1# Release 24.11 (“Vicuña”, 2024.11/28) {#sec-release-24.11}
2
3<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
4
5## Highlights {#sec-release-24.11-highlights}
6
7- Nix was updated to 2.24, which brings a lot of improvements and fixes. See the release notes for
8 [2.19](https://nix.dev/manual/nix/latest/release-notes/rl-2.19),
9 [2.20](https://nix.dev/manual/nix/latest/release-notes/rl-2.20),
10 [2.21](https://nix.dev/manual/nix/latest/release-notes/rl-2.21),
11 [2.22](https://nix.dev/manual/nix/latest/release-notes/rl-2.22),
12 [2.23](https://nix.dev/manual/nix/latest/release-notes/rl-2.23),
13 [2.24](https://nix.dev/manual/nix/latest/release-notes/rl-2.24).
14 Notable changes include improvements to Git fetching, documentation comment support in `nix-repl> :doc`, as well as many quality of life additions.
15
16- There have been significant changes to macOS support.
17 - The build environment has been redesigned to be closer to a native Xcode toolchain, enabling us to provide all SDKs from macOS Sierra 10.12 to macOS Sequoia 15, simplify build definitions, and build more software without hacks or patching.
18 Although compatibility shims for the old SDK scheme are provided, some builds may break, and the old mechanisms will be removed by 25.11 at the latest.
19 See the [Darwin section](https://nixos.org/manual/nixpkgs/stable/#sec-darwin) of the Nixpkgs manual for details of the new scheme and how to use it, and [the announcement on Discourse](https://discourse.nixos.org/t/the-darwin-sdks-have-been-updated/55295) for more information on the changes and benefits.
20
21 - **This will be the last release of Nixpkgs to support macOS Sierra 10.12 to macOS Catalina 10.15.**
22 Starting with release 25.05, the minimum supported version will be macOS Big Sur 11, and we cannot guarantee that packages will continue to work on older versions of macOS.
23 Users on old macOS versions should consider upgrading to a supported version (potentially using [OpenCore Legacy Patcher](https://dortania.github.io/OpenCore-Legacy-Patcher/) for old hardware) or installing NixOS.
24 If neither of those options are viable and you require new versions of software, [MacPorts](https://www.macports.org/) supports versions back to Mac OS X Snow Leopard 10.6.
25
26- This will be the last release of Nixpkgs to support versions of CUDA prior to CUDA 12.0.
27 These versions only work with old compiler versions that will be unsupported by the time of the Nixpkgs 25.05 release.
28 In the future, users should expect CUDA versions to be dropped as the compiler versions they require leave upstream support windows.
29
30- Convenience options for `amdgpu`, the open source driver for Radeon cards, are now available under [`hardware.amdgpu`](#opt-hardware.amdgpu.initrd.enable).
31
32- [AMDVLK](https://github.com/GPUOpen-Drivers/AMDVLK), AMD's open source Vulkan driver, is now available to be configured under the {option}`hardware.amdgpu.amdvlk` option.
33 This also allows configuring runtime settings for AMDVLK, including enabling experimental features.
34
35- The `moonlight-qt` package (for [Moonlight game streaming](https://moonlight-stream.org/)) now has HDR support on Linux systems.
36
37- [Sched-ext](https://github.com/sched-ext/scx), a Linux kernel feature to run schedulers in userspace, is now available [`services.scx`](options.html#opt-services.scx.enable).
38 Requires Linux kernel version 6.12 or later.
39
40- PostgreSQL now defaults to major version 16.
41
42- GNOME has been updated to version 47. Refer to the [release notes](https://release.gnome.org/47/) for more details.
43
44- `authelia` has been upgraded to version 4.38. This version brings several features and improvements which are detailed in the [release blog post](https://www.authelia.com/blog/4.38-release-notes/).
45 This release also deprecates some configuration keys which are likely to be removed in version 5.0.0.
46
47- `netbird` has been updated to 0.31.1. This adds a built-in relay server which is not yet supported by the NixOS module, as well as a metrics endpoint for both the management and signal services. The default metrics port for the `signal` service has been changed from `9090` to `9091` to prevent a port conflict with the management server. This can be changed with their respective `metricsPort` as needed. Refer to the [release notes](https://github.com/netbirdio/netbird/releases/tag/v0.31.1) and [this pull request](https://github.com/NixOS/nixpkgs/pull/354032#issuecomment-2480925927) for more information.
48
49- `compressDrv` can compress selected files in a derivation. `compressDrvWeb` compresses files for common web server usage (`.gz` with `zopfli`, `.br` with `brotli`).
50
51- [`hardware.display`](#opt-hardware.display.edid.enable) is a new module implementing workarounds for misbehaving monitors
52 by setting up custom EDID files and forcing kernel/framebuffer modes.
53
54- [`services.displayManager.ly`](#opt-services.displayManager.ly.enable) is a new module for configuring the display manager [ly](https://github.com/fairyglade/ly),
55 a TUI-based replacement for SDDM and LightDM meant for window manager users.
56
57- `srcOnly` was rewritten to be more readable, have additional warnings in the event that something is probably wrong, use the `stdenv` provided by the derivation, and Noogle-compatible documentation was added.
58
59- The default sound server for most graphical sessions has been switched from PulseAudio to PipeWire.
60 Users that want to keep using PulseAudio will want to set `services.pipewire.enable = false;` and `hardware.pulseaudio.enable = true;`.
61 There is currently no plan to fully deprecate and remove PulseAudio, however, PipeWire should generally be preferred for new installs.
62
63- The Rust rewrite of the `switch-to-configuration` program is now used for system activation by default.
64 If you experience any issues, please report them.
65 The original Perl script is deprecated and is planned for removal in the 25.05 release. It will remain accessible until then by setting `system.switch.enableNg` to `false`.
66
67- Support for mounting filesystems from block devices protected with [dm-verity](https://docs.kernel.org/admin-guide/device-mapper/verity.html)
68 was added through the [`boot.initrd.systemd.dmVerity`](#opt-boot.initrd.systemd.dmVerity.enable) option.
69
70- The [Xen Project Hypervisor](https://xenproject.org) is once again available as a virtualisation option under [`virtualisation.xen`](#opt-virtualisation.xen.enable).
71 - This release includes Xen [4.19.0](https://wiki.xenproject.org/wiki/Xen_Project_4.19_Release_Notes) and support for booting the hypervisor on EFI systems.
72 ::: {.warning}
73 Booting into the Xen Project Hypervisor through a legacy BIOS bootloader or with the legacy script-based Stage 1 initrd have been **deprecated**. Only EFI booting and the new systemd-based Stage 1 initrd are supported.
74 :::
75 - The `qemu-xen-traditional` component has been deprecated by the upstream Xen Project, and is no longer included in the Xen build.
76 - The OCaml-based Xen Store can now be configured using [`virtualisation.xen.store.settings`](#opt-virtualisation.xen.store.settings).
77 - The `virtualisation.xen.bridge` options have been deprecated in this release cycle. Users who need network bridges are encouraged to set up their own networking configurations.
78
79- A new option [`systemd.enableStrictShellChecks`](#opt-systemd.enableStrictShellChecks) has been added. When enabled, all systemd scripts generated by NixOS will
80 be checked with [shellcheck](https://www.shellcheck.net) and any errors or warnings will cause the build to fail.
81 This affects all scripts that have been created through the `script`, `reload`, `preStart`, `postStart`, `preStop` and `postStop` options for systemd services.
82 This does not affect commandlines passed directly to `ExecStart`, `ExecReload`, `ExecStartPre`, `ExecStartPost`, `ExecStop` or `ExecStopPost`.
83 It therefore also does not affect systemd units that are coming from packages and that are not defined through the NixOS config.
84 This option is disabled by default, and although some services have already been fixed, it is still likely that you will encounter build failures when enabling this.
85 We encourage people to enable this option when they are willing and able to submit fixes for potential build failures to nixpkgs.
86 The option can also be enabled or disabled for individual services using the `enableStrictShellChecks` option on the service itself, which will take precedence over the global setting.
87
88## New Modules {#sec-release-24.11-new-modules}
89
90- [hardware.block](options.html#hardware-block.defaultScheduler) allows configuration of I/O schedulers for block devices.
91
92- [KMonad](https://github.com/kmonad/kmonad), an advanced keyboard remapping utility. Available as [services.kmonad](#opt-services.kmonad.enable).
93
94- [Coral](https://coral.ai/), hardware support for Coral.ai Edge TPU devices. Available as [hardware.coral.usb.enable](#opt-hardware.coral.usb.enable) and [hardware.coral.pcie.enable](#opt-hardware.coral.pcie.enable).
95
96- [Cyrus IMAP](https://github.com/cyrusimap/cyrus-imapd), an email, contacts and calendar server. Available as [services.cyrus-imap](#opt-services.cyrus-imap.enable) service.
97
98- [TaskChampion Sync-Server](https://github.com/GothenburgBitFactory/taskchampion-sync-server), a [Taskwarrior 3](https://taskwarrior.org/docs/upgrade-3/) sync server. Available as [services.taskchampion-sync-server](#opt-services.taskchampion-sync-server.enable).
99
100- [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr), a proxy server to bypass Cloudflare protection. Available as [services.flaresolverr](#opt-services.flaresolverr.enable).
101
102- [Whisparr](https://wiki.servarr.com/en/whisparr), an adult movie collection manager for Usenet and BitTorrent users. Available as [services.whisparr](#opt-services.whisparr.enable).
103
104- [Gancio](https://gancio.org/), a shared agenda for local communities. Available as [services.gancio](#opt-services.gancio.enable).
105
106- [Goatcounter](https://www.goatcounter.com/), an easy web analytics platform with no tracking of personal data. Available as [services.goatcounter](options.html#opt-services.goatcounter.enable).
107
108- [Privatebin](https://github.com/PrivateBin/PrivateBin/), a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Available as [services.privatebin](#opt-services.privatebin.enable).
109
110- [UWSM](https://github.com/Vladimir-csp/uwsm), a wayland session manager to wrap Wayland compositors into useful systemd units such as `graphical-session.target`. Available as [programs.uwsm](#opt-programs.uwsm.enable).
111
112- [Open-WebUI](https://github.com/open-webui/open-webui), a user-friendly WebUI for LLMs. Available as [services.open-webui](#opt-services.open-webui.enable).
113
114- [Quickwit](https://quickwit.io), a sub-second search & analytics engine on cloud storage. Available as [services.quickwit](options.html#opt-services.quickwit.enable).
115
116- [Userborn](https://github.com/nikstur/userborn), a service for declarative
117 user management. This can be used instead of the `update-users-groups.pl`
118 Perl script and/or systemd-sysusers. This is now recommended over
119 systemd-sysusers to achieve a system without Perl, as it can create normal
120 users and change passwords. Available as [services.userborn](#opt-services.userborn.enable).
121
122- [g810-led](https://github.com/MatMoul/g810-led), a LED controller for Logitech G keyboards. Available as [services.g810-led](options.html#opt-services.g810-led.enable).
123
124- [Hatsu](https://github.com/importantimport/hatsu), a self-hosted bridge that interacts with Fediverse on behalf of your static site. Available as [services.hatsu](options.html#opt-services.hatsu.enable).
125
126- [Soteria](https://github.com/ImVaskel/soteria), a polkit authentication agent to handle elevated prompts for any desktop environment. Normally this should only be used on DEs or WMs that do not provide a graphical polkit frontend on their own. Available as [`security.soteria`](#opt-security.soteria.enable).
127
128- [Flood](https://flood.js.org/), a beautiful WebUI for various torrent clients. Available as [services.flood](options.html#opt-services.flood.enable).
129
130- [Niri](https://github.com/YaLTeR/niri), a scrollable-tiling Wayland compositor. Available as [programs.niri](options.html#opt-programs.niri.enable).
131
132- [Firefly-iii Data Importer](https://github.com/firefly-iii/data-importer), a data importer for Firefly-III. Available as [services.firefly-iii-data-importer](options.html#opt-services.firefly-iii-data-importer.enable).
133
134- [Dashy](https://dashy.to), an open source, highly customizable, easy to use, privacy-respecting dashboard app. Available as [services.dashy](options.html#opt-services.dashy).
135
136- [QGroundControl], a ground station support and configuration manager for the PX4 and APM Flight Stacks. Available as [programs.qgroundcontrol](options.html#opt-programs.qgroundcontrol.enable).
137
138- [Eintopf](https://eintopf.info), a community event and calendar web application. Available as [services.eintopf](options.html#opt-services.eintopf.enable).
139
140- [`pay-respects`](https://codeberg.org/iff/pay-respects), a terminal command correction program, alternative to `thefuck`, written in Rust. Available as [programs.pay-respects](options.html#opt-programs.pay-respects).
141
142- [Radicle](https://radicle.xyz), an open source, peer-to-peer code collaboration stack built on Git. Available as [services.radicle](#opt-services.radicle.enable).
143
144- [Ordinal](https://github.com/snu-sf/Ordinal), A library for ordinal numbers in the Coq proof assistant.
145
146- [ddns-updater](https://github.com/qdm12/ddns-updater), a service with a WebUI to update DNS records periodically for many providers. Available as [services.ddns-updater](#opt-services.ddns-updater.enable).
147
148- [Immersed](https://immersed.com/), a closed-source coworking platform. Available as [programs.immersed](#opt-programs.immersed.enable).
149
150- [HomeBox](https://github.com/sysadminsmedia/homebox), an inventory and organization system built for the home user. Available as [services.homebox](#opt-services.homebox.enable).
151
152- [evremap](https://github.com/wez/evremap), a keyboard input remapper for Linux/Wayland systems. Available as [services.evremap](options.html#opt-services.evremap).
153
154- [matrix-hookshot](https://matrix-org.github.io/matrix-hookshot), a Matrix bot for connecting to external services. Available as [services.matrix-hookshot](#opt-services.matrix-hookshot.enable).
155
156- [Renovate](https://github.com/renovatebot/renovate), a dependency updating tool for various Git forges and language ecosystems. Available as [services.renovate](#opt-services.renovate.enable).
157
158- [Music Assistant](https://music-assistant.io/), a music library manager for your offline and online music sources that can stream to a wide range of supported players. Available as [services.music-assistant](#opt-services.music-assistant.enable).
159
160- [zeronsd](https://github.com/zerotier/zeronsd), a DNS server for ZeroTier users. Available with [services.zeronsd.servedNetworks](#opt-services.zeronsd.servedNetworks).
161
162- [Collabora Online](https://www.collaboraonline.com/), a collaborative online office suite based on LibreOffice technology. Available as [services.collabora-online](options.html#opt-services.collabora-online.enable).
163
164- [wg-access-server](https://github.com/freifunkMUC/wg-access-server/), an all-in-one WireGuard VPN solution with a WebUI for connecting devices. Available as [services.wg-access-server](#opt-services.wg-access-server.enable).
165
166- [Pingvin Share](https://github.com/stonith404/pingvin-share), a self-hosted file sharing platform and an alternative for WeTransfer. Available as [services.pingvin-share](#opt-services.pingvin-share.enable).
167
168- [Envision](https://gitlab.com/gabmus/envision), a UI for building, configuring and running Monado, the open source OpenXR runtime. Available as [programs.envision](#opt-programs.envision.enable).
169
170- [Localsend](https://localsend.org/), an open source cross-platform alternative to AirDrop. Available as [programs.localsend](#opt-programs.localsend.enable).
171
172- [Gatus](https://github.com/TwiN/gatus), an automated developer-oriented status page. Available as [services.gatus](#opt-services.gatus.enable).
173
174- [cryptpad](https://cryptpad.org/), a privacy-oriented collaborative office suite, has been added back. Available as [services.cryptpad](#opt-services.cryptpad.enable).
175
176- [realm](https://github.com/zhboner/realm), a simple, high performance relay server written in Rust. Available as [services.realm](#opt-services.realm.enable).
177
178- [Gotenberg](https://gotenberg.dev), an API server for converting files to PDFs that can be used alongside Paperless-ngx. Available as [services.gotenberg](options.html#opt-services.gotenberg.enable).
179
180- [Suricata](https://suricata.io/), a free and open source, mature, fast and robust network threat detection engine. Available as [services.suricata](options.html#opt-services.suricata.enable).
181
182- [Playerctld](https://github.com/altdesktop/playerctl), a daemon to track media player activity. Available as [services.playerctld](options.html#opt-services.playerctld.enable).
183
184- [Glance](https://github.com/glanceapp/glance), a self-hosted dashboard that puts all your feeds in one place. Available as [services.glance](options.html#opt-services.glance.enable).
185
186- [Apache Tika](https://github.com/apache/tika), a toolkit that detects and extracts metadata and text from over a thousand different file types. Available as [services.tika](options.html#opt-services.tika.enable).
187
188- [Misskey](https://misskey-hub.net/en/), an interplanetary microblogging platform. Available as [services.misskey](options.html#opt-services.misskey.enable).
189
190- [Improved File Manager (IFM)](https://github.com/misterunknown/ifm), a single-file web-based file manager. Available as [services.ifm](options.html#opt-services.ifm.enable).
191
192- [OpenGFW](https://github.com/apernet/OpenGFW), an implementation of the Great Firewall on Linux. Available as [services.opengfw](#opt-services.opengfw.enable).
193
194- [Rathole](https://github.com/rapiz1/rathole), a lightweight and high-performance reverse proxy for NAT traversal. Available as [services.rathole](#opt-services.rathole.enable).
195
196- [Proton Mail bridge](https://proton.me/mail/bridge), a desktop application that runs in the background, encrypting and decrypting messages as they enter and leave your computer. Available as [services.protonmail-bridge](#opt-services.protonmail-bridge.enable).
197
198- [chromadb](https://www.trychroma.com/), an open-source AI application database with batteries included. Available as [services.chromadb](options.html#opt-services.chromadb.enable).
199
200- [bitmagnet](https://bitmagnet.io/), a self-hosted BitTorrent indexer, DHT crawler, content classifier and torrent search engine with WebUI, GraphQL API and Servarr stack integration. Available as [services.bitmagnet](options.html#opt-services.bitmagnet.enable).
201
202- [Wakapi](https://wakapi.dev/), a time tracking software for programmers. Available as [services.wakapi](#opt-services.wakapi.enable).
203
204- [foot](https://codeberg.org/dnkl/foot), a fast, lightweight and minimalistic Wayland terminal emulator. Available as [programs.foot](#opt-programs.foot.enable).
205
206- [ToDesk](https://www.todesk.com/linux.html), a remote desktop application. Available as [services.todesk](#opt-services.todesk.enable).
207
208- [Dependency Track](https://dependencytrack.org/), an intelligent Component Analysis platform that allows organizations to identify and reduce risk in the software supply chain. Available as [services.dependency-track](options.html#opt-services.dependency-track.enable).
209
210- [Immich](https://github.com/immich-app/immich), a self-hosted photo and video backup solution. Available as [services.immich](#opt-services.immich.enable).
211
212- [saunafs](https://saunafs.com), a distributed POSIX file system. Available as [services.saunafs](options.html#opt-services.saunafs.enable).
213
214- [obs-studio](https://obsproject.com/), a free and open source software for video recording and live streaming. Available as [programs.obs-studio](#opt-programs.obs-studio.enable).
215
216- [Veilid](https://veilid.com), a privacy-focused, headless server for data sharing and messaging on a peer-to-peer network. Available as [services.veilid](#opt-services.veilid.enable).
217
218- [Fedimint](https://github.com/fedimint/fedimint), a module based system for building federated applications (Federated E-Cash Mint). Available as [services.fedimintd](#opt-services.fedimintd).
219
220- [tiny-dfr](https://github.com/WhatAmISupposedToPutHere/tiny-dfr), a dynamic function row daemon for the Touch Bar found on some Apple laptops. Available as [hardware.apple.touchBar.enable](options.html#opt-hardware.apple.touchBar.enable).
221
222- [Swapspace](https://github.com/Tookmund/Swapspace), a dynamic swap space manager that turns your unused free space into swap automatically. Available as [services.swapspace](#opt-services.swapspace.enable).
223
224- [Zapret](https://github.com/bol-van/zapret), a DPI bypass tool. Available as [services.zapret](options.html#opt-services.zapret.enable).
225
226- [Glances](https://github.com/nicolargo/glances), an open-source system cross-platform monitoring tool. Available as [services.glances](options.html#opt-services.glances).
227
228## Backward Incompatibilities {#sec-release-24.11-incompatibilities}
229
230- Nixpkgs now requires Nix 2.3.17 or newer to allow for zstd compressed binary artifacts.
231
232- The `sound` options have been removed or renamed, as they had a lot of unintended side effects. See [below](#sec-release-24.11-migration-sound) for details.
233
234- The NVIDIA driver no longer defaults to the proprietary kernel module with versions >= 560. You will need to manually set `hardware.nvidia.open` to select the proprietary or open modules.
235
236- The `intel` driver for the X server (`services.xserver.videoDrives = [ "intel" ]`) is no longer functional due to incompatibilities with the latest Mesa version.
237 All users are strongly encouraged to switch to the generic `modesetting` driver (the default one) whenever possible, for more information see the manual chapter on [Intel Graphics](#sec-x11--graphics-cards-intel) and issue [#342763](https://github.com/NixOS/nixpkgs/issues/342763).
238
239- The `intel-compute-runtime` package dropped support for older GPUs, and only supports 12th Gen and newer from now on.
240 Intel GPUs from Gen 8,9 and 11 need to use the `intel-compute-runtime-legacy1` package in `hardware.graphics.extraPackages`.
241
242- The `(buildPythonPackage { ... }).override` and `(buildPythonPackage { ... }).overrideDerivation` attributes is now deprecated and removed in favour of `overridePythonAttrs` and `lib.overrideDerivation`.
243 This change does not affect the override interface of most Python packages, as [`<pkg>.override`](https://nixos.org/manual/nixpkgs/unstable/#sec-pkg-override) provided by `callPackage` shadows such a locally-defined `override` attribute.
244 The `<pkg>.overrideDerivation` attribute of Python packages called with `callPackage` will also remain available after this change.
245
246- All Cinnamon and XApp packages have been moved to top-level (i.e., `cinnamon.nemo` is now `nemo`).
247
248- All GNOME packages have been moved to top-level (i.e., `gnome.nautilus` is now `nautilus`).
249
250- `transmission` has been aliased with a `trace` warning to `transmission_3`, since [Transmission 4 has been released last year](https://github.com/transmission/transmission/releases/tag/4.0.0) and Transmission 3 will eventually go away -- this is meant to make people aware of the new version. `services.transmission.package` now also defaults to `transmission_3`, as the upgrade can cause data loss in some cases (examples: [#5153](https://github.com/transmission/transmission/issues/5153), [#6796](https://github.com/transmission/transmission/issues/6796)). Please make sure to back up to your data directory if you may be affected:
251 - `transmission-gtk`: `~/.config/transmission`
252 - `transmission-daemon` using NixOS module: `${config.services.transmission.home}/.config/transmission-daemon` (defaults to `/var/lib/transmission/.config/transmission-daemon`)
253
254- The default `mongodb` version has been updated from 5.0 to 7.0.
255 For more information, see the compatibility changes for MongoDB [6.0](https://www.mongodb.com/docs/manual/release-notes/6.0-compatibility/) and [7.0](https://www.mongodb.com/docs/manual/release-notes/7.0-compatibility/).
256
257- `unifi` has been updated to UniFi 8.
258 `unifi7` was removed as it is vulnerable to CVE-2024-42025 and required a version of MongoDB that has reached end of life.
259
260- `androidenv.androidPkgs_9_0` has been removed. It is replaced with `androidenv.androidPkgs` for a more complete Android SDK, including support for Android 9 and later.
261
262- The VirtualBox demo installer appliance has been removed.
263 Please use the standard installer ISOs instead.
264
265- `grafana` has been updated to version 11.3. This version doesn't support setting `http_addr` to a hostname anymore, an IP address is expected.
266
267- `deno` has been updated to Deno 2, which has breaking changes.
268 See the [migration guide](https://docs.deno.com/runtime/reference/migration_guide/) for details.
269
270- `gogs` has been removed. Upstream development has stalled and it has several
271 [critical vulnerabilities](https://github.com/gogs/gogs/issues/7777) that weren't addressed
272 within a year. Consider migrating to `forgejo` or `gitea`.
273
274- `knot-dns` has been updated to version 3.4.x. Check the [migration guide](https://www.knot-dns.cz/docs/latest/html/migration.html#upgrade-3-3-x-to-3-4-x) for breaking changes.
275
276- `mutmut` has been updated to version 3.0.5.
277
278- `services.kubernetes.kubelet.clusterDns` now accepts a list of DNS resolvers rather than a single string, bringing the module more in line with the upstream Kubelet configuration schema.
279
280- `bluemap` has changed the format used to store map tiles, and the database layout has been heavily modified. Upstream recommends a clean reinstallation: <https://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v5.2>. Unless you are using an SQL storage backend, this should only entail deleting the contents of `config.services.bluemap.coreSettings.data` (defaults to `/var/lib/bluemap`) and `config.services.bluemap.webRoot` (defaults to `/var/lib/bluemap/web`).
281
282- `wstunnel` has had a major version upgrade that entailed rewriting the program in Rust.
283 The module was updated to accommodate for breaking changes and breaking changes to the
284 module options were minimised as much as possible. Nonetheless, some were inevitable due
285 to changes in the upstream CLI. Certain options were moved from separate CLI arguments into
286 the forward specifications, and those options were also removed from the module's options.
287 Please consult the wstunnel man page for more details.
288 Also be aware that if you have set additional options in `services.wstunnel.{clients,servers}.<name>.extraArgs`,
289 they may have been modified or removed upstream.
290
291- `gnat` and `gnatPackages` now use GNAT 13 instead of GNAT 12. This matches
292 the default `gcc` version.
293
294- `percona-server_8_4` and `mysql84` now have password authentication via the deprecated `mysql_native_password` disabled by default. This authentication plugin can be enabled via a CLI argument again, for detailed instructions and alternative authentication methods [see upstream documentation](https://dev.mysql.com/doc/refman/8.4/en/native-pluggable-authentication.html). The config file directive `default_authentication_plugin` has been removed.
295
296- Percona has decided not to follow the LTS/ Innovation release scheme of upstream MySQL and thus [will only create releases for MySQL LTS versions](https://www.percona.com/blog/no-mysql-9-x-innovation-releases-from-percona/). Hence, the package names `percona-server_lts`, `percona-server_innovation`, `percona-xtrabackup_lts` and `percona-xtrabackup_innovation` are deprecated.
297 - `percona-server` and `percona-server_lts` now point towards the new LTS release `percona-server_8_4`. The previous LTS continues to be supported and is available as `percona-server_8_0`. The same is true for the supporting `percona-xtrabackup` tooling.
298
299- `clang-tools_<version>` packages have been moved into `llvmPackages_<version>` (i.e. `clang-tools_18` is now `llvmPackages_18.clang-tools`).
300 - For convenience, the top-level `clang-tools` attribute remains and is now bound to `llvmPackages.clang-tools`.
301 - Top-level `clang_tools_<version>` attributes are now aliases; these will be removed in a future release.
302
303- `buildbot` was updated to 4.0 and the AngularJS frontend replaced by a React frontend. See the [upstream release notes](https://docs.buildbot.net/current/manual/upgrading/4.0-upgrade.html).
304
305- `headscale` has been updated to version 0.23.0 which reworked large parts of the configuration, including DNS, Magic DNS prefixes and ACL policy files. See the [upstream changelog](https://github.com/juanfont/headscale/releases/tag/v0.23.0) for details.
306
307- `nginx` package no longer includes the `gd` and `geoip` dependencies. To re-enable them, override `nginx` with the options `withImageFilter = true;` and `withGeoIP = true;`.
308
309- `systemd.enableUnifiedCgroupHierarchy` has been removed.
310 In systemd 256, support for cgroup v1 ('legacy' and 'hybrid' hierarchies) is now considered obsolete and systemd will refuse to boot under it by default.
311 To forcibly re-enable cgroup v1 support, you can set `boot.kernelParams = [ "systemd.unified_cgroup_hierarchy=0" "SYSTEMD_CGROUP_ENABLE_LEGACY_FORCE=1" ]`.
312 This is not an officially supported configuration and might cause your system to become unbootable in future versions. You are on your own.
313
314- `nrfutil` -- which previously pointed to the now-deprecated `pc-nrfutil` Python package -- has been repackaged under the same name with the new nrfutil tool.
315
316- `openssh` and `openssh_hpn` are now compiled without Kerberos 5 / GSSAPI support in an effort to reduce the attack surface of the components. Users needing this support can
317 use the new `opensshWithKerberos` and `openssh_hpnWithKerberos` package flavors (e.g. `programs.ssh.package = pkgs.openssh_gssapi`).
318
319- `security.ipa.ipaHostname` now defaults to the value of `networking.fqdn` if
320 it is set, instead of the previous hardcoded default of
321 `${networking.hostName}.${security.ipa.domain}`.
322
323- The `MSMTP_QUEUE` and `MSMTP_LOG` environment variables accepted by `msmtpq` have been renamed to `MSMTPQ_Q` and `MSMTPQ_LOG` respectively.
324
325- The logrotate service has been hardened and now requires enabling `allowNetworking` if network access is required.
326
327- `mautrix-whatsapp` has been updated to version 0.11.0, which is a major rewrite of the bridge. Config file changes are required.
328
329- qBittorrent has been updated to major version 5, which drops support for Qt 5.
330 The `qbittorrent-qt5` package has been removed.
331
332- The fcgiwrap module now allows multiple instances running as distinct users.
333 The option `services.fgciwrap` now takes an attribute set of the
334 configuration of each individual instance.
335 This requires migrating any previous configuration keys from
336 `services.fcgiwrap.*` to `services.fcgiwrap.instances.some-instance.*`.
337 The ownership and mode of the UNIX sockets created by this service are now
338 configurable and private by default.
339 Processes also now run as a dynamically allocated user by default instead of
340 root.
341
342- The `mautrix-signal` module was adapted to incorporate the configuration changes that resulted from the update to the mautrix bridgev2 architecture. Pre-0.7.0 configurations should continue to work.
343 In case you want to update your configuration, make sure to check the NixOS manual.
344
345- `cargo-tauri` has been updated to major version 2. Please review [the migration guide](https://tauri.app/start/migrate/from-tauri-1/).
346 v1 of `cargo-tauri` is still available as `cargo-tauri_1`, but will be removed in future releases.
347
348- The nvidia driver no longer defaults to the proprietary driver starting with version 560. You will need to manually set `hardware.nvidia.open` to select the proprietary or open driver.
349
350- `postgresql_12` has been removed since it reached its end of life.
351
352- `postgresql` no longer accepts the `enableSystemd` override. Use `systemdSupport` instead.
353
354- `postgresql` was split into default and -dev outputs. To make this work without circular dependencies, the output of the `pg_config` system view has been removed. The `pg_config` binary is provided in the -dev output and still works as expected.
355
356- The arguments from [](#opt-services.postgresql.initdbArgs) now get shell-escaped.
357
358- `postgresql` is now [hardened by default](#module-services-postgres-hardening) using the common `systemd` settings for that.
359
360- The dhcpcd service (`networking.useDHCP`) has been hardened and now runs exclusively as the "dhcpcd" user.
361 Users that were relying on the root privileges in `networking.dhcpcd.runHook` will have to write specific [sudo](security.sudo.extraRules) or [polkit](security.polkit.extraConfig) rules to allow dhcpcd to perform privileged actions.
362
363 As part of these changes, the DHCP lease files directory has also been moved from `/var/db/dhcpcd` to `/var/lib/dhcpcd`. This migration is performed automatically, but users may have to update their backup configuration.
364
365- `singularity-tools` have the `storeDir` argument removed from its override interface and use `builtins.storeDir` instead.
366
367- The `mkLayer` and `shellScript` build helpers in `singularity-tools` are deprecated, as they are no longer involved in image-building. Maintainers will remove them in future releases.
368
369- The `rust.toTargetArch`, `rust.toTargetOs`, `rust.toTargetFamily`, `rust.toTargetVendor`, `rust.toRustTarget`, `rust.toRustTargetSpec`, `rust.toRustTargetSpecShort`, and `rust.IsNoStdTarget` functions are deprecated in favour of the `rust.platform.arch`, `rust.platform.os`, `rust.platform.target-family`, `rust.platform.vendor`, `rust.rustcTarget`, `rust.rustcTargetSpec`, `rust.cargoShortTarget`, `rust.cargoEnvVarTarget`, and `rust.isNoStdTarget` platform attributes respectively.
370
371- All Budgie and `budgiePlugins` packages have been moved to top-level (i.e.,
372 `budgie.budgie-desktop` is now `budgie-desktop` and `budgiePlugins.budgie-media-player-applet`
373 is now `budgie-media-player-applet`).
374
375- The method of safely handling secrets in the `networking.wireless` module has been changed to benefit from a [new feature](https://w1.fi/cgit/hostap/commit/?id=e680a51e94a33591f61edb210926bcb71217a21a) of `wpa_supplicant`.
376 The syntax to refer to secrets has changed slightly and the option `networking.wireless.environmentFile` has been replaced by `networking.wireless.secretsFile`; see the description of the latter for how to upgrade.
377
378- NetBox was updated to `>= 4.1.0`.
379 Have a look at the breaking changes
380 of the [4.0 release](https://github.com/netbox-community/netbox/releases/tag/v4.0.0)
381 and the [4.1 release](https://github.com/netbox-community/netbox/releases/tag/v4.1.0),
382 make the required changes to your database, if needed,
383 then upgrade by setting `services.netbox.package = pkgs.netbox_4_1;`
384 in your configuration.
385
386- `services.cgit` now runs as the cgit user by default instead of root.
387 This change requires granting access to the repositories to this user or
388 setting the appropriate one through `services.cgit.some-instance.user`.
389
390- All Oracle JDKs and JREs (`oraclejdk`, `oraclejdk8`, `oraclejre`, `oraclejre8`,
391 `jrePlugin`, `jre8Plugin`, `jdkdistro`, `oraclejdk8distro`, and `oraclejdk11`)
392 were dropped due to being unmaintained and heavily insecure. OpenJDK provides
393 compatible replacements for JDKs and JREs.
394
395- `gradle_6` was removed due to being [unsupported upstream as of 10 Feb 2023](https://endoflife.date/gradle).
396 Additionally, it had numerous security vulnerabilities that were only patched
397 in later versions, such as [CVE-2021-29429](https://nvd.nist.gov/vuln/detail/CVE-2021-32751),
398 [CVE-2021-29427](https://nvd.nist.gov/vuln/detail/CVE-2021-29427), [CVE-2021-29428](https://nvd.nist.gov/vuln/detail/CVE-2021-29428), and [CVE-2021-32751](https://nvd.nist.gov/vuln/detail/CVE-2021-32751).
399
400- `nvimpager` was updated to version 0.13.0, which changes the order of user and
401 nvimpager settings: user commands in `-c` and `--cmd` now override the
402 respective default settings because they are executed later.
403
404- `javacard-devkit` was dropped due to having a dependency on the Oracle JDK,
405 as well as being several years out-of-date.
406
407- Kubernetes `featureGates` have changed from a `listOf str` to `attrsOf bool`.
408 This refactor makes it possible to also disable feature gates, without having
409 to use `extraOpts` flags.
410
411 A previous configuration may have looked like this:
412
413 ```nix
414 {
415 featureGates = [ "EphemeralContainers" ];
416 extraOpts = pkgs.lib.concatStringsSep " " ([ ''--feature-gates="CSIMigration=false"'' ]);
417 }
418 ```
419
420 Using an attribute set instead, the new configuration would be:
421
422 ```nix
423 {
424 featureGates = {
425 EphemeralContainers = true;
426 CSIMigration = false;
427 };
428 }
429 ```
430
431- `pkgs.nextcloud27` has been removed as it has reached EOL.
432
433- The `environment.noXlibs` option has been removed. It was a common source of unexpected rebuilds and breakage that was often hard to diagnose.
434 If you need to disable certain libraries, you're encouraged to add your own overlay to your configuration that targets the packages you care about.
435
436- `frigate` was updated past 0.14.0. This release includes various breaking changes, so please review the [release notes](https://github.com/blakeblackshear/frigate/releases/tag/v0.14.0).
437 Most prominently, access to the web interface and API are now protected by authentication. Retrieve the auto-created
438 admin account from the `frigate.service` journal after upgrading.
439
440- `nodePackages.coc-python` was dropped, as [its upstream is unmaintained](https://github.com/neoclide/coc-python). The associated `vimPlugins.coc-python` was also dropped.
441 The upstream project recommends using `coc-pyright` or `coc-jedi` as replacements.
442
443- `forgejo` has been upgraded from version 7.0 to version 9.0, see the release notes for [8.0](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/RELEASE-NOTES.md#8-0-0) and [9.0](https://codeberg.org/forgejo/forgejo/milestone/7235).
444
445- `services.forgejo.mailerPasswordFile` has been deprecated by the drop-in replacement `services.forgejo.secrets.mailer.PASSWD`,
446 which is part of the new free-form `services.forgejo.secrets` option.
447 `services.forgejo.secrets` is a small wrapper over systemd's `LoadCredential=`. It has the same structure (sections/keys) as
448 `services.forgejo.settings` but takes file paths that will be read before service startup instead of some plaintext value.
449 `services.forgejo.package` now defaults to `forgejo-lts`, the Long Term Support version of Forgejo.
450
451- `forgejo` and `forgejo-lts` no longer support the opt-in feature [PAM (Pluggable Authentication Module)](https://forgejo.org/docs/latest/user/authentication/#pam-pluggable-authentication-module).
452
453- `gitea` no longer supports the opt-in feature [PAM (Pluggable Authentication Module)](https://docs.gitea.com/usage/authentication#pam-pluggable-authentication-module).
454
455- `vuze` was removed because it is unmaintained upstream and insecure (CVE-2018-13417).
456 BiglyBT is a maintained fork.
457
458- `services.ddclient.use` has been deprecated: `ddclient` now supports separate IPv4 and IPv6 configuration. Use `services.ddclient.usev4` and `services.ddclient.usev6` instead.
459
460- `services.pgbouncer` systemd service is now configured with `Type=notify-reload` and allows reloading configuration without process restart. PgBouncer configuration options were moved to the freeform type option under [`services.pgbouncer.settings`](#opt-services.pgbouncer.settings).
461
462- Docear was removed because it was unmaintained upstream.
463 JabRef, Zotero, or Mendeley are potential replacements.
464
465- `nodePackages.coc-metals` was removed due to being deprecated upstream.
466 `vimPlugins.nvim-metals` is its official replacement.
467
468- `matrix-sliding-sync` was removed because it has been replaced by the simplified sliding sync functionality introduced in matrix-synapse 114.0.
469
470- `nodePackages.coc-tslint`, `vimPlugins.coc-tslint`, `nodePackages.coc-tslint-plugin`,
471 and `vimPlugins.coc-tslint-plugin` were removed due to being deprecated upstream. The
472 `nodePackages.coc-eslint` and `vimPlugins.coc-eslint` packages offer comparable
473 features for `eslint`, which replaced `tslint`.
474
475- Tcl packages have been moved into the `tclPackages` scope.
476
477- `teleport` has been upgraded from major version 15 to major version 16.
478 Refer to upstream [upgrade instructions](https://goteleport.com/docs/management/operations/upgrading/)
479 and [release notes for v16](https://goteleport.com/docs/changelog/#1600-061324).
480
481- `tests.overriding`'s `passthru.tests` has been restructured as an attribute set instead of a list, making individual tests accessible by their names.
482
483- `skk-dict` was split into multiple packages under `skkDictionaries`.
484 If in doubt of what to use, try `skkDictionaries.l`. As part of this change, the dictionaries
485 were moved from `$out/share` to `$out/share/skk`. The dictionaries also won't
486 be converted to UTF-8 unless the `useUtf8` package option is enabled; UTF-8
487 converted dictionaries will have the .utf8 suffix appended to its filename.
488
489- `vaultwarden` lost the capability to bind to privileged ports. If you rely on
490 this behavior, override the systemd unit to allow `CAP_NET_BIND_SERVICE` in
491 your configuration.
492
493- `services.invoiceplane.sites.<name>.extraConfig` was removed. Configuration must now be done
494 through the structured `services.invoiceplane.sites.<name>.settings` option.
495
496- `services.ollama.sandbox` has been replaced with options to configure
497 a static `user` and `group`. The `writablePaths` option has also been removed and
498 the models directory is now always exempt from sandboxing.
499
500- The `gns3-server` service now runs under the `gns3` system user
501 instead of a dynamically created one via `DynamicUser`.
502 The use of SUID wrappers is incompatible with SystemD's `DynamicUser` setting,
503 and GNS3 requires calling ubridge through its SUID wrapper to function properly.
504 This change requires to manually move the following directories:
505 * from `/var/lib/private/gns3` to `/var/lib/gns3`
506 * from `/var/log/private/gns3` to `/var/log/gns3`
507 and to change the ownership of these directories and their contents to `gns3` (including `/etc/gns3`).
508
509- Legacy package `stalwart-mail_0_6` was dropped, please note the
510 [manual upgrade process](https://github.com/stalwartlabs/mail-server/blob/main/UPGRADING.md)
511 before changing the package to `pkgs.stalwart-mail` in
512 [`services.stalwart-mail.package`](#opt-services.stalwart-mail.package).
513
514- `nomad_1_5` and `nomad_1_6` were dropped, as [they have reached end-of-life upstream](https://support.hashicorp.com/hc/en-us/articles/360021185113-Support-Period-and-End-of-Life-EOL-Policy). Evaluating them will throw an error.
515
516- The default `nomad` package has been updated to 1.8.x. For more information, see [breaking changes for Nomad 1.8](https://developer.hashicorp.com/nomad/docs/upgrade/upgrade-specific#nomad-1-8-0)
517
518- `androidndkPkgs` has been updated to `androidndkPkgs_26`.
519
520- Android NDK version 26 and SDK version 33 are now the default versions used for cross compilation to android.
521
522- `ankisyncd` package and its `services.ankisyncd` have been removed. Use [`services.anki-sync-server`](#opt-services.anki-sync-server.enable) instead.
523
524- `nodePackages.vscode-css-languageserver-bin`, `nodePackages.vscode-html-languageserver-bin`,
525 and `nodePackages.vscode-json-languageserver-bin` were dropped due to an unmaintained upstream.
526 The `vscode-langservers-extracted` package is a maintained drop-in replacement.
527
528- `nodePackages.prisma` has been replaced by `prisma`.
529
530- `fetchNextcloudApp` has been rewritten to use `fetchurl` rather than
531 `fetchzip`. This invalidates all existing hashes, but you can restore the old
532 behavior by passing it `unpack = true`.
533
534- `haskell.lib.compose.justStaticExecutables` now disallows references to GHC in its
535 output by default to alert users to closure size issues caused by
536 [#164630](https://github.com/NixOS/nixpkgs/issues/164630). See ["Packaging
537 Helpers" in the Haskell section of the Nixpkgs
538 manual](https://nixos.org/manual/nixpkgs/unstable/#haskell-packaging-helpers)
539 for information on working around `output '...' is not allowed to refer to
540 the following paths` errors caused by this change.
541
542- `services.stalwart-mail` now runs under the `stalwart-mail` system user
543 instead of a dynamic one via `DynamicUser` in order to avoid automatic
544 ownership changes on its large file store on service restart.
545 This change requires to manually move the state directory from
546 `/var/lib/private/stalwart-mail` to `/var/lib/stalwart-mail`, and to
547 change the ownership of the directory and its content to `stalwart-mail`.
548
549- `services.stalwart-mail` now uses RocksDB as the default storage backend
550 for `stateVersion` ≥ 24.11. It was previously using SQLite for structured
551 data and the filesystem for blobs.
552
553- `services.stargazer` has been hardened to improve security, but these
554 changes make break certain setups, particularly around traditional CGI.
555
556 - `services.stargazer.allowCgiUser` has been added, enabling
557 Stargazer's `cgi-user` option to work, which was previously broken.
558
559- `services.shiori` now requires the HTTP secret value `SHIORI_HTTP_SECRET_KEY` to be provided as an environment variable. `services.shiori.environmentFile` has been introduced to handle this:
560
561 ```
562 # This is how a environment file can be generated:
563 # $ printf "SHIORI_HTTP_SECRET_KEY=%s\n" "$(openssl rand -hex 16)" > /path/to/env-file
564 services.shiori.environmentFile = "/path/to/env-file";
565 ```
566
567- `/share/nano` is now only linked when `programs.nano.enable` is enabled.
568
569- PPD files for Utax printers were renamed (spaces replaced by underscores) in the newest `foomatic-db` package. Users of Utax printers might need to adapt their `hardware.printers.ensurePrinters.*.model` value to account for this.
570
571- `sqldeveloper` was dropped due to being severely out-of-date and having a dependency on
572 JavaFX for Java 8, which we do not support.
573
574- The `kvdo` kernel module package was removed as it was upstreamed in kernel version 6.9, where it is now called `dm-vdo`.
575
576- `libe57format` has been updated to `>= 3.0.0`, which contains some backward-incompatible API changes. See the [release note](https://github.com/asmaloney/libE57Format/releases/tag/v3.0.0) for more details.
577
578- `gitlab` deprecated support for *runner registration tokens* in GitLab 16.0, disabled their support in GitLab 17.0 and will
579 ultimately remove it in GitLab 18.0 (as outlined in the
580 [documentation](https://docs.gitlab.com/17.0/ee/ci/runners/new_creation_workflow.html#estimated-time-frame-for-planned-changes)).
581 After upgrading to GitLab >= 17.0, it is possible to re-enable support for registration tokens in the UI until GitLab 18.0.
582 Refer to the manual on [using registration tokens after GitLab 17.0](https://docs.gitlab.com/17.0/ee/ci/runners/new_creation_workflow.html#using-registration-tokens-after-gitlab-170).
583 GitLab administrators should migrate to the [new runner registration workflow](https://docs.gitlab.com/17.0/ee/ci/runners/new_creation_workflow.html#using-registration-tokens-after-gitlab-170)
584 with *runner authentication tokens* until the release of GitLab 18.0.
585
586- `gitlab` has been updated from 16.x to 17.x and requires `postgresql` >= 14.9, as stated in the [documentation](https://docs.gitlab.com/17.1/ee/install/requirements.html#postgresql-requirements). Check the [upgrade guide](#module-services-postgres-upgrading) in the NixOS manual on how to upgrade your PostgreSQL installation.
587
588- `gitaly` (part of `gitlab`) is now using the bundled `git` package instead of `pkgs.git`, to maintain compatibility with GitLab.
589
590- `nixos/gitlab` no longer adds `pkgs.git` to `environment.systemPackages` by default.
591
592- The `replay-sorcery` package and module was removed as it unmaintained upstream. Consider using `gpu-screen-recorder` or `obs-studio` instead.
593
594- A few options of `services.samba` have been moved from `extraConfig` and `configText` to the new freeform option `settings` and renamed, e.g.:
595 - `services.samba.invalidUsers` to `services.samba.settings.global."invalid users"`
596 - `services.samba.securityType` to `services.samba.settings.global."security type"`
597 - `services.samba.shares` to `services.samba.settings`
598 - `services.samba.enableWinbindd` to `services.samba.winbindd.enable`
599 - `services.samba.enableNmbd` to `services.samba.nmbd.enable`
600
601- `zx` was updated to v8, which introduces several breaking changes.
602 See the [v8 changelog](https://github.com/google/zx/releases/tag/8.0.0) for more information.
603
604- `feishin` removed support for Navidrome `< v0.53.2` due to an API change. See the [v0.10.0 release notes](https://github.com/jeffvli/feishin/releases/tag/v0.10.0) for more information.
605
606- `services.dnscrypt-wrapper` was removed, as the project has been effectively unmaintained since 2018. Moreover, the NixOS module had to rely on an abandoned version of `dnscrypt-proxy` v1 for the rotation of keys.
607 To wrap a resolver with DNSCrypt, you can instead use `dnsdist`. See `services.dnsdist.dnscrypt`
608
609- The `portunus` package and service do not support weak password hashes anymore.
610 If you installed Portunus on NixOS 23.11 or earlier, upgrade to NixOS 24.05 first to get support for strong password hashing.
611 Then, follow the instructions on the [upstream release notes](https://github.com/majewsky/portunus/releases/tag/v2.0.0) to upgrade all existing user accounts to strong password hashes.
612 If you need to upgrade to 24.11 without having completed the migration, consider the security implications of weak password hashes on your user accounts, and add the following to your configuration:
613 ```nix
614 {
615 services.portunus.package = pkgs.portunus.override { libxcrypt = pkgs.libxcrypt-legacy; };
616 services.portunus.ldap.package = pkgs.openldap.override { libxcrypt = pkgs.libxcrypt-legacy; };
617 }
618 ```
619
620- The default value of `services.kubernetes.kubelet.hostname` is now lowercased.
621 Explicitly set `kubelet.hostname` to `networking.fqdnOrHostName` to get back
622 the old default behavior.
623
624- Docker now defaults to 27.x, as version 24.x stopped receiving security updates and bug fixes after [February 1, 2024](https://github.com/moby/moby/pull/46772#discussion_r1686464084).
625
626- `keycloak` was updated to version 25, which introduces new hostname related options.
627 See [Upgrading Guide](https://www.keycloak.org/docs/25.0.1/upgrading/#migrating-to-25-0-0) for instructions.
628
629- `programs.vim.defaultEditor` now only works if `programs.vim.enable` is enabled.
630
631- `services.mautrix-meta` was updated to [0.4](https://github.com/mautrix/meta/releases/tag/v0.4.0). This release makes significant changes to the settings format. If you have custom settings you should migrate them to the new format. Unfortunately upstream provides little guidance for how to do this, but [the auto-migration code](https://github.com/mautrix/meta/blob/f5440b05aac125b4c95b1af85635a717cbc6dd0e/cmd/mautrix-meta/legacymigrate.go#L23) may serve as a useful reference. The NixOS module should warn you if you still have any old settings configured.
632
633- The `nodePackages.shout` package has been removed because it was deprecated upstream in favor of `thelounge`.
634 The `shout` top-level attribute was an alias to this package.
635 The associated `services.shout` module has also been removed.
636
637- `prometheus-openldap-exporter` was removed, as it was unmaintained both upstream and in nixpkgs.
638
639- The `indi-full` package no longer contains non-free drivers.
640 To get the old collection of drivers use `indi-full-nonfree` or create your own collection of drivers by overriding indi-with-drivers.
641 E.g.: `pkgs.indi-with-drivers.override {extraDrivers = with pkgs.indi-3rdparty; [indi-gphoto];}`
642
643- `/share/vim-plugins` now only gets linked if `programs.vim.enable` is enabled
644
645- The `services.guix` module now manages trusted substitute servers
646 declaratively. Instead of `guix archive --authorize`, list keys with
647 `services.guix.substituters.authorizedKeys`. Default substitute servers can be
648 set via `services.guix.substituters.urls`.
649
650- The `tracy` package no longer works on X11, since it's moved to Wayland
651 support, which is the intended default behavior by Tracy maintainers.
652 X11 users have to switch to the new package `tracy-x11`.
653
654- `gollum` has been upgraded to major version 6. Please review their [migration notes](https://github.com/gollum/gollum/wiki/6.0-Release-Notes).
655
656- `services.prometheus.exporters.minio` option has been removed, as it's upstream implementation was broken and unmaintained.
657 Minio now has built-in [Prometheus metrics exposure](https://min.io/docs/minio/linux/operations/monitoring/collect-minio-metrics-using-prometheus.html), which can be used instead.
658
659- The `services.prometheus.exporters.tor` option has been removed, as its upstream implementation was broken and unmaintained.
660
661- `services.patroni.raft` has been removed, as Raft has been [deprecated by upstream since 3.0.0](https://github.com/patroni/patroni/blob/master/docs/releases.rst#version-300).
662
663- The `jd-cli` package was removed due to an inactive upstream and a dependency on the shut down
664 JCenter JAR repository.
665 Java decompilers already packaged in Nixpkgs include `bytecode-viewer` (GUI), `cfr` (CLI), and `procyon` (CLI).
666
667- The `jd-gui` package was removed due to an inactive upstream and a dependency on the end-of-life Gradle 6.
668 Java decompilers already packaged in Nixpkgs include `bytecode-viewer` (GUI), `cfr` (CLI), and `procyon` (CLI).
669
670- `services.roundcube.maxAttachmentSize` will multiply the value set with `1.37` to offset overhead introduced by the base64 encoding applied to attachments.
671
672- `services.mxisd` has been removed as both [mxisd](https://github.com/kamax-matrix/mxisd) and [ma1sd](https://github.com/ma1uta/ma1sd) are no longer maintained.
673 Consequently, the package `ma1sd` has also been removed.
674
675- The `rss-bridge` service drops the support to load a configuration file from `${config.services.rss-bridge.dataDir}/config.ini.php`.
676 Consider using the `services.rss-bridge.config` option instead.
677
678- `mikutter` has been removed, as the package was broken and had no maintainers in nixpkgs.
679
680- `xdg.portal.gtkUsePortal` has been removed, as it had been deprecated for over 2 years. Using the `GTK_USE_PORTAL` environment variable in this manner is not intended nor encouraged by the GTK developers, but can still be done manually via `environment.sessionVariables`.
681
682- Support for the legacy CUPS browsing and LDAP have been removed from `services.printing`. If `cups` or `ldap` are in the `BrowseRemoteProtocols` setting in `services.printing.browsedConf`, it needs to be removed.
683
684- `services.trust-dns` has been renamed to `services.hickory-dns`.
685
686- `services.prometheus.exporters.pgbouncer.connectionStringFile` has been removed since
687 it leaked the connection string (and thus potentially the DB password) into the cmdline
688 of process making it effectively world-readable.
689
690 Use [`services.prometheus.exporters.pgbouncer.connectionEnvFile`](#opt-services.prometheus.exporters.pgbouncer.connectionEnvFile) instead.
691
692- `lsh` and `services.lshd` have been removed as they had no maintainer in Nixpkgs and no upstream release in over a decade. It is recommended to migrate to `openssh` and `services.openssh`.
693
694- `ceph` has been upgraded to v19. See the [Ceph "squid" release notes](https://docs.ceph.com/en/latest/releases/squid/#v19-2-0-squid) for details and recommended upgrade procedure.
695
696- `services.frr` has been refactored to use upstream service scripts. The per-daemon configurations
697 have been removed in favour of an `integrated-vtysh-config` style config. The daemon submodules
698 now use the daemon name (e.g. `ospfd`) instead of the protocol name (`ospf`). The daemons `zebra`,
699 `mgmtd` and `staticd` are always enabled if a config is present. The `vtyListenAddress` and
700 `vtyListenPort` options have been removed; use `options` or `extraOptions` instead, respectively.
701
702- `opencv2` and `opencv3` have been removed, as they are obsolete and
703 were not used by any other package. External users are encouraged to
704 migrate to OpenCV 4.
705
706- `tvheadend` package and the `services.tvheadend` module have been
707 removed due to lack of maintenance in Nixpkgs and being stuck on
708 an unmaintained version that required FFmpeg 4. Please see the related [pull
709 request #332259](https://github.com/NixOS/nixpkgs/pull/332259) if you
710 are interested in maintaining a newer version.
711
712- `antennas` and `services.antennas` have been removed as they only work with `tvheadend` (see above).
713
714- `system.build.brightboxImage` has been removed as it no longer built and has not seen any maintenance in over 7 years (excluding tree-wide changes).
715
716- `services.syncplay` now exposes all currently available command-line arguments for `syncplay-server` as options, as well as a `useACMEHost` option for easy TLS setup.
717 The systemd service now uses `DynamicUser`/`StateDirectory` and the `user` and `group` options have been deprecated.
718
719- `openlens` was removed. It is recommended to use `lens-desktop` instead.
720
721- `services.dnsmasq.extraConfig` has been removed, as it had been deprecated for over 2 years. This option has been replaced by `services.dnsmasq.settings`.
722
723- The NixOS installation media no longer support the ReiserFS or JFS file systems by default.
724
725- Minimal installer ISOs are no longer built on the small channel.
726 Please obtain installer images from the full release channels.
727
728- The default FFmpeg version is now 7.1, and FFmpeg 5 has been removed.
729 Please prefer using the package variants without a version suffix,
730 or pin FFmpeg 6 or 4 if necessary for compatibility.
731 Note that we keep old versions around only as required
732 to support packages in the tree,
733 and FFmpeg 4 especially should be avoided in favour of newer versions
734 as it may be removed soon.
735
736- `openssl` now defaults to the latest version line `3.3.x`, instead of `3.0.x` before. While there should be no major code incompatibilities, newer OpenSSL versions typically strengthen the default security level. This means that you may have to explicitly allow weak ciphers, hashes and key lengths if necessary. See: [OpenSSL security level documentation](https://docs.openssl.org/3.3/man3/SSL_CTX_set_security_level/).
737
738- `isync` has been updated to version `1.5.0`, which introduces some breaking changes. See the [compatibility concerns](https://sourceforge.net/projects/isync/files/isync/1.5.0/) for more details.
739
740- Two new packages -- `gpauth` and `gpclient` from the 2.x version of the
741 GlobalProtect-openconnect project -- are added in parallel to
742 `globalprotect-openconnect`. The GUI components related to the project are
743 non-free and not packaged.
744
745- Compatible string matching for `hardware.deviceTree.overlays` has been changed to a more correct behavior. See [below](#sec-release-24.11-migration-dto-compatible) for details.
746
747- `rustic` was upgraded to `0.9.0`, which contains [breaking changes to the config file format](https://github.com/rustic-rs/rustic/releases/tag/v0.9.0).
748
749- `pkgs.formats.ini` and `pkgs.formats.iniWithGlobalSection` with
750 `listsAsDuplicateKeys` or `listToValue` no longer merge non-list values into
751 lists by default. Backwards-compatible behavior can be enabled with
752 `atomsCoercedToLists`.
753
754- Atlassian Server products have been removed, as support for the Atlassian Server
755 products ended in February 2024 and there was insufficient interest in
756 maintaining the Atlassian Data Center replacements:
757 - The `atlassian-bamboo` package
758 - The `atlassian-confluence` package and its `services.confluence` NixOS module
759 - The `atlassian-crowd` package and its `services.crowd` NixOS module
760 - The `atlassian-jira` package and its `services.jira` NixOS module
761
762- `python3Packages.nose` has been removed, as it has been deprecated and unmaintained for almost a decade and does not work on Python 3.12.
763 Please switch to `pytest` or another test runner/framework.
764
765- `dotnet-sdk`, `dotnet-runtime`, and all other dotnet packages now use a
766 wrapper package containing `bin/dotnet`, build hooks, etc. If you need to
767 reference the underlying dotnet distribution (DOTNET_ROOT) you should use e.g.
768 `dotnet-runtime.unwrapped`.
769
770- The root of dotnet distribution packages (DOTNET_ROOT) is now under e.g.
771 `${dotnet-sdk.unwrapped}/share/dotnet` instead of directly in the package
772 root. This is consistent with packaging guidelines and more friendly for FHS
773 environments.
774
775- `dotnet-sdk`, `dotnet-runtime`, and `dotnet-aspnetcore` now point to dotnet 8
776 rather than dotnet 6. For packages that still need dotnet 6, use
777 `dotnet-sdk_6`, etc.
778
779- torq has been removed because upstreamed went closed source.
780
781## Other Notable Changes {#sec-release-24.11-notable-changes}
782
783<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
784
785- The `zerocallusedregs` hardening flag is enabled by default on compilers that support it.
786
787- The `stackclashprotection` hardening flag has been added, though disabled by default.
788
789- The `pacret` hardening flag has been added, though disabled by default.
790
791- `cargoSha256` in `rustPlatform.buildRustPackage` has been deprecated in favor
792 of `cargoHash` which supports SRI hashes. See
793 [buildRustPackage: Compiling Rust applications with Cargo](https://nixos.org/manual/nixpkgs/unstable/#compiling-rust-applications-with-cargo)
794 for more information.
795
796- The `vendorHash` of Go packages built with `buildGoModule` can now be overridden with `overrideAttrs`.
797 `goModules`, `modRoot`, `vendorHash`, `deleteVendor`, and `proxyVendor` are now passed as derivation attributes.
798 `goModules` and `vendorHash` are no longer placed under `passthru`.
799
800- `buildFlags`/`buildFlagsArray` on `buildGoModule` have been deprecated. 24.11 is the last release where `buildGoModule` accepts these flags (while throwing a warning).
801 Use the [`ldflags`](https://nixos.org/manual/nixpkgs/unstable/#var-go-ldflags) and/or [`tags`](https://nixos.org/manual/nixpkgs/unstable/#var-go-tags) attributes or
802 [the environment](https://nixos.org/manual/nixpkgs/unstable/#ssec-go-environment) instead.
803
804- `buildGoPackage` has been deprecated. 24.11 is the last release with `buildGoPackage` available.
805
806- `hareHook` has been added as the language framework for Hare. From now on, it,
807 not the `hare` package, should be added to `nativeBuildInputs` when building
808 Hare programs.
809
810- `virtualisation.docker.liveRestore` has been renamed to `virtualisation.docker.daemon.settings."live-restore"` and turned off by default for state versions of at least 24.11.
811
812- Tailscale's `authKeyFile` can now have its corresponding parameters set through `config.services.tailscale.authKeyParameters`, allowing for non-ephemeral unsupervised deployment and more.
813 See [Registering new nodes using OAuth credentials](https://tailscale.com/kb/1215/oauth-clients#registering-new-nodes-using-oauth-credentials) for the supported options.
814
815- `nixosTests` now provide a working IPv6 setup for VLAN 1 by default.
816
817- Kanidm can now be provisioned using the new [`services.kanidm.provision`] option, but requires using a patched version available via `pkgs.kanidm.withSecretProvisioning`.
818
819- Kanidm previously had an incorrect systemd service type, causing dependent units with an `after` and `requires` directive to start before `kanidm*` finished startup. The module has now been updated in line with upstream recommendations.
820
821- [`services.jupyter`](#opt-services.jupyter.enable) is now compatible with `Jupyter Notebook 7`. See [the migration guide](https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html) for details.
822
823- The kubelet configuration file can now be amended with arbitrary additional content using the `services.kubernetes.kubelet.extraConfig` option.
824
825- The `services.seafile` module was updated to major version 11.
826 - As part of this upgrade, the database backend will be migrated to MySQL.
827 This process should be automatic, but in case of a botched migration,
828 old sqlite files are not removed and can be used to manually migrate the database.
829 - Additionally, the updated CSRF protection may prevent some users from logging in.
830 Specific origin addresses can be whitelisted using the `services.seafile.seahubExtraConf` option
831 (e.g. `services.seafile.seahubExtraConf = ''CSRF_TRUSTED_ORIGINS = ["https://example.com"]'';`).
832 Note that first solution of the [official FAQ answer](https://cloud.seatable.io/dtable/external-links/7b976c85f504491cbe8e/?tid=0000&vid=0000&row-id=BQhH-2HSQs68Nq2EW91DBA)
833 is not allowed by the `services.nginx` module's config-checker.
834
835- The new option `boot.binfmt.addEmulatedSystemsToNixSandbox` allows you to skip adding the emulated systems to `nix.settings.extra-platforms`. Now you can emulate foreign binaries locally while only building them on native remote builders.
836
837- The latest available version of Nextcloud is v30 (available as `pkgs.nextcloud30`). The installation logic is as follows:
838 - If [`services.nextcloud.package`](#opt-services.nextcloud.package) is specified explicitly, this package will be installed (**recommended**)
839 - If [`system.stateVersion`](#opt-system.stateVersion) is >=24.05, `pkgs.nextcloud29` will be installed by default.
840 - If [`system.stateVersion`](#opt-system.stateVersion) is >=24.11, `pkgs.nextcloud30` will be installed by default.
841 - Please note that an upgrade from v28 (or older) to v30 directly is not possible. Please upgrade to `nextcloud29` (or earlier) first. Nextcloud prohibits skipping major versions while upgrading. You can upgrade by declaring [`services.nextcloud.package = pkgs.nextcloud29;`](options.html#opt-services.nextcloud.package).
842
843- To facilitate dependency injection, the `imgui` package now builds a static archive using vcpkg' CMake rules.
844 The derivation now installs "impl" headers selectively instead of by a wildcard.
845 Use `imgui.src` if you just want to access the unpacked sources.
846
847- The new `boot.loader.systemd-boot.windows` option makes setting up dual-booting with Windows on a different drive easier.
848
849- The `boot.loader.raspberryPi` options were marked as deprecated in 23.11 and have now been removed.
850
851- Linux 4.19 has been removed because it will reach its end of life within the lifespan of 24.11.
852
853- Unprivileged access to the kernel syslog via `dmesg` is now restricted by default. Users wanting to keep an
854 unrestricted access to it can set `boot.kernel.sysctl."kernel.dmesg_restrict" = false`.
855
856- The `i18n.inputMethod` module introduces two new properties:
857 `enable` and `type`, for declaring whether to enable an alternative input method and defining which input method respectfully. The options available in `type` are the same as the existing `enabled` option. `enabled` is now deprecated, and will be removed in a future release.
858
859- `security.pam.u2f` now uses freeform options; all module options are now configurable through `security.pam.u2f.settings`.
860
861- `mikutter` was removed as the package was broken and had no maintainers.
862
863- `services.getty.autologinOnce` was added to limit the automatic login to once per boot and on the first tty only.
864 When using full disk encryption, this option allows to unlock the system without retyping the passphrase while keeping the other ttys protected.
865
866- Gollum was upgraded to major version 6. Read their [migration notes](https://github.com/gollum/gollum/wiki/6.0-Release-Notes).
867
868- The hooks `yarnConfigHook` and `yarnBuildHook` were added. These should replace `yarn2nix.mkYarnPackage` and other `yarn2nix` related tools. The motivation to get rid of `yarn2nix` tools is the fact that they are too complex and hard to maintain, and they rely upon too much Nix evaluation which is problematic if import-from-derivation is not allowed (see more details at [#296856](https://github.com/NixOS/nixpkgs/issues/296856). The transition from `mkYarnPackage` to `yarn{Config,Build}Hook` is tracked at [#324246](https://github.com/NixOS/nixpkgs/issues/324246).
869
870- `services.timesyncd.servers` now defaults to `null`, allowing systemd-timesyncd to use NTP servers advertised by DHCP.
871
872- `services.timesyncd.fallbackServers` was added and defaults to `networking.timeServers`.
873
874- Cinnamon has been updated to 6.2. Please check [upstream announcement](https://www.linuxmint.com/rel_wilma_whatsnew.php) for more details.
875 Following Mint 22 defaults, the Cinnamon module no longer ships `geary` and `hexchat` by default.
876
877- `zfs.latestCompatibleLinuxPackages` is deprecated and is now pointing at the default kernel. If using the stable LTS kernel (default `linuxPackages` is not possible then you must explicitly pin a specific kernel release. For example, `boot.kernelPackages = pkgs.linuxPackages_6_6`. Please be aware that non-LTS kernels are likely to go EOL before ZFS supports the latest supported non-LTS release, requiring manual intervention.
878
879- The `shadowstack` hardening flag has been added, though disabled by default.
880
881- `writeReferencesToFile` has been removed after its deprecation in 24.05. Use the trivial build helper `writeClosure` instead.
882
883- `xxd` is now provided by the `tinyxxd` package rather than `vim.xxd` to reduce closure size and vulnerability impact. Since it has the same options and semantics as Vim's `xxd` utility, there is no user impact. Vim's `xxd` remains available as the `vim.xxd` package.
884
885- `restic` module now has an option for inhibiting system sleep while backups are running, defaulting to off (not inhibiting sleep). Available as [`services.restic.backups.<name>.inhibitsSleep`](#opt-services.restic.backups._name_.inhibitsSleep).
886
887- Mattermost has been updated from 9.5 to 9.11 ESR. See the [changelog](https://docs.mattermost.com/about/mattermost-v9-changelog.html#release-v9-11-extended-support-release) for more details.
888
889- `cargo-tauri.hook` was introduced to help users build [Tauri](https://tauri.app/) projects. It is meant to be used alongside
890 `rustPlatform.buildRustPackage` and Node hooks such as `npmConfigHook`, `pnpm.configHook`, and the new `yarnConfig`
891
892- `power.ups` now powers off UPSs during a power outage event.
893 This saves UPS battery and ensures that host(s) get back up again when power comes back, even in the scenario when the UPS would have had enough capacity to keep power on during the whole power outage.
894 If you like the old behaviour of keeping the UPSs on (and emptying the battery) after the host(s) have shut down, and risk not getting a power cycle event to get the host(s) back up, set `power.ups.upsmon.settings.POWERDOWNFLAG = null;`.
895
896- `nixos-firewall-tool` now supports nftables in addition to iptables and is installed by default when NixOS firewall is enabled.
897
898- Support for *runner registration tokens* has been [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/380872)
899 in `gitlab-runner` 15.6 and is expected to be removed in `gitlab-runner` 18.0. Configuration of existing runners
900 should be changed to using *runner authentication tokens* by configuring
901 {option}`services.gitlab-runner.services.<name>.authenticationTokenConfigFile` instead of the former
902 {option}`services.gitlab-runner.services.<name>.registrationConfigFile` option.
903
904- `iproute2` now has libbpf support.
905
906 If you use extensions that are not packaged in nixpkgs, please review whether it still works
907 with the current settings and adjust accordingly if needed.
908
909- `nix.channel.enable = false` no longer implies `nix.settings.nix-path = []`.
910 Since Nix 2.13, a `nix-path` set in `nix.conf` cannot be overridden by the `NIX_PATH` configuration variable.
911
912- ZFS now imports its pools in `postResumeCommands` rather than `postDeviceCommands`. If you had `postDeviceCommands` scripts that depended on ZFS pools being imported, those now need to be in `postResumeCommands`.
913
914- `services.automatic-timezoned.enable = true` will now set `time.timeZone = null`.
915 This is to avoid silently shadowing a user's explicitly defined timezone without recognition on the user's part.
916
917- `services.localtimed.enable = true` will now set `time.timeZone = null`.
918 This is to avoid silently shadowing a user's explicitly defined timezone without recognition on the user's part.
919
920- `qgis` and `qgis-ltr` are now built without `grass` by default. `grass` support can be enabled with `qgis.override { withGrass = true; }`.
921
922- `virtualisation.incus` module gained new `incus-user.service` and `incus-user.socket` systemd units. It is now possible to add a user to `incus` group instead of `incus-admin` for increased security.
923
924- `buildDotnetModule` now uses JSON-based instead of nix-based lockfiles.
925 Support for nix-based lockfiles has been deprecated and will be dropped on release 25.11.
926
927- `buildDotnetModule.fetch-deps` now generates a JSON lockfile by default.
928 A nix-based lockfile will be generated if one existed before for compatibility, however it has been deprecated and will be dropped on release 25.11.
929
930- `freecad` now supports addons and custom configuration in nix-way, which can be used by calling `freecad.customize`.
931
932- `buildNimSbom` was added as an alternative to `buildNimPackage`. `buildNimSbom` uses [SBOMs](https://cyclonedx.org/) to generate packages whereas `buildNimPackage` uses a custom JSON lockfile format.
933
934## Detailed Migration Information {#sec-release-24.11-migration}
935
936### `sound` options removal {#sec-release-24.11-migration-sound}
937
938The `sound` options have been largely removed, as they are unnecessary for most modern setups, and cause issues when enabled.
939
940If you set `sound.enable` in your configuration:
941 - If you are using Pulseaudio or PipeWire, simply remove that option
942 - If you are not using an external sound server, and want volumes to be persisted across shutdowns, set `hardware.alsa.enablePersistence = true` instead
943
944If you set `sound.enableOSSEmulation` in your configuration:
945 - Make sure it is still necessary, as very few applications actually use OSS
946 - If necessary, set `boot.kernelModules = [ "snd_pcm_oss" ]`
947
948If you set `sound.extraConfig` in your configuration:
949 - If you are using another sound server, like Pulseaudio, JACK or PipeWire, migrate your configuration to that
950 - If you are not using an external sound server, set `environment.etc."asound.conf".text = yourExtraConfig` instead
951
952If you set `sound.mediaKeys` in your configuration:
953 - Preferably switch to handling media keys in your desktop environment/compositor
954 - If you want to maintain the exact behavior of the option, use the following snippet
955
956```nix
957{
958 services.actkbd =
959 let
960 volumeStep = "1%";
961 in
962 {
963 enable = true;
964 bindings = [
965 # "Mute" media key
966 {
967 keys = [ 113 ];
968 events = [ "key" ];
969 command = "${alsa-utils}/bin/amixer -q set Master toggle";
970 }
971
972 # "Lower Volume" media key
973 {
974 keys = [ 114 ];
975 events = [
976 "key"
977 "rep"
978 ];
979 command = "${alsa-utils}/bin/amixer -q set Master ${volumeStep}- unmute";
980 }
981
982 # "Raise Volume" media key
983 {
984 keys = [ 115 ];
985 events = [
986 "key"
987 "rep"
988 ];
989 command = "${alsa-utils}/bin/amixer -q set Master ${volumeStep}+ unmute";
990 }
991
992 # "Mic Mute" media key
993 {
994 keys = [ 190 ];
995 events = [ "key" ];
996 command = "${alsa-utils}/bin/amixer -q set Capture toggle";
997 }
998 ];
999 };
1000}
1001```
1002
1003### `hardware.deviceTree.overlays` compatible string matching {#sec-release-24.11-migration-dto-compatible}
1004
1005The original compatible string implementation in older NixOS versions relied on substring matching,
1006which is incorrect for overlays with multiple compatible strings and other cases.
1007
1008The new behavior is consistent with what other tools already do - the overlay is considered applicable if,
1009and only if, _any_ of the compatible strings in the overlay match _any_ of the compatible strings in the DT.
1010
1011To provide some examples:
1012
1013| Overlay `compatible` | DT `compatible` | Pre-24.11 behavior | Correct behavior | Notes |
1014|----------------------|-----------------|--------------------|------------------|--------------------------------------------|
1015| `"foo"` | `"foo", "bar"` | match | match | Most common use case does not change |
1016| `"foo"` | `"foobar"` | match | no match | Substrings should not be matched |
1017| `"foo bar"` | `"foo", "bar"` | match | no match | Separators should not be matched to spaces |
1018| `"foo", "bar"` | `"baz", "bar"` | no match | match | One compatible string matching is enough |
1019
1020Note that this also allows writing overlays that explicitly apply to multiple boards.
1021
1022## Nixpkgs Library {#sec-release-24.11-lib}
1023
1024### Breaking changes {#sec-release-24.11-lib-breaking}
1025
1026- [`lib.escapeShellArg`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.strings.escapeShellArg) and [`lib.escapeShellArgs`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.strings.escapeShellArgs): Arguments that don't need to be escaped won't be anymore, which is not breaking according to the functions documentation, but it can cause breakages if used for the non-intended use cases.
1027- [`lib.warn msg val`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.trivial.warn) (and its relatives [`lib.warnIf`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.trivial.warnIf) and [`lib.warnIfNot`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.trivial.warnIfNot)) now require `msg` to be a string to match the behavior of the new [`builtins.warn`](https://nix.dev/manual/nix/2.25/language/builtins.html?highlight=warn#builtins-warn).
1028- `lib.mdDoc`: Removed after deprecation in the previous release.
1029
1030### Additions and Improvements {#sec-release-24.11-lib-additions-improvements}
1031
1032New and extended interfaces:
1033- [`lib.fromHexString`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.trivial.fromHexString): Convert a hexadecimal string to it's integer representation.
1034- `lib.network.ipv6.fromString`: Parse an IPv6 address.
1035- [`lib.getLicenseFromSpdxIdOr`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.meta.getLicenseFromSpdxIdOr): Get the corresponding attribute in `lib.licenses` from an SPDX ID or fall back to the given default value.
1036- [`lib.licensesSpdx`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.meta.licensesSpdx): Mapping of SPDX ID to the attributes in `lib.licenses`.
1037- [`lib.getFirstOutput`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.attrsets.getFirstOutput): Like `getOutput` but with a list of fallback output names.
1038- [`lib.getInclude`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.attrsets.getInclude) and [`lib.getStatic`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.attrsets.getStatic): Get a package’s `include`/`static` output.
1039- [`lib.trim`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.strings.trim) and [`lib.trimWith`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.strings.trimWith): Remove leading and trailing whitespace from a string.
1040- [`lib.meta.defaultPriority`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.meta.defaultPriority): The default priority of packages in Nix.
1041- [`lib.toExtension`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.fixedPoints.toExtension): Convert to an extending function (overlay).
1042- `lib.fetchers.normalizeHash`: Convert an attrset containing one of `hash`, `sha256` or `sha512` into one containing `outputHash{,Algo}` as accepted by `mkDerivation`.
1043- `lib.fetchers.withNormalizedHash`: Wraps a function which accepts `outputHash{,Algo}` into one which accepts `hash`, `sha256` or `sha512`.
1044- Various builtins are now reexported in a more standard way:
1045 - `lib.map` -> `lib.lists.map` -> `builtins.map`
1046 - `lib.intersectAttrs` -> `lib.attrsets.intersectAttrs` -> `builtins.intersectAttrs`
1047 - `lib.removeAttrs` -> `lib.attrsets.removeAttrs` -> `builtins.removeAttrs`
1048 - `lib.match` -> `lib.strings.match` -> `builtins.match`
1049 - `lib.split` -> `lib.strings.split` -> `builtins.split`
1050 - `lib.typeOf` -> `builtins.typeOf`
1051 - `lib.unsafeGetAttrPos` -> `builtins.unsafeGetAttrPos`
1052- [`lib.cli.toGNUCommandLine`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.cli.toGNUCommandLine) now supports the `optionValueSeparator` argument attribute to control the key-value separator for arguments.
1053
1054Documentation improvements:
1055- Much of the documentation has been migrated to the [standard doc-comment format](https://github.com/NixOS/rfcs/pull/145), including [`lib.derivations`](https://nixos.org/manual/nixpkgs/unstable/#sec-functions-library-derivations), [`lib.fixedPoints`](https://nixos.org/manual/nixpkgs/unstable/#sec-functions-library-fixedPoints), [`lib.gvariant`](https://nixos.org/manual/nixpkgs/unstable/#sec-functions-library-gvariant), [`lib.filesystem`](https://nixos.org/manual/nixpkgs/unstable/#sec-functions-library-filesystem), [`lib.strings`](https://nixos.org/manual/nixpkgs/unstable/#sec-functions-library-strings), [`lib.meta`](https://nixos.org/manual/nixpkgs/unstable/#sec-functions-library-meta).
1056- [`lib.generators` documentation](https://nixos.org/manual/nixpkgs/unstable/#sec-functions-library-generators) is now improved and rendered in the manual.
1057- [`lib.cli` documentation](https://nixos.org/manual/nixpkgs/unstable/#sec-functions-library-cli) is now improved and rendered in the manual.
1058- [`lib.composeExtensions`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.fixedPoints.composeExtensions) and [`lib.composeManyExtensions`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.fixedPoints.composeManyExtensions) documentation is now improved.
1059- [`lib.importTOML`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.trivial.importTOML) and [`lib.importJSON`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.trivial.importJSON)'s documentation now have an example.
1060
1061Module System:
1062- `lib.importApply`: New function, imports a Nix expression file much like the module system would, after passing an extra positional argument to the function in the file.
1063- Improve error message when accessing an option that isn't defined.
1064- `lib.types.anything`: Don't fail to merge when specifying the same list multiple times.
1065- Improve error when loading a flake as a module.
1066
1067### Deprecations {#sec-release-24.11-lib-deprecations}
1068
1069- [`lib.options.mkPackageOptionMD`](https://nixos.org/manual/nixpkgs/unstable#function-library-lib.options.mkPackageOptionMD) is now obsolete; use the identical [`lib.options.mkPackageOption`](https://nixos.org/manual/nixpkgs/unstable#function-library-lib.options.mkPackageOption) instead.
1070- `lib.misc.mapAttrsFlatten` is now formally deprecated and will be removed in future releases; use the identical [`lib.attrsets.mapAttrsToList`](https://nixos.org/manual/nixpkgs/unstable#function-library-lib.attrsets.mapAttrsToList) instead.
1071- `lib.isInOldestRelease`: Renamed to [`oldestSupportedReleaseIsAtLeast`](https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.trivial.oldestSupportedReleaseIsAtLeast) and deprecated.
1072
1073## NixOS Wiki {#sec-release-24.11-wiki}
1074
1075The official NixOS Wiki at [wiki.nixos.org](https://wiki.nixos.org/) was launched in April 2024, featuring
1076content initially copied from the community wiki. The wiki enhances the official documentation, linking to
1077existing resources and providing a categorization system for easy navigation, and is guided by a new "Manual
1078of Style" — a contribution guide and enhanced templates. It offers a wealth of new information, including
1079articles on applications, desktop environments, and a growing number of translations in multiple languages.