b449da897c0f | atagen | 2026-05-27 15:49 UTC | 1 | { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 2 | description = "automatic loudness and per-app volume control (pipewire)"; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 3 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 4 | inputs = { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 5 | nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 6 | }; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 7 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 8 | outputs = |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 9 | { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 10 | self, |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 11 | nixpkgs, |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 12 | }: |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 13 | let |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 14 | systems = [ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 15 | "x86_64-linux" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 16 | "aarch64-linux" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 17 | ]; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 18 | forAllSystems = nixpkgs.lib.genAttrs systems; |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 19 | cleanSrc = |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 20 | root: |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 21 | nixpkgs.lib.cleanSourceWith { |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 22 | src = root; |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 23 | filter = |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 24 | path: type: |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 25 | nixpkgs.lib.cleanSourceFilter path type |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 26 | && !(type == "directory" && builtins.elem (baseNameOf path) [ "target" ]); |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 27 | }; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 28 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 29 | pkgsFor = |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 30 | system: |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 31 | import nixpkgs { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 32 | inherit system; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 33 | }; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 34 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 35 | perSystem = |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 36 | system: |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 37 | let |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 38 | pkgs = pkgsFor system; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 39 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 40 | # native libs the audio crates link against |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 41 | nativeAudioBuildInputs = with pkgs; [ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 42 | pipewire |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 43 | pipewire.dev |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 44 | ]; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 45 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 46 | nativeBuildTools = with pkgs; [ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 47 | pkg-config |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 48 | clang |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 49 | ]; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 50 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 51 | # system libs iced (wgpu/winit/cosmic-text) compiles + dlopens at runtime. |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 52 | # wayland-only (x11 feature off); re-add libx11/libxcursor/libxi/libxrandr/libxcb if x11 re-enabled |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 53 | guiLibs = with pkgs; [ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 54 | vulkan-loader |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 55 | libxkbcommon |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 56 | wayland |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 57 | libGL |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 58 | fontconfig |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 59 | ]; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 60 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 61 | commonEnv = { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 62 | LIBCLANG_PATH = "${pkgs.libclang.lib}/lib"; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 63 | PKG_CONFIG_PATH = "${pkgs.pipewire.dev}/lib/pkgconfig"; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 64 | }; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 65 | in |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 66 | { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 67 | # nix develop — dev environment |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 68 | devShell = pkgs.mkShell ( |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 69 | { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 70 | name = "headroom-dev"; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 71 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 72 | nativeBuildInputs = nativeBuildTools ++ [ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 73 | pkgs.cargo |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 74 | pkgs.clippy |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 75 | pkgs.rust-analyzer |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 76 | pkgs.rustc |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 77 | pkgs.rustfmt |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 78 | ]; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 79 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 80 | buildInputs = |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 81 | nativeAudioBuildInputs |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 82 | ++ guiLibs |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 83 | ++ (with pkgs; [ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 84 | socat # poke the ipc socket |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 85 | jq # pretty-print json |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 86 | pipewire # pw-cli, pw-cat, etc. |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 87 | wireplumber |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 88 | ]); |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 89 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 90 | shellHook = '' |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 91 | echo "headroom dev shell — rustc $(rustc --version | cut -d' ' -f2)" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 92 | echo " cargo build / cargo test for iteration." |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 93 | echo " nix build .#headroom for the packaged binary." |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 94 | echo " cargo run -p headroom-gui for the GUI (needs a display)." |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 95 | export RUST_BACKTRACE=1 |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 96 | export RUST_LOG=headroom=debug,info |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 97 | # iced/wgpu dlopen vulkan/wayland/xkbcommon at runtime |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 98 | export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath guiLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 99 | ''; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 100 | } |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 101 | // commonEnv |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 102 | ); |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 103 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 104 | # nix build — packaged daemon + cli |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 105 | headroom = pkgs.rustPlatform.buildRustPackage ( |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 106 | { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 107 | pname = "headroom"; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 108 | # workspace version (per-crate manifests use version.workspace = true) |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 109 | version = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).workspace.package.version; |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 110 | # + "-" |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 111 | # + (toString self.rev); |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 112 | |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 113 | src = cleanSrc ./.; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 114 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 115 | cargoLock = { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 116 | lockFile = ./Cargo.lock; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 117 | # allowBuiltinFetchGit = true; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 118 | }; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 119 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 120 | nativeBuildInputs = nativeBuildTools; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 121 | buildInputs = nativeAudioBuildInputs; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 122 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 123 | # one binary: `headroom` (cli + daemon) |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 124 | cargoBuildFlags = [ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 125 | "-p" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 126 | "headroom-cli" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 127 | ]; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 128 | doCheck = true; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 129 | # exclude headroom-gui from the test sweep — pulls iced's gpu stack, not part of the daemon |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 130 | cargoTestFlags = [ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 131 | "--workspace" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 132 | "--exclude" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 133 | "headroom-gui" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 134 | ]; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 135 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 136 | # systemd user unit (@bindir@ templated to this derivation's bin, not PATH) |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 137 | # + canonical profiles under share/headroom/profiles (daemon finds via $XDG_DATA_DIRS) |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 138 | postInstall = '' |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 139 | install -Dm644 contrib/systemd/headroom.service \ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 140 | "$out/lib/systemd/user/headroom.service" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 141 | substituteInPlace "$out/lib/systemd/user/headroom.service" \ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 142 | --replace-fail '@bindir@' "$out/bin" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 143 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 144 | mkdir -p "$out/share/headroom/profiles" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 145 | cp -r profiles/. "$out/share/headroom/profiles/" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 146 | ''; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 147 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 148 | meta = with pkgs.lib; { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 149 | description = "automatic loudness and per-app volume control (pipewire)"; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 150 | license = licenses.gpl3Plus; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 151 | platforms = platforms.linux; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 152 | mainProgram = "headroom"; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 153 | }; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 154 | } |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 155 | // commonEnv |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 156 | ); |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 157 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 158 | # `nix build .#headroom-gui` — optional iced GUI monitor. |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 159 | # separate package so the default build stays graphics-free. iced/wgpu |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 160 | # dlopen vulkan/libGL/wayland/xkbcommon at runtime → wrap with LD_LIBRARY_PATH. |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 161 | # also ships the .desktop entry. |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 162 | headroom-gui = pkgs.rustPlatform.buildRustPackage ( |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 163 | { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 164 | pname = "headroom-gui"; |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 165 | version = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).workspace.package.version; |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 166 | # + "-" |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 167 | # + (toString self.lastModifiedDate); |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 168 | |
872b0bdcf4ab | atagen | 2026-10-17 11:08 UTC | 169 | src = cleanSrc ./.; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 170 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 171 | cargoLock = { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 172 | lockFile = ./Cargo.lock; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 173 | }; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 174 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 175 | # makeWrapper for the LD_LIBRARY_PATH wrap. gui doesn't link pipewire |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 176 | # (talks to the daemon over the socket via headroom-client) → no pipewire/clang |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 177 | nativeBuildInputs = [ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 178 | pkgs.pkg-config |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 179 | pkgs.makeWrapper |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 180 | ]; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 181 | buildInputs = guiLibs; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 182 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 183 | cargoBuildFlags = [ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 184 | "-p" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 185 | "headroom-gui" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 186 | ]; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 187 | # gui tests drive iced view/update; no display in the sandbox. |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 188 | # run them via `cargo test -p headroom-gui` in the dev shell instead |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 189 | doCheck = false; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 190 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 191 | postInstall = '' |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 192 | install -Dm644 contrib/desktop/headroom-gui.desktop \ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 193 | "$out/share/applications/headroom-gui.desktop" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 194 | substituteInPlace "$out/share/applications/headroom-gui.desktop" \ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 195 | --replace-fail '@bindir@' "$out/bin" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 196 | ''; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 197 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 198 | postFixup = '' |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 199 | wrapProgram "$out/bin/headroom-gui" \ |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 200 | --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath guiLibs}" |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 201 | ''; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 202 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 203 | meta = with pkgs.lib; { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 204 | description = "automatic loudness and per-app volume control (pipewire)"; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 205 | license = licenses.eupl12; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 206 | platforms = platforms.linux; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 207 | mainProgram = "headroom-gui"; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 208 | }; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 209 | } |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 210 | // commonEnv |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 211 | ); |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 212 | }; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 213 | in |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 214 | { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 215 | devShells = forAllSystems (system: { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 216 | default = (perSystem system).devShell; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 217 | }); |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 218 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 219 | packages = forAllSystems ( |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 220 | system: |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 221 | let |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 222 | ps = perSystem system; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 223 | in |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 224 | rec { |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 225 | default = headroom; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 226 | headroom = ps.headroom; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 227 | headroom-gui = ps.headroom-gui; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 228 | } |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 229 | ); |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 230 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 231 | formatter = forAllSystems (system: (pkgsFor system).nixpkgs-fmt); |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 232 | |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 233 | # System-independent outputs — modules. |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 234 | nixosModules.default = import ./nix/nixos-module.nix self; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 235 | }; |
b449da897c0f | atagen | 2026-05-27 15:49 UTC | 236 | } |