Nix wrote half of my debugger
fzakaria.com
fzakaria.com
So I'd expect AI to rapidly accelerate Nix adoption. Hopefully, because it is amazing.
Now you can just send this to agent "port dis <repo link>" and 20 minutes later you get a working package, or 20 working packages what were required for that package to work.
Fixing stuff also easy, just today for some reason my machine wouldn't wake up monitors after sleeping them, a few minutes later claude fixed my configuration. Making QuickShell things with it also easy. For years I've avoide all GUIs for networkmanager and bluetooth on linux because they all looked awful and unusable, now QuickShell things made just for me, exactly the way I wanted.
These days it's magical, but it was even a huge boon when it was barely functional. Nix just had a way of leaving me super confused and stranded.
My mac setup hasn’t been replaced since 2021 or something, and it was copied from my old mac. I have a dotfiles git repo, which I drag around and have multiple branches for my daily driver. For temp setup, I just copy files and edit.
It’s not the only thing that agents have changed for me - I also went back to using neovim and tmux; partly because of how I use remote development servers but also because now I can get my setup working perfectly for me without a lot of hassle.
Open source and code managing all the things has always been a great idea but now it feels crazy to do anything else.
I say this as a daily user of Nix.
Now compare it even to Haskell, to say nothing about e.g. Typescript.
(I say this as somebody who deeply loves the concepts in most functional languages, and loves the concepts in nix, but recognises that the developer-experience of both is about as pleasant as reading somebody else's code-golfed perl)
The concepts in functional languages are not fully realized in any multi-paradigm languages. So you can admire all you want, but don’t knock it until you’ve actually tried it.
I worked with a very forward-thinking functional programmer around 2012 and even back then she was raving about it. And of course, people thought she was a raving lunatic.
I give her credit to this day. It took me having one too many problems caused by NOT using Nix, to cause me to finally dive in.
And there's no going back. Which is what happens with the best technologies.
Then all of my dotfiles are backed up, with any important other config, in a big gig repo. And all of my documents/photos/etc live on a separate hard drive which gets backed up to the cloud.
All of that to say, with the right setup nix is mostly unnecessary, and honestly the benefit of not using it is that I can wipe my system anytime and restart it with just my usual important programs ready to go. Any mess made along the way gets purged automatically in every fresh install
I use devenv (yet another nix flake dev environments) and opencode.
It is quite a synergy : my nix usage profits from the agent and the agent profits from being able to install just anything.
I even vibecoded a plugin for personal use that runs all bash tool calls through devenv and uses the supplied nix lsp package:
Is `nix` amazing though? Eh... if it were implemented better, it could be amazing. It's like python virtual environments or `pyproject.toml` for general software. It solves a real problem, but it does so by introducing a possibly even bigger problem.
it's more like, it definitively solves a problem forever, like nothing else.
It's like when you have immutable data and it permanently solves a class of problems that can result from mutable data.
It's sort of like that.
"We have this system that is so amazing that... it requires a paid subscription to an LLM provider or a $5000 GPU for most people to understand and configure".
When instead Nix could've focused on releasing flakes 10 years ago with probably the same effect. And fix issues like this: https://news.ycombinator.com/item?id=50040083
Pre-LLM: Nix is "high effort, moderate reward". The cost is: you have to learn a tool which does things apparently completely different to how other tools do things.. you have to put up with a lot of friction, pay all the pain upfront, and the benefit is that may be later it's easier to get the package again.
It's just not a practical trade-off for most developers.
With LLMs, the cost-benefit trade-off changes.
You can use this cloud provider's LLM to get you a good result. You get the benefits, and the cost is 'just' "ask the LLM to do it".
Similarly: it's easier to assess whether produced code does the right thing, than to come up with that code from scratch.
Without LLMs? The inaccessibility also comes from being a niche tool. Not many use it, so not many software projects accommodate it or consider it, and you might have to come up with workarounds yourself.
It remains so, only now you want people to blindly trust LLM output for this system.
That people use resources to help them use tools they don't understand too well is hardly new. e.g. Classically you might copy-paste from StackOverflow after finding an error, or some people watch YouTube videos about it.
I'd say LLMs make it easier to get to the point where you can understand it, though. So it's an accessibility increase.
> It remains so, only now you want people to blindly trust LLM output for this system.
This isn't related to Nix, though. You could ask an LLM to create the most mainstream Python code ever and blindly trusting it would make as much sense.
For system management, Nix has the advantage of being declarative. e.g. For NixOS you get to read the code and review what it's doing.
Here's a rough sketch: the Nix expression language is really configuration oriented; it's a "JSON + functions" kind of language. You write Nix to describe how a package is built; the ideal case being "./configure && make && make install" as such. The resulting packages are put in a Nix store. (Almost) every dependency is put in the Nix store; so your program links against libraries in the Nix store, or runs other sources from the Nix store.
- Nix is "just" declarations of those instructions which output into directories and everything gets symlinked. But, it can take time to build an intuition for how to do things.
- There's some fundamental friction where most Linux systems assume shared libraries are available globally in a typical place on Linux. -- e.g. Python's "wheels" come with precompiled dependencies which assume shared libraries are available in a global place. Nix doesn't provide that.
- "Why not just provide globals?" For one, by having everything not be global, you can have multiple versions available at the same time.
- Since Nix is quite 'strict' by default about everything coming from the Nix store, it practically means 'paying' for all the difficulties up front. (There's a trade-off where you could write packages in a less strict manner; this is great for iterating, but bad for maintainability).
- Since Nix is strict about symlinking all dependencies, often if upstream software does things in a "quick and dirty manner" (e.g. hardcodes "/bin/bash", hardcodes paths for binaries to run, etc.) then it can be difficult to describe how to package that software with Nix. -- Fundamentally, you're taking something which works loosely, and bringing it into a stricter system.
- Upthread the comment mentions "flakes". Flakes provide both dependency management (i.e. being able to declare other Nix codebases you'll use), as well as a standard entrypoint into a Nix codebase. -- Without flakes, the UX is a bit cumbersome..
- The majority of packages which people use come from "Nixpkgs" package repository. This has a lot of organic complexity to it, coming from multiple contributors, with competing ideas for achieving results.
- With Nix being a "json + functions" language.. not sure I'm articulating this right, but it means that practically a large codebase is built as a single 'expression' (i.e. soft boundaries between bits of code).. and the tooling for troubleshooting problems is ... not very good.
- The Nix expression language is functional and lazy. This can be rough for people who don't have this background.
- Since Nix adds a layer of abstraction, it means you might need to have both a broad and a deep understanding to get something working (e.g. understanding how to drive Python or Linux in non-conventional ways). -- A kind of "do everything properly" which more conventional systems don't require.
So ... some aspects could be easier. But I think there's a fundamental friction to it.
Flake stabilisation probably hasn't gotten any easier/more likely by LLMs, but it does make it quicker for people to pickup technology.
Technology sometimes has that odd effect. (And it will apply to different technologies in different contexts at different rates.)
The "Undo" time-travelling debugger for C/C++ has been around for 20+ years. So I guess the answer is simply that most people chase shiny new things instead of using established, reliable, and, hence, boring tools.
Its a very curious project, but don't you end up pinning repligraph usability on model weights? Since you take indeterminism out of the equation, a repligraph's notability is as significant as the producing model's weights, and since there is no dice rolls to be made, the eyeball problem:
> Our blind spots, while not perfectly correlated, have substantial overlap
is entirely replicated. Models that are diffused from one another can have the same blind spots, the same loose statistical reality that exists with humans. This is partially addressed in steering:
> A repligraph proves that a model generated some artifact. It does not prove that the model did a good job, or that the artifact is safe.
but I think the "Peer Review" solution is inadequate, and with some jailbreaking prompts' innocuous looks considered, "the attacker just needs to find one prompt" might be much easier than it appears.
Batching seems to be a huge economic turn off for proprietary model determinism, but I think its entirely viable for consumer models. Trustless evals are brilliant and should've been our reality. Nice project, good luck on your endeavor.
True, I expect models to be pretty correlated with each other as well. But you can at least attempt to quantify that correlation in a rigorous way, by running experiments (e.g. by pointing each model at a big project and comparing the sets of bugs they each find).
And yeah, the "double-edged sword" aspect of determinism is definitely the biggest bullet that you have to bite. For me, it's better than the alternative; without determinism, such jailbreaking attacks are still possible, just harder to detect. But I certainly would not want people to go around thinking "it's deterministic, therefore it's safe."
FWIW, I used Debian more than anything over decades, and also have little patience when it comes to unstable computers. NixOS is a breath of fresh air and has reinvigorated my love of Linux. I haven't found it less stable than Debian, and also have a higher degree of confidence when making changes. It has its quirks, but ultimately I've found it a joy to use, and I'm never going back to a distro that doesn't have similar capabilities.
If you boot default Debian and apt install a handful of packages from the primary channel, it probably doesn't matter much, but if you enjoy even a modest amount of customizing, NixOS really shines. From one Linux user to another, I encourage you to try it! I have no affiliation, just an old head stoked on Nix.
This year I decided to give it another try and set it up on an ancient laptop using Claude to factor the config and it’s gone so well that I now use the same nix config to manage three different machines and it’s insanely liberating to know how easy it is to screw everything up and roll it back trivially. I now regularly make edits on one machine and then just routinely commit them and go apply on the other machines with zero friction. It’s kind of amazing.
Curious: how does Rewind deal with randomness?
...of which the following are most important:
2. Run deterministically
One vCPU on stock KVM, so code in the VM runs on the real CPU. The VM's kernel carries a small Rewind platform: interrupts arrive only when the VM hands control to Rewind, time moves only then, and the timestamp counter and hardware RNG are hidden. A step is one of those handoffs.
3. Keep keyframes
Every quarter second of wall time, Rewind snapshots the machine using KVM's dirty-page [aka Memory Pages that have been written to since the last snapshot] log. Pages go into a content-addressed store (BLAKE3, zstd), so a page shared by keyframes, runs and forks is stored once."
Now, that's some brilliant engineering right there!
While I like the product name "Rewind VM" (and yes, that's what it allows the user to do!), it could just as easily be called "Deterministic VM" and that name would have been wholly appropriate, as well!
Future OS and VM engineers should study Rewind VM. Those are some great engineering ideas there, and determinism, or at least optional determinism, should it be desired, when it is desired -- is the one thing that is completely non-existent in most OS's, most VM's, and most other program runtime environments...
Anyway, a great article on using Rewind VM (never knew about it before this article!) with Nix builds.
There could be great ideas in Rewind VM, but the page is littered with Claude-ish which is immediately off-putting.
Rewind VM appears to be made solely by fzakaria, the author of the submitted article. I don't see any connection to peter_d_sherman, who is clearly not a sock puppet account. It took 10 seconds to check that info.
God forbid people on HN get excited about a technology.
You, on the other hand, clearly have an axe to grind against LLM usage. Which is fine and all as a personal preference, but not a reason to post such a comment.
I honestly have no idea what point you are making.
Anyway, cynically asking whether people are self-promoting (without any attempt at evidence) is far more than just sharing your opinion.
And it's clear you didn't force yourself to read through all that "Claude-authored text", otherwise you would not be left wondering if peter_d_sherman was self-promoting. (I don't know any of these people but it's clear they're all different).
My point was to tell you that you are exhibiting unacceptable behavior for a civil discussion. That's an example of sharing an opinion with justification.
Then don't use it.
My eyes glazed over even the examples which seem to have a good premise, but almost immediately devolve into the prose I have to sit through every day.