Herdr writes settings changes back to config.toml, which a read-only Nix store link prevents.
Add opt-in mutableSettings using the shared merger and cleanup helpers. Preserve undeclared settings, reload Herdr after merging, and keep immutable settings as the default.
Cover generated TOML, activation ordering, custom XDG paths, empty and disabled configurations, and nullable package handling.
Use mutableSettings for Mise and Vicinae, and mutableSnippets for Pet.
These controls follow the same naming pattern as existing mutable options,
regardless of whether configuration uses merging or a read-only layer.
Keep Mise's existing name as a deprecated alias. Rename the freshly
introduced Pet and Vicinae options directly before the next stable
release, and update their tests and user-facing documentation. Defaults
and configuration behavior remain unchanged.
Keep native settings and MCP configuration writable while applying
declared values. Treat unspecified permission lists as absent in mutable
native mode so activation does not reset undeclared application choices.
Explicit lists, including empty lists, replace saved lists. Keep
immutable and legacy defaults unchanged.
Nixpkgs 26.05 already ships Vicinae with the modern configuration formats, so retaining compatibility with the previous release no longer needs the pre-0.17 paths.
Require Vicinae 0.17.0 or later, remove legacy JSON themes and layer-shell environment handling, and direct useLayerShell users to the native setting. Keep the separate 0.20.6 requirement for mutable configuration.
Apply declarations through the native overrides layer while leaving user
settings writable. Respect effective file targets and quote service
environment assignments so paths containing spaces or percent signs
reach the daemon unchanged.
Load declared snippets through the native read-only snippet layer while
leaving user snippets writable. Initialize a missing user file without
replacing existing contents, and keep the default snippet arrangement.
Keep the application configuration writable while applying declared
settings. Preserve undeclared state and use ordinary collision handling
when returning to linked YAML configuration.
Keep credentials and application configuration writable while applying
declared values. Seed the required token map and use the same Linux XDG
path in both modes, preserving the macOS location and existing home.file
overrides. Restore byte-identical files before linking read-only settings.
Preserve interactive settings and keymaps while applying declarations
during activation. Parse existing commented JSON using the packaged
reader and keep the default file ownership.
Keep user settings and marketplace registrations writable while applying
declared values. Seed required marketplace metadata only where missing,
preserving saved timestamps and update flags. Retain the immutable
default.
Check effective file overrides, trust-state parsing, and custom paths without changing the opt-in default. Describe byte-identical relinking accurately during the filename migration.
Copilot CLI ignores trusted folders in settings.json and keeps them in
config.json, its own state file that also holds login and plugin
state. The module therefore left them out of settings.json, which left
no declarative way to trust folders.
Add a trustedFolders option that merges the declared folders into
config.json's trustedFolders list at activation. Only that key is
changed: folders trusted from inside Copilot CLI are kept, and removing
a folder from Nix does not untrust it. config.json is read as JSON5
because Copilot CLI starts it with a comment header, and a new file is
created with mode 600 as Copilot CLI does. The warning for the old
settings keys now points to the new option.
Copilot CLI replaces settings.json when it saves a setting, for example
after changing the model or theme from inside the CLI. With a linked
file that replaces the link, and the next activation reports a
collision.
Add an opt-in mutableSettings option that merges the declared settings
into a writable settings.json after linkGeneration with
mkImpureConfigMerger instead of linking it. Existing files are read as
JSON5, since Copilot CLI accepts comments there. Declared values take
precedence, keys later removed from the settings stay in the file, and
comments and formatting are not preserved. The default still links the
file.
Turning the option off links the file again. mkImpureConfigCleanup
removes a merged copy Copilot CLI has not changed so the link can
replace it; a changed one is reported as a collision.
Mention the option in the news entry and release note as the way to
keep a settings.json Copilot CLI already wrote.
Since Copilot CLI 1.0.35, user settings live in settings.json and
config.json holds internal state. On startup, 1.0.88 moves user keys
out of a Home Manager config.json into settings.json and rewrites
config.json as a regular file, replacing the link, so the next switch
collides on config.json.
Link the declared settings as settings.json instead and stop managing
config.json, including the firstLaunchAt workaround that only existed
for it. A read-only settings.json link survives startup; Copilot CLI
replaces it only when it saves a setting.
Copilot CLI drops trusted_folders from settings.json and moves
trustedFolders into its own state in config.json, rewriting
settings.json and so replacing a linked file. Leave both keys out of
the file, warn when either is set, and do not manage the file when
they are the only settings. Document the canonical allowedUrls and
deniedUrls names.
The old config.json link is removed by linkGeneration when it still
points into a generation; a regular file left by Copilot CLI stays for
it to manage. The news entry and release note tell users whose Copilot
CLI already wrote a regular settings.json to remove it before
switching, since the new link would collide with it.
Plex mpv shim writes conf.json when it loads settings and whenever a
setting changes from its menu or a Plex remote. A store-linked
configuration makes those writes fail and loses the generated client
UUID across restarts.
Add an opt-in mutableSettings option that merges the declared settings
into a writable conf.json after linkGeneration instead, keeping keys
the application writes. The application keeps its settings in memory
and saves all of them, so a running instance would write old values
back over the merge; in this mode the service restarts when the
declared settings change, and the merge is ordered before
reloadSystemd so the restarted service reads it. The option
description notes the short window before that restart and that
turning the option off again collides with the writable file. The
default keeps linking the file from the Nix store, so existing
configurations are unchanged. Also correct the file name in the
settings description, which said config.json.
Test what the module wires up in each mode: the linked file by
default, and in mutable mode the merge placement, its target, the
generated settings, and the restart trigger; enabling the option with
empty settings changes nothing. The merge itself is covered by the
helper's tests. Announce the option.
Merge declared settings into writable TOML files with mkImpureConfigMerger. Preserve user settings and support transitions between mutable and immutable configurations.
Co-authored-by: Austin Horstman <khaneliman12@gmail.com>
Add programs.astroid.settings for native JSON configuration and
generate the configuration file from it.
The extraConfig and externalEditor options become deprecated aliases
into settings. Home Manager no longer writes its bundled template;
Astroid's built-in defaults match it except editor.markdown_processor.
Astroid accounts still supply account settings, the notmuch path, and
the GPG path as per-key defaults. Empty settings write no file.
externalEditor now merges at ordinary priority instead of replacing
the editor keys, and priorities on extraConfig sections apply to the
section as a unit. The release notes describe both changes.
Add programs.notmuch.settings for native INI configuration with list
values, and generate the configuration file from it.
The new.ignore, new.tags, maildir.synchronizeFlags, search.excludeTags,
and extraConfig options become deprecated aliases into settings.
Settings carry no static defaults: new.tags, new.ignore, and
maildir.synchronize_flags fall back to notmuch's identical defaults.
State versions before 26.11 keep search.exclude_tags = deleted;spam and
write database.path even without email accounts. Enabled email
accounts supply database.path, and notmuch-enabled accounts the user
identity. Null values and empty sections are omitted so a derived
value can be removed.
extraConfig no longer overwrites modeled values unconditionally: forced
definitions win and ordinary collisions fail. The release notes
describe the migration.
Mbsync, lieer, and mujmap now write settings.new.ignore directly, so
they do not trigger deprecation warnings.
Add programs.borgmatic.backups.<name>.settings for native borgmatic
YAML and generate each backup file from it.
The location, storage, retention, and consistency options and the
section extraConfig options become deprecated aliases into settings.
Warnings name the affected backup. Legacy configurations without
overlapping keys produce the same YAML, and Home Manager symlink
exclusions still append to exclude_from.
Drop the assertions that rejected backups setting both or neither of
sourceDirectories and patterns, so native source patterns and
database-only backups work.
Fixes#8000
The `mpd-mpris` module used different names for the options than
`mpd-mpris` itself, causing some confusion.
Additionally, this makes some more improvements in the module, largely
based on the upstream module [^1], which includes:
- Removing the `services.mpd-mpris.mpd` namespace, it did not serve any
purpose. This also got rid of the `services.mpd-mpris.mpd.useLocal`
option, just don't configure `host` to connect to the local instance.
- Removing the `password` option, it should have never gotten into this
module because it will write the password to the world readable nix
store. A new `password-file` option was added to replace it.
- Moving the settings to a new freeform submodule under the key
`services.mpd-mpris.settings`.
- Replacing the `renderCmd` function with a use of `lib.cli.toCommandLine`.
While I diverged quite a bit from the upstream module, much credit for
these changes goes to @natsukagami!
[^1] 90c4264e58/nix/module.nix
Fixes an issue introduced in [1] where gtk4 apps would print the
following warning:
> Error setting gtk-interface-color-scheme in
> /home/mithic/.config/gtk-4.0/settings.ini: Key file contains key
> “gtk-interface-color-scheme” which has a value that cannot be
> interpreted.
The value should be set to the nickname ("light" or "dark" in this
case), rather than the actual numerical value of the enum. This lookup
happens at [2].
These nicknames appear to be undocumented and automatically generated at
compile time, but in general they appear to follow the pattern where an
enum value FOO_BAR_BAZ_QUUX of the enum FOO_BAR has nickname "baz-quux".
Regardless, they can be looked up in the generated file
gtktypebuiltins.c (it unfortunately appears that nix only keeps
gtktypebuiltins.h, which does not contain the nicknames).
[1] https://github.com/nix-community/home-manager/pull/7763
[2] https://gitlab.gnome.org/GNOME/gtk/-/blob/4.22.4/gtk/gtksettings.c#L1863
Expose native filter, retriever, and destination configuration while
retaining account defaults and legacy boolean aliases. Preserve tuple
rendering and allow complete native retriever configuration without an
IMAP account block.
Generate managed JSON from canonical settings while preserving legacy editor and sync conversions. Use the shared overlay helper for extraConfig priorities and effective-key detection.
Keep activation-time merging into the writable application file, including unmanaged settings and historical null and empty-string filtering.
Adds programs.yopass for managing the yopass CLI configuration file
(~/.config/yopass/defaults.yml), with an NMT test verifying the
generated settings.
Assisted-by: Claude Fable 5
Expose cover matching and notification settings without duplicating the
upstream schema. Preserve legacy options and MPD integration through
per-key migration helpers and retain path-valued music directories.
Generate grobi.conf from unrestricted JSON settings so root fields such as on_failure and nested rule values are configurable.
Migrate rules and executeAfter through the ordered settings rename helper, retaining historical empty defaults, alias reads, priorities, and list ordering.
Leave native defaults to Rofi instead of injecting location and offset
values. Preserve explicit legacy settings and theme selection, and omit
configuration files when no effective settings or theme are supplied.
Generate the Rasi configuration block from merged native settings. Preserve legacy option conversions, overlay precedence, numeric defaults, and theme ordering.
Use the shared settings overlay helper for extraConfig forwarding and key detection. Keep package integration and the existing serializer unchanged.
The old cloud-only mappings cannot express root-level cache and client
settings. Expose complete YAML documents while preserving existing
configurations through standard rename aliases.