-
released this
2026-03-21 19:31:27 -04:00 | 47 commits to main since this releaseFirst versioned release. Major restructuring of the module tree, consumer ergonomics improvements, and comprehensive documentation.
Added
meta.typeoption on all service modules — classifies each asnixos(wraps a NixOS service module),container(OCI/podman), orcustom(original logic). Available atconfig.josephembrey.<service>.meta.type.portoptions on container modules with web UIs: calibre (8081), factorio (34197), gokapi (53842), linkding (9090), sabnzbd (8080), seerr (5055), silverbullet (3000), syncthing (8384). Defaults match previously hardcoded values — no action needed on upgrade.tagoption on scrutiny (default"latest-omnibus") for pinning container image versions.uid/gidoptions on factorio (default 845/845) for stable container user IDs.- Stable media group GID: all media modules now set
users.groups.${cfg.group}.gid = lib.mkDefault 2000, ensuring consistent file ownership across audiobookshelf, bazarr, calibre, jellyfin, radarr, sabnzbd, and sonarr. - Sops ordering guards (
after/wantsonsops-install-secrets.service) added to linkding, copyparty, openclaw, cloudflare/fail2ban, cloudflare/tunnel. These ensure secrets are available before the service starts. - Documentation directory
docs/:ORGANIZATION.md— directory layout, category rules, flat vs directory criteriaMODULE-STYLE.md— code structure, section ordering, module type patternsOPTIONS.md— option conventions, standard options by module type, UID/GID tableGUARDS.md—mkIfvsoptionalAttrs, sops and impermanence guard patternsFLAKE.md— flake outputs/inputs,lib.discover, consumer integration, dev shell
CHANGELOG.mdfollowing Keep a Changelog format.- Tag-triggered release workflow (
.forgejo/workflows/release.yml) — extracts version notes from this file and creates a Forgejo release onv*tag push.
Changed
- BREAKING: Module file paths reorganized. All modules flattened from multi-file directories (e.g.,
services/bazarr/{options,module,caddy,impermanence}.nix) into single files (e.g.,services/media/bazarr.nix). Complex modules (cloudflare, wireguard, recyclarr) retain a directory but with self-contained sub-files instead of split options/module pairs. Transparent to consumers usingnixosModules.default— only affects direct file imports. - BREAKING: Services organized into categories. Media services moved to
modules/services/media/, networking services tomodules/services/networking/. Uncategorized services remain flat undermodules/services/. Again, transparent tonixosModules.defaultconsumers. - BREAKING:
josephembrey.searxngdefault port changed from 8888 to 8890. The old default collided with gluetun's HTTP proxy port. Setjosephembrey.searxng.port = 8888to restore old behavior (not recommended if gluetun is also enabled). - BREAKING:
services.caddy.logFormatnow defaults to JSON with file output at/var/log/caddy/access.log. Previously defaulted to plain text level-only format. This enables fail2ban log parsing. Consumers can override viaservices.caddy.logFormat(nowmkDefault). - All NixOS wrapper module values on
services.*options now uselib.mkDefault. Consumers can override any preset value at normal priority without needingmkForce. This applies to 22 wrapper modules. - Module discovery (
modules/services/default.nix) updated from single-level directory scan to hybrid flat-file + category + directory scanning.modules/system/default.nixupdated for flat-file scanning. home-assistantuid/gid now uselib.mkForce— required because the upstream NixOS module sets these at normal priority, and our stable IDs must take precedence.CLAUDE.mdtrimmed to a concise overview with references todocs/.
Fixed
- Port collision between searxng (8888) and gluetun HTTP proxy (8888). Searxng moved to 8890; gluetun retains 8888 as the port owner.
crosswatchmeta.type corrected fromcustomtocontainer(it runs as an OCI container).webhookmeta.type corrected fromcustomtonixos(it wraps the NixOS webhook service module).discordmeta.type corrected fromcontainertocustom(it implements a script-based webhook, not an OCI container).backups.nixreplacedwith pkgs;with explicitpkgs.restic,pkgs.rclonereferences per Nix style guidelines.glanceenvironment file now uses the upstreamservices.glance.environmentFileoption instead ofmkForceonsystemd.services.glance.serviceConfig.EnvironmentFile.piholevirtualisation.podman.defaultNetwork.settings.dns_enabledchanged fromlib.mkForce falseto plainfalse— sufficient to override podman module'smkDefault truewithout force.bazarrremoved redundantsystemd.services.bazarr.serviceConfigoverrides forDynamicUser,User, andGroupthat duplicated upstream behavior.- Hardcoded
sops-install-secrets.servicedependencies in backups and cloudflare/dns replaced with conditional(lib.mkIf (config ? sops) ...)guards, so modules work correctly without sops-nix loaded.
Downloads
-
Source code (ZIP)
2 downloads
-
Source code (TAR.GZ)
2 downloads