Nh is my own take at reimplementing some commands from the NixOS ecosystem. I aim to provide more feature and better ergonomics than the existing commands.
Nh has serveral subcommands, such as:
os
, which reimplementsnixos-rebuild
, with a tree of builds, diff and confirmation.home
, which reimplementshome-manager
.search
, a super-fast package searching tool (powered by a ElasticSearch client).clean
, my own take at cleaning GC roots from a NixOS system.
This wouldn't be possible with the programs that nh runs under the hood:
- Tree of builds with nix-output-monitor.
- Visualization of the upgrade diff with nvd.
- And of course, all the crates we depend on.
The latest stable version is available in Nixpkgs. You can try nh in a shell:
nix shell nixpkgs#nh
We provide a NixOS module that integrates nh clean
as a service. To enable it,
set the following configuration:
{ config, pkgs, ... }:
{
programs.nh = {
enable = true;
clean.enable = true;
clean.extraArgs = "--keep-since 4d --keep 3";
flake = "/home/user/my-nixos-config";
};
}
Nh supports both Flakes and classical NixOS configurations:
- For flakes, the command is
nh os switch /path/to/flake
- For a classical configuration, you must use
nh os switch -f <nixpkgs/nixos> /etc/nixos/configuration.nix
You might want to check nh os --help
for other values and the defaults from
environment variables.
Nh is capable of detecting which specialisation you are running, so it runs the proper activation script.
To do so, you need to give nh some information of the spec that is currently running by writing its name to /etc/specialisation
. The config would look like this:
{config, pkgs, ...}: {
specialisation."foo".configuration = {
environment.etc."specialisation".text = "foo";
# ..rest of config
};
specialisation."bar".configuration = {
environment.etc."specialisation".text = "bar";
# ..rest of config
};
}
Just clone and nix develop
. We also provide a .envrc
for Direnv.