Release Notes

E.1. Release 21.05
E.1.1. Highlights
E.1.2. State Version Changes
E.2. Release 20.09
E.2.1. Highlights
E.2.2. State Version Changes
E.3. Release 20.03
E.3.1. Highlights
E.3.2. State Version Changes
E.4. Release 19.09
E.4.1. Highlights
E.4.2. State Version Changes
E.5. Release 19.03
E.5.1. Highlights
E.5.2. State Version Changes
E.6. Release 18.09

This section lists the release notes for stable versions of Home Manager and the current unstable version.

E.1. Release 21.05

This is the current unstable branch and the information in this section is therefore not final.

E.1.1. Highlights

This release has the following notable changes:

  • The programs.broot.verbs option is now a list rather than an attribute set. To migrate, move the keys of the attrset into the list items' invocation keys. For example,

    programs.broot.verbs = {
      "p" = { execution = ":parent"; };
    };

    becomes

    programs.broot.verbs = [
      {
        invocation = "p";
        execution = ":parent";
      }
    ];
  • The programs.mpv.package option has been changed to allow custom derivations. The following configuration is now possible:

    programs.mpv.package = (pkgs.wrapMpv (pkgs.mpv-unwrapped.override {
      vapoursynthSupport = true;
    }) {
      extraMakeWrapperArgs = [
        "--prefix" "LD_LIBRARY_PATH" ":" "${pkgs.vapoursynth-mvtools}/lib/vapoursynth"
      ];
    });

    As a result of this change, programs.mpv.package is no longer the resulting derivation. Use the newly introduced programs.mpv.finalPackage instead.

  • The programs.rofi.extraConfig option is now an attribute set rather than a string. To migrate, move each line into the attribute set, removing the rofi. prefix from the keys. For example,

    programs.rofi.extraConfig = ''
      rofi.show-icons: true
      rofi.modi: drun,emoji,ssh
    '';

    becomes

    programs.rofi.extraConfig = {
      show-icons = true;
      modi = "drun,emoji,ssh";
    };
  • The programs.rofi.theme option now supports defining a theme using an attribute set, the following configuration is now possible:

    programs.rofi.theme = let
      # Necessary to avoid quoting non-string values
      inherit (config.lib.formats.rasi) mkLiteral;
    in {
       "@import" = "~/.config/rofi/theme.rasi";
    
      "*" = {
        background-color = mkLiteral "#000000";
        foreground-color = mkLiteral "rgba ( 250, 251, 252, 100 % )";
        border-color = mkLiteral "#FFFFFF";
        width = 512;
      };
    
      "#textbox-prompt-colon" = {
        expand = false;
        str = ":";
        margin = mkLiteral "0px 0.3em 0em 0em";
        text-color = mkLiteral "@foreground-color";
      };
    };
  • The services.redshift.extraOptions and services.gammastep.extraOptions options were removed in favor of services.redshift.settings and services.gammastep.settings, that are now an attribute set rather than a string. They also support new features not available before, for example:

    services.redshift = {
      dawnTime = "6:00-7:45";
      duskTime = "18:35-20:15";
      settings = {
        redshift = {
          gamma = 0.8;
          adjustment-method = "randr";
        };
    
        randr = {
          screen = 0;
        };
      };
    };

    It is recommended to check either redshift.conf.sample or gammastep.conf.sample for the available additional options in each program.

  • Specifying programs.neomutt.binds.map or programs.neomutt.macros.map as a single string is now deprecated in favor of specfiying it as a list of strings.
  • The programs.neovim.configure is deprecated in favor of other programs.neovim options; please use the other options at your disposal:

    configure.packages.*.opt  -> programs.neovim.plugins = [ { plugin = ...; optional = true; }]
    configure.packages.*.start  -> programs.neovim.plugins = [ { plugin = ...; }]
    configure.customRC -> programs.neovim.extraConfig
  • Home Manager now respects the NO_COLOR environment variable as per https://no-color.org/.
  • Qt module now supports qt.style.name to specify a theme name and qt.style.package to specify a theme package. If you have set qt.platformTheme to gnome, a qt.style.package compatible with both Qt and Gtk is now required to be set. For instance:

    qt = {
      platformTheme = "gnome";
      style = {
        name = "adwaita-dark";
        package = pkgs.adwaita-qt;
      };
    };

