nix-output-monitor
nix-output-monitor copied to clipboard
Pipe your nix-build output through the nix-output-monitor a.k.a nom to get additional information while building.
nix-output-monitor
Pipe your nix-build output through the nix-output-monitor (aka nom) to get additional information while building.
While your build runs nom will draw something like this at the bottom of your build log:

Status
This was an experimental fun project, which proofed to be useful to quite a lot of people.
The purpose of it is to write something fun and useful in Haskell.
You are free and very welcome to contribute feedback, issues or PRs, but I do not commit to maintain this project over a long time period.
This program relies on the output of the v1 nix commands (i.e. nix-build and not nix build) support for v2 output may come in the future.
Installing
- nixpkgs: nom is in nixpkgs. Just install
pkgs.nix-output-monitorin the usual way. You might want to install it from nixos-unstable to get the newest version. - cabal: Install
cabal-installand runcabal installin the checked out repo. - nix: or run
nix-buildornix-envor include thedefault.nixof this repo in your nixos config.
Running
The Easy Way
When installed from nixpkgs you can replace every call to nix-build with the bundled wrapper script nom-build.
The Flexible Way
Once you have installed nix-output-monitor to your path, run any nix command (nixos-rebuild,nix-build,home-manager switch, not nix build.) and pipe stderr and stdout into nom.
nix-build |& nom
Don‘t forget to redirect stderr, too. That's what the &, does.
Preserving Colored Text
To preserve the color of the redirected text you can use the unbuffer command from the expect package. (The nom-build wrapper does this for you.)
unbuffer nix-build |& nom
Explanation
Legend
Nom tries to convey informations via symbols and colors
- ▶, yellow: running builds
- ✔, green: completed builds
- ⏳︎︎︎, blue: planned builds
- ⬇, cyan: downloads often in the form
completed/total - ⬆, magenta: uploads
- ⚠, red: failed builds
- ∅: a moving average over past builds of this derivation
- ⏱︎: running time
- ∑: a summary over all packages and hosts
If you can‘t see all icons you maybe need another terminal font.
I recommend any font from pkgs.nerdfonts e.g. "JetBrainsMono Nerd Font".
Also different terminals might work differently well. I recommend: pkgs.foot.
How to Read the Dependency Graph
- nom will sort all builds into a tree.
- Children of a node are direct dependencies.
- nom will try to show you the most relevant part of the dependency tree, roughly aiming to fill a third of your terminal
- No build will be printed twice in the tree, it will only be shown for the lower most dependency.
- Everytime nom decides to not show all direct dependencies of a build (and for root nodes), it will print a
&and a summary over the build state of all dependencies. - Use the colors from above to read the summary
Example Runs
An example failing remote build:
An example really large build (haskell-language-server):
An example running sudo nixos-rebuild switch:
Implementation
Right now nom uses four sources of information:
- The parsed nix-build output
- it checks if build results exist in the nix-store
- it querys
.drvfiles for information about theoutoutput path. - It caches build times in
$XDG_CACHE_HOME/nix-output-monitor/build-reports.csv.
Limitations
-
This will fail in unexpected and expected ways.
-
nix-output-monitor receives most it's information from parsing nix-build output. The parser might be to strict or to loose for use cases I didn‘t think of. Then the numbers displayed will be off!
-
nix-build does not show info when a download or upload is finished, so we currently cannot differentiate between started and completed downloads.
-
remote builds will sometimes be shown as running even when they are actually still waiting for uploads or downloads.
-
Terminal clearing and reprinting is brittle. It might fail with your terminal or terminal width. But at this point I‘ve invested some effort to make it usable.
-
This program also makes assumptions like your nix-store is at "/nix/store" or that every derivation has an output at "out".
-
Luckily I don‘t think this program screws up anything more than your terminal.