Every interactive shell ran `mkdir -p "$(dirname "$HISTFILE")"`, which
forks twice, even though the directory almost always exists. It costs
~10ms on macOS 27.
We now test if the directory exists first and use zsh's `:h` modifier
instead of dirname, so the most of the time no processes are started.
The directory is still created when missing.
Macros can now set an optional `description`, written as the final
argument of the `macro` command so it shows in the help screen.
Macros without a description generate the same output as before.
mandb may exit successfully without creating output when no manual pages
are available. Create the output directory before invoking it so the
man-cache derivation always has its declared output.
Add a regression test for an empty manual page set.
Fixes#9962
Track the final enabled configuration source at the path Atuin reads so daemon settings that require a restart take effect. Respect file replacements and omit dependencies for themes, disabled files, and retargeted configuration without changing systemd behavior.
Keep settings writable while applying declared values. Match packages by
native npm, Git and lexical local-path identities so declarations
replace equivalent saved entries without reordering unrelated packages.
Add programs.opencode.cli for OpenCode 2's global cli.json, while
retaining programs.opencode.tui for OpenCode 1.
Support mutable CLI configuration through OPENCODE_CLI_CONFIG_CONTENT,
leaving cli.json writable by OpenCode. Add validation against the
configured package's CLI schema and warn when CLI or TUI settings do
not match the package version.
T3 Code 0.0.40 renamed enableAssistantStreaming to
enableLegacyTokenStreaming and drops the old key when reading
settings.json, so the userSettings example now sets
enableProviderUpdateChecks instead.
The desktop app writes client-settings.json without the legacy
{ settings = ...; } wrapper. It still reads a wrapped file, but then
ignores every top-level key, so with mutableClientSettings a wrapped
declaration hides the app's own changes. Write the clientSettings
example without the wrapper.
Codex refuses to load a config that redefines a built-in provider, and
ollama is one. Replace the custom provider config with the built-in
ollama provider.
Alistral 0.6.9 has no listenbrainz_url field and ignores it; the
ListenBrainz server is set with listenbrainz_domain. musicbrainz_url is
deprecated in favour of musicbrainz_server.
With mutableSettings, config.toml is merged recursively, so switching a
declared MCP server from command to url kept command and args next to
the new url, and switching back kept url and the HTTP options. Codex
refuses such a server and does not start: "failed to load bootstrap
configuration … url is not supported for stdio in
`
mcp_servers.<name>`".
When a declared server sets url or command, remove the keys that only
the other transport accepts. Keys both transports share, and those
Codex adds, such as tool approvals, are kept.
nixpkgs only builds Readest for Linux, so on Darwin the module needs
package = null to evaluate. Say so in the package option, as
programs.ghostty does.
Readest keeps settings.json in Tauri's app config directory, which on
Darwin is ~/Library/Application Support/com.bilingify.readest rather
than $XDG_CONFIG_HOME/com.bilingify.readest. The module wrote to the
latter, so declared settings had no effect on Darwin.
Source the OS and Home Manager POSIX environment scripts when Nushell
starts so runtime HOME and USER expansions and profile paths match managed
POSIX shells.
Add programs.t3code.server to run the headless server as a user service
with systemd on Linux and launchd on Darwin. Support extra arguments
and an optional environment file for runtime secrets.
Add tests for generated service files and launchd environment loading.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tealdeer starting from version 1.9.0 respects
the XDG directories spec on Darwin and uses `~/.config`
instead of `~/Library/Application Support` to read the config file.
Use the shell scripts shipped by the configured package instead of
starting fzf to print them. This removes the target executable invocation
from Nushell integration builds and startup generation in other shells.
Preserve legacy fish binding setup and optional completion files, and
document the package script layout required by shell integration.
The former skin alias generated skins/skin.yaml. Point users to the matching skins.skin entry so migrating preserves the filename and configuration structure.
Since 25.11, `programs.go.goPath`, `extraGoPaths`, `goBin`, and
`goPrivate` have been converted to `programs.go.env` variables. Remove
the conversions ahead of the 26.11 release; set `GOPATH`, `GOBIN`, and
`GOPRIVATE` under `programs.go.env` instead.
Setting a removed option now fails with an error that explains what
to do instead.
`programs.k9s.skin` was renamed to `programs.k9s.skins` in 24.05, and
`hotkey` and `plugin` became `hotKeys` and `plugins` in 25.11. Since
25.11 the module also writes `aliases`, `plugins`, and `views` under
their top-level YAML keys, and warned about the old nested `alias`,
`plugin`, and `k9s.views` keys.
Remove the aliases and those warnings ahead of the 26.11 release.
Configurations that still nest these keys already produced nested YAML;
they now do so without a warning.
Setting a removed option now fails with an error that explains what
to do instead.
`programs.mcfly.enableFuzzySearch` was replaced by
`programs.mcfly.fuzzySearchFactor` and has been converted with a warning
since at least 22.11. Remove the conversion ahead of the 26.11 release;
set `fuzzySearchFactor` directly.
Setting a removed option now fails with an error that explains what
to do instead.
`programs.broot.modal`, `programs.broot.verbs`, and
`programs.broot.skin` have been aliases for the matching
`programs.broot.settings` fields since at least 22.11. Remove them ahead
of the 26.11 release.
Setting a removed option now fails with an error that explains what
to do instead.
Entries in `programs.bat.themes` and `programs.bat.syntaxes` given as
file contents in a string have been deprecated in favor of `{ src; file;
}` attribute sets since 23.11. Accept only the attribute set form ahead
of the 26.11 release.
The `programs.exa` aliases for `programs.eza` date to 23.11, and Boolean
`programs.eza.icons` values have been deprecated since 24.11. Remove
both ahead of the 26.11 release; set `icons` to `"auto"`, `"always"`,
`"never"`, or `null`.
Setting a removed option now fails with an error that explains what
to do instead.
`programs.less.keys` has been an alias for `programs.less.config` since
25.11. Remove it ahead of the 26.11 release.
Setting a removed option now fails with an error that explains what
to do instead.
`programs.kitty.theme` was replaced by `programs.kitty.themeFile` in
24.11 and has been converted with a warning since. Remove the conversion
ahead of the 26.11 release.
The 2024 news entry about that change read `programs.kitty.theme` in its
condition, which would now fail to evaluate whenever news is generated,
so retire that entry's condition.
Setting a removed option now fails with an error that explains what
to do instead.
Upstream keychain 2.9.0 dropped `--agents` and `--inherit`, and Home
Manager has warned about `programs.keychain.agents` and
`programs.keychain.inheritType` since 25.11. Remove both options ahead
of the 26.11 release; removed-option errors explain that the flags are
gone.
The top-level `programs.ssh` options such as `forwardAgent`,
`serverAliveInterval`, and `controlPath` were deprecated in 25.11.
Remove their aliases ahead of the 26.11 release; set the native
directives under `programs.ssh.settings."*"` instead.
The `enableDefaultConfig` default and the newer `matchBlocks`
compatibility are unchanged.
Setting a removed option now fails with an error that explains what
to do instead.
`programs.direnv.enableNixDirenvIntegration` has been an alias for
`programs.direnv.nix-direnv.enable` since 21.11. Remove it ahead of the
26.11 release.
Setting a removed option now fails with an error that explains what
to do instead.
`programs.bash.enableAutojump` has been an alias for
`programs.autojump.enable` since at least 20.09. Remove it ahead of the
26.11 release.
Setting a removed option now fails with an error that explains what
to do instead.
Remove the `enableSyntaxHighlighting` alias from 23.11, the
`enableAutosuggestions` alias from 24.05, the `zproof` alias, and the
`initExtra`, `initExtraFirst`, and `initExtraBeforeCompInit` options
deprecated in 25.05 in favor of `initContent`. Each now fails with a
removed-option error that names its replacement; for the init options,
that includes the `initContent` order to use.
Relative `dotDir` and `history.path` values, deprecated in 25.11, now
fail an assertion instead of being resolved against the home directory.
History paths may still contain shell variables, and neither assertion
applies while zsh is disabled.
`programs.anki.sync.passwordFile` was renamed to `sync.keyFile` in 25.11
and now points at `programs.anki.profiles."User 1".sync.keyFile`. Remove
the alias ahead of the 26.11 release; the other `programs.anki.sync`
aliases, deprecated in 26.05, stay.
Setting a removed option now fails with an error that explains what
to do instead.
ashell 0.5.0, released in June 2025, moved its configuration from YAML
to `ashell/config.toml`. Since 25.11 Home Manager has written YAML for
older packages and TOML for newer ones. Nixpkgs 25.11 already ships
0.6.0 and 26.05 ships 0.8.0, so drop the YAML path and, like the vicinae
module, fail an assertion when `programs.ashell.package` is older than
0.5.0.
`programs.ashell.settings` no longer accepts null. Only the YAML format
could serialize it; with TOML it already failed to build.
Replace the YAML test with one for the version assertion.
ashell 0.5.0 switched its TOML configuration to snake_case keys, and
since 25.11 Home Manager has converted camelCase keys in
`programs.ashell.settings` for TOML configurations, with a warning.
Remove the conversion ahead of the 26.11 release; camelCase keys are
now written as given.
Drop the test that only exercised the conversion.
Since 25.11, setting `programs.hyprpanel.settings.theme.name` has warned
that named themes are no longer loaded and that theme contents belong
directly under `programs.hyprpanel.settings.theme`. Remove the warning
ahead of the 26.11 release.
`programs.rtorrent.settings` has been an alias for
`programs.rtorrent.extraConfig` since at least 22.11. Remove it ahead of
the 26.11 release.
Setting a removed option now fails with an error that explains what
to do instead.
`programs.msmtp.extraConfig` and `programs.msmtp.extraAccounts` were
deprecated in 25.11 in favor of `programs.msmtp.configContent`, ordered
with `lib.mkBefore` or `lib.mkAfter`. Remove them ahead of the 26.11
release; removed-option errors point to the replacement.
The `accounts.email.accounts.<name>.lieer` options
`dropNonExistingLabels`, `ignoreTagsRemote`, `ignoreTagsLocal`,
`timeout`, and `replaceSlashWithDot` have been aliases for the native
settings under `lieer.settings` since at least 21.11. Remove them ahead
of the 26.11 release.
`programs.neomutt.binds.*.map` and `programs.neomutt.macros.*.map` have
accepted a single menu string with a deprecation warning since 21.05.
Accept only lists of menus ahead of the 26.11 release, for example
`map = [ "index" ];`.
Plugin names given as strings have been deprecated in favor of packages
since at least 19.09, with a warning and a lookup in `pkgs.vimPlugins`.
Remove the lookup and accept only packages ahead of the 26.11 release;
use values such as `pkgs.vimPlugins.vim-airline`.