E.1.2. State Version Changes

The state version in this release includes the changes below. These changes are only active if the home.stateVersion option is set to "21.05" or later.

  • Nothing has happened.

E.2. Release 20.09

The 20.09 release branch became the stable branch in late September, 2020.

E.2.1. Highlights

This release has the following notable changes:

  • Nothing has happened.

E.2.2. State Version Changes

The state version in this release includes the changes below. These changes are only active if the home.stateVersion option is set to "20.09" or later.

  • The options home.homeDirectory and home.username no longer have default values and must therefore be provided in your configuration. Previously their values would default to the content of the environment variables HOME and USER, respectively.

    Further, the options xdg.cacheHome, xdg.configHome, and xdg.dataHome will no longer be affected by the XDG_CACHE_HOME, XDG_CONFIG_HOME, and XDG_DATA_HOME environment variables. They now unconditionally default to

    • "${config.home.homeDirectory}/.cache",
    • "${config.home.homeDirectory}/.config", and
    • "${config.home.homeDirectory}/.local/share".

    If you choose to switch to state version 20.09 then you must set these options if you use non-default XDG base directory paths.

    The initial configuration generated by

    $ nix-shell '<home-manager>' -A install

    will automatically include these options, when necessary.

  • Git’s smtpEncryption option is now set to tls only if both accounts.email.accounts.<name>.smtp.tls.enable and accounts.email.accounts.<name>.smtp.tls.useStartTls are true. If only accounts.email.accounts.<name>.smtp.tls.enable is true, ssl is used instead.
  • The nixpkgs module no longer references <nixpkgs>. Before it would do so when building the pkgs module argument. Starting with state version 20.09, the pkgs argument is instead built from the same Nixpkgs that was used to initialize the Home Manager modules. This is useful, for example, when using Home Manager within a Nix Flake. If you want to keep using <nixpkgs> with state version ≥ 20.09 then add

    _module.args.pkgsPath = <nixpkgs>;

    to your Home Manager configuration.

  • The options wayland.windowManager.sway.config.bars and opt-xsession.windowManager.i3.config.bars have been changed so that most of the suboptions are now nullable and default to null. The default for these two options has been changed to manually set the old defaults for each suboption. The overall effect is that if the bars options is not set, then the default remains the same. On the other hand, something like:

    bars = [ {
      command = "waybar";
    } ];

    will now create the config:

    bar {
      swaybar_command waybar
    }

    instead of

    bar {
    
      font pango:monospace 8
      mode dock
      hidden_state hide
      position bottom
      status_command /nix/store/h7s6i9q1z5fxrlyyw5ls8vqxhf5bcs5a-i3status-2.13/bin/i3status
      swaybar_command waybar
      workspace_buttons yes
      strip_workspace_numbers no
      tray_output primary
      colors {
        background #000000
        statusline #ffffff
        separator #666666
        focused_workspace #4c7899 #285577 #ffffff
        active_workspace #333333 #5f676a #ffffff
        inactive_workspace #333333 #222222 #888888
        urgent_workspace #2f343a #900000 #ffffff
        binding_mode #2f343a #900000 #ffffff
      }
    
    }

E.3. Release 20.03

The 20.03 release branch became the stable branch in April, 2020.

E.3.1. Highlights

