I’ve created longer arguments internally than this vote shows. I can however share some more polished versions of why I think this is a good idea.
And immediate refinement might be to move the goalpost. We shouldn’t declare them stable, we should declare they’re NOT experimental. That means they’d ship as enabled by default.
The “out of history” argument
In general, I think it’s telling that newcomers always wonder why flakes aren’t stable, but people that have been a long time in the project insist they remain unstable. To me, it reveals that it’s not an obvious conclusion to many outsiders, and doesn’t conform to typical industry usage of the term “unstable”.
Let’s say we lived in the distant future, we just opened the GitHub code vault, and we wanted to reboot the project. Unfortunately, the knowledge of which experimental features of Nix were ever stabilized was lost to time.
We’d probably quickly realize that things such as ca-derivations were features considered unstable, makes sense. What about these flakes and nix-command features?
A very naive approach might be to look for usage. And this metric is by no means perfect at all. But we have to start somewhere. There are 147k results for path:flake.nix on GitHub. There are 823k for path:default.nix. Okay. These were clearly some features a lot of people used.
We’ll probably quickly wonder not just about the current usage patterns, but the relative growth. Determinate Systems has already made an excellent argument here, it seems that flakes are the ones that new users would strongly prefer, and the only one with noticeable growth compared to the alternatives.
When we look through the actual breakage users experience in their day-to-day workflow as well, it seemed to be minimal if non-existent. While the actual nix binary did change behavior between versions sometimes, because the vast majority of users got their version of nix directly from nixpkgs, none of them ever felt that breakage.
I think we’d conclude that the feature seemed to be a widely used and powerful, and that they were probably shipped as enabled by default. The usage was clearly growing rapidly, and had clearly started to take over compared to not using flakes.
The harm reduction argument is false
Another argument that is often made is that flakes just aren’t “done” enough yet. I personally think that is perfectionism, but I think proving that it is perfectionism is not necessary, it’s sufficient to prove that them not being done doesn’t matter.
The argument that they aren’t done enough frequently leans on the idea that if we were to enable flakes by default, users of Nix would start to use an “unfinished” feature that would have all sorts of bugs.
This argument had a chance when there was only the one true nix, even if it wasn’t a good argument, but the landscape has changed. Now there is a corporate-backed alternative, that has declared that flakes aren’t just non-experimental, but stable, and guaranteed not to break. They’ve done this specifically in response to the official NixOS project’s hesitance to do so.
But here is the problem: it assumes that people will not use flakes just because they’re marked “experimental” and made harder to use. But in reality it leads to a much different outcome.
By keeping flakes experimental:
- We alienated users that want flakes, and they gravitate towards a more closed, proprietary alternative. We are helping Determinate Systems nudge users, both personal and enterprise, towards their products instead of the official nix.
- We provide worse support to those users that want to use flakes in our community and value open source. We are, in effect, punishing them for using flakes and not jumping ship to the closed and proprietary alternative.
- We stall the actual real world friction that it takes to make a version of flakes that could be considered “stable”. If we started treating flakes as a first-class feature, that was installed everywhere, yes, there may be more bugs. But there would also be a much stronger, more immediate incentive to fix those issues.
Rapid Fire Counterarguments
“But the CLI is still changing!”
Removing experimental is not the same as freezing. And we could change it using major versions, new feature flags or similar. It doesn’t have to be a big-bang on/off rollout. We can make what is here and used available, and then use more granular flags for future improvements.
“We are normalizing bad design”
We are endorsing user reality. The design can be iterated on.
“You just hate Determinate Systems”
I agree strongly with their line of reasoning and arguments in many cases, at least on paper. I’ve found they’re not living up to them in practice, and I see the misalignment of incentives. The results of that misalignment are clear indicators that we wouldn’t want them to capture major parts of the project, such as the installation method, the Nix binary, “flakehub”, and most crucially getting to write the narrative of our community.
I think that given the reality of usage of flakes and nix-command, “unstable” and “experimental” are not declarations of maturity, they’re simply an unfair downgrade that makes them second class citizens.
From an outcome perspective, the harm outweighs the risk. Significantly.