runix: run nix software without nix
I think nix is fantastic. Language-agnostic, cross-platform, reproducible, cacheable software building and distribution. It’s not an easy thing to learn, but the payoff is tremendous.
But one thing about nix is that you typically need to be all-in. When building software, this makes sense - Nix’s reproducibility only works if all your dependencies are themselves available within nix. But as a colleague casually suggested one day: shouldn’t it be possible to run nix-built software without installing nix?
I told him a few reasons why it’s harder than it sounds, mainly due to the hardcoded /nix/store
path which is assumed by the entire ecosystem. But my mind dwelt on it in the background, and it turns out it turned out to be much easier than I first thought.
Runix
So, I’m announcing runix, which does just that - it’s a small, unobtrusive executable which allows running nix software from any binary cache. Features:
- small (<4mb compressed)
- fast (~10 microsecond overhead after initial download)
- no configuration required
- unobtrusive (no need for root access or a
/nix
directory) - can use software from any nix-compatible binary cache (including cache.nixos.org and cachix)
- conveniently distribute software via
runscripts
Runscripts are a runix invention, they’re a tiny wrapper around a list of derivations and binary caches. In addition, they support:
- self-bootstrapping (install
runix
itself if missing) - multiplatform (execute a different nix derivation per platform)
runix
intentionally lacks all the development and authoring features of nix itself - you can’t evaluate nix expressions or build software locally, you can only run existing software which someone else has built and pushed to a binary cache. But for distributing software, it’s a much easier way for users to access nix-built software.