This release has the following notable changes:

  • Assigning a list to the home.file, xdg.configFile, and xdg.dataFile options is now deprecated and will produce a warning message if used. Specifically, if your configuration currently contains something like

    home.file = [
      {
        target = ".config/foo.txt";
        text = "bar";
      }
    ]

    then it should be updated to instead use the equivalent attribute set form

    home.file = {
      ".config/foo.txt".text = "bar";
    }

    Support for the list form will be removed in Home Manager version 20.09.

  • The lib function attribute given to modules is now enriched with an attribute hm containing extra library functions specific for Home Manager. More specifically, lib.hm is now the same as config.lib and should be the preferred choice since it is more robust.

    Therefore, if your configuration makes use of, for example, config.lib.dag to create activation script blocks, it is recommended to change to lib.hm.dag.

    Note, in the unlikely case that you are

    • using Home Manager’s NixOS or nix-darwin module,
    • have made your own Home Manager module containing an top-level option named config or options, and
    • assign to this option in your system configuration inside a plain attribute set, i.e., without a function argument,

    then you must update your configuration to perform the option assignment inside a config attribute. For example, instead of

    home-manager.users.jane = { config = "foo"; };

    use

    home-manager.users.jane = { config.config = "foo"; };
  • The services.compton module has been deprecated and instead the new module services.picom should be used. This is because Nixpkgs no longer packages compton, and instead packages the (mostly) compatible fork called picom.
  • The list form of the programs.ssh.matchBlocks option has been deprecated and configurations requiring match blocks in a defined order should switch to using DAG entries instead. For example, a configuration

    programs.ssh.matchBlocks = [
      {
        host = "alpha.foo.com";
        user = "jd";
      }
      {
        host = "*.foo.com";
        user = "john.doe";
      }
    ];

    can be expressed along the lines of

    programs.ssh.matchBlocks = {
      "*.example.com" = {
        user = "john.doe";
      }
      "alpha.example.com" = lib.hm.dag.entryBefore ["*.example.com"] {
        user = "jd";
      }
    };

    Support for the list form will be removed in Home Manager version 20.09.

E.3.2. State Version Changes

The state version in this release includes the changes below. These changes are only active if the home.stateVersion option is set to "20.03" or later.

  • The programs.zsh.history.path option is no longer prepended by $HOME, which allows specifying absolute paths, for example, using the xdg module. Also, the default value is fixed to $HOME/.zsh_history and dotDir path is not prepended to it anymore.
  • The newsboat module will now default in displaying queries before urls in its main window. This makes sense in the case when one has a lot of URLs and few queries.

E.4. Release 19.09

The 19.09 release branch became the stable branch in October, 2019.

E.4.1. Highlights

This release has the following notable changes:

  • The programs.firefox.enableGoogleTalk and programs.firefox.enableIcedTea options are now deprecated and will only work if Firefox ESR 52.x is used.
  • The home-manager tool now provides an uninstall sub-command that can be used to uninstall Home Manager, if used in the standalone mode. That is, not as a NixOS module.

E.4.2. State Version Changes

The state version in this release includes the changes below. These changes are only active if the home.stateVersion option is set to "19.09" or later.

E.5. Release 19.03

The 19.03 release branch became the stable branch in April, 2019.

E.5.1. Highlights

This release has the following notable changes:

  • The home.file.<name>.source option now allows source files to be hidden, that is, having a name starting with the . character. It also allows the source file name to contain characters not typically allowed for Nix store paths. For example, your configuration can now contain things such as

    home.file."my file".source = ./. + "/file with spaces!";
  • The type used for the systemd unit options under systemd.user.services, systemd.user.sockets, etc. has been changed to offer more robust merging of configurations. If you don’t override values within systemd units then you are not affected by this change. Unfortunately, if you do override unit values you may encounter errors.

    In particular, if you get an error saying that a “unique option” is “defined multiple times” then you need to use the mkForce function. For example,

    systemd.user.services.foo.Service.ExecStart = "/foo/bar";

    becomes

    systemd.user.services.foo.Service.ExecStart = lib.mkForce "/foo/bar";

    We had to make this change because the old merging was causing too many confusing situations for people.

E.5.2. State Version Changes

The state version in this release includes the changes below. These changes are only active if the home.stateVersion option is set to “19.03” or later.

E.6. Release 18.09

The 18.09 release branch became the stable branch in September, 2018.