需在 NixOS unstable 上使用;配置通过各服务官方 REST API 下发,服务需先可访问;反向代理、VPN 等为可选模块需自行启用
nixflix
kiriwalawrenMPL-2.0活跃维护用 NixOS 和 flake 一键搭起整套家庭媒体服务器,把 Jellyfin 播放和 Sonarr、Radarr 等下载管理组件打包成可复现配置,省去手动拼装 homelab 的麻烦。
NixOS Media Server Configuration
NixOS 上的声明式媒体服务器配置模块,自动打通 Starr 与 Jellyfin 服务间的连接
用 NixOS 和 flake 一键搭起整套家庭媒体服务器,把 Jellyfin 播放和 Sonarr、Radarr 等下载管理组件打包成可复现配置,省去手动拼装 homelab 的麻烦。
核心能力
- 用 NixOS 选项声明式配置各服务并通过 REST API 自动下发
- 预置 Sonarr、Radarr、Lidarr、Prowlarr 与 Jellyfin 模块
- 可选 PostgreSQL 作为 Arr 服务后端
- 内置 WireGuard 支持含 kill switch 与自定义 DNS
- 可配置 nginx 或 Caddy 反向代理并支持单服务退出
容易踩的坑
- v4.0.1最新正式版2026-11-05 · 2026-11-05 17:35 UTC
Fixed
[sonarr|radarr|lidarr]-notifications.serviceno longer fails with HTTP 400 whennixflix.jellyfin.network.localNetworkAddresses = [ "0.0.0.0" ](or"::"). The Jellyfin notifications, and Seerr's and Maintainerr's Jellyfin connections, now use127.0.0.1in that case instead of the wildcard address (#402)
- v4.0.02026-11-03 · 2026-11-03 18:49 UTC
查看更新说明
Breaking
- Web UIs now bind to
127.0.0.1(loopback) by default, so services are no longer reachable from your network unless you expose them explicitly: set the service's bind option to0.0.0.0or your LAN IP (e.g.nixflix.[radarr|sonarr|lidarr|sonarr-anime|prowlarr].config.hostConfig.bindAddress,nixflix.jellyfin.network.localNetworkAddresses,nixflix.navidrome.settings.Address,nixflix.torrentClients.qbittorrent.serverConfig.Preferences.WebUI.Address,nixflix.usenetClients.sabnzbd.settings.misc.host,nixflix.slskd.settings.web.ip_address), or put the built-in reverse proxy in front (nixflix.nginx.enable/nixflix.caddy.enable). Services confined to the VPN namespace keep binding to the namespace address. (#364)
Changed
- Jellyfin plugins whose
targetAbiis older than 12 are no longer excluded on Jellyfin 12+.targetAbiis now treated purely as the minimum supported Jellyfin version, matching Jellyfin's own check, which grows the plugins available undernixflix.jellyfin.pluginsfrom 179 to 330 - The bundled Jellyfin plugin list now keeps the newest 10 versions of each plugin, and for each version only the build with the highest
targetAbithat the pinned Jellyfin supports - The Jellyfin plugin update script now hashes plugin versions in parallel (one job per CPU, override with
PLUGIN_PREFETCH_CONCURRENCY), reports progress as it goes, and avoids repeated manifest parsing
Added
nixflix.jellyfin.users.<name>.policy.enabledFoldersto restrict a user to specific Jellyfin libraries by name instead of giving every user access to all of them.policy.enableAllFoldersnow defaults tofalsewhenenabledFoldersis set. Note that a user withenableAllFolders = falseandmutable = falsenow has their library selection overwritten from Nix on every rebuildnixflix.jellyfin.liveTvto declare Live TV M3U tuners (IPTV playlists) and XMLTV guides (#391)nixflix.usenetClients.sabnzbd.settings.rssto declare SABnzbd RSS feeds and their filters. Feed URLs can be_secretfiles. (#389)- Added Navidrome plugin support (#372)
nixflix.seerrnow asserts that the Seerr package in use is 3.5.0 or newer, failing evaluation with an actionable message instead of a bareseerr-setup.servicestatus=22during activation.nixflix.seerr.packagedefaults topkgs.seerrfrom your own nixpkgs rather than the nixpkgs nixflix pins, so this applies whether or not you set the option — update your nixpkgs, or setnixflix.seerr.packageto a 3.5.0+ build. Seerr library calls also report their HTTP status on failure rather than exiting on a barecurl -fcodenixflix.<sonarr|sonarr-anime|radarr|lidarr>.config.metadatato configure metadata consumers (Settings → Metadata), e.g. Plex series match files and episode mappings (#373)
Deprecated
relaxVersionCheckinnixflix.lib.jellyfinPlugins.fromRepono longer has any effect and prints an evaluation warning when set. Remove it from your configuration
Fixed
- Radarr, Sonarr, Sonarr Anime, Lidarr, Prowlarr, Seerr and Maintainerr data directories are now
0700instead of0755. Their API keys (config.xml, Seerr'ssettings.json, Maintainerr's database) were readable by every local user: the *arr units run withUMask=0002, soconfig.xmlwas0664. Existing installs are fixed on the next activation. (#392) - SABnzbd: a
_secretinside a list value was written triple-quoted, which ConfigObj cannot parse in a list: two secrets were silently read as one garbled string, and a single one with a trailing comma failed to parse. List items now use a list-safe quote. ([#389](https://githu
- Web UIs now bind to
- v3.2.02026-10-05 · 2026-10-05 14:18 UTC
查看更新说明
Changed
- Made Nix module options more discoverable in docs (#345)
- Updated
nixflix.seerr.externalUrlSchemedeprecation instructions - Radarr's default Recyclarr quality profile now sets
min_format_scoreto180instead of1000, to prefer media acquisition (#305)
Added
- Allow VPN namespace to be overriden per service (#336)
- Soulseek downloader - slskd (#336)
- Notif Service for configuring notification connectors in Starr apps (#324)
nixflix.prowlarr.config.indexers.*.schemaNameto set a custom indexer display name and configure multiple indexers from the same schema (#353)- Automatically set default package for most Jellyfin plugins, also removing the Universal Plugin
Repository from the system configuration. (#339).
If you previously enabled a plugin just by setting a package, you'll now want to just set
enable = true;instead.
Fixed
- Fix Recyclarr Custom Quality Profile causes Seerr to fail on first run (#367)
- Fix Starr apps failing to hardlink downloads into media directories by removing leftover per-directory
ReadWritePathsbind mounts and setting qBittorrent'sUMaskto0002(#347). Torrents downloaded before this fix keep mode0644. To make them hardlinkable, runsudo chmod -R g+w /data/downloads/torrentonce (adjust the path if you changednixflix.torrentClients.qbittorrent.downloadsDir). - Fix
radarr-configfailing to apply host settings on Radarr 6.4.4 by sendingallowedHostsin the host config payload (#355) - Fix redundant group configuration causing mediaUsers failure (#341)
- Fix jellyfin auto ignore empty folders (#333)
- Added missing websocket support to arrs nginx config (#354)
- Resolve
_secretreferences in additional Prowlarr indexer fields instead of sending them unresolved (#353)
- v3.1.02026-09-04 · 2026-09-04 14:42 UTC
查看更新说明
Changed
- Default theme is set to
"catppuccin-mocha".
Added
- Added Jellyfin Universal Plugin Repo manifest so users don't have to add plugin manifests manually anymore (#321)
- Lidarr metadata profile overrides service that creates, updates, and deletes metadata profiles to match
nixflix.lidarr.config.metadataProfiles(#293) - Lidarr quality profile overrides service that creates, updates, and deletes quality profiles to match
nixflix.lidarr.config.qualityProfiles(#294) - Navidrome (#296)
Fixed
- fix forceJellyfinIgnore not correctly finding series' paths
- fix(arr-common): silent failure of arr-config services not generating if
username&passwordwere bothnull(#311) - fix(seer/sonarr): requirement on radarr and require
seerr-librarieslike seer/radarr (#311) - fix navidrome dependency on
serviceDependencies(#306) - fix seerr sonarr activeDirectory default resolving host config (#283)
- fix *arr rootfolders oneshot racing app startup (#286)
- fix *arr
config.hostConfigauth/port/urlBase values being ignored in favor of hardcodedsettingsenv vars (#289) - fix Jellyfin crash-looping on boot when a stale
TranscodingTempPathinencoding.xmlpoints at an inaccessible path aftercacheDir/encoding.transcodingTempPathchanges (#291) - fix
_secretrefs nested inside lists being silently dropped and POSTed asnull, e.g. the Jellyfin Webhook plugin'sGenericOptions(#302)
- Default theme is set to
- v3.0.02026-07-12 · 2026-07-12 21:46 UTC
查看更新说明
Breaking
- Jellyfin manifest is pulled from this repository instead of a separate one.
- I accidentally deleted the old repository instead of archiving it, updates to 3.0.0 are required.
- Jellyfin manifest is pulled from this repository instead of a separate one.
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Nixflix is a declarative media server configuration manager for NixOS. The aim of the project is to automate all of the connective tissue required to get Starr and Jellyfin services (Sonarr, Radarr, Lidarr, Prowlarr, Jellyfin, Seerr) working together. I want users to be able to configure this module and it just works.
Why Nixflix?
Dreading the thought of configuring a media server from scratch. Again...
Nixflix makes it so you never have to again!
Managing media server configuration can be very painful:
- No version control for settings
- Tedious navigation through UI systems
- And annoying interservice Configuration
All of these services have APIs, surely we can use this to automate the whole thing.
Nixflix is:
- ✅ Opinionated — Don't you hate having to think for yourself?
- ✅ API-based — Nixflix uses official REST APIs of each service (with a couple minor exceptions)
- ✅ Idempotent — All services safely execute repeatedly
- ✅ Commanding — Your code is the source of truth, no need to fear drift
Features
- Media Server Stack: Pre-configured modules for Sonarr, Radarr, Lidarr, and Prowlarr
- Declarative API Configuration: Configure services declaratively via NixOS options, automatically applied through their REST APIs
- PostgreSQL Integration: Optional PostgreSQL backend for all Arr services
- WireGuard VPN Integration: Built-in support for Wireguard VPN with kill switch and custom DNS
- Flexible Directory Management: Configurable media and state directories with automatic setup
- Service Dependencies: Configure custom systemd service dependencies
- Reverse Proxy Support: Configurable nginx or Caddy integration for all services, with per-service opt-out
- Unified Theming: All supported services can be themed to look the same, powered by theme.park
- TRaSH Guides: Default configuration follows TRaSH guidelines
Upcoming Features
- Better music tooling
Documentation
Check out the documentation to get started.
Services
Starr Stack
All Arr services (Sonarr, Radarr, Lidarr, Prowlarr) support:
- API-based configuration
- PostgreSQL integration
- Reverse proxy (nginx or Caddy)
- Automatic directory creation
- Root folder management
- Custom media directories
Jellyfin
- Basic server management
- Libraries are automatically configured based on selected media managers
- Plugin management
- Subtitle downloader management
Seerr
- Media request management
- Automatic integration with Starr services
- Automatic integration with Jellyfin libraries
Navidrome
- Music Server
- Supports OpenSubsonic API
SABnzbd
- Automatic integration with Starr services
qBittorrent
- Automatic integration with Starr services
Soulseek (slskd)
- Automatic integration with Aurral (comming soon)
WireGuard VPN
- Generic WireGuard support
- Kill switch
Maintainerr
- Automatic cleanup of old media
Development
Enter development shell:
nix develop
Format code:
nix fmt
Check formatting and linting:
nix flake check
License
MPL 2.0