01 Languages & frameworks
Nix
A language built so that the same expression produces the same artefact, every time.
- Role
- Build & package language
- Licence
- LGPL v2.1
- Since
- 2003
- Upstream
- Project site ↗
Nix is the language underneath NixOS, and the two are worth separating. NixOS is an operating system. Nix is a purely functional language for describing how software is built.
Why we still choose it
Nix treats a build as a function, which other build tools only work around. Given the same inputs, a Nix expression produces a bit-identical output on your laptop, in CI, on a server in Falkenstein, and again in three years. Dependencies are content-addressed rather than named, so two projects that need different versions of the same library cause no trouble at all.
Much of what we promise depends on that. Reproducible servers, a staging environment that matches production, and a rollback that takes one reboot all follow from the build being deterministic.
Where it shows up in our work
Beyond the servers, we use it for development shells that give a new engineer the exact toolchain on their first morning, for CI that builds the same closure the server will run, and for flakes that pin every input by hash, so you can check whether something really did work last week.
Where it falls short
The language is strange at first. It is lazily evaluated and purely functional, and its error messages have historically been unkind. Expect a week or two before it clicks. There are not many concepts to learn, though; they are unfamiliar more than complicated.