Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

figsoda/unnix

Reproducible Nix environments without installing Nix

figsoda/unnix.json
{
"createdAt": "2026-02-04T05:56:09Z",
"defaultBranch": "main",
"description": "Reproducible Nix environments without installing Nix",
"fullName": "figsoda/unnix",
"homepage": "",
"language": "Rust",
"name": "unnix",
"pushedAt": "2026-06-04T02:07:03Z",
"stargazersCount": 106,
"topics": [
"cache",
"ci",
"devbox",
"hydra",
"nix",
"nixos"
],
"updatedAt": "2026-06-04T02:07:00Z",
"url": "https://github.com/figsoda/unnix"
}

release version deps license ci

Reproducible Nix environments without installing Nix

[!Warning] Unnix is alpha software. I recommend against running it on long-running production servers in its current state.

Try with Nix flakes Install from crates.io Download prebuilt binaries
Terminal window
nix shell github:figsoda/unnix
Terminal window
cargo install unnix --locked

latest release

To use unnix, start by creating unnix.kdl, [unnix’s manifest file]!(docs/manifest.md)

Terminal window
unnix init -p jq ripgrep

Now you can enter the environment with

Terminal window
unnix env

This will generate unnix.lock.json and put you in a shell with jq and rg. Make sure to commit the lockfile to your VCS to keep your environment reproducible.

This is a very simplified view of what happens when you run nix develop.

flowchart TB
nix(nix) --> | download | expr --> | evaluate | drv
drv --> | outputs | path --> | query | cache
cache -->| hit | download(download to the Nix store)
cache -->| miss | build(build the derivation)
drv -.- build
cache(
binary cache
e.g. cache.nixos.org
)
drv(derivations)
expr(
Nix expressions
e.g. Nixpkgs
)
path(store paths)

Downloading and evaluating Nixpkgs can take a long time, especially in ephemeral environments like CI pipelines. Unnix avoids that by removing derivations from the picture altogether, and getting the store paths directly from services like [Hydra] or [Devbox].

flowchart TB
unnix --> | lockfile absent or outdated | update --> | Hydra / Devbox | paths
unnix --> | up-to-date lockfile | paths
paths --> | query | cache
cache --> | hit | download(download to the unnix store)
cache --> | miss | miss
cache(
binary cache
e.g. cache.nixos.org
)
miss(
fail
)
paths(store paths)
unnix(unnix)
update(update lockfile)
aarch64-darwinaarch64-linuxx86_64-darwinx86_64-linux
CLIpartial[^1]yespartial[^1]yes
[GitHub action]yesyesnoyes
[prebuilt binaries]yesyesnoyes
cached by the default cacheyesyesyes[^2]yes

[^1] !: unnix env relies on [bubblewrap], which only works on Linux. An alternative darwin backend is work in progress.

[^2] !: x86_64-darwin will be deprecated in Nixpkgs 26.11.

  • No setup hooks

    Unnix does not have access to stdenv, and therefore cannot run the setup hooks or any user-specified shellHooks. Instead, it tries its best to emulate the behavior of setup hooks like pkg-config, so that dependencies can be picked up without executing any hooks.

  • No evaluation

    Unnix does not evaluate Nix expressions. You cannot use .override or .overrideAttrs on packages, and are limited to the attributes the resolver exposes, e.g. [Hydra] jobs.

  • No builds

    Unnix cannot build anything, and strictly relies on binary caches. This means no unfree packages if you are using the default set of caches.

See [docs/README.md]!(docs)

See [CHANGELOG.md]!(CHANGELOG.md)

[Devbox] !: https://www.nixhub.io/ [GitHub action] !: https://github.com/figsoda/unnix-action [Hydra] !: https://github.com/nixos/hydra [bubblewrap] !: https://github.com/containers/bubblewrap [prebuilt binaries] !: https://github.com/figsoda/unnix/releases