Skip to content

Services

Source directory: modules/services/

default.nix

modules/services/appimage/default.nix

No option declarations; see source for implementation.

arr-suite-mcp.nix

modules/services/arr-suite-mcp.nix

arr-suite MCP server — exposed as an HTTP/SSE daemon.

arr-suite-mcp (shaktech786) is a stdio-only Python MCP server. To make it a tailnet-reachable daemon we wrap it with mcp-proxy (stdio→SSE):

mcp-proxy --host 0.0.0.0 --port --pass-environment -- arr-suite-mcp

Clients connect to the SSE endpoint: http://:/sse

The *arr API keys are supplied via an agenix EnvironmentFile (SONARR/RADARR/PROWLARR/OVERSEERR_API_KEY). Hosts/ports default to localhost: inside arr-suite, matching the services on p510. NZBGeek is reached transitively through Prowlarr's API.

  • Enable option: arr-suite MCP server (SSE daemon via mcp-proxy)
Options declaration (Nix)
  options.features.arr-suite-mcp = {
    enable = lib.mkEnableOption "arr-suite MCP server (SSE daemon via mcp-proxy)";

    port = lib.mkOption {
      type = lib.types.port;
      default = 3011;
      description = "Port the SSE bridge binds to (loopback always; tailnet + LAN via firewall).";
    };

    environmentFile = lib.mkOption {
      type = lib.types.path;
      default = config.age.secrets."arr-suite-mcp-env".path;
      defaultText = lib.literalExpression ''config.age.secrets."arr-suite-mcp-env".path'';
      description = "EnvironmentFile with the *arr API keys (KEY=VALUE per line).";
    };

    listenLanInterface = lib.mkOption {
      type = lib.types.nullOr lib.types.str;
      default = null;
      example = "eno1";
      description = ''
        LAN interface to open the port on, in addition to tailscale0 and
        loopback. null exposes the daemon only via Tailscale. (No effect on
        hosts where the firewall is disabled.)
      '';
    };
  }

default.nix

modules/services/atuin/default.nix

No option declarations; see source for implementation.

audible-sync.nix

modules/services/audible-sync.nix

audible-sync — download + decrypt your Audible library to local .m4b files.

UX: one command, audible-sync, after a one-time interactive login. Pipeline: library export → bulk download (.aaxc/.aax) → decrypt to .m4b → organise into one folder per book under outputDir. Re-runnable; already-downloaded books and already-decrypted files are skipped.

Per-host wiring (currently p620 only):

features.audibleSync = { enable = true; outputDir = "~/audiobooks/audible"; # default };

One-time setup (run interactively on p620 AFTER deploy): 1. audible quickstart # picks marketplace, handles 2FA in browser 2. audible library list # confirm your books are visible 3. audible-sync # downloads + decrypts everything

Legal note: stripping DRM violates Audible's ToS. Personal-use only.

  • Enable option: audible-sync — download + decrypt Audible library to .m4b
Options declaration (Nix)
  options.features.audibleSync = {
    enable = lib.mkEnableOption "audible-sync — download + decrypt Audible library to .m4b";

    outputDir = lib.mkOption {
      type = lib.types.str;
      default = "~/audiobooks/audible";
      description = ''
        Destination for decrypted, organised .m4b files (one folder per book).
        Tilde is expanded at runtime against the invoking user's $HOME.
      '';
    };
  }

audiobook-import.nix

modules/services/audiobook-import.nix

audiobook-import — completed-download → Audiobookshelf import pipeline.

A timer-driven reconciler (modules/services/audiobook-import.py) that scans the audiobook download dir(s) for stable, completed folders, uses the local Ollama to parse the release name into structured metadata, optionally merges multi-file books into a chaptered M4B via m4b-tool, and hardlinks/places the result into the Audiobookshelf library with a metadata.json. Idempotent via a .imported marker; sources are left intact so torrent seeding continues.

  • Enable option: audiobook download → Audiobookshelf import pipeline
Options declaration (Nix)
  options.features.audiobook-import = {
    enable = lib.mkEnableOption "audiobook download → Audiobookshelf import pipeline";

    watchDirs = lib.mkOption {
      type = lib.types.listOf lib.types.str;
      default = [ "/mnt/media/downloads/torrents/audiobooks" ];
      description = "Download directories scanned for completed audiobook folders.";
    };

    libraryDir = lib.mkOption {
      type = lib.types.str;
      default = "/mnt/media/Media/Audiobooks";
      description = "Audiobookshelf library root to place imported books into.";
    };

    model = lib.mkOption {
      type = lib.types.str;
      default = "qwen2.5:7b";
      description = "Ollama model used for metadata extraction (strict JSON).";
    };

    ollamaUrl = lib.mkOption {
      type = lib.types.str;
      default = "http://127.0.0.1:11434";
      description = "Base URL of the local Ollama server.";
    };

    mergeToM4b = lib.mkOption {
      type = lib.types.bool;
      default = true;
      description = "Merge multi-file audiobooks into a single chaptered M4B via m4b-tool.";
    };

    stableSeconds = lib.mkOption {
      type = lib.types.int;
      default = 120;
      description = "Skip folders modified more recently than this (still downloading).";
    };

    interval = lib.mkOption {
      type = lib.types.str;
      default = "*:0/5";
      description = "systemd OnCalendar expression for the import scan (default every 5 min).";
    };

    user = lib.mkOption {
      type = lib.types.str;
      default = "olafkfreund";
      description = "User to run the import as (must own the library + read downloads).";
    };

    group = lib.mkOption {
      type = lib.types.str;
      default = "users";
      description = "Group to run the import as.";
    };
  }

audiobook-mcp.nix

modules/services/audiobook-mcp.nix

audiobook-mcp — audiobook acquisition + library MCP server, as an SSE daemon.

audiobook-mcp (pkgs.customPkgs.audiobook-mcp) is a stdio FastMCP server. To make it tailnet-reachable we wrap it with mcp-proxy (stdio→SSE):

mcp-proxy --host 0.0.0.0 --port --pass-environment -- audiobook-mcp

Clients connect to the SSE endpoint: http://:/sse

Backend URLs default to the local services on p510 and are passed as plain env; the API keys (PROWLARR/SABNZBD/ABS) come from an agenix EnvironmentFile read by systemd as root before dropping to the DynamicUser.

  • Enable option: audiobook MCP server (SSE daemon via mcp-proxy)
Options declaration (Nix)
  options.features.audiobook-mcp = {
    enable = lib.mkEnableOption "audiobook MCP server (SSE daemon via mcp-proxy)";

    port = lib.mkOption {
      type = lib.types.port;
      default = 3012;
      description = "Port the SSE bridge binds to (loopback always; tailnet + LAN via firewall).";
    };

    abbAppUrl = lib.mkOption {
      type = lib.types.str;
      default = "http://127.0.0.1:5078";
      description = "audiobookbay-automated base URL (used to add ABB releases).";
    };

    prowlarrUrl = lib.mkOption {
      type = lib.types.str;
      default = "http://127.0.0.1:9696";
      description = "Prowlarr base URL (Usenet/torrent indexer search).";
    };

    sabnzbdUrl = lib.mkOption {
      type = lib.types.str;
      default = "http://127.0.0.1:8080";
      description = "SABnzbd base URL (Usenet grabs).";
    };

    audiobookshelfUrl = lib.mkOption {
      type = lib.types.str;
      default = "http://127.0.0.1:13378";
      description = "Audiobookshelf base URL (library lookups).";
    };

    ollamaUrl = lib.mkOption {
      type = lib.types.str;
      default = "http://127.0.0.1:11434";
      description = "Local Ollama base URL (recommend_bestsellers tool).";
    };

    ollamaModel = lib.mkOption {
      type = lib.types.str;
      default = "qwen2.5:7b";
      description = "Ollama model used for bestseller suggestions.";
    };

    environmentFile = lib.mkOption {
      type = lib.types.path;
      default = config.age.secrets."audiobook-mcp-env".path;
      defaultText = lib.literalExpression ''config.age.secrets."audiobook-mcp-env".path'';
      description = "EnvironmentFile with backend API keys (PROWLARR/SABNZBD/ABS).";
    };

    listenLanInterface = lib.mkOption {
      type = lib.types.nullOr lib.types.str;
      default = null;
      example = "eno1";
      description = ''
        LAN interface to open the port on, in addition to tailscale0 and
        loopback. null exposes the daemon only via Tailscale.
      '';
    };
  }

audiobookbay-automated.nix

modules/services/audiobookbay-automated.nix

audiobookbay-automated — AudioBookBay search → Transmission web app.

A small Flask app (pkgs.customPkgs.audiobookbay-automated) that searches AudioBookBay and sends the chosen release's magnet to the existing Transmission daemon on p510. Each download is saved to //, which the audiobook-import pipeline watches.</p> <p>The app only talks to Transmission's RPC (127.0.0.1:9091, auth disabled on p510) and to AudioBookBay over HTTPS — it writes nothing to disk itself, so the unit runs fully sandboxed (DynamicUser + ProtectSystem=strict).</p> <p>Note: AudioBookBay distributes copyrighted material without authorization. abbHostname is configurable; the same app works against any compatible host.</p> <ul> <li><strong>Enable option:</strong> AudioBookBay search → Transmission web app</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">audiobookbay-automated</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"AudioBookBay search → Transmission web app"</span><span class="p">;</span> </span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a> </span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a> <span class="ss">port</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-4-5"><a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>port<span class="p">;</span> </span><span id="__span-4-6"><a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">5078</span><span class="p">;</span> </span><span id="__span-4-7"><a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Port the Flask UI binds to (loopback always; tailnet + LAN via firewall)."</span><span class="p">;</span> </span><span id="__span-4-8"><a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a> <span class="p">};</span> </span><span id="__span-4-9"><a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a> </span><span id="__span-4-10"><a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a> <span class="ss">abbHostname</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-4-11"><a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-4-12"><a id="__codelineno-4-12" name="__codelineno-4-12" href="#__codelineno-4-12"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"audiobookbay.lu"</span><span class="p">;</span> </span><span id="__span-4-13"><a id="__codelineno-4-13" name="__codelineno-4-13" href="#__codelineno-4-13"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"AudioBookBay host to search against."</span><span class="p">;</span> </span><span id="__span-4-14"><a id="__codelineno-4-14" name="__codelineno-4-14" href="#__codelineno-4-14"></a> <span class="p">};</span> </span><span id="__span-4-15"><a id="__codelineno-4-15" name="__codelineno-4-15" href="#__codelineno-4-15"></a> </span><span id="__span-4-16"><a id="__codelineno-4-16" name="__codelineno-4-16" href="#__codelineno-4-16"></a> <span class="ss">transmissionHost</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-4-17"><a id="__codelineno-4-17" name="__codelineno-4-17" href="#__codelineno-4-17"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-4-18"><a id="__codelineno-4-18" name="__codelineno-4-18" href="#__codelineno-4-18"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"127.0.0.1"</span><span class="p">;</span> </span><span id="__span-4-19"><a id="__codelineno-4-19" name="__codelineno-4-19" href="#__codelineno-4-19"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Transmission RPC host."</span><span class="p">;</span> </span><span id="__span-4-20"><a id="__codelineno-4-20" name="__codelineno-4-20" href="#__codelineno-4-20"></a> <span class="p">};</span> </span><span id="__span-4-21"><a id="__codelineno-4-21" name="__codelineno-4-21" href="#__codelineno-4-21"></a> </span><span id="__span-4-22"><a id="__codelineno-4-22" name="__codelineno-4-22" href="#__codelineno-4-22"></a> <span class="ss">transmissionPort</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-4-23"><a id="__codelineno-4-23" name="__codelineno-4-23" href="#__codelineno-4-23"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>port<span class="p">;</span> </span><span id="__span-4-24"><a id="__codelineno-4-24" name="__codelineno-4-24" href="#__codelineno-4-24"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">9091</span><span class="p">;</span> </span><span id="__span-4-25"><a id="__codelineno-4-25" name="__codelineno-4-25" href="#__codelineno-4-25"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Transmission RPC port."</span><span class="p">;</span> </span><span id="__span-4-26"><a id="__codelineno-4-26" name="__codelineno-4-26" href="#__codelineno-4-26"></a> <span class="p">};</span> </span><span id="__span-4-27"><a id="__codelineno-4-27" name="__codelineno-4-27" href="#__codelineno-4-27"></a> </span><span id="__span-4-28"><a id="__codelineno-4-28" name="__codelineno-4-28" href="#__codelineno-4-28"></a> <span class="ss">savePathBase</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-4-29"><a id="__codelineno-4-29" name="__codelineno-4-29" href="#__codelineno-4-29"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-4-30"><a id="__codelineno-4-30" name="__codelineno-4-30" href="#__codelineno-4-30"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"/mnt/media/downloads/torrents/audiobooks"</span><span class="p">;</span> </span><span id="__span-4-31"><a id="__codelineno-4-31" name="__codelineno-4-31" href="#__codelineno-4-31"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-4-32"><a id="__codelineno-4-32" name="__codelineno-4-32" href="#__codelineno-4-32"></a><span class="s s-Multiline"> Base directory passed to Transmission as the per-torrent download</span> </span><span id="__span-4-33"><a id="__codelineno-4-33" name="__codelineno-4-33" href="#__codelineno-4-33"></a><span class="s s-Multiline"> location (each book lands in <savePathBase>/<Title>/). Must be</span> </span><span id="__span-4-34"><a id="__codelineno-4-34" name="__codelineno-4-34" href="#__codelineno-4-34"></a><span class="s s-Multiline"> writable by the Transmission service user; watched by the</span> </span><span id="__span-4-35"><a id="__codelineno-4-35" name="__codelineno-4-35" href="#__codelineno-4-35"></a><span class="s s-Multiline"> audiobook-import pipeline.</span> </span><span id="__span-4-36"><a id="__codelineno-4-36" name="__codelineno-4-36" href="#__codelineno-4-36"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-4-37"><a id="__codelineno-4-37" name="__codelineno-4-37" href="#__codelineno-4-37"></a> <span class="p">};</span> </span><span id="__span-4-38"><a id="__codelineno-4-38" name="__codelineno-4-38" href="#__codelineno-4-38"></a> </span><span id="__span-4-39"><a id="__codelineno-4-39" name="__codelineno-4-39" href="#__codelineno-4-39"></a> <span class="ss">category</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-4-40"><a id="__codelineno-4-40" name="__codelineno-4-40" href="#__codelineno-4-40"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-4-41"><a id="__codelineno-4-41" name="__codelineno-4-41" href="#__codelineno-4-41"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"Audiobookbay-Audiobooks"</span><span class="p">;</span> </span><span id="__span-4-42"><a id="__codelineno-4-42" name="__codelineno-4-42" href="#__codelineno-4-42"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Download category/label tag."</span><span class="p">;</span> </span><span id="__span-4-43"><a id="__codelineno-4-43" name="__codelineno-4-43" href="#__codelineno-4-43"></a> <span class="p">};</span> </span><span id="__span-4-44"><a id="__codelineno-4-44" name="__codelineno-4-44" href="#__codelineno-4-44"></a> </span><span id="__span-4-45"><a id="__codelineno-4-45" name="__codelineno-4-45" href="#__codelineno-4-45"></a> <span class="ss">listenLanInterface</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-4-46"><a id="__codelineno-4-46" name="__codelineno-4-46" href="#__codelineno-4-46"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>nullOr lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-4-47"><a id="__codelineno-4-47" name="__codelineno-4-47" href="#__codelineno-4-47"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">null</span><span class="p">;</span> </span><span id="__span-4-48"><a id="__codelineno-4-48" name="__codelineno-4-48" href="#__codelineno-4-48"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"eno1"</span><span class="p">;</span> </span><span id="__span-4-49"><a id="__codelineno-4-49" name="__codelineno-4-49" href="#__codelineno-4-49"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-4-50"><a id="__codelineno-4-50" name="__codelineno-4-50" href="#__codelineno-4-50"></a><span class="s s-Multiline"> LAN interface to open the port on, in addition to tailscale0 and</span> </span><span id="__span-4-51"><a id="__codelineno-4-51" name="__codelineno-4-51" href="#__codelineno-4-51"></a><span class="s s-Multiline"> loopback. null exposes the UI only via Tailscale.</span> </span><span id="__span-4-52"><a id="__codelineno-4-52" name="__codelineno-4-52" href="#__codelineno-4-52"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-4-53"><a id="__codelineno-4-53" name="__codelineno-4-53" href="#__codelineno-4-53"></a> <span class="p">};</span> </span><span id="__span-4-54"><a id="__codelineno-4-54" name="__codelineno-4-54" href="#__codelineno-4-54"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="backstagenix"><code>backstage.nix</code><a class="headerlink" href="#backstagenix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/backstage.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/backstage.nix</code></a></p> <p>Backstage developer portal.</p> <p>Runs olafkfreund/backstage (a customised Spotify Backstage app) on p510 alongside a sibling Postgres container. Image is consumed from ghcr.io/olafkfreund/backstage, pinned to a SHA digest (NEVER :latest — that's a supply-chain risk: a leaked GHCR token could quietly swap the running image).</p> <p>Wiring overview:</p> <p>┌─────────────────────────┐ ┌──────────────────────────┐ │ podman-backstage-postgres│◀────│ podman-backstage │ │ 127.0.0.1:5435 → 5432 │ │ 127.0.0.1:7007 → 7007 │ └─────────────────────────┘ └──────────────────────────┘ ▲ │ Tailscale Serve │ /backstage path ▼ https://p510.tail833f7.ts.net/backstage</p> <p>Secrets (from agenix, loaded at runtime — never in the Nix store): backstage-postgres-password → POSTGRES_PASSWORD backstage-github-token → GITHUB_TOKEN (catalog integration) backstage-github-oauth-client-id → AUTH_GITHUB_CLIENT_ID backstage-github-oauth-client-secret → AUTH_GITHUB_CLIENT_SECRET</p> <p>The secret-to-env bridge: a one-shot systemd unit (backstage-env-setup) reads /run/agenix/backstage-* and writes /run/backstage/env-{postgres, backstage}, consumed by the container services as environmentFiles. /run/backstage is tmpfs (cleared on every boot — secrets re-emitted each time the unit runs).</p> <p>This module is intentionally disabled by default. Flip features.backstage.enable = true on p510 only AFTER: 1. Phase 1 image is in ghcr.io with a real SHA digest 2. Phase 2 agenix secrets exist and have been rekeyed 3. Phase 4 Tailscale Serve route is added See olafkfreund/nixos_config epic #731.</p> <ul> <li><strong>Enable option:</strong> Backstage developer portal</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">backstage</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"Backstage developer portal"</span><span class="p">;</span> </span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a> </span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a> <span class="ss">image</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-5-5"><a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-5-6"><a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"ghcr.io/olafkfreund/backstage@sha256:33a836eb6a7b8d45e5ef240e973ba2dd1856e377a31b1c952fa244b2d3dd70bc"</span><span class="p">;</span> </span><span id="__span-5-7"><a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"ghcr.io/olafkfreund/backstage@sha256:abc123..."</span><span class="p">;</span> </span><span id="__span-5-8"><a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-5-9"><a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a><span class="s s-Multiline"> OCI image to pull for the Backstage backend. MUST be pinned to a</span> </span><span id="__span-5-10"><a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a><span class="s s-Multiline"> SHA256 digest (the @sha256:... form). Do NOT use :latest — updates</span> </span><span id="__span-5-11"><a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a><span class="s s-Multiline"> should be explicit nixos commits so a leaked GHCR token can't</span> </span><span id="__span-5-12"><a id="__codelineno-5-12" name="__codelineno-5-12" href="#__codelineno-5-12"></a><span class="s s-Multiline"> quietly swap the running image.</span> </span><span id="__span-5-13"><a id="__codelineno-5-13" name="__codelineno-5-13" href="#__codelineno-5-13"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-5-14"><a id="__codelineno-5-14" name="__codelineno-5-14" href="#__codelineno-5-14"></a> <span class="p">};</span> </span><span id="__span-5-15"><a id="__codelineno-5-15" name="__codelineno-5-15" href="#__codelineno-5-15"></a> </span><span id="__span-5-16"><a id="__codelineno-5-16" name="__codelineno-5-16" href="#__codelineno-5-16"></a> <span class="ss">postgresImage</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-5-17"><a id="__codelineno-5-17" name="__codelineno-5-17" href="#__codelineno-5-17"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-5-18"><a id="__codelineno-5-18" name="__codelineno-5-18" href="#__codelineno-5-18"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"docker.io/postgres:16-alpine"</span><span class="p">;</span> </span><span id="__span-5-19"><a id="__codelineno-5-19" name="__codelineno-5-19" href="#__codelineno-5-19"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"OCI image for the Postgres sidecar."</span><span class="p">;</span> </span><span id="__span-5-20"><a id="__codelineno-5-20" name="__codelineno-5-20" href="#__codelineno-5-20"></a> <span class="p">};</span> </span><span id="__span-5-21"><a id="__codelineno-5-21" name="__codelineno-5-21" href="#__codelineno-5-21"></a> </span><span id="__span-5-22"><a id="__codelineno-5-22" name="__codelineno-5-22" href="#__codelineno-5-22"></a> <span class="ss">port</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-5-23"><a id="__codelineno-5-23" name="__codelineno-5-23" href="#__codelineno-5-23"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>port<span class="p">;</span> </span><span id="__span-5-24"><a id="__codelineno-5-24" name="__codelineno-5-24" href="#__codelineno-5-24"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">7007</span><span class="p">;</span> </span><span id="__span-5-25"><a id="__codelineno-5-25" name="__codelineno-5-25" href="#__codelineno-5-25"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Localhost port the Backstage backend binds to."</span><span class="p">;</span> </span><span id="__span-5-26"><a id="__codelineno-5-26" name="__codelineno-5-26" href="#__codelineno-5-26"></a> <span class="p">};</span> </span><span id="__span-5-27"><a id="__codelineno-5-27" name="__codelineno-5-27" href="#__codelineno-5-27"></a> </span><span id="__span-5-28"><a id="__codelineno-5-28" name="__codelineno-5-28" href="#__codelineno-5-28"></a> <span class="ss">pgPort</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-5-29"><a id="__codelineno-5-29" name="__codelineno-5-29" href="#__codelineno-5-29"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>port<span class="p">;</span> </span><span id="__span-5-30"><a id="__codelineno-5-30" name="__codelineno-5-30" href="#__codelineno-5-30"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">5435</span><span class="p">;</span> </span><span id="__span-5-31"><a id="__codelineno-5-31" name="__codelineno-5-31" href="#__codelineno-5-31"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-5-32"><a id="__codelineno-5-32" name="__codelineno-5-32" href="#__codelineno-5-32"></a><span class="s s-Multiline"> Localhost port for Backstage's Postgres. 5435 avoids colliding with</span> </span><span id="__span-5-33"><a id="__codelineno-5-33" name="__codelineno-5-33" href="#__codelineno-5-33"></a><span class="s s-Multiline"> skill-pool's 5434 on p620 (in case that ever migrates to p510) and</span> </span><span id="__span-5-34"><a id="__codelineno-5-34" name="__codelineno-5-34" href="#__codelineno-5-34"></a><span class="s s-Multiline"> with a typical host Postgres on 5432.</span> </span><span id="__span-5-35"><a id="__codelineno-5-35" name="__codelineno-5-35" href="#__codelineno-5-35"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-5-36"><a id="__codelineno-5-36" name="__codelineno-5-36" href="#__codelineno-5-36"></a> <span class="p">};</span> </span><span id="__span-5-37"><a id="__codelineno-5-37" name="__codelineno-5-37" href="#__codelineno-5-37"></a> </span><span id="__span-5-38"><a id="__codelineno-5-38" name="__codelineno-5-38" href="#__codelineno-5-38"></a> <span class="ss">pgDatabase</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-5-39"><a id="__codelineno-5-39" name="__codelineno-5-39" href="#__codelineno-5-39"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-5-40"><a id="__codelineno-5-40" name="__codelineno-5-40" href="#__codelineno-5-40"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"backstage"</span><span class="p">;</span> </span><span id="__span-5-41"><a id="__codelineno-5-41" name="__codelineno-5-41" href="#__codelineno-5-41"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Postgres database name."</span><span class="p">;</span> </span><span id="__span-5-42"><a id="__codelineno-5-42" name="__codelineno-5-42" href="#__codelineno-5-42"></a> <span class="p">};</span> </span><span id="__span-5-43"><a id="__codelineno-5-43" name="__codelineno-5-43" href="#__codelineno-5-43"></a> </span><span id="__span-5-44"><a id="__codelineno-5-44" name="__codelineno-5-44" href="#__codelineno-5-44"></a> <span class="ss">pgUser</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-5-45"><a id="__codelineno-5-45" name="__codelineno-5-45" href="#__codelineno-5-45"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-5-46"><a id="__codelineno-5-46" name="__codelineno-5-46" href="#__codelineno-5-46"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"backstage"</span><span class="p">;</span> </span><span id="__span-5-47"><a id="__codelineno-5-47" name="__codelineno-5-47" href="#__codelineno-5-47"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Postgres user."</span><span class="p">;</span> </span><span id="__span-5-48"><a id="__codelineno-5-48" name="__codelineno-5-48" href="#__codelineno-5-48"></a> <span class="p">};</span> </span><span id="__span-5-49"><a id="__codelineno-5-49" name="__codelineno-5-49" href="#__codelineno-5-49"></a> </span><span id="__span-5-50"><a id="__codelineno-5-50" name="__codelineno-5-50" href="#__codelineno-5-50"></a> <span class="ss">publicUrl</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-5-51"><a id="__codelineno-5-51" name="__codelineno-5-51" href="#__codelineno-5-51"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-5-52"><a id="__codelineno-5-52" name="__codelineno-5-52" href="#__codelineno-5-52"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"https://p510.tail833f7.ts.net/backstage"</span><span class="p">;</span> </span><span id="__span-5-53"><a id="__codelineno-5-53" name="__codelineno-5-53" href="#__codelineno-5-53"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-5-54"><a id="__codelineno-5-54" name="__codelineno-5-54" href="#__codelineno-5-54"></a><span class="s s-Multiline"> Public-facing base URL Backstage uses for app.baseUrl,</span> </span><span id="__span-5-55"><a id="__codelineno-5-55" name="__codelineno-5-55" href="#__codelineno-5-55"></a><span class="s s-Multiline"> backend.baseUrl, CORS origin, and OAuth callbacks. If you rename</span> </span><span id="__span-5-56"><a id="__codelineno-5-56" name="__codelineno-5-56" href="#__codelineno-5-56"></a><span class="s s-Multiline"> your tailnet or move Backstage to a different host, update this</span> </span><span id="__span-5-57"><a id="__codelineno-5-57" name="__codelineno-5-57" href="#__codelineno-5-57"></a><span class="s s-Multiline"> AND the GitHub OAuth App's authorization callback URL (which</span> </span><span id="__span-5-58"><a id="__codelineno-5-58" name="__codelineno-5-58" href="#__codelineno-5-58"></a><span class="s s-Multiline"> must match exactly).</span> </span><span id="__span-5-59"><a id="__codelineno-5-59" name="__codelineno-5-59" href="#__codelineno-5-59"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-5-60"><a id="__codelineno-5-60" name="__codelineno-5-60" href="#__codelineno-5-60"></a> <span class="p">};</span> </span><span id="__span-5-61"><a id="__codelineno-5-61" name="__codelineno-5-61" href="#__codelineno-5-61"></a> </span><span id="__span-5-62"><a id="__codelineno-5-62" name="__codelineno-5-62" href="#__codelineno-5-62"></a> <span class="ss">memoryHigh</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-5-63"><a id="__codelineno-5-63" name="__codelineno-5-63" href="#__codelineno-5-63"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-5-64"><a id="__codelineno-5-64" name="__codelineno-5-64" href="#__codelineno-5-64"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"2G"</span><span class="p">;</span> </span><span id="__span-5-65"><a id="__codelineno-5-65" name="__codelineno-5-65" href="#__codelineno-5-65"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-5-66"><a id="__codelineno-5-66" name="__codelineno-5-66" href="#__codelineno-5-66"></a><span class="s s-Multiline"> Soft memory cap on the Backstage container (passed as --memory to</span> </span><span id="__span-5-67"><a id="__codelineno-5-67" name="__codelineno-5-67" href="#__codelineno-5-67"></a><span class="s s-Multiline"> podman). Caps blast radius if Backstage leaks memory while Plex</span> </span><span id="__span-5-68"><a id="__codelineno-5-68" name="__codelineno-5-68" href="#__codelineno-5-68"></a><span class="s s-Multiline"> transcode + Ollama are running. Epic #731 risk #3.</span> </span><span id="__span-5-69"><a id="__codelineno-5-69" name="__codelineno-5-69" href="#__codelineno-5-69"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-5-70"><a id="__codelineno-5-70" name="__codelineno-5-70" href="#__codelineno-5-70"></a> <span class="p">};</span> </span><span id="__span-5-71"><a id="__codelineno-5-71" name="__codelineno-5-71" href="#__codelineno-5-71"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="bazarrnix"><code>bazarr.nix</code><a class="headerlink" href="#bazarrnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/bazarr.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/bazarr.nix</code></a></p> <p>Bazarr — subtitle manager for Sonarr/Radarr/Lidarr on p510.</p> <p>Thin wrapper over nixpkgs's services.bazarr. We add a feature flag for consistency with the other media services, plus narrow the firewall opening to tailscale0 (and optionally a named LAN interface) instead of using <code>openFirewall = true</code> which would expose the port globally.</p> <p>Storage: nixpkgs default <code>/var/lib/bazarr</code> (small config + SQLite db). Subtitle .srt files are written <em>next to</em> the video files in <code>/mnt/media</code>, not into Bazarr's own data dir — no extra config needed.</p> <p>First-deploy UX (one-time, in the Bazarr web UI at http://p510:6767): 1. Settings → Sonarr → add: localhost:8989 + SONARR_API_KEY 2. Settings → Radarr → add: localhost:7878 + RADARR_API_KEY (API keys can be found in arr-suite-mcp-env.age — pasted via UI; Bazarr stores them in its own DB after that) 3. Settings → Languages → enable Norwegian Bokmål (nb) + English (en) 4. Settings → Languages → Default Profile: a. Norwegian Bokmål (forced=False) b. English (forced=False) 5. Settings → Providers → enable OpenSubtitles.com (anonymous works; authenticate later for higher daily quota) 6. Tick "use embedded subs" if present (saves a download when the release already has subs muxed in)</p> <p>Phase 2 candidate: declarative initial-config via Bazarr's REST API at first deploy, similar to the *arr webhook wiring for media-bot.</p> <ul> <li><strong>Enable option:</strong> Bazarr subtitle manager</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">bazarr</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"Bazarr subtitle manager"</span><span class="p">;</span> </span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a> </span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a> <span class="ss">listenLanInterface</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>nullOr lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-6-6"><a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">null</span><span class="p">;</span> </span><span id="__span-6-7"><a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"eno1"</span><span class="p">;</span> </span><span id="__span-6-8"><a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-6-9"><a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a><span class="s s-Multiline"> LAN interface to also open the Bazarr port on, in addition to</span> </span><span id="__span-6-10"><a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a><span class="s s-Multiline"> tailscale0. null exposes the service only via Tailscale (the</span> </span><span id="__span-6-11"><a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a><span class="s s-Multiline"> recommended setting; Bazarr's UI is fine over the tailnet).</span> </span><span id="__span-6-12"><a id="__codelineno-6-12" name="__codelineno-6-12" href="#__codelineno-6-12"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-6-13"><a id="__codelineno-6-13" name="__codelineno-6-13" href="#__codelineno-6-13"></a> <span class="p">};</span> </span><span id="__span-6-14"><a id="__codelineno-6-14" name="__codelineno-6-14" href="#__codelineno-6-14"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="bluetoothnix"><code>bluetooth.nix</code><a class="headerlink" href="#bluetoothnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/bluetooth/bluetooth.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/bluetooth/bluetooth.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="citrix-workspacenix"><code>citrix-workspace.nix</code><a class="headerlink" href="#citrix-workspacenix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/citrix-workspace.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/citrix-workspace.nix</code></a></p> <ul> <li><strong>Enable option:</strong> Citrix Workspace</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>package</code>, <code>acceptLicense</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a> options<span class="o">.</span>services<span class="o">.</span><span class="ss">citrix-workspace</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"Citrix Workspace"</span><span class="p">;</span> </span><span id="__span-7-3"><a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a> </span><span id="__span-7-4"><a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a> <span class="ss">package</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-7-5"><a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>package<span class="p">;</span> </span><span id="__span-7-6"><a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a> <span class="ss">default</span> <span class="o">=</span> pkgs<span class="o">.</span>citrix_workspace<span class="p">;</span> </span><span id="__span-7-7"><a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Citrix Workspace package to use"</span><span class="p">;</span> </span><span id="__span-7-8"><a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a> <span class="p">};</span> </span><span id="__span-7-9"><a id="__codelineno-7-9" name="__codelineno-7-9" href="#__codelineno-7-9"></a> </span><span id="__span-7-10"><a id="__codelineno-7-10" name="__codelineno-7-10" href="#__codelineno-7-10"></a> <span class="ss">acceptLicense</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-7-11"><a id="__codelineno-7-11" name="__codelineno-7-11" href="#__codelineno-7-11"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-7-12"><a id="__codelineno-7-12" name="__codelineno-7-12" href="#__codelineno-7-12"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-7-13"><a id="__codelineno-7-13" name="__codelineno-7-13" href="#__codelineno-7-13"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-7-14"><a id="__codelineno-7-14" name="__codelineno-7-14" href="#__codelineno-7-14"></a><span class="s s-Multiline"> Accept the Citrix Workspace End User License Agreement.</span> </span><span id="__span-7-15"><a id="__codelineno-7-15" name="__codelineno-7-15" href="#__codelineno-7-15"></a> </span><span id="__span-7-16"><a id="__codelineno-7-16" name="__codelineno-7-16" href="#__codelineno-7-16"></a><span class="s s-Multiline"> WARNING: By setting this to true, you accept the Citrix EULA.</span> </span><span id="__span-7-17"><a id="__codelineno-7-17" name="__codelineno-7-17" href="#__codelineno-7-17"></a><span class="s s-Multiline"> You must manually download the tarball from Citrix if required.</span> </span><span id="__span-7-18"><a id="__codelineno-7-18" name="__codelineno-7-18" href="#__codelineno-7-18"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-7-19"><a id="__codelineno-7-19" name="__codelineno-7-19" href="#__codelineno-7-19"></a> <span class="p">};</span> </span><span id="__span-7-20"><a id="__codelineno-7-20" name="__codelineno-7-20" href="#__codelineno-7-20"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="cloudflarednix"><code>cloudflared.nix</code><a class="headerlink" href="#cloudflarednix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/cloudflared.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/cloudflared.nix</code></a></p> <p>Cloudflare Tunnel — public ingress for p510 services from behind Starlink CGNAT.</p> <p>Outbound-only tunnel from p510 to Cloudflare's edge. No port forwards, no public IP needed. Each route maps a hostname under <code>freundcloud.org.uk</code> (Cloudflare-managed zone) to a local URL on p510.</p> <p>Thin feature-flag wrapper over upstream <code>services.cloudflared</code>. The credentials.json from <code>cloudflared tunnel create</code> lives in agenix (cloudflared-credentials.age); the cert.pem from <code>cloudflared login</code> lives in agenix too (cloudflared-cert.age). Routes are declarative — add a new entry to <code>cfg.ingress</code>, deploy, optionally run <code>cloudflared tunnel route dns <tunnel> <hostname></code> once to add the Cloudflare DNS CNAME (or do it via dashboard).</p> <p>One-time bootstrap (run on a workstation with browser access — NOT p510): 1. nix-shell -p cloudflared 2. cloudflared login # → opens browser; saves ~/.cloudflared/cert.pem 3. cloudflared tunnel create p510-home</p> <h1 id="prints-tunnel-uuid-saves-cloudflaredjson">→ prints tunnel UUID, saves ~/.cloudflared/<UUID>.json<a class="headerlink" href="#prints-tunnel-uuid-saves-cloudflaredjson" title="Anchor link to this section">¶</a></h1> <ol> <li>Copy cert.pem + <UUID>.json into agenix via manage-secrets.sh (one secret each: cloudflared-cert, cloudflared-credentials)</li> <li>Set features.cloudflared.tunnelId to the UUID and deploy</li> </ol> <p>Adding a Cloudflare DNS record for a hostname (one-time per hostname): cloudflared tunnel route dns p510-home argocd.freundcloud.org.uk</p> <h1 id="or-click-route-in-the-cloudflare-zero-trust-dashboard">or click-route in the Cloudflare Zero Trust dashboard<a class="headerlink" href="#or-click-route-in-the-cloudflare-zero-trust-dashboard" title="Anchor link to this section">¶</a></h1> <p>References: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/ https://nixos.wiki/wiki/Cloudflare_tunnel</p> <ul> <li><strong>Enable option:</strong> Cloudflare Tunnel client — public ingress from behind Starlink CGNAT</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">cloudflared</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"Cloudflare Tunnel client — public ingress from behind Starlink CGNAT"</span><span class="p">;</span> </span><span id="__span-8-3"><a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a> </span><span id="__span-8-4"><a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a> <span class="ss">tunnelId</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-8-5"><a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-8-6"><a id="__codelineno-8-6" name="__codelineno-8-6" href="#__codelineno-8-6"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-8-7"><a id="__codelineno-8-7" name="__codelineno-8-7" href="#__codelineno-8-7"></a><span class="s s-Multiline"> Tunnel UUID issued by `cloudflared tunnel create`. The credentials</span> </span><span id="__span-8-8"><a id="__codelineno-8-8" name="__codelineno-8-8" href="#__codelineno-8-8"></a><span class="s s-Multiline"> file in agenix MUST match this UUID — they are paired.</span> </span><span id="__span-8-9"><a id="__codelineno-8-9" name="__codelineno-8-9" href="#__codelineno-8-9"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-8-10"><a id="__codelineno-8-10" name="__codelineno-8-10" href="#__codelineno-8-10"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"deadbeef-1234-5678-9abc-def012345678"</span><span class="p">;</span> </span><span id="__span-8-11"><a id="__codelineno-8-11" name="__codelineno-8-11" href="#__codelineno-8-11"></a> <span class="p">};</span> </span><span id="__span-8-12"><a id="__codelineno-8-12" name="__codelineno-8-12" href="#__codelineno-8-12"></a> </span><span id="__span-8-13"><a id="__codelineno-8-13" name="__codelineno-8-13" href="#__codelineno-8-13"></a> <span class="ss">ingress</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-8-14"><a id="__codelineno-8-14" name="__codelineno-8-14" href="#__codelineno-8-14"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>attrsOf lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-8-15"><a id="__codelineno-8-15" name="__codelineno-8-15" href="#__codelineno-8-15"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">{</span> <span class="p">};</span> </span><span id="__span-8-16"><a id="__codelineno-8-16" name="__codelineno-8-16" href="#__codelineno-8-16"></a> <span class="ss">example</span> <span class="o">=</span> lib<span class="o">.</span>literalExpression <span class="s s-Multiline">''</span> </span><span id="__span-8-17"><a id="__codelineno-8-17" name="__codelineno-8-17" href="#__codelineno-8-17"></a><span class="s s-Multiline"> {</span> </span><span id="__span-8-18"><a id="__codelineno-8-18" name="__codelineno-8-18" href="#__codelineno-8-18"></a><span class="s s-Multiline"> "argocd.freundcloud.org.uk" = "http://localhost:80";</span> </span><span id="__span-8-19"><a id="__codelineno-8-19" name="__codelineno-8-19" href="#__codelineno-8-19"></a><span class="s s-Multiline"> "backstage.freundcloud.org.uk" = "http://localhost:7007";</span> </span><span id="__span-8-20"><a id="__codelineno-8-20" name="__codelineno-8-20" href="#__codelineno-8-20"></a><span class="s s-Multiline"> }</span> </span><span id="__span-8-21"><a id="__codelineno-8-21" name="__codelineno-8-21" href="#__codelineno-8-21"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-8-22"><a id="__codelineno-8-22" name="__codelineno-8-22" href="#__codelineno-8-22"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-8-23"><a id="__codelineno-8-23" name="__codelineno-8-23" href="#__codelineno-8-23"></a><span class="s s-Multiline"> Map of public hostnames to local service URLs that cloudflared will</span> </span><span id="__span-8-24"><a id="__codelineno-8-24" name="__codelineno-8-24" href="#__codelineno-8-24"></a><span class="s s-Multiline"> proxy. Each hostname MUST also have a Cloudflare DNS CNAME pointing</span> </span><span id="__span-8-25"><a id="__codelineno-8-25" name="__codelineno-8-25" href="#__codelineno-8-25"></a><span class="s s-Multiline"> at <tunnelId>.cfargotunnel.com — created once via:</span> </span><span id="__span-8-26"><a id="__codelineno-8-26" name="__codelineno-8-26" href="#__codelineno-8-26"></a> </span><span id="__span-8-27"><a id="__codelineno-8-27" name="__codelineno-8-27" href="#__codelineno-8-27"></a><span class="s s-Multiline"> cloudflared tunnel route dns p510-home <hostname></span> </span><span id="__span-8-28"><a id="__codelineno-8-28" name="__codelineno-8-28" href="#__codelineno-8-28"></a> </span><span id="__span-8-29"><a id="__codelineno-8-29" name="__codelineno-8-29" href="#__codelineno-8-29"></a><span class="s s-Multiline"> or via the Cloudflare Zero Trust dashboard.</span> </span><span id="__span-8-30"><a id="__codelineno-8-30" name="__codelineno-8-30" href="#__codelineno-8-30"></a> </span><span id="__span-8-31"><a id="__codelineno-8-31" name="__codelineno-8-31" href="#__codelineno-8-31"></a><span class="s s-Multiline"> Default fallback (`services.cloudflared.tunnels.<id>.default`) is</span> </span><span id="__span-8-32"><a id="__codelineno-8-32" name="__codelineno-8-32" href="#__codelineno-8-32"></a><span class="s s-Multiline"> set below to `http_status:404` so any miss returns a clean 404</span> </span><span id="__span-8-33"><a id="__codelineno-8-33" name="__codelineno-8-33" href="#__codelineno-8-33"></a><span class="s s-Multiline"> rather than leaking that the tunnel exists.</span> </span><span id="__span-8-34"><a id="__codelineno-8-34" name="__codelineno-8-34" href="#__codelineno-8-34"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-8-35"><a id="__codelineno-8-35" name="__codelineno-8-35" href="#__codelineno-8-35"></a> <span class="p">};</span> </span><span id="__span-8-36"><a id="__codelineno-8-36" name="__codelineno-8-36" href="#__codelineno-8-36"></a> </span><span id="__span-8-37"><a id="__codelineno-8-37" name="__codelineno-8-37" href="#__codelineno-8-37"></a> <span class="ss">keepalive</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-8-38"><a id="__codelineno-8-38" name="__codelineno-8-38" href="#__codelineno-8-38"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s s-Multiline">''</span> </span><span id="__span-8-39"><a id="__codelineno-8-39" name="__codelineno-8-39" href="#__codelineno-8-39"></a><span class="s s-Multiline"> Periodic GET against each ingress origin to keep apps warm.</span> </span><span id="__span-8-40"><a id="__codelineno-8-40" name="__codelineno-8-40" href="#__codelineno-8-40"></a> </span><span id="__span-8-41"><a id="__codelineno-8-41" name="__codelineno-8-41" href="#__codelineno-8-41"></a><span class="s s-Multiline"> Cloudflare opens a fresh TCP connection to the origin per request,</span> </span><span id="__span-8-42"><a id="__codelineno-8-42" name="__codelineno-8-42" href="#__codelineno-8-42"></a><span class="s s-Multiline"> so any app behind the tunnel that idles aggressively (Node SPAs,</span> </span><span id="__span-8-43"><a id="__codelineno-8-43" name="__codelineno-8-43" href="#__codelineno-8-43"></a><span class="s s-Multiline"> gunicorn workers, JVMs, podman containers without --keepalive)</span> </span><span id="__span-8-44"><a id="__codelineno-8-44" name="__codelineno-8-44" href="#__codelineno-8-44"></a><span class="s s-Multiline"> will cold-start on the first hit and the SPA may render blank</span> </span><span id="__span-8-45"><a id="__codelineno-8-45" name="__codelineno-8-45" href="#__codelineno-8-45"></a><span class="s s-Multiline"> while it boots. A 2-minute heartbeat sidesteps this entirely.</span> </span><span id="__span-8-46"><a id="__codelineno-8-46" name="__codelineno-8-46" href="#__codelineno-8-46"></a> </span><span id="__span-8-47"><a id="__codelineno-8-47" name="__codelineno-8-47" href="#__codelineno-8-47"></a><span class="s s-Multiline"> Hits the LOCAL origin URLs directly — does not exercise the</span> </span><span id="__span-8-48"><a id="__codelineno-8-48" name="__codelineno-8-48" href="#__codelineno-8-48"></a><span class="s s-Multiline"> cloudflared edge path, just the origin app, which is what needs</span> </span><span id="__span-8-49"><a id="__codelineno-8-49" name="__codelineno-8-49" href="#__codelineno-8-49"></a><span class="s s-Multiline"> keeping warm.</span> </span><span id="__span-8-50"><a id="__codelineno-8-50" name="__codelineno-8-50" href="#__codelineno-8-50"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-8-51"><a id="__codelineno-8-51" name="__codelineno-8-51" href="#__codelineno-8-51"></a> </span><span id="__span-8-52"><a id="__codelineno-8-52" name="__codelineno-8-52" href="#__codelineno-8-52"></a> <span class="ss">interval</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-8-53"><a id="__codelineno-8-53" name="__codelineno-8-53" href="#__codelineno-8-53"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-8-54"><a id="__codelineno-8-54" name="__codelineno-8-54" href="#__codelineno-8-54"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"2min"</span><span class="p">;</span> </span><span id="__span-8-55"><a id="__codelineno-8-55" name="__codelineno-8-55" href="#__codelineno-8-55"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"5min"</span><span class="p">;</span> </span><span id="__span-8-56"><a id="__codelineno-8-56" name="__codelineno-8-56" href="#__codelineno-8-56"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-8-57"><a id="__codelineno-8-57" name="__codelineno-8-57" href="#__codelineno-8-57"></a><span class="s s-Multiline"> systemd `OnUnitActiveSec` interval between keepalive runs.</span> </span><span id="__span-8-58"><a id="__codelineno-8-58" name="__codelineno-8-58" href="#__codelineno-8-58"></a><span class="s s-Multiline"> Default 2min is comfortably under typical idle-recycle windows</span> </span><span id="__span-8-59"><a id="__codelineno-8-59" name="__codelineno-8-59" href="#__codelineno-8-59"></a><span class="s s-Multiline"> (Node `keepAliveTimeout`, gunicorn worker recycling, k8s HPA</span> </span><span id="__span-8-60"><a id="__codelineno-8-60" name="__codelineno-8-60" href="#__codelineno-8-60"></a><span class="s s-Multiline"> scale-to-zero) without generating meaningful load.</span> </span><span id="__span-8-61"><a id="__codelineno-8-61" name="__codelineno-8-61" href="#__codelineno-8-61"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-8-62"><a id="__codelineno-8-62" name="__codelineno-8-62" href="#__codelineno-8-62"></a> <span class="p">};</span> </span><span id="__span-8-63"><a id="__codelineno-8-63" name="__codelineno-8-63" href="#__codelineno-8-63"></a> </span><span id="__span-8-64"><a id="__codelineno-8-64" name="__codelineno-8-64" href="#__codelineno-8-64"></a> <span class="ss">timeout</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-8-65"><a id="__codelineno-8-65" name="__codelineno-8-65" href="#__codelineno-8-65"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-8-66"><a id="__codelineno-8-66" name="__codelineno-8-66" href="#__codelineno-8-66"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> </span><span id="__span-8-67"><a id="__codelineno-8-67" name="__codelineno-8-67" href="#__codelineno-8-67"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-8-68"><a id="__codelineno-8-68" name="__codelineno-8-68" href="#__codelineno-8-68"></a><span class="s s-Multiline"> Per-origin curl timeout in seconds. Kept short so a single</span> </span><span id="__span-8-69"><a id="__codelineno-8-69" name="__codelineno-8-69" href="#__codelineno-8-69"></a><span class="s s-Multiline"> slow origin doesn't delay the rest of the sweep.</span> </span><span id="__span-8-70"><a id="__codelineno-8-70" name="__codelineno-8-70" href="#__codelineno-8-70"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-8-71"><a id="__codelineno-8-71" name="__codelineno-8-71" href="#__codelineno-8-71"></a> <span class="p">};</span> </span><span id="__span-8-72"><a id="__codelineno-8-72" name="__codelineno-8-72" href="#__codelineno-8-72"></a> <span class="p">};</span> </span><span id="__span-8-73"><a id="__codelineno-8-73" name="__codelineno-8-73" href="#__codelineno-8-73"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="cronnix"><code>cron.nix</code><a class="headerlink" href="#cronnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/cron/cron.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/cron/cron.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="defaultnix_2"><code>default.nix</code><a class="headerlink" href="#defaultnix_2" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/default.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="secure-dnsnix"><code>secure-dns.nix</code><a class="headerlink" href="#secure-dnsnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/dns/secure-dns.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/dns/secure-dns.nix</code></a></p> <ul> <li><strong>Enable option:</strong> Secure DNS with enhanced stability</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>dnssec</code>, <code>useStubResolver</code>, <code>fallbackProviders</code>, <code>cacheSize</code>, <code>dnsOverTls</code>, <code>networkManagerIntegration</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a> options<span class="o">.</span>services<span class="o">.</span><span class="ss">secure-dns</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"Secure DNS with enhanced stability"</span><span class="p">;</span> </span><span id="__span-9-3"><a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a> </span><span id="__span-9-4"><a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a> <span class="ss">dnssec</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-9-5"><a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>enum <span class="p">[</span> <span class="s2">"true"</span> <span class="s2">"false"</span> <span class="s2">"allow-downgrade"</span> <span class="p">];</span> </span><span id="__span-9-6"><a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"true"</span><span class="p">;</span> </span><span id="__span-9-7"><a id="__codelineno-9-7" name="__codelineno-9-7" href="#__codelineno-9-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Whether to enable DNSSEC validation"</span><span class="p">;</span> </span><span id="__span-9-8"><a id="__codelineno-9-8" name="__codelineno-9-8" href="#__codelineno-9-8"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"allow-downgrade"</span><span class="p">;</span> </span><span id="__span-9-9"><a id="__codelineno-9-9" name="__codelineno-9-9" href="#__codelineno-9-9"></a> <span class="p">};</span> </span><span id="__span-9-10"><a id="__codelineno-9-10" name="__codelineno-9-10" href="#__codelineno-9-10"></a> </span><span id="__span-9-11"><a id="__codelineno-9-11" name="__codelineno-9-11" href="#__codelineno-9-11"></a> <span class="ss">useStubResolver</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-9-12"><a id="__codelineno-9-12" name="__codelineno-9-12" href="#__codelineno-9-12"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-9-13"><a id="__codelineno-9-13" name="__codelineno-9-13" href="#__codelineno-9-13"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-9-14"><a id="__codelineno-9-14" name="__codelineno-9-14" href="#__codelineno-9-14"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Use systemd-resolved's stub resolver"</span><span class="p">;</span> </span><span id="__span-9-15"><a id="__codelineno-9-15" name="__codelineno-9-15" href="#__codelineno-9-15"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-9-16"><a id="__codelineno-9-16" name="__codelineno-9-16" href="#__codelineno-9-16"></a> <span class="p">};</span> </span><span id="__span-9-17"><a id="__codelineno-9-17" name="__codelineno-9-17" href="#__codelineno-9-17"></a> </span><span id="__span-9-18"><a id="__codelineno-9-18" name="__codelineno-9-18" href="#__codelineno-9-18"></a> <span class="ss">fallbackProviders</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-9-19"><a id="__codelineno-9-19" name="__codelineno-9-19" href="#__codelineno-9-19"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>listOf types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-9-20"><a id="__codelineno-9-20" name="__codelineno-9-20" href="#__codelineno-9-20"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">[</span> </span><span id="__span-9-21"><a id="__codelineno-9-21" name="__codelineno-9-21" href="#__codelineno-9-21"></a> <span class="s2">"1.1.1.1#cloudflare-dns.com"</span> </span><span id="__span-9-22"><a id="__codelineno-9-22" name="__codelineno-9-22" href="#__codelineno-9-22"></a> <span class="s2">"8.8.8.8#dns.google"</span> </span><span id="__span-9-23"><a id="__codelineno-9-23" name="__codelineno-9-23" href="#__codelineno-9-23"></a> <span class="p">];</span> </span><span id="__span-9-24"><a id="__codelineno-9-24" name="__codelineno-9-24" href="#__codelineno-9-24"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"List of fallback DNS providers to use"</span><span class="p">;</span> </span><span id="__span-9-25"><a id="__codelineno-9-25" name="__codelineno-9-25" href="#__codelineno-9-25"></a> <span class="ss">example</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"9.9.9.9#dns.quad9.net"</span> <span class="p">];</span> </span><span id="__span-9-26"><a id="__codelineno-9-26" name="__codelineno-9-26" href="#__codelineno-9-26"></a> <span class="p">};</span> </span><span id="__span-9-27"><a id="__codelineno-9-27" name="__codelineno-9-27" href="#__codelineno-9-27"></a> </span><span id="__span-9-28"><a id="__codelineno-9-28" name="__codelineno-9-28" href="#__codelineno-9-28"></a> <span class="ss">cacheSize</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-9-29"><a id="__codelineno-9-29" name="__codelineno-9-29" href="#__codelineno-9-29"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-9-30"><a id="__codelineno-9-30" name="__codelineno-9-30" href="#__codelineno-9-30"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">4096</span><span class="p">;</span> </span><span id="__span-9-31"><a id="__codelineno-9-31" name="__codelineno-9-31" href="#__codelineno-9-31"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Size of DNS cache in entries"</span><span class="p">;</span> </span><span id="__span-9-32"><a id="__codelineno-9-32" name="__codelineno-9-32" href="#__codelineno-9-32"></a> <span class="ss">example</span> <span class="o">=</span> <span class="mi">8192</span><span class="p">;</span> </span><span id="__span-9-33"><a id="__codelineno-9-33" name="__codelineno-9-33" href="#__codelineno-9-33"></a> <span class="p">};</span> </span><span id="__span-9-34"><a id="__codelineno-9-34" name="__codelineno-9-34" href="#__codelineno-9-34"></a> </span><span id="__span-9-35"><a id="__codelineno-9-35" name="__codelineno-9-35" href="#__codelineno-9-35"></a> <span class="ss">dnsOverTls</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-9-36"><a id="__codelineno-9-36" name="__codelineno-9-36" href="#__codelineno-9-36"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-9-37"><a id="__codelineno-9-37" name="__codelineno-9-37" href="#__codelineno-9-37"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-9-38"><a id="__codelineno-9-38" name="__codelineno-9-38" href="#__codelineno-9-38"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Whether to enable DNS-over-TLS"</span><span class="p">;</span> </span><span id="__span-9-39"><a id="__codelineno-9-39" name="__codelineno-9-39" href="#__codelineno-9-39"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-9-40"><a id="__codelineno-9-40" name="__codelineno-9-40" href="#__codelineno-9-40"></a> <span class="p">};</span> </span><span id="__span-9-41"><a id="__codelineno-9-41" name="__codelineno-9-41" href="#__codelineno-9-41"></a> </span><span id="__span-9-42"><a id="__codelineno-9-42" name="__codelineno-9-42" href="#__codelineno-9-42"></a> <span class="ss">networkManagerIntegration</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-9-43"><a id="__codelineno-9-43" name="__codelineno-9-43" href="#__codelineno-9-43"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-9-44"><a id="__codelineno-9-44" name="__codelineno-9-44" href="#__codelineno-9-44"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-9-45"><a id="__codelineno-9-45" name="__codelineno-9-45" href="#__codelineno-9-45"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Whether to integrate with NetworkManager"</span><span class="p">;</span> </span><span id="__span-9-46"><a id="__codelineno-9-46" name="__codelineno-9-46" href="#__codelineno-9-46"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-9-47"><a id="__codelineno-9-47" name="__codelineno-9-47" href="#__codelineno-9-47"></a> <span class="p">};</span> </span><span id="__span-9-48"><a id="__codelineno-9-48" name="__codelineno-9-48" href="#__codelineno-9-48"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="defaultnix_3"><code>default.nix</code><a class="headerlink" href="#defaultnix_3" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/flaresolverr/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/flaresolverr/default.nix</code></a></p> <p>FlareSolverr Configuration Module A proxy server to bypass Cloudflare protection for web scraping applications</p> <ul> <li><strong>Enable option:</strong> FlareSolverr proxy server</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>package</code>, <code>port</code>, <code>host</code>, <code>logLevel</code>, <code>logHtml</code>, <code>captchaSolver</code>, <code>testUrl</code>, <code>sessionTtl</code>, <code>headless</code>, <code>browserTimeout</code>, <code>user</code>, <code>group</code>, <code>dataDir</code>, <code>extraEnvironment</code>, <code>openFirewall</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a> options<span class="o">.</span>services<span class="o">.</span><span class="ss">flaresolverr</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"FlareSolverr proxy server"</span><span class="p">;</span> </span><span id="__span-10-3"><a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a> </span><span id="__span-10-4"><a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-4"></a> <span class="ss">package</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-5"><a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>package<span class="p">;</span> </span><span id="__span-10-6"><a id="__codelineno-10-6" name="__codelineno-10-6" href="#__codelineno-10-6"></a> <span class="ss">default</span> <span class="o">=</span> pkgs<span class="o">.</span>flaresolverr<span class="p">;</span> </span><span id="__span-10-7"><a id="__codelineno-10-7" name="__codelineno-10-7" href="#__codelineno-10-7"></a> <span class="ss">defaultText</span> <span class="o">=</span> literalExpression <span class="s2">"pkgs.flaresolverr"</span><span class="p">;</span> </span><span id="__span-10-8"><a id="__codelineno-10-8" name="__codelineno-10-8" href="#__codelineno-10-8"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"The FlareSolverr package to use"</span><span class="p">;</span> </span><span id="__span-10-9"><a id="__codelineno-10-9" name="__codelineno-10-9" href="#__codelineno-10-9"></a> <span class="p">};</span> </span><span id="__span-10-10"><a id="__codelineno-10-10" name="__codelineno-10-10" href="#__codelineno-10-10"></a> </span><span id="__span-10-11"><a id="__codelineno-10-11" name="__codelineno-10-11" href="#__codelineno-10-11"></a> <span class="ss">port</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-12"><a id="__codelineno-10-12" name="__codelineno-10-12" href="#__codelineno-10-12"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>port<span class="p">;</span> </span><span id="__span-10-13"><a id="__codelineno-10-13" name="__codelineno-10-13" href="#__codelineno-10-13"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">8191</span><span class="p">;</span> </span><span id="__span-10-14"><a id="__codelineno-10-14" name="__codelineno-10-14" href="#__codelineno-10-14"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Port on which FlareSolverr will listen"</span><span class="p">;</span> </span><span id="__span-10-15"><a id="__codelineno-10-15" name="__codelineno-10-15" href="#__codelineno-10-15"></a> <span class="p">};</span> </span><span id="__span-10-16"><a id="__codelineno-10-16" name="__codelineno-10-16" href="#__codelineno-10-16"></a> </span><span id="__span-10-17"><a id="__codelineno-10-17" name="__codelineno-10-17" href="#__codelineno-10-17"></a> <span class="ss">host</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-18"><a id="__codelineno-10-18" name="__codelineno-10-18" href="#__codelineno-10-18"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-10-19"><a id="__codelineno-10-19" name="__codelineno-10-19" href="#__codelineno-10-19"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"0.0.0.0"</span><span class="p">;</span> </span><span id="__span-10-20"><a id="__codelineno-10-20" name="__codelineno-10-20" href="#__codelineno-10-20"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Host address to bind to"</span><span class="p">;</span> </span><span id="__span-10-21"><a id="__codelineno-10-21" name="__codelineno-10-21" href="#__codelineno-10-21"></a> <span class="p">};</span> </span><span id="__span-10-22"><a id="__codelineno-10-22" name="__codelineno-10-22" href="#__codelineno-10-22"></a> </span><span id="__span-10-23"><a id="__codelineno-10-23" name="__codelineno-10-23" href="#__codelineno-10-23"></a> <span class="ss">logLevel</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-24"><a id="__codelineno-10-24" name="__codelineno-10-24" href="#__codelineno-10-24"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>enum <span class="p">[</span> <span class="s2">"debug"</span> <span class="s2">"info"</span> <span class="s2">"warning"</span> <span class="s2">"error"</span> <span class="p">];</span> </span><span id="__span-10-25"><a id="__codelineno-10-25" name="__codelineno-10-25" href="#__codelineno-10-25"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"info"</span><span class="p">;</span> </span><span id="__span-10-26"><a id="__codelineno-10-26" name="__codelineno-10-26" href="#__codelineno-10-26"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Log level for FlareSolverr"</span><span class="p">;</span> </span><span id="__span-10-27"><a id="__codelineno-10-27" name="__codelineno-10-27" href="#__codelineno-10-27"></a> <span class="p">};</span> </span><span id="__span-10-28"><a id="__codelineno-10-28" name="__codelineno-10-28" href="#__codelineno-10-28"></a> </span><span id="__span-10-29"><a id="__codelineno-10-29" name="__codelineno-10-29" href="#__codelineno-10-29"></a> <span class="ss">logHtml</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-30"><a id="__codelineno-10-30" name="__codelineno-10-30" href="#__codelineno-10-30"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-10-31"><a id="__codelineno-10-31" name="__codelineno-10-31" href="#__codelineno-10-31"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-10-32"><a id="__codelineno-10-32" name="__codelineno-10-32" href="#__codelineno-10-32"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Whether to log HTML content"</span><span class="p">;</span> </span><span id="__span-10-33"><a id="__codelineno-10-33" name="__codelineno-10-33" href="#__codelineno-10-33"></a> <span class="p">};</span> </span><span id="__span-10-34"><a id="__codelineno-10-34" name="__codelineno-10-34" href="#__codelineno-10-34"></a> </span><span id="__span-10-35"><a id="__codelineno-10-35" name="__codelineno-10-35" href="#__codelineno-10-35"></a> <span class="ss">captchaSolver</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-36"><a id="__codelineno-10-36" name="__codelineno-10-36" href="#__codelineno-10-36"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>enum <span class="p">[</span> <span class="s2">"none"</span> <span class="s2">"hcaptcha-solver"</span> <span class="s2">"harvester"</span> <span class="p">];</span> </span><span id="__span-10-37"><a id="__codelineno-10-37" name="__codelineno-10-37" href="#__codelineno-10-37"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"none"</span><span class="p">;</span> </span><span id="__span-10-38"><a id="__codelineno-10-38" name="__codelineno-10-38" href="#__codelineno-10-38"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"CAPTCHA solver to use"</span><span class="p">;</span> </span><span id="__span-10-39"><a id="__codelineno-10-39" name="__codelineno-10-39" href="#__codelineno-10-39"></a> <span class="p">};</span> </span><span id="__span-10-40"><a id="__codelineno-10-40" name="__codelineno-10-40" href="#__codelineno-10-40"></a> </span><span id="__span-10-41"><a id="__codelineno-10-41" name="__codelineno-10-41" href="#__codelineno-10-41"></a> <span class="ss">testUrl</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-42"><a id="__codelineno-10-42" name="__codelineno-10-42" href="#__codelineno-10-42"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-10-43"><a id="__codelineno-10-43" name="__codelineno-10-43" href="#__codelineno-10-43"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"https://www.google.com"</span><span class="p">;</span> </span><span id="__span-10-44"><a id="__codelineno-10-44" name="__codelineno-10-44" href="#__codelineno-10-44"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"URL to test browser functionality"</span><span class="p">;</span> </span><span id="__span-10-45"><a id="__codelineno-10-45" name="__codelineno-10-45" href="#__codelineno-10-45"></a> <span class="p">};</span> </span><span id="__span-10-46"><a id="__codelineno-10-46" name="__codelineno-10-46" href="#__codelineno-10-46"></a> </span><span id="__span-10-47"><a id="__codelineno-10-47" name="__codelineno-10-47" href="#__codelineno-10-47"></a> <span class="ss">sessionTtl</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-48"><a id="__codelineno-10-48" name="__codelineno-10-48" href="#__codelineno-10-48"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-10-49"><a id="__codelineno-10-49" name="__codelineno-10-49" href="#__codelineno-10-49"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">600000</span><span class="p">;</span> </span><span id="__span-10-50"><a id="__codelineno-10-50" name="__codelineno-10-50" href="#__codelineno-10-50"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Session time-to-live in milliseconds"</span><span class="p">;</span> </span><span id="__span-10-51"><a id="__codelineno-10-51" name="__codelineno-10-51" href="#__codelineno-10-51"></a> <span class="p">};</span> </span><span id="__span-10-52"><a id="__codelineno-10-52" name="__codelineno-10-52" href="#__codelineno-10-52"></a> </span><span id="__span-10-53"><a id="__codelineno-10-53" name="__codelineno-10-53" href="#__codelineno-10-53"></a> <span class="ss">headless</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-54"><a id="__codelineno-10-54" name="__codelineno-10-54" href="#__codelineno-10-54"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-10-55"><a id="__codelineno-10-55" name="__codelineno-10-55" href="#__codelineno-10-55"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-10-56"><a id="__codelineno-10-56" name="__codelineno-10-56" href="#__codelineno-10-56"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Run browser in headless mode"</span><span class="p">;</span> </span><span id="__span-10-57"><a id="__codelineno-10-57" name="__codelineno-10-57" href="#__codelineno-10-57"></a> <span class="p">};</span> </span><span id="__span-10-58"><a id="__codelineno-10-58" name="__codelineno-10-58" href="#__codelineno-10-58"></a> </span><span id="__span-10-59"><a id="__codelineno-10-59" name="__codelineno-10-59" href="#__codelineno-10-59"></a> <span class="ss">browserTimeout</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-60"><a id="__codelineno-10-60" name="__codelineno-10-60" href="#__codelineno-10-60"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-10-61"><a id="__codelineno-10-61" name="__codelineno-10-61" href="#__codelineno-10-61"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">40000</span><span class="p">;</span> </span><span id="__span-10-62"><a id="__codelineno-10-62" name="__codelineno-10-62" href="#__codelineno-10-62"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Browser timeout in milliseconds"</span><span class="p">;</span> </span><span id="__span-10-63"><a id="__codelineno-10-63" name="__codelineno-10-63" href="#__codelineno-10-63"></a> <span class="p">};</span> </span><span id="__span-10-64"><a id="__codelineno-10-64" name="__codelineno-10-64" href="#__codelineno-10-64"></a> </span><span id="__span-10-65"><a id="__codelineno-10-65" name="__codelineno-10-65" href="#__codelineno-10-65"></a> <span class="ss">user</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-66"><a id="__codelineno-10-66" name="__codelineno-10-66" href="#__codelineno-10-66"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-10-67"><a id="__codelineno-10-67" name="__codelineno-10-67" href="#__codelineno-10-67"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"flaresolverr"</span><span class="p">;</span> </span><span id="__span-10-68"><a id="__codelineno-10-68" name="__codelineno-10-68" href="#__codelineno-10-68"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"User to run FlareSolverr as"</span><span class="p">;</span> </span><span id="__span-10-69"><a id="__codelineno-10-69" name="__codelineno-10-69" href="#__codelineno-10-69"></a> <span class="p">};</span> </span><span id="__span-10-70"><a id="__codelineno-10-70" name="__codelineno-10-70" href="#__codelineno-10-70"></a> </span><span id="__span-10-71"><a id="__codelineno-10-71" name="__codelineno-10-71" href="#__codelineno-10-71"></a> <span class="ss">group</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-72"><a id="__codelineno-10-72" name="__codelineno-10-72" href="#__codelineno-10-72"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-10-73"><a id="__codelineno-10-73" name="__codelineno-10-73" href="#__codelineno-10-73"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"flaresolverr"</span><span class="p">;</span> </span><span id="__span-10-74"><a id="__codelineno-10-74" name="__codelineno-10-74" href="#__codelineno-10-74"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Group to run FlareSolverr as"</span><span class="p">;</span> </span><span id="__span-10-75"><a id="__codelineno-10-75" name="__codelineno-10-75" href="#__codelineno-10-75"></a> <span class="p">};</span> </span><span id="__span-10-76"><a id="__codelineno-10-76" name="__codelineno-10-76" href="#__codelineno-10-76"></a> </span><span id="__span-10-77"><a id="__codelineno-10-77" name="__codelineno-10-77" href="#__codelineno-10-77"></a> <span class="ss">dataDir</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-78"><a id="__codelineno-10-78" name="__codelineno-10-78" href="#__codelineno-10-78"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>path<span class="p">;</span> </span><span id="__span-10-79"><a id="__codelineno-10-79" name="__codelineno-10-79" href="#__codelineno-10-79"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"/var/lib/flaresolverr"</span><span class="p">;</span> </span><span id="__span-10-80"><a id="__codelineno-10-80" name="__codelineno-10-80" href="#__codelineno-10-80"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Data directory for FlareSolverr"</span><span class="p">;</span> </span><span id="__span-10-81"><a id="__codelineno-10-81" name="__codelineno-10-81" href="#__codelineno-10-81"></a> <span class="p">};</span> </span><span id="__span-10-82"><a id="__codelineno-10-82" name="__codelineno-10-82" href="#__codelineno-10-82"></a> </span><span id="__span-10-83"><a id="__codelineno-10-83" name="__codelineno-10-83" href="#__codelineno-10-83"></a> <span class="ss">extraEnvironment</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-10-84"><a id="__codelineno-10-84" name="__codelineno-10-84" href="#__codelineno-10-84"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>attrs<span class="p">;</span> </span><span id="__span-10-85"><a id="__codelineno-10-85" name="__codelineno-10-85" href="#__codelineno-10-85"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">{</span> <span class="p">};</span> </span><span id="__span-10-86"><a id="__codelineno-10-86" name="__codelineno-10-86" href="#__codelineno-10-86"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Extra environment variables for FlareSolverr"</span><span class="p">;</span> </span><span id="__span-10-87"><a id="__codelineno-10-87" name="__codelineno-10-87" href="#__codelineno-10-87"></a> <span class="ss">example</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-10-88"><a id="__codelineno-10-88" name="__codelineno-10-88" href="#__codelineno-10-88"></a> <span class="ss">PROMETHEUS_ENABLED</span> <span class="o">=</span> <span class="s2">"true"</span><span class="p">;</span> </span><span id="__span-10-89"><a id="__codelineno-10-89" name="__codelineno-10-89" href="#__codelineno-10-89"></a> <span class="ss">PROMETHEUS_PORT</span> <span class="o">=</span> <span class="s2">"8192"</span><span class="p">;</span> </span><span id="__span-10-90"><a id="__codelineno-10-90" name="__codelineno-10-90" href="#__codelineno-10-90"></a> <span class="p">};</span> </span><span id="__span-10-91"><a id="__codelineno-10-91" name="__codelineno-10-91" href="#__codelineno-10-91"></a><span class="c1"># … truncated — see source link above</span> </span></code></pre></div> </details> <h3 id="flatpaknix"><code>flatpak.nix</code><a class="headerlink" href="#flatpaknix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/flatpak/flatpak.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/flatpak/flatpak.nix</code></a></p> <p>Flatpak Application Management Module Enables Flatpak with automatic Flathub repository setup</p> <ul> <li><strong>Enable option:</strong> Flatpak application management</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>autoAddFlathub</code>, <code>maxRetries</code>, <code>retryDelay</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a> options<span class="o">.</span>modules<span class="o">.</span>services<span class="o">.</span><span class="ss">flatpak</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"Flatpak application management"</span><span class="p">;</span> </span><span id="__span-11-3"><a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a> </span><span id="__span-11-4"><a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a> <span class="ss">autoAddFlathub</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-11-5"><a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-11-6"><a id="__codelineno-11-6" name="__codelineno-11-6" href="#__codelineno-11-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-11-7"><a id="__codelineno-11-7" name="__codelineno-11-7" href="#__codelineno-11-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''Automatically add Flathub repository on system startup''</span><span class="p">;</span> </span><span id="__span-11-8"><a id="__codelineno-11-8" name="__codelineno-11-8" href="#__codelineno-11-8"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-11-9"><a id="__codelineno-11-9" name="__codelineno-11-9" href="#__codelineno-11-9"></a> <span class="p">};</span> </span><span id="__span-11-10"><a id="__codelineno-11-10" name="__codelineno-11-10" href="#__codelineno-11-10"></a> </span><span id="__span-11-11"><a id="__codelineno-11-11" name="__codelineno-11-11" href="#__codelineno-11-11"></a> <span class="ss">repositorySetup</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-11-12"><a id="__codelineno-11-12" name="__codelineno-11-12" href="#__codelineno-11-12"></a> <span class="ss">maxRetries</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-11-13"><a id="__codelineno-11-13" name="__codelineno-11-13" href="#__codelineno-11-13"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-11-14"><a id="__codelineno-11-14" name="__codelineno-11-14" href="#__codelineno-11-14"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> </span><span id="__span-11-15"><a id="__codelineno-11-15" name="__codelineno-11-15" href="#__codelineno-11-15"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''Maximum number of retry attempts for repository setup''</span><span class="p">;</span> </span><span id="__span-11-16"><a id="__codelineno-11-16" name="__codelineno-11-16" href="#__codelineno-11-16"></a> <span class="ss">example</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> </span><span id="__span-11-17"><a id="__codelineno-11-17" name="__codelineno-11-17" href="#__codelineno-11-17"></a> <span class="p">};</span> </span><span id="__span-11-18"><a id="__codelineno-11-18" name="__codelineno-11-18" href="#__codelineno-11-18"></a> </span><span id="__span-11-19"><a id="__codelineno-11-19" name="__codelineno-11-19" href="#__codelineno-11-19"></a> <span class="ss">retryDelay</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-11-20"><a id="__codelineno-11-20" name="__codelineno-11-20" href="#__codelineno-11-20"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-11-21"><a id="__codelineno-11-21" name="__codelineno-11-21" href="#__codelineno-11-21"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> </span><span id="__span-11-22"><a id="__codelineno-11-22" name="__codelineno-11-22" href="#__codelineno-11-22"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''Base delay in seconds between retry attempts''</span><span class="p">;</span> </span><span id="__span-11-23"><a id="__codelineno-11-23" name="__codelineno-11-23" href="#__codelineno-11-23"></a> <span class="ss">example</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> </span><span id="__span-11-24"><a id="__codelineno-11-24" name="__codelineno-11-24" href="#__codelineno-11-24"></a> <span class="p">};</span> </span><span id="__span-11-25"><a id="__codelineno-11-25" name="__codelineno-11-25" href="#__codelineno-11-25"></a> <span class="p">};</span> </span><span id="__span-11-26"><a id="__codelineno-11-26" name="__codelineno-11-26" href="#__codelineno-11-26"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="defaultnix_4"><code>default.nix</code><a class="headerlink" href="#defaultnix_4" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/geforcenow/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/geforcenow/default.nix</code></a></p> <p>NVIDIA GeForce NOW Cloud Gaming Module Enables GeForce NOW native Linux client via Flatpak</p> <ul> <li><strong>Enable option:</strong> NVIDIA GeForce NOW cloud gaming client</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>autoInstall</code>, <code>waylandFix</code>, <code>maxRetries</code>, <code>retryDelay</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a> options<span class="o">.</span>modules<span class="o">.</span>services<span class="o">.</span><span class="ss">geforcenow</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"NVIDIA GeForce NOW cloud gaming client"</span><span class="p">;</span> </span><span id="__span-12-3"><a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a> </span><span id="__span-12-4"><a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-4"></a> <span class="ss">autoInstall</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-12-5"><a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-12-6"><a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-12-7"><a id="__codelineno-12-7" name="__codelineno-12-7" href="#__codelineno-12-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-12-8"><a id="__codelineno-12-8" name="__codelineno-12-8" href="#__codelineno-12-8"></a><span class="s s-Multiline"> Automatically install GeForce NOW Flatpak on system startup.</span> </span><span id="__span-12-9"><a id="__codelineno-12-9" name="__codelineno-12-9" href="#__codelineno-12-9"></a><span class="s s-Multiline"> If disabled, the remote will be added but installation must be done manually.</span> </span><span id="__span-12-10"><a id="__codelineno-12-10" name="__codelineno-12-10" href="#__codelineno-12-10"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-12-11"><a id="__codelineno-12-11" name="__codelineno-12-11" href="#__codelineno-12-11"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-12-12"><a id="__codelineno-12-12" name="__codelineno-12-12" href="#__codelineno-12-12"></a> <span class="p">};</span> </span><span id="__span-12-13"><a id="__codelineno-12-13" name="__codelineno-12-13" href="#__codelineno-12-13"></a> </span><span id="__span-12-14"><a id="__codelineno-12-14" name="__codelineno-12-14" href="#__codelineno-12-14"></a> <span class="ss">waylandFix</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-12-15"><a id="__codelineno-12-15" name="__codelineno-12-15" href="#__codelineno-12-15"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-12-16"><a id="__codelineno-12-16" name="__codelineno-12-16" href="#__codelineno-12-16"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-12-17"><a id="__codelineno-12-17" name="__codelineno-12-17" href="#__codelineno-12-17"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-12-18"><a id="__codelineno-12-18" name="__codelineno-12-18" href="#__codelineno-12-18"></a><span class="s s-Multiline"> Apply Wayland fix by disabling Wayland socket for GeForce NOW.</span> </span><span id="__span-12-19"><a id="__codelineno-12-19" name="__codelineno-12-19" href="#__codelineno-12-19"></a><span class="s s-Multiline"> Enable this if the application window doesn't open on Wayland.</span> </span><span id="__span-12-20"><a id="__codelineno-12-20" name="__codelineno-12-20" href="#__codelineno-12-20"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-12-21"><a id="__codelineno-12-21" name="__codelineno-12-21" href="#__codelineno-12-21"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-12-22"><a id="__codelineno-12-22" name="__codelineno-12-22" href="#__codelineno-12-22"></a> <span class="p">};</span> </span><span id="__span-12-23"><a id="__codelineno-12-23" name="__codelineno-12-23" href="#__codelineno-12-23"></a> </span><span id="__span-12-24"><a id="__codelineno-12-24" name="__codelineno-12-24" href="#__codelineno-12-24"></a> <span class="ss">remoteSetup</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-12-25"><a id="__codelineno-12-25" name="__codelineno-12-25" href="#__codelineno-12-25"></a> <span class="ss">maxRetries</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-12-26"><a id="__codelineno-12-26" name="__codelineno-12-26" href="#__codelineno-12-26"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-12-27"><a id="__codelineno-12-27" name="__codelineno-12-27" href="#__codelineno-12-27"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> </span><span id="__span-12-28"><a id="__codelineno-12-28" name="__codelineno-12-28" href="#__codelineno-12-28"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''Maximum number of retry attempts for repository setup''</span><span class="p">;</span> </span><span id="__span-12-29"><a id="__codelineno-12-29" name="__codelineno-12-29" href="#__codelineno-12-29"></a> <span class="ss">example</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> </span><span id="__span-12-30"><a id="__codelineno-12-30" name="__codelineno-12-30" href="#__codelineno-12-30"></a> <span class="p">};</span> </span><span id="__span-12-31"><a id="__codelineno-12-31" name="__codelineno-12-31" href="#__codelineno-12-31"></a> </span><span id="__span-12-32"><a id="__codelineno-12-32" name="__codelineno-12-32" href="#__codelineno-12-32"></a> <span class="ss">retryDelay</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-12-33"><a id="__codelineno-12-33" name="__codelineno-12-33" href="#__codelineno-12-33"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-12-34"><a id="__codelineno-12-34" name="__codelineno-12-34" href="#__codelineno-12-34"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> </span><span id="__span-12-35"><a id="__codelineno-12-35" name="__codelineno-12-35" href="#__codelineno-12-35"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''Base delay in seconds between retry attempts''</span><span class="p">;</span> </span><span id="__span-12-36"><a id="__codelineno-12-36" name="__codelineno-12-36" href="#__codelineno-12-36"></a> <span class="ss">example</span> <span class="o">=</span> <span class="mi">15</span><span class="p">;</span> </span><span id="__span-12-37"><a id="__codelineno-12-37" name="__codelineno-12-37" href="#__codelineno-12-37"></a> <span class="p">};</span> </span><span id="__span-12-38"><a id="__codelineno-12-38" name="__codelineno-12-38" href="#__codelineno-12-38"></a> <span class="p">};</span> </span><span id="__span-12-39"><a id="__codelineno-12-39" name="__codelineno-12-39" href="#__codelineno-12-39"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="github-runnernix"><code>github-runner.nix</code><a class="headerlink" href="#github-runnernix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/github/github-runner.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/github/github-runner.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="gnome-servicesnix"><code>gnome-services.nix</code><a class="headerlink" href="#gnome-servicesnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/gnome/gnome-services.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/gnome/gnome-services.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="greetdnix"><code>greetd.nix</code><a class="headerlink" href="#greetdnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/greetd/greetd.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/greetd/greetd.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="home-assistantnix"><code>home-assistant.nix</code><a class="headerlink" href="#home-assistantnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/home-assistant.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/home-assistant.nix</code></a></p> <ul> <li><strong>Enable option:</strong> Home Assistant home automation platform</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>port</code>, <code>enableCloud</code>, <code>enableCLI</code>, <code>extraComponents</code>, <code>tailscaleIntegration</code>, <code>dashboards</code>, <code>title</code>, <code>icon</code>, <code>showInSidebar</code>, <code>yaml</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">homeAssistant</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-13-2"><a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"Home Assistant home automation platform"</span><span class="p">;</span> </span><span id="__span-13-3"><a id="__codelineno-13-3" name="__codelineno-13-3" href="#__codelineno-13-3"></a> </span><span id="__span-13-4"><a id="__codelineno-13-4" name="__codelineno-13-4" href="#__codelineno-13-4"></a> <span class="ss">port</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-13-5"><a id="__codelineno-13-5" name="__codelineno-13-5" href="#__codelineno-13-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>port<span class="p">;</span> </span><span id="__span-13-6"><a id="__codelineno-13-6" name="__codelineno-13-6" href="#__codelineno-13-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">8123</span><span class="p">;</span> </span><span id="__span-13-7"><a id="__codelineno-13-7" name="__codelineno-13-7" href="#__codelineno-13-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Port for Home Assistant web interface"</span><span class="p">;</span> </span><span id="__span-13-8"><a id="__codelineno-13-8" name="__codelineno-13-8" href="#__codelineno-13-8"></a> <span class="p">};</span> </span><span id="__span-13-9"><a id="__codelineno-13-9" name="__codelineno-13-9" href="#__codelineno-13-9"></a> </span><span id="__span-13-10"><a id="__codelineno-13-10" name="__codelineno-13-10" href="#__codelineno-13-10"></a> <span class="ss">enableCloud</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-13-11"><a id="__codelineno-13-11" name="__codelineno-13-11" href="#__codelineno-13-11"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-13-12"><a id="__codelineno-13-12" name="__codelineno-13-12" href="#__codelineno-13-12"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-13-13"><a id="__codelineno-13-13" name="__codelineno-13-13" href="#__codelineno-13-13"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Enable Home Assistant Cloud (Nabu Casa) integration"</span><span class="p">;</span> </span><span id="__span-13-14"><a id="__codelineno-13-14" name="__codelineno-13-14" href="#__codelineno-13-14"></a> <span class="p">};</span> </span><span id="__span-13-15"><a id="__codelineno-13-15" name="__codelineno-13-15" href="#__codelineno-13-15"></a> </span><span id="__span-13-16"><a id="__codelineno-13-16" name="__codelineno-13-16" href="#__codelineno-13-16"></a> <span class="ss">enableCLI</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-13-17"><a id="__codelineno-13-17" name="__codelineno-13-17" href="#__codelineno-13-17"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-13-18"><a id="__codelineno-13-18" name="__codelineno-13-18" href="#__codelineno-13-18"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-13-19"><a id="__codelineno-13-19" name="__codelineno-13-19" href="#__codelineno-13-19"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Install Home Assistant CLI tool"</span><span class="p">;</span> </span><span id="__span-13-20"><a id="__codelineno-13-20" name="__codelineno-13-20" href="#__codelineno-13-20"></a> <span class="p">};</span> </span><span id="__span-13-21"><a id="__codelineno-13-21" name="__codelineno-13-21" href="#__codelineno-13-21"></a> </span><span id="__span-13-22"><a id="__codelineno-13-22" name="__codelineno-13-22" href="#__codelineno-13-22"></a> <span class="ss">extraComponents</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-13-23"><a id="__codelineno-13-23" name="__codelineno-13-23" href="#__codelineno-13-23"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>listOf types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-13-24"><a id="__codelineno-13-24" name="__codelineno-13-24" href="#__codelineno-13-24"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">[</span> <span class="p">];</span> </span><span id="__span-13-25"><a id="__codelineno-13-25" name="__codelineno-13-25" href="#__codelineno-13-25"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Additional Home Assistant components to enable"</span><span class="p">;</span> </span><span id="__span-13-26"><a id="__codelineno-13-26" name="__codelineno-13-26" href="#__codelineno-13-26"></a> <span class="p">};</span> </span><span id="__span-13-27"><a id="__codelineno-13-27" name="__codelineno-13-27" href="#__codelineno-13-27"></a> </span><span id="__span-13-28"><a id="__codelineno-13-28" name="__codelineno-13-28" href="#__codelineno-13-28"></a> <span class="ss">tailscaleIntegration</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-13-29"><a id="__codelineno-13-29" name="__codelineno-13-29" href="#__codelineno-13-29"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-13-30"><a id="__codelineno-13-30" name="__codelineno-13-30" href="#__codelineno-13-30"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-13-31"><a id="__codelineno-13-31" name="__codelineno-13-31" href="#__codelineno-13-31"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Configure trusted proxies for Tailscale access"</span><span class="p">;</span> </span><span id="__span-13-32"><a id="__codelineno-13-32" name="__codelineno-13-32" href="#__codelineno-13-32"></a> <span class="p">};</span> </span><span id="__span-13-33"><a id="__codelineno-13-33" name="__codelineno-13-33" href="#__codelineno-13-33"></a> </span><span id="__span-13-34"><a id="__codelineno-13-34" name="__codelineno-13-34" href="#__codelineno-13-34"></a> <span class="ss">dashboards</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-13-35"><a id="__codelineno-13-35" name="__codelineno-13-35" href="#__codelineno-13-35"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>attrsOf <span class="p">(</span>types<span class="o">.</span>submodule <span class="p">{</span> </span><span id="__span-13-36"><a id="__codelineno-13-36" name="__codelineno-13-36" href="#__codelineno-13-36"></a> <span class="ss">options</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-13-37"><a id="__codelineno-13-37" name="__codelineno-13-37" href="#__codelineno-13-37"></a> <span class="ss">title</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-13-38"><a id="__codelineno-13-38" name="__codelineno-13-38" href="#__codelineno-13-38"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-13-39"><a id="__codelineno-13-39" name="__codelineno-13-39" href="#__codelineno-13-39"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Sidebar display title"</span><span class="p">;</span> </span><span id="__span-13-40"><a id="__codelineno-13-40" name="__codelineno-13-40" href="#__codelineno-13-40"></a> <span class="p">};</span> </span><span id="__span-13-41"><a id="__codelineno-13-41" name="__codelineno-13-41" href="#__codelineno-13-41"></a> <span class="ss">icon</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-13-42"><a id="__codelineno-13-42" name="__codelineno-13-42" href="#__codelineno-13-42"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-13-43"><a id="__codelineno-13-43" name="__codelineno-13-43" href="#__codelineno-13-43"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"mdi:view-dashboard"</span><span class="p">;</span> </span><span id="__span-13-44"><a id="__codelineno-13-44" name="__codelineno-13-44" href="#__codelineno-13-44"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Material Design Icons name for the sidebar entry"</span><span class="p">;</span> </span><span id="__span-13-45"><a id="__codelineno-13-45" name="__codelineno-13-45" href="#__codelineno-13-45"></a> <span class="p">};</span> </span><span id="__span-13-46"><a id="__codelineno-13-46" name="__codelineno-13-46" href="#__codelineno-13-46"></a> <span class="ss">showInSidebar</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-13-47"><a id="__codelineno-13-47" name="__codelineno-13-47" href="#__codelineno-13-47"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-13-48"><a id="__codelineno-13-48" name="__codelineno-13-48" href="#__codelineno-13-48"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-13-49"><a id="__codelineno-13-49" name="__codelineno-13-49" href="#__codelineno-13-49"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Show this dashboard in the HA sidebar"</span><span class="p">;</span> </span><span id="__span-13-50"><a id="__codelineno-13-50" name="__codelineno-13-50" href="#__codelineno-13-50"></a> <span class="p">};</span> </span><span id="__span-13-51"><a id="__codelineno-13-51" name="__codelineno-13-51" href="#__codelineno-13-51"></a> <span class="ss">yaml</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-13-52"><a id="__codelineno-13-52" name="__codelineno-13-52" href="#__codelineno-13-52"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>lines<span class="p">;</span> </span><span id="__span-13-53"><a id="__codelineno-13-53" name="__codelineno-13-53" href="#__codelineno-13-53"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-13-54"><a id="__codelineno-13-54" name="__codelineno-13-54" href="#__codelineno-13-54"></a><span class="s s-Multiline"> Raw Lovelace dashboard YAML. Must define `title:` and `views:`.</span> </span><span id="__span-13-55"><a id="__codelineno-13-55" name="__codelineno-13-55" href="#__codelineno-13-55"></a><span class="s s-Multiline"> Written to /etc/home-assistant/dashboards/<name>.yaml at activation;</span> </span><span id="__span-13-56"><a id="__codelineno-13-56" name="__codelineno-13-56" href="#__codelineno-13-56"></a><span class="s s-Multiline"> referenced from configuration.yaml via lovelace.dashboards.</span> </span><span id="__span-13-57"><a id="__codelineno-13-57" name="__codelineno-13-57" href="#__codelineno-13-57"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-13-58"><a id="__codelineno-13-58" name="__codelineno-13-58" href="#__codelineno-13-58"></a> <span class="p">};</span> </span><span id="__span-13-59"><a id="__codelineno-13-59" name="__codelineno-13-59" href="#__codelineno-13-59"></a> <span class="p">};</span> </span><span id="__span-13-60"><a id="__codelineno-13-60" name="__codelineno-13-60" href="#__codelineno-13-60"></a> <span class="p">});</span> </span><span id="__span-13-61"><a id="__codelineno-13-61" name="__codelineno-13-61" href="#__codelineno-13-61"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">{</span> <span class="p">};</span> </span><span id="__span-13-62"><a id="__codelineno-13-62" name="__codelineno-13-62" href="#__codelineno-13-62"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-13-63"><a id="__codelineno-13-63" name="__codelineno-13-63" href="#__codelineno-13-63"></a><span class="s s-Multiline"> Declarative Lovelace dashboards. Each attr key becomes the URL slug</span> </span><span id="__span-13-64"><a id="__codelineno-13-64" name="__codelineno-13-64" href="#__codelineno-13-64"></a><span class="s s-Multiline"> (/<key>) and the corresponding YAML is rendered into a read-only file</span> </span><span id="__span-13-65"><a id="__codelineno-13-65" name="__codelineno-13-65" href="#__codelineno-13-65"></a><span class="s s-Multiline"> under /etc/home-assistant/dashboards/. The default Overview dashboard</span> </span><span id="__span-13-66"><a id="__codelineno-13-66" name="__codelineno-13-66" href="#__codelineno-13-66"></a><span class="s s-Multiline"> remains in storage mode and is unaffected.</span> </span><span id="__span-13-67"><a id="__codelineno-13-67" name="__codelineno-13-67" href="#__codelineno-13-67"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-13-68"><a id="__codelineno-13-68" name="__codelineno-13-68" href="#__codelineno-13-68"></a> <span class="p">};</span> </span><span id="__span-13-69"><a id="__codelineno-13-69" name="__codelineno-13-69" href="#__codelineno-13-69"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="http-time-fallbacknix"><code>http-time-fallback.nix</code><a class="headerlink" href="#http-time-fallbacknix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/http-time-fallback.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/http-time-fallback.nix</code></a></p> <ul> <li><strong>Enable option:</strong> HTTPS-based time sync fallback (htpdate) for networks that block NTP (UDP 123)</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>urls</code>, <code>interval</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a> options<span class="o">.</span>services<span class="o">.</span><span class="ss">httpTimeFallback</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-14-2"><a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"HTTPS-based time sync fallback (htpdate) for networks that block NTP (UDP 123)"</span><span class="p">;</span> </span><span id="__span-14-3"><a id="__codelineno-14-3" name="__codelineno-14-3" href="#__codelineno-14-3"></a> </span><span id="__span-14-4"><a id="__codelineno-14-4" name="__codelineno-14-4" href="#__codelineno-14-4"></a> <span class="ss">urls</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-14-5"><a id="__codelineno-14-5" name="__codelineno-14-5" href="#__codelineno-14-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>listOf types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-14-6"><a id="__codelineno-14-6" name="__codelineno-14-6" href="#__codelineno-14-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">[</span> </span><span id="__span-14-7"><a id="__codelineno-14-7" name="__codelineno-14-7" href="#__codelineno-14-7"></a> <span class="s2">"https://www.cloudflare.com"</span> </span><span id="__span-14-8"><a id="__codelineno-14-8" name="__codelineno-14-8" href="#__codelineno-14-8"></a> <span class="s2">"https://www.google.com"</span> </span><span id="__span-14-9"><a id="__codelineno-14-9" name="__codelineno-14-9" href="#__codelineno-14-9"></a> <span class="s2">"https://www.kernel.org"</span> </span><span id="__span-14-10"><a id="__codelineno-14-10" name="__codelineno-14-10" href="#__codelineno-14-10"></a> <span class="p">];</span> </span><span id="__span-14-11"><a id="__codelineno-14-11" name="__codelineno-14-11" href="#__codelineno-14-11"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"HTTPS endpoints htpdate samples to set the clock."</span><span class="p">;</span> </span><span id="__span-14-12"><a id="__codelineno-14-12" name="__codelineno-14-12" href="#__codelineno-14-12"></a> <span class="p">};</span> </span><span id="__span-14-13"><a id="__codelineno-14-13" name="__codelineno-14-13" href="#__codelineno-14-13"></a> </span><span id="__span-14-14"><a id="__codelineno-14-14" name="__codelineno-14-14" href="#__codelineno-14-14"></a> <span class="ss">interval</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-14-15"><a id="__codelineno-14-15" name="__codelineno-14-15" href="#__codelineno-14-15"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-14-16"><a id="__codelineno-14-16" name="__codelineno-14-16" href="#__codelineno-14-16"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"*:0/15"</span><span class="p">;</span> </span><span id="__span-14-17"><a id="__codelineno-14-17" name="__codelineno-14-17" href="#__codelineno-14-17"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"systemd OnCalendar expression controlling how often the fallback check runs."</span><span class="p">;</span> </span><span id="__span-14-18"><a id="__codelineno-14-18" name="__codelineno-14-18" href="#__codelineno-14-18"></a> <span class="p">};</span> </span><span id="__span-14-19"><a id="__codelineno-14-19" name="__codelineno-14-19" href="#__codelineno-14-19"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="intune-portalnix"><code>intune-portal.nix</code><a class="headerlink" href="#intune-portalnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/intune-portal.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/intune-portal.nix</code></a></p> <ul> <li><strong>Enable option:</strong> Microsoft Intune Company Portal</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>package</code>, <code>autoStart</code>, <code>enableDesktopIntegration</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">intune</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-15-2"><a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"Microsoft Intune Company Portal"</span><span class="p">;</span> </span><span id="__span-15-3"><a id="__codelineno-15-3" name="__codelineno-15-3" href="#__codelineno-15-3"></a> </span><span id="__span-15-4"><a id="__codelineno-15-4" name="__codelineno-15-4" href="#__codelineno-15-4"></a> <span class="ss">package</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-15-5"><a id="__codelineno-15-5" name="__codelineno-15-5" href="#__codelineno-15-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>package<span class="p">;</span> </span><span id="__span-15-6"><a id="__codelineno-15-6" name="__codelineno-15-6" href="#__codelineno-15-6"></a> <span class="ss">default</span> <span class="o">=</span> pkgs<span class="o">.</span>intune-portal<span class="p">;</span> </span><span id="__span-15-7"><a id="__codelineno-15-7" name="__codelineno-15-7" href="#__codelineno-15-7"></a> <span class="ss">defaultText</span> <span class="o">=</span> literalExpression <span class="s2">"pkgs.intune-portal"</span><span class="p">;</span> </span><span id="__span-15-8"><a id="__codelineno-15-8" name="__codelineno-15-8" href="#__codelineno-15-8"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-15-9"><a id="__codelineno-15-9" name="__codelineno-15-9" href="#__codelineno-15-9"></a><span class="s s-Multiline"> The Microsoft Intune Company Portal package to use.</span> </span><span id="__span-15-10"><a id="__codelineno-15-10" name="__codelineno-15-10" href="#__codelineno-15-10"></a> </span><span id="__span-15-11"><a id="__codelineno-15-11" name="__codelineno-15-11" href="#__codelineno-15-11"></a><span class="s s-Multiline"> This defaults to our custom-built package with manual version control.</span> </span><span id="__span-15-12"><a id="__codelineno-15-12" name="__codelineno-15-12" href="#__codelineno-15-12"></a><span class="s s-Multiline"> Change the version by updating pkgs/intune-portal/default.nix and</span> </span><span id="__span-15-13"><a id="__codelineno-15-13" name="__codelineno-15-13" href="#__codelineno-15-13"></a><span class="s s-Multiline"> rebuilding the system.</span> </span><span id="__span-15-14"><a id="__codelineno-15-14" name="__codelineno-15-14" href="#__codelineno-15-14"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-15-15"><a id="__codelineno-15-15" name="__codelineno-15-15" href="#__codelineno-15-15"></a> <span class="ss">example</span> <span class="o">=</span> literalExpression <span class="s2">"pkgs.intune-portal"</span><span class="p">;</span> </span><span id="__span-15-16"><a id="__codelineno-15-16" name="__codelineno-15-16" href="#__codelineno-15-16"></a> <span class="p">};</span> </span><span id="__span-15-17"><a id="__codelineno-15-17" name="__codelineno-15-17" href="#__codelineno-15-17"></a> </span><span id="__span-15-18"><a id="__codelineno-15-18" name="__codelineno-15-18" href="#__codelineno-15-18"></a> <span class="ss">autoStart</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-15-19"><a id="__codelineno-15-19" name="__codelineno-15-19" href="#__codelineno-15-19"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-15-20"><a id="__codelineno-15-20" name="__codelineno-15-20" href="#__codelineno-15-20"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-15-21"><a id="__codelineno-15-21" name="__codelineno-15-21" href="#__codelineno-15-21"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-15-22"><a id="__codelineno-15-22" name="__codelineno-15-22" href="#__codelineno-15-22"></a><span class="s s-Multiline"> Whether to automatically start the Intune Portal service on login.</span> </span><span id="__span-15-23"><a id="__codelineno-15-23" name="__codelineno-15-23" href="#__codelineno-15-23"></a> </span><span id="__span-15-24"><a id="__codelineno-15-24" name="__codelineno-15-24" href="#__codelineno-15-24"></a><span class="s s-Multiline"> When enabled, the intune-portal service will start with the user session.</span> </span><span id="__span-15-25"><a id="__codelineno-15-25" name="__codelineno-15-25" href="#__codelineno-15-25"></a><span class="s s-Multiline"> When disabled, you must manually launch intune-portal from the application menu.</span> </span><span id="__span-15-26"><a id="__codelineno-15-26" name="__codelineno-15-26" href="#__codelineno-15-26"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-15-27"><a id="__codelineno-15-27" name="__codelineno-15-27" href="#__codelineno-15-27"></a> <span class="p">};</span> </span><span id="__span-15-28"><a id="__codelineno-15-28" name="__codelineno-15-28" href="#__codelineno-15-28"></a> </span><span id="__span-15-29"><a id="__codelineno-15-29" name="__codelineno-15-29" href="#__codelineno-15-29"></a> <span class="ss">enableDesktopIntegration</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-15-30"><a id="__codelineno-15-30" name="__codelineno-15-30" href="#__codelineno-15-30"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-15-31"><a id="__codelineno-15-31" name="__codelineno-15-31" href="#__codelineno-15-31"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-15-32"><a id="__codelineno-15-32" name="__codelineno-15-32" href="#__codelineno-15-32"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-15-33"><a id="__codelineno-15-33" name="__codelineno-15-33" href="#__codelineno-15-33"></a><span class="s s-Multiline"> Whether to install desktop integration files (.desktop files, system tray support).</span> </span><span id="__span-15-34"><a id="__codelineno-15-34" name="__codelineno-15-34" href="#__codelineno-15-34"></a> </span><span id="__span-15-35"><a id="__codelineno-15-35" name="__codelineno-15-35" href="#__codelineno-15-35"></a><span class="s s-Multiline"> This makes Intune Portal available in application menus and provides</span> </span><span id="__span-15-36"><a id="__codelineno-15-36" name="__codelineno-15-36" href="#__codelineno-15-36"></a><span class="s s-Multiline"> system tray integration for enrollment status and notifications.</span> </span><span id="__span-15-37"><a id="__codelineno-15-37" name="__codelineno-15-37" href="#__codelineno-15-37"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-15-38"><a id="__codelineno-15-38" name="__codelineno-15-38" href="#__codelineno-15-38"></a> <span class="p">};</span> </span><span id="__span-15-39"><a id="__codelineno-15-39" name="__codelineno-15-39" href="#__codelineno-15-39"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="defaultnix_5"><code>default.nix</code><a class="headerlink" href="#defaultnix_5" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/kometa/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/kometa/default.nix</code></a></p> <p>Kometa (was Plex Meta Manager) — collections + metadata + posters for Plex.</p> <p>Runs as a podman OCI container on p510 sharing the host network namespace so it can reach localhost:32400 (Plex) directly. Container is always-on; Kometa's internal scheduler fires per the <code>schedule:</code> key in config.yml.</p> <p>Phase 1a (this commit): dry-run mode + IMDb Top 250 only. Once the dry-run output looks right, flip <code>dry_run: false</code> in modules/services/kometa/config.yml and redeploy.</p> <p>Pattern mirrors modules/services/skill-pool.nix (oci-containers + podman).</p> <p>Config flow: modules/services/kometa/config.yml ← repo source of truth; contains ${TMDB_API_KEY} + ${PLEX_TOKEN} shell-style placeholders. kometa-config-render.service ← systemd oneshot; envsubst's the template into /var/lib/kometa/config.yml with agenix-provided values. podman-kometa.service ← depends on the oneshot; mounts /var/lib/kometa as /config.</p> <ul> <li><strong>Enable option:</strong> Kometa (Plex Meta Manager)</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">kometa</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"Kometa (Plex Meta Manager)"</span><span class="p">;</span> </span><span id="__span-16-3"><a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-3"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="defaultnix_6"><code>default.nix</code><a class="headerlink" href="#defaultnix_6" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/libinput/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/libinput/default.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="litellm-routernix"><code>litellm-router.nix</code><a class="headerlink" href="#litellm-routernix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/litellm-router.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/litellm-router.nix</code></a></p> <p>LiteLLM proxy — Anthropic-compat router that fronts the local Ollama service. Lets Claude Code (which speaks the Anthropic API natively) reach local Ollama models by setting ANTHROPIC_BASE_URL per repo.</p> <p>Architecture: Claude Code → http(s)://p620.../router (LiteLLM) → 127.0.0.1:11434 (Ollama)</p> <p>Model aliases: claude-sonnet-4-6 → qwen3.8:27b (default coding model — primary) claude-opus-4-6 → gemma4:e4b (light/fast on-demand) qwen3 → qwen3.8:27b (native name passthrough) qwen3.8 → qwen3.8:27b (native name passthrough) qwen3.6 → qwen3.8:27b (backward compatibility alias) qwen2.5-coder → qwen2.5-coder:14b (previous default, still pulled) gemma4 → gemma4:e4b (backward compatibility alias)</p> <p>The aliases point at whatever host's Ollama is fronted, so they only resolve to a model that host actually pulled — this file is p620's, where qwen3.8:27b is the persistent model (hosts/p620/configuration.nix).</p> <p>Authentication: a single master bearer key loaded at runtime from agenix (/run/agenix/litellm-master-key). Per-host clients hold the same plaintext under their own .age files (api-router-p620, api-router-razer — Phase 3).</p> <p>Network: binds 0.0.0.0:4000 but firewall opens it only on tailscale0 and the configured LAN interface — never globally reachable.</p> <p>See docs/plans/2026-05-22-ollama-p620-litellm-design.md §5 for full design.</p> <ul> <li><strong>Enable option:</strong> LiteLLM proxy fronting the local Ollama service</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-17-1"><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">litellm-router</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-17-2"><a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"LiteLLM proxy fronting the local Ollama service"</span><span class="p">;</span> </span><span id="__span-17-3"><a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></a> </span><span id="__span-17-4"><a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></a> <span class="ss">port</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-17-5"><a id="__codelineno-17-5" name="__codelineno-17-5" href="#__codelineno-17-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>port<span class="p">;</span> </span><span id="__span-17-6"><a id="__codelineno-17-6" name="__codelineno-17-6" href="#__codelineno-17-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">4000</span><span class="p">;</span> </span><span id="__span-17-7"><a id="__codelineno-17-7" name="__codelineno-17-7" href="#__codelineno-17-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Port LiteLLM binds to (loopback always; tailnet + LAN via firewall)."</span><span class="p">;</span> </span><span id="__span-17-8"><a id="__codelineno-17-8" name="__codelineno-17-8" href="#__codelineno-17-8"></a> <span class="p">};</span> </span><span id="__span-17-9"><a id="__codelineno-17-9" name="__codelineno-17-9" href="#__codelineno-17-9"></a> </span><span id="__span-17-10"><a id="__codelineno-17-10" name="__codelineno-17-10" href="#__codelineno-17-10"></a> <span class="ss">listenLanInterface</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-17-11"><a id="__codelineno-17-11" name="__codelineno-17-11" href="#__codelineno-17-11"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>nullOr lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-17-12"><a id="__codelineno-17-12" name="__codelineno-17-12" href="#__codelineno-17-12"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">null</span><span class="p">;</span> </span><span id="__span-17-13"><a id="__codelineno-17-13" name="__codelineno-17-13" href="#__codelineno-17-13"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"enp1s0"</span><span class="p">;</span> </span><span id="__span-17-14"><a id="__codelineno-17-14" name="__codelineno-17-14" href="#__codelineno-17-14"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-17-15"><a id="__codelineno-17-15" name="__codelineno-17-15" href="#__codelineno-17-15"></a><span class="s s-Multiline"> LAN interface to open the port on (in addition to tailscale0 and</span> </span><span id="__span-17-16"><a id="__codelineno-17-16" name="__codelineno-17-16" href="#__codelineno-17-16"></a><span class="s s-Multiline"> loopback). Set to the host's actual LAN NIC; confirm with `ip link`.</span> </span><span id="__span-17-17"><a id="__codelineno-17-17" name="__codelineno-17-17" href="#__codelineno-17-17"></a><span class="s s-Multiline"> Set to null to expose only via Tailscale.</span> </span><span id="__span-17-18"><a id="__codelineno-17-18" name="__codelineno-17-18" href="#__codelineno-17-18"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-17-19"><a id="__codelineno-17-19" name="__codelineno-17-19" href="#__codelineno-17-19"></a> <span class="p">};</span> </span><span id="__span-17-20"><a id="__codelineno-17-20" name="__codelineno-17-20" href="#__codelineno-17-20"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="defaultnix_7"><code>default.nix</code><a class="headerlink" href="#defaultnix_7" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/logind/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/logind/default.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="defaultnix_8"><code>default.nix</code><a class="headerlink" href="#defaultnix_8" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/mandb/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/mandb/default.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="matrix-continuwuitynix"><code>matrix-continuwuity.nix</code><a class="headerlink" href="#matrix-continuwuitynix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/matrix-continuwuity.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/matrix-continuwuity.nix</code></a></p> <p>Matrix homeserver — the substrate under the agent bus.</p> <p>The store behind modules/services/agent-bus-mcp.nix. Agents reach it through four MCP tools; humans reach the same rooms with any Matrix client. That is the whole point of choosing a real chat server over a bespoke message table: one store, two faces. The BBS this replaces had three stores that could not see each other (inbox, news, IRC), which is why nothing could follow a conversation across them.</p> <p>continuwuity rather than conduwuit: conduwuit was removed from nixpkgs after upstream deleted the repository, and <code>services.conduwuit</code> survives only as a removed-option stub that errors on eval. continuwuity is the maintained continuation and is config-compatible. <code>matrix-tuwunel</code> is the other successor; either would do.</p> <p>Federation is OFF. We want accounts on this server talking to each other, not to matrix.org. The client-server API is fully functional without it, and turning it off removes the whole /.well-known/matrix/server and port-8448 surface along with any inbound federation traffic.</p> <ul> <li><strong>Enable option:</strong> Matrix homeserver (continuwuity) backing the agent bus</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-18-1"><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">matrix-continuwuity</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-18-2"><a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"Matrix homeserver (continuwuity) backing the agent bus"</span><span class="p">;</span> </span><span id="__span-18-3"><a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a> </span><span id="__span-18-4"><a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-4"></a> <span class="ss">serverName</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-18-5"><a id="__codelineno-18-5" name="__codelineno-18-5" href="#__codelineno-18-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-18-6"><a id="__codelineno-18-6" name="__codelineno-18-6" href="#__codelineno-18-6"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"example.com"</span><span class="p">;</span> </span><span id="__span-18-7"><a id="__codelineno-18-7" name="__codelineno-18-7" href="#__codelineno-18-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-18-8"><a id="__codelineno-18-8" name="__codelineno-18-8" href="#__codelineno-18-8"></a><span class="s s-Multiline"> The identity suffix in `@user:<serverName>` and in every room id.</span> </span><span id="__span-18-9"><a id="__codelineno-18-9" name="__codelineno-18-9" href="#__codelineno-18-9"></a> </span><span id="__span-18-10"><a id="__codelineno-18-10" name="__codelineno-18-10" href="#__codelineno-18-10"></a><span class="s s-Multiline"> **Permanent.** Changing it later means wiping the database, because</span> </span><span id="__span-18-11"><a id="__codelineno-18-11" name="__codelineno-18-11" href="#__codelineno-18-11"></a><span class="s s-Multiline"> every id already minted embeds it. It does not have to resolve to this</span> </span><span id="__span-18-12"><a id="__codelineno-18-12" name="__codelineno-18-12" href="#__codelineno-18-12"></a><span class="s s-Multiline"> machine and is not the hostname clients connect to — that is</span> </span><span id="__span-18-13"><a id="__codelineno-18-13" name="__codelineno-18-13" href="#__codelineno-18-13"></a><span class="s s-Multiline"> `publicUrl` below, advertised through `/.well-known/matrix/client`.</span> </span><span id="__span-18-14"><a id="__codelineno-18-14" name="__codelineno-18-14" href="#__codelineno-18-14"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-18-15"><a id="__codelineno-18-15" name="__codelineno-18-15" href="#__codelineno-18-15"></a> <span class="p">};</span> </span><span id="__span-18-16"><a id="__codelineno-18-16" name="__codelineno-18-16" href="#__codelineno-18-16"></a> </span><span id="__span-18-17"><a id="__codelineno-18-17" name="__codelineno-18-17" href="#__codelineno-18-17"></a> <span class="ss">publicUrl</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-18-18"><a id="__codelineno-18-18" name="__codelineno-18-18" href="#__codelineno-18-18"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-18-19"><a id="__codelineno-18-19" name="__codelineno-18-19" href="#__codelineno-18-19"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"https://matrix.example.com"</span><span class="p">;</span> </span><span id="__span-18-20"><a id="__codelineno-18-20" name="__codelineno-18-20" href="#__codelineno-18-20"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-18-21"><a id="__codelineno-18-21" name="__codelineno-18-21" href="#__codelineno-18-21"></a><span class="s s-Multiline"> Where clients actually reach the homeserver, advertised as</span> </span><span id="__span-18-22"><a id="__codelineno-18-22" name="__codelineno-18-22" href="#__codelineno-18-22"></a><span class="s s-Multiline"> `well_known.client`. This is the tunnel hostname, not `serverName`.</span> </span><span id="__span-18-23"><a id="__codelineno-18-23" name="__codelineno-18-23" href="#__codelineno-18-23"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-18-24"><a id="__codelineno-18-24" name="__codelineno-18-24" href="#__codelineno-18-24"></a> <span class="p">};</span> </span><span id="__span-18-25"><a id="__codelineno-18-25" name="__codelineno-18-25" href="#__codelineno-18-25"></a> </span><span id="__span-18-26"><a id="__codelineno-18-26" name="__codelineno-18-26" href="#__codelineno-18-26"></a> <span class="ss">port</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-18-27"><a id="__codelineno-18-27" name="__codelineno-18-27" href="#__codelineno-18-27"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>port<span class="p">;</span> </span><span id="__span-18-28"><a id="__codelineno-18-28" name="__codelineno-18-28" href="#__codelineno-18-28"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">6167</span><span class="p">;</span> </span><span id="__span-18-29"><a id="__codelineno-18-29" name="__codelineno-18-29" href="#__codelineno-18-29"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-18-30"><a id="__codelineno-18-30" name="__codelineno-18-30" href="#__codelineno-18-30"></a><span class="s s-Multiline"> Loopback port. Never exposed directly: the Cloudflare tunnel proxies</span> </span><span id="__span-18-31"><a id="__codelineno-18-31" name="__codelineno-18-31" href="#__codelineno-18-31"></a><span class="s s-Multiline"> `/_matrix/` to it over HTTPS, which is the tunnel doing the job it is</span> </span><span id="__span-18-32"><a id="__codelineno-18-32" name="__codelineno-18-32" href="#__codelineno-18-32"></a><span class="s s-Multiline"> actually for — unlike SSH, which it cannot carry.</span> </span><span id="__span-18-33"><a id="__codelineno-18-33" name="__codelineno-18-33" href="#__codelineno-18-33"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-18-34"><a id="__codelineno-18-34" name="__codelineno-18-34" href="#__codelineno-18-34"></a> <span class="p">};</span> </span><span id="__span-18-35"><a id="__codelineno-18-35" name="__codelineno-18-35" href="#__codelineno-18-35"></a> </span><span id="__span-18-36"><a id="__codelineno-18-36" name="__codelineno-18-36" href="#__codelineno-18-36"></a> <span class="ss">registrationTokenFile</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-18-37"><a id="__codelineno-18-37" name="__codelineno-18-37" href="#__codelineno-18-37"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>path<span class="p">;</span> </span><span id="__span-18-38"><a id="__codelineno-18-38" name="__codelineno-18-38" href="#__codelineno-18-38"></a> <span class="ss">default</span> <span class="o">=</span> config<span class="o">.</span>age<span class="o">.</span>secrets<span class="o">.</span><span class="s2">"matrix-registration-token"</span><span class="o">.</span>path<span class="p">;</span> </span><span id="__span-18-39"><a id="__codelineno-18-39" name="__codelineno-18-39" href="#__codelineno-18-39"></a> <span class="ss">defaultText</span> <span class="o">=</span> lib<span class="o">.</span>literalExpression <span class="s s-Multiline">''config.age.secrets."matrix-registration-token".path''</span><span class="p">;</span> </span><span id="__span-18-40"><a id="__codelineno-18-40" name="__codelineno-18-40" href="#__codelineno-18-40"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-18-41"><a id="__codelineno-18-41" name="__codelineno-18-41" href="#__codelineno-18-41"></a><span class="s s-Multiline"> Token gating account creation. Registration is open but token-gated:</span> </span><span id="__span-18-42"><a id="__codelineno-18-42" name="__codelineno-18-42" href="#__codelineno-18-42"></a><span class="s s-Multiline"> continuwuity has no Synapse-style HTTP admin API, so a token is the</span> </span><span id="__span-18-43"><a id="__codelineno-18-43" name="__codelineno-18-43" href="#__codelineno-18-43"></a><span class="s s-Multiline"> only scriptable way to provision accounts — user administration</span> </span><span id="__span-18-44"><a id="__codelineno-18-44" name="__codelineno-18-44" href="#__codelineno-18-44"></a><span class="s s-Multiline"> otherwise happens through commands in an in-Matrix admin room.</span> </span><span id="__span-18-45"><a id="__codelineno-18-45" name="__codelineno-18-45" href="#__codelineno-18-45"></a> </span><span id="__span-18-46"><a id="__codelineno-18-46" name="__codelineno-18-46" href="#__codelineno-18-46"></a><span class="s s-Multiline"> Anyone holding this can create an account.</span> </span><span id="__span-18-47"><a id="__codelineno-18-47" name="__codelineno-18-47" href="#__codelineno-18-47"></a> </span><span id="__span-18-48"><a id="__codelineno-18-48" name="__codelineno-18-48" href="#__codelineno-18-48"></a><span class="s s-Multiline"> **This is the un-revokable kind, and it is the fallback, not the</span> </span><span id="__span-18-49"><a id="__codelineno-18-49" name="__codelineno-18-49" href="#__codelineno-18-49"></a><span class="s s-Multiline"> published one.** continuwuity is blunt about the file-backed token:</span> </span><span id="__span-18-50"><a id="__codelineno-18-50" name="__codelineno-18-50" href="#__codelineno-18-50"></a><span class="s s-Multiline"> "Tokens set in the registration token file cannot be revoked. Edit the</span> </span><span id="__span-18-51"><a id="__codelineno-18-51" name="__codelineno-18-51" href="#__codelineno-18-51"></a><span class="s s-Multiline"> registration token file and restart Continuwuity to change them." So</span> </span><span id="__span-18-52"><a id="__codelineno-18-52" name="__codelineno-18-52" href="#__codelineno-18-52"></a><span class="s s-Multiline"> rotating *this* value is a commit here plus a homeserver restart, and</span> </span><span id="__span-18-53"><a id="__codelineno-18-53" name="__codelineno-18-53" href="#__codelineno-18-53"></a><span class="s s-Multiline"> the only kill switch in between is `allowRegistration = false`, which</span> </span><span id="__span-18-54"><a id="__codelineno-18-54" name="__codelineno-18-54" href="#__codelineno-18-54"></a><span class="s s-Multiline"> is all-or-nothing.</span> </span><span id="__span-18-55"><a id="__codelineno-18-55" name="__codelineno-18-55" href="#__codelineno-18-55"></a> </span><span id="__span-18-56"><a id="__codelineno-18-56" name="__codelineno-18-56" href="#__codelineno-18-56"></a><span class="s s-Multiline"> The token published to outside agents is no longer this one. Since</span> </span><span id="__span-18-57"><a id="__codelineno-18-57" name="__codelineno-18-57" href="#__codelineno-18-57"></a><span class="s s-Multiline"> 26.8.1 the homeserver has a database-backed registration-token service</span> </span><span id="__span-18-58"><a id="__codelineno-18-58" name="__codelineno-18-58" href="#__codelineno-18-58"></a><span class="s s-Multiline"> reachable from the admin room, and the public token is issued there:</span> </span><span id="__span-18-59"><a id="__codelineno-18-59" name="__codelineno-18-59" href="#__codelineno-18-59"></a> </span><span id="__span-18-60"><a id="__codelineno-18-60" name="__codelineno-18-60" href="#__codelineno-18-60"></a><span class="s s-Multiline"> !admin token issue --max-uses 50 # bounded, no expiry</span> </span><span id="__span-18-61"><a id="__codelineno-18-61" name="__codelineno-18-61" href="#__codelineno-18-61"></a><span class="s s-Multiline"> !admin token list # remaining budget, uses so far</span> </span><span id="__span-18-62"><a id="__codelineno-18-62" name="__codelineno-18-62" href="#__codelineno-18-62"></a><span class="s s-Multiline"> !admin token revoke <token> # takes effect immediately</span> </span><span id="__span-18-63"><a id="__codelineno-18-63" name="__codelineno-18-63" href="#__codelineno-18-63"></a> </span><span id="__span-18-64"><a id="__codelineno-18-64" name="__codelineno-18-64" href="#__codelineno-18-64"></a><span class="s s-Multiline"> That token lives in `share/agent-bus/REGISTRATION-TOKEN` in the</span> </span><span id="__span-18-65"><a id="__codelineno-18-65" name="__codelineno-18-65" href="#__codelineno-18-65"></a><span class="s s-Multiline"> nixarchy repo (nixarchy#359), is bounded so a leak costs the unused</span> </span><span id="__span-18-66"><a id="__codelineno-18-66" name="__codelineno-18-66" href="#__codelineno-18-66"></a><span class="s s-Multiline"> remainder rather than unlimited account creation, and is revoked</span> </span><span id="__span-18-67"><a id="__codelineno-18-67" name="__codelineno-18-67" href="#__codelineno-18-67"></a><span class="s s-Multiline"> without touching this file or restarting anything. Reissue and commit</span> </span><span id="__span-18-68"><a id="__codelineno-18-68" name="__codelineno-18-68" href="#__codelineno-18-68"></a><span class="s s-Multiline"> the new value there when it runs out; that is the whole procedure.</span> </span><span id="__span-18-69"><a id="__codelineno-18-69" name="__codelineno-18-69" href="#__codelineno-18-69"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-18-70"><a id="__codelineno-18-70" name="__codelineno-18-70" href="#__codelineno-18-70"></a> <span class="p">};</span> </span><span id="__span-18-71"><a id="__codelineno-18-71" name="__codelineno-18-71" href="#__codelineno-18-71"></a> </span><span id="__span-18-72"><a id="__codelineno-18-72" name="__codelineno-18-72" href="#__codelineno-18-72"></a> <span class="ss">allowRegistration</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-18-73"><a id="__codelineno-18-73" name="__codelineno-18-73" href="#__codelineno-18-73"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-18-74"><a id="__codelineno-18-74" name="__codelineno-18-74" href="#__codelineno-18-74"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-18-75"><a id="__codelineno-18-75" name="__codelineno-18-75" href="#__codelineno-18-75"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-18-76"><a id="__codelineno-18-76" name="__codelineno-18-76" href="#__codelineno-18-76"></a><span class="s s-Multiline"> Whether new accounts can be created with the registration token. Turn</span> </span><span id="__span-18-77"><a id="__codelineno-18-77" name="__codelineno-18-77" href="#__codelineno-18-77"></a><span class="s s-Multiline"> this off once every agent and person that needs an account has one; the</span> </span><span id="__span-18-78"><a id="__codelineno-18-78" name="__codelineno-18-78" href="#__codelineno-18-78"></a><span class="s s-Multiline"> server keeps working and nobody new can appear.</span> </span><span id="__span-18-79"><a id="__codelineno-18-79" name="__codelineno-18-79" href="#__codelineno-18-79"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-18-80"><a id="__codelineno-18-80" name="__codelineno-18-80" href="#__codelineno-18-80"></a> <span class="p">};</span> </span><span id="__span-18-81"><a id="__codelineno-18-81" name="__codelineno-18-81" href="#__codelineno-18-81"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="media-botnix"><code>media-bot.nix</code><a class="headerlink" href="#media-botnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/media-bot.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/media-bot.nix</code></a></p> <p>media-bot — household Telegram bot for the *arr stack on p510.</p> <p>Phase 1 surface (spec: docs/plans/2026-05-30-media-bot-design.md, mirrored at ~/.claude/plans/stateless-enchanting-beaver.md during brainstorm): • menu commands (/search /add /queue /status /recent /wanted) • aiohttp webhook receiver on cfg.port ingesting Sonarr / Radarr / Overseerr / audiobook-import events; replies to Telegram with inline action buttons (Quiet event set — wins only). • Ollama-backed natural-language fallback (qwen2.5:7b by default, override via OLLAMA_MODEL in the env file).</p> <p>Required secrets (both agenix-encrypted, host-keyed for p510): • media-bot-env.age — TELEGRAM_BOT_TOKEN + <em>arr API keys + OLLAMA_</em> • media-bot-users.age — YAML user whitelist (telegram_id, plex_user, name)</p> <p>Pattern mirrors modules/services/arr-suite-mcp.nix: DynamicUser, full systemd hardening, tailscale-only firewall by default.</p> <ul> <li><strong>Enable option:</strong> household media Telegram bot</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-19-1"><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">media-bot</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-19-2"><a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"household media Telegram bot"</span><span class="p">;</span> </span><span id="__span-19-3"><a id="__codelineno-19-3" name="__codelineno-19-3" href="#__codelineno-19-3"></a> </span><span id="__span-19-4"><a id="__codelineno-19-4" name="__codelineno-19-4" href="#__codelineno-19-4"></a> <span class="ss">port</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-19-5"><a id="__codelineno-19-5" name="__codelineno-19-5" href="#__codelineno-19-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>port<span class="p">;</span> </span><span id="__span-19-6"><a id="__codelineno-19-6" name="__codelineno-19-6" href="#__codelineno-19-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">8090</span><span class="p">;</span> </span><span id="__span-19-7"><a id="__codelineno-19-7" name="__codelineno-19-7" href="#__codelineno-19-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-19-8"><a id="__codelineno-19-8" name="__codelineno-19-8" href="#__codelineno-19-8"></a><span class="s s-Multiline"> Port the aiohttp webhook receiver listens on. Loopback is always</span> </span><span id="__span-19-9"><a id="__codelineno-19-9" name="__codelineno-19-9" href="#__codelineno-19-9"></a><span class="s s-Multiline"> available; the firewall opens this port on `tailscale0` (and</span> </span><span id="__span-19-10"><a id="__codelineno-19-10" name="__codelineno-19-10" href="#__codelineno-19-10"></a><span class="s s-Multiline"> optionally on a named LAN interface) so Sonarr / Radarr / Overseerr</span> </span><span id="__span-19-11"><a id="__codelineno-19-11" name="__codelineno-19-11" href="#__codelineno-19-11"></a><span class="s s-Multiline"> and audiobook-import.service can POST event payloads to it.</span> </span><span id="__span-19-12"><a id="__codelineno-19-12" name="__codelineno-19-12" href="#__codelineno-19-12"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-19-13"><a id="__codelineno-19-13" name="__codelineno-19-13" href="#__codelineno-19-13"></a> <span class="p">};</span> </span><span id="__span-19-14"><a id="__codelineno-19-14" name="__codelineno-19-14" href="#__codelineno-19-14"></a> </span><span id="__span-19-15"><a id="__codelineno-19-15" name="__codelineno-19-15" href="#__codelineno-19-15"></a> <span class="ss">environmentFile</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-19-16"><a id="__codelineno-19-16" name="__codelineno-19-16" href="#__codelineno-19-16"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>path<span class="p">;</span> </span><span id="__span-19-17"><a id="__codelineno-19-17" name="__codelineno-19-17" href="#__codelineno-19-17"></a> <span class="ss">default</span> <span class="o">=</span> config<span class="o">.</span>age<span class="o">.</span>secrets<span class="o">.</span><span class="s2">"media-bot-env"</span><span class="o">.</span>path<span class="p">;</span> </span><span id="__span-19-18"><a id="__codelineno-19-18" name="__codelineno-19-18" href="#__codelineno-19-18"></a> <span class="ss">defaultText</span> <span class="o">=</span> lib<span class="o">.</span>literalExpression </span><span id="__span-19-19"><a id="__codelineno-19-19" name="__codelineno-19-19" href="#__codelineno-19-19"></a> <span class="s s-Multiline">''config.age.secrets."media-bot-env".path''</span><span class="p">;</span> </span><span id="__span-19-20"><a id="__codelineno-19-20" name="__codelineno-19-20" href="#__codelineno-19-20"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-19-21"><a id="__codelineno-19-21" name="__codelineno-19-21" href="#__codelineno-19-21"></a><span class="s s-Multiline"> EnvironmentFile with TELEGRAM_BOT_TOKEN, *arr API keys, OLLAMA_*</span> </span><span id="__span-19-22"><a id="__codelineno-19-22" name="__codelineno-19-22" href="#__codelineno-19-22"></a><span class="s s-Multiline"> endpoint + model (KEY=VALUE per line). The bot reads these on</span> </span><span id="__span-19-23"><a id="__codelineno-19-23" name="__codelineno-19-23" href="#__codelineno-19-23"></a><span class="s s-Multiline"> startup; restart the service to pick up changes.</span> </span><span id="__span-19-24"><a id="__codelineno-19-24" name="__codelineno-19-24" href="#__codelineno-19-24"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-19-25"><a id="__codelineno-19-25" name="__codelineno-19-25" href="#__codelineno-19-25"></a> <span class="p">};</span> </span><span id="__span-19-26"><a id="__codelineno-19-26" name="__codelineno-19-26" href="#__codelineno-19-26"></a> </span><span id="__span-19-27"><a id="__codelineno-19-27" name="__codelineno-19-27" href="#__codelineno-19-27"></a> <span class="ss">usersFile</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-19-28"><a id="__codelineno-19-28" name="__codelineno-19-28" href="#__codelineno-19-28"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>path<span class="p">;</span> </span><span id="__span-19-29"><a id="__codelineno-19-29" name="__codelineno-19-29" href="#__codelineno-19-29"></a> <span class="ss">default</span> <span class="o">=</span> config<span class="o">.</span>age<span class="o">.</span>secrets<span class="o">.</span><span class="s2">"media-bot-users"</span><span class="o">.</span>path<span class="p">;</span> </span><span id="__span-19-30"><a id="__codelineno-19-30" name="__codelineno-19-30" href="#__codelineno-19-30"></a> <span class="ss">defaultText</span> <span class="o">=</span> lib<span class="o">.</span>literalExpression </span><span id="__span-19-31"><a id="__codelineno-19-31" name="__codelineno-19-31" href="#__codelineno-19-31"></a> <span class="s s-Multiline">''config.age.secrets."media-bot-users".path''</span><span class="p">;</span> </span><span id="__span-19-32"><a id="__codelineno-19-32" name="__codelineno-19-32" href="#__codelineno-19-32"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-19-33"><a id="__codelineno-19-33" name="__codelineno-19-33" href="#__codelineno-19-33"></a><span class="s s-Multiline"> YAML file listing whitelisted Telegram users and their Plex</span> </span><span id="__span-19-34"><a id="__codelineno-19-34" name="__codelineno-19-34" href="#__codelineno-19-34"></a><span class="s s-Multiline"> usernames. Reloadable at runtime: `systemctl reload media-bot`</span> </span><span id="__span-19-35"><a id="__codelineno-19-35" name="__codelineno-19-35" href="#__codelineno-19-35"></a><span class="s s-Multiline"> sends SIGHUP, the bot rereads this file, no restart needed.</span> </span><span id="__span-19-36"><a id="__codelineno-19-36" name="__codelineno-19-36" href="#__codelineno-19-36"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-19-37"><a id="__codelineno-19-37" name="__codelineno-19-37" href="#__codelineno-19-37"></a> <span class="p">};</span> </span><span id="__span-19-38"><a id="__codelineno-19-38" name="__codelineno-19-38" href="#__codelineno-19-38"></a> </span><span id="__span-19-39"><a id="__codelineno-19-39" name="__codelineno-19-39" href="#__codelineno-19-39"></a> <span class="ss">listenLanInterface</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-19-40"><a id="__codelineno-19-40" name="__codelineno-19-40" href="#__codelineno-19-40"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>nullOr lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-19-41"><a id="__codelineno-19-41" name="__codelineno-19-41" href="#__codelineno-19-41"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">null</span><span class="p">;</span> </span><span id="__span-19-42"><a id="__codelineno-19-42" name="__codelineno-19-42" href="#__codelineno-19-42"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"eno1"</span><span class="p">;</span> </span><span id="__span-19-43"><a id="__codelineno-19-43" name="__codelineno-19-43" href="#__codelineno-19-43"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-19-44"><a id="__codelineno-19-44" name="__codelineno-19-44" href="#__codelineno-19-44"></a><span class="s s-Multiline"> LAN interface to additionally open `cfg.port` on. `null` exposes</span> </span><span id="__span-19-45"><a id="__codelineno-19-45" name="__codelineno-19-45" href="#__codelineno-19-45"></a><span class="s s-Multiline"> the webhook receiver only via tailscale0 — recommended, since</span> </span><span id="__span-19-46"><a id="__codelineno-19-46" name="__codelineno-19-46" href="#__codelineno-19-46"></a><span class="s s-Multiline"> Sonarr / Radarr / Overseerr / audiobook-import all run on the</span> </span><span id="__span-19-47"><a id="__codelineno-19-47" name="__codelineno-19-47" href="#__codelineno-19-47"></a><span class="s s-Multiline"> same host as the bot and reach it via 127.0.0.1.</span> </span><span id="__span-19-48"><a id="__codelineno-19-48" name="__codelineno-19-48" href="#__codelineno-19-48"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-19-49"><a id="__codelineno-19-49" name="__codelineno-19-49" href="#__codelineno-19-49"></a> <span class="p">};</span> </span><span id="__span-19-50"><a id="__codelineno-19-50" name="__codelineno-19-50" href="#__codelineno-19-50"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="meeting-transcribenix"><code>meeting-transcribe.nix</code><a class="headerlink" href="#meeting-transcribenix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/meeting-transcribe.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/meeting-transcribe.nix</code></a></p> <p>meeting-transcribe — one-button meeting recording + transcription + summary.</p> <p>UX: SUPER+SHIFT+M to start, again to stop. After stop, a background job transcribes (whisperX + diarization) and summarizes (Ollama, gemma4:12b) the audio. ~2-5 min later, notify-send fires with a markdown brief at ~/meetings/YYYY-MM-DD-HHMM.md containing TL;DR, your action items, decisions, flagged keywords, topic timeline, and the full diarized transcript.</p> <p>Topology: razer records locally + offloads heavy work to p620 over Tailscale SSH. p620 records AND processes locally. Per-host wiring:</p> <h1 id="razer-client-only">razer (client only)<a class="headerlink" href="#razer-client-only" title="Anchor link to this section">¶</a></h1> <p>features.meetingTranscribe = { enable = true; processHost = "p620"; installProcessor = false; userName = "Olaf"; userEmail = "olaf@freundcloud.com"; };</p> <h1 id="p620-client-processor">p620 (client + processor)<a class="headerlink" href="#p620-client-processor" title="Anchor link to this section">¶</a></h1> <p>features.meetingTranscribe = { enable = true; processHost = "local"; installProcessor = true; huggingfaceTokenFile = config.age.secrets."api-huggingface".path; ollamaUrl = "http://localhost:11434"; userName = "Olaf"; userEmail = "olaf@freundcloud.com"; };</p> <p>Setup (one-time, post-deploy on p620): 1. Sign up at https://huggingface.co/join (free). 2. Accept terms at https://huggingface.co/pyannote/speaker-diarization-community-1 That is what whisperX 3.8.6 requests -- NOT speaker-diarization-3.1, which earlier revisions of this file and the docs both named. 3. Create a read token at https://huggingface.co/settings/tokens. 4. ./scripts/manage-secrets.sh create api-huggingface (paste token). 5. just quick-deploy p620 && just quick-deploy razer.</p> <ul> <li><strong>Enable option:</strong> Meeting recording, transcription, and summarization</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-20-1"><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">meetingTranscribe</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-20-2"><a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"Meeting recording, transcription, and summarization"</span><span class="p">;</span> </span><span id="__span-20-3"><a id="__codelineno-20-3" name="__codelineno-20-3" href="#__codelineno-20-3"></a> </span><span id="__span-20-4"><a id="__codelineno-20-4" name="__codelineno-20-4" href="#__codelineno-20-4"></a> <span class="ss">processHost</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-20-5"><a id="__codelineno-20-5" name="__codelineno-20-5" href="#__codelineno-20-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-20-6"><a id="__codelineno-20-6" name="__codelineno-20-6" href="#__codelineno-20-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"local"</span><span class="p">;</span> </span><span id="__span-20-7"><a id="__codelineno-20-7" name="__codelineno-20-7" href="#__codelineno-20-7"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"p620"</span><span class="p">;</span> </span><span id="__span-20-8"><a id="__codelineno-20-8" name="__codelineno-20-8" href="#__codelineno-20-8"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-20-9"><a id="__codelineno-20-9" name="__codelineno-20-9" href="#__codelineno-20-9"></a><span class="s s-Multiline"> Where transcription + summarization runs. "local" means same host</span> </span><span id="__span-20-10"><a id="__codelineno-20-10" name="__codelineno-20-10" href="#__codelineno-20-10"></a><span class="s s-Multiline"> (requires installProcessor = true). Otherwise an SSH-reachable host</span> </span><span id="__span-20-11"><a id="__codelineno-20-11" name="__codelineno-20-11" href="#__codelineno-20-11"></a><span class="s s-Multiline"> name (typically a Tailscale node) where the processor is installed.</span> </span><span id="__span-20-12"><a id="__codelineno-20-12" name="__codelineno-20-12" href="#__codelineno-20-12"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-20-13"><a id="__codelineno-20-13" name="__codelineno-20-13" href="#__codelineno-20-13"></a> <span class="p">};</span> </span><span id="__span-20-14"><a id="__codelineno-20-14" name="__codelineno-20-14" href="#__codelineno-20-14"></a> </span><span id="__span-20-15"><a id="__codelineno-20-15" name="__codelineno-20-15" href="#__codelineno-20-15"></a> <span class="ss">installProcessor</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-20-16"><a id="__codelineno-20-16" name="__codelineno-20-16" href="#__codelineno-20-16"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-20-17"><a id="__codelineno-20-17" name="__codelineno-20-17" href="#__codelineno-20-17"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-20-18"><a id="__codelineno-20-18" name="__codelineno-20-18" href="#__codelineno-20-18"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-20-19"><a id="__codelineno-20-19" name="__codelineno-20-19" href="#__codelineno-20-19"></a><span class="s s-Multiline"> Install processor-side dependencies (whisperX, meet-process helper).</span> </span><span id="__span-20-20"><a id="__codelineno-20-20" name="__codelineno-20-20" href="#__codelineno-20-20"></a><span class="s s-Multiline"> Set true on the host that runs the heavy lifting (typically p620).</span> </span><span id="__span-20-21"><a id="__codelineno-20-21" name="__codelineno-20-21" href="#__codelineno-20-21"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-20-22"><a id="__codelineno-20-22" name="__codelineno-20-22" href="#__codelineno-20-22"></a> <span class="p">};</span> </span><span id="__span-20-23"><a id="__codelineno-20-23" name="__codelineno-20-23" href="#__codelineno-20-23"></a> </span><span id="__span-20-24"><a id="__codelineno-20-24" name="__codelineno-20-24" href="#__codelineno-20-24"></a> <span class="ss">huggingfaceTokenFile</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-20-25"><a id="__codelineno-20-25" name="__codelineno-20-25" href="#__codelineno-20-25"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>nullOr lib<span class="o">.</span>types<span class="o">.</span>path<span class="p">;</span> </span><span id="__span-20-26"><a id="__codelineno-20-26" name="__codelineno-20-26" href="#__codelineno-20-26"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">null</span><span class="p">;</span> </span><span id="__span-20-27"><a id="__codelineno-20-27" name="__codelineno-20-27" href="#__codelineno-20-27"></a> <span class="ss">example</span> <span class="o">=</span> lib<span class="o">.</span>literalExpression <span class="s s-Multiline">''config.age.secrets."api-huggingface".path''</span><span class="p">;</span> </span><span id="__span-20-28"><a id="__codelineno-20-28" name="__codelineno-20-28" href="#__codelineno-20-28"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-20-29"><a id="__codelineno-20-29" name="__codelineno-20-29" href="#__codelineno-20-29"></a><span class="s s-Multiline"> Path to a HuggingFace token file (required by whisperX for the</span> </span><span id="__span-20-30"><a id="__codelineno-20-30" name="__codelineno-20-30" href="#__codelineno-20-30"></a><span class="s s-Multiline"> pyannote diarization model). Required on the processor host. Read</span> </span><span id="__span-20-31"><a id="__codelineno-20-31" name="__codelineno-20-31" href="#__codelineno-20-31"></a><span class="s s-Multiline"> at runtime, never embedded in the store.</span> </span><span id="__span-20-32"><a id="__codelineno-20-32" name="__codelineno-20-32" href="#__codelineno-20-32"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-20-33"><a id="__codelineno-20-33" name="__codelineno-20-33" href="#__codelineno-20-33"></a> <span class="p">};</span> </span><span id="__span-20-34"><a id="__codelineno-20-34" name="__codelineno-20-34" href="#__codelineno-20-34"></a> </span><span id="__span-20-35"><a id="__codelineno-20-35" name="__codelineno-20-35" href="#__codelineno-20-35"></a> <span class="ss">ollamaUrl</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-20-36"><a id="__codelineno-20-36" name="__codelineno-20-36" href="#__codelineno-20-36"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-20-37"><a id="__codelineno-20-37" name="__codelineno-20-37" href="#__codelineno-20-37"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"http://p620:11434"</span><span class="p">;</span> </span><span id="__span-20-38"><a id="__codelineno-20-38" name="__codelineno-20-38" href="#__codelineno-20-38"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-20-39"><a id="__codelineno-20-39" name="__codelineno-20-39" href="#__codelineno-20-39"></a><span class="s s-Multiline"> Ollama API base URL for summarization. On p620, override to</span> </span><span id="__span-20-40"><a id="__codelineno-20-40" name="__codelineno-20-40" href="#__codelineno-20-40"></a><span class="s s-Multiline"> http://localhost:11434.</span> </span><span id="__span-20-41"><a id="__codelineno-20-41" name="__codelineno-20-41" href="#__codelineno-20-41"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-20-42"><a id="__codelineno-20-42" name="__codelineno-20-42" href="#__codelineno-20-42"></a> <span class="p">};</span> </span><span id="__span-20-43"><a id="__codelineno-20-43" name="__codelineno-20-43" href="#__codelineno-20-43"></a> </span><span id="__span-20-44"><a id="__codelineno-20-44" name="__codelineno-20-44" href="#__codelineno-20-44"></a> <span class="ss">ollamaModel</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-20-45"><a id="__codelineno-20-45" name="__codelineno-20-45" href="#__codelineno-20-45"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-20-46"><a id="__codelineno-20-46" name="__codelineno-20-46" href="#__codelineno-20-46"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"gemma4:12b"</span><span class="p">;</span> </span><span id="__span-20-47"><a id="__codelineno-20-47" name="__codelineno-20-47" href="#__codelineno-20-47"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-20-48"><a id="__codelineno-20-48" name="__codelineno-20-48" href="#__codelineno-20-48"></a><span class="s s-Multiline"> Ollama model used for summarization. Must be declared in</span> </span><span id="__span-20-49"><a id="__codelineno-20-49" name="__codelineno-20-49" href="#__codelineno-20-49"></a><span class="s s-Multiline"> `features.ollama-server` or every brief silently degrades to</span> </span><span id="__span-20-50"><a id="__codelineno-20-50" name="__codelineno-20-50" href="#__codelineno-20-50"></a><span class="s s-Multiline"> transcript-only -- asserted below when Ollama is local.</span> </span><span id="__span-20-51"><a id="__codelineno-20-51" name="__codelineno-20-51" href="#__codelineno-20-51"></a> </span><span id="__span-20-52"><a id="__codelineno-20-52" name="__codelineno-20-52" href="#__codelineno-20-52"></a><span class="s s-Multiline"> Sized to fit, not maximised. p620's card has 21.5 GB and</span> </span><span id="__span-20-53"><a id="__codelineno-20-53" name="__codelineno-20-53" href="#__codelineno-20-53"></a><span class="s s-Multiline"> OLLAMA_CONTEXT_LENGTH is 32768, so gemma4:12b (7.6 GB) loads fully</span> </span><span id="__span-20-54"><a id="__codelineno-20-54" name="__codelineno-20-54" href="#__codelineno-20-54"></a><span class="s s-Multiline"> onto the GPU at ~51% VRAM and leaves the rest for the compositor.</span> </span><span id="__span-20-55"><a id="__codelineno-20-55" name="__codelineno-20-55" href="#__codelineno-20-55"></a><span class="s s-Multiline"> qwen3.8:27b was tried first and is the wrong shape here: 17 GB of</span> </span><span id="__span-20-56"><a id="__codelineno-20-56" name="__codelineno-20-56" href="#__codelineno-20-56"></a><span class="s s-Multiline"> weights plus that KV cache overflows the card, ollama splits it</span> </span><span id="__span-20-57"><a id="__codelineno-20-57" name="__codelineno-20-57" href="#__codelineno-20-57"></a><span class="s s-Multiline"> 88/12 GPU/CPU, VRAM hits 94% and the desktop freezes for the whole</span> </span><span id="__span-20-58"><a id="__codelineno-20-58" name="__codelineno-20-58" href="#__codelineno-20-58"></a><span class="s s-Multiline"> run. Both return valid JSON of equivalent quality for this task --</span> </span><span id="__span-20-59"><a id="__codelineno-20-59" name="__codelineno-20-59" href="#__codelineno-20-59"></a><span class="s s-Multiline"> it is transcript extraction, not reasoning -- so the larger model</span> </span><span id="__span-20-60"><a id="__codelineno-20-60" name="__codelineno-20-60" href="#__codelineno-20-60"></a><span class="s s-Multiline"> buys nothing and costs a usable machine.</span> </span><span id="__span-20-61"><a id="__codelineno-20-61" name="__codelineno-20-61" href="#__codelineno-20-61"></a> </span><span id="__span-20-62"><a id="__codelineno-20-62" name="__codelineno-20-62" href="#__codelineno-20-62"></a><span class="s s-Multiline"> Note OLLAMA_KEEP_ALIVE is 5m: nothing stays resident between</span> </span><span id="__span-20-63"><a id="__codelineno-20-63" name="__codelineno-20-63" href="#__codelineno-20-63"></a><span class="s s-Multiline"> meetings, so every run pays a cold load (24s for gemma4:12b,</span> </span><span id="__span-20-64"><a id="__codelineno-20-64" name="__codelineno-20-64" href="#__codelineno-20-64"></a><span class="s s-Multiline"> ~59s for qwen3.8:27b). `persistentModels` only pre-pulls.</span> </span><span id="__span-20-65"><a id="__codelineno-20-65" name="__codelineno-20-65" href="#__codelineno-20-65"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-20-66"><a id="__codelineno-20-66" name="__codelineno-20-66" href="#__codelineno-20-66"></a> <span class="p">};</span> </span><span id="__span-20-67"><a id="__codelineno-20-67" name="__codelineno-20-67" href="#__codelineno-20-67"></a> </span><span id="__span-20-68"><a id="__codelineno-20-68" name="__codelineno-20-68" href="#__codelineno-20-68"></a> <span class="ss">whisperModel</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-20-69"><a id="__codelineno-20-69" name="__codelineno-20-69" href="#__codelineno-20-69"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-20-70"><a id="__codelineno-20-70" name="__codelineno-20-70" href="#__codelineno-20-70"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"large-v3"</span><span class="p">;</span> </span><span id="__span-20-71"><a id="__codelineno-20-71" name="__codelineno-20-71" href="#__codelineno-20-71"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"whisperX model size: tiny | base | small | medium | large-v3."</span><span class="p">;</span> </span><span id="__span-20-72"><a id="__codelineno-20-72" name="__codelineno-20-72" href="#__codelineno-20-72"></a> <span class="p">};</span> </span><span id="__span-20-73"><a id="__codelineno-20-73" name="__codelineno-20-73" href="#__codelineno-20-73"></a> </span><span id="__span-20-74"><a id="__codelineno-20-74" name="__codelineno-20-74" href="#__codelineno-20-74"></a> <span class="ss">language</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-20-75"><a id="__codelineno-20-75" name="__codelineno-20-75" href="#__codelineno-20-75"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-20-76"><a id="__codelineno-20-76" name="__codelineno-20-76" href="#__codelineno-20-76"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"en"</span><span class="p">;</span> </span><span id="__span-20-77"><a id="__codelineno-20-77" name="__codelineno-20-77" href="#__codelineno-20-77"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Language code for whisperX (e.g. en, no, da)."</span><span class="p">;</span> </span><span id="__span-20-78"><a id="__codelineno-20-78" name="__codelineno-20-78" href="#__codelineno-20-78"></a> <span class="p">};</span> </span><span id="__span-20-79"><a id="__codelineno-20-79" name="__codelineno-20-79" href="#__codelineno-20-79"></a> </span><span id="__span-20-80"><a id="__codelineno-20-80" name="__codelineno-20-80" href="#__codelineno-20-80"></a> <span class="ss">outputDir</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-20-81"><a id="__codelineno-20-81" name="__codelineno-20-81" href="#__codelineno-20-81"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-20-82"><a id="__codelineno-20-82" name="__codelineno-20-82" href="#__codelineno-20-82"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"~/meetings"</span><span class="p">;</span> </span><span id="__span-20-83"><a id="__codelineno-20-83" name="__codelineno-20-83" href="#__codelineno-20-83"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Where finished meeting briefs land (per-user; tilde expanded at runtime)."</span><span class="p">;</span> </span><span id="__span-20-84"><a id="__codelineno-20-84" name="__codelineno-20-84" href="#__codelineno-20-84"></a> <span class="p">};</span> </span><span id="__span-20-85"><a id="__codelineno-20-85" name="__codelineno-20-85" href="#__codelineno-20-85"></a> </span><span id="__span-20-86"><a id="__codelineno-20-86" name="__codelineno-20-86" href="#__codelineno-20-86"></a> <span class="ss">userName</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-20-87"><a id="__codelineno-20-87" name="__codelineno-20-87" href="#__codelineno-20-87"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-20-88"><a id="__codelineno-20-88" name="__codelineno-20-88" href="#__codelineno-20-88"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"Olaf"</span><span class="p">;</span> </span><span id="__span-20-89"><a id="__codelineno-20-89" name="__codelineno-20-89" href="#__codelineno-20-89"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-20-90"><a id="__codelineno-20-90" name="__codelineno-20-90" href="#__codelineno-20-90"></a><span class="s s-Multiline"> Your display name. Used in the Ollama prompt to identify "your action</span> </span><span id="__span-20-91"><a id="__codelineno-20-91" name="__codelineno-20-91" href="#__codelineno-20-91"></a><span class="s s-Multiline"># … truncated — see source link above</span> </span></code></pre></div> </details> <h3 id="mtrnix"><code>mtr.nix</code><a class="headerlink" href="#mtrnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/mtr/mtr.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/mtr/mtr.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="network-stabilitynix"><code>network-stability.nix</code><a class="headerlink" href="#network-stabilitynix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/network-stability.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/network-stability.nix</code></a></p> <ul> <li><strong>Enable option:</strong> Comprehensive network stability improvements</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>interval</code>, <code>providers</code>, <code>improve</code>, <code>switchDelayMs</code>, <code>startDelay</code>, <code>restartSec</code>, <code>scriptPath</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-21-1"><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a> options<span class="o">.</span>services<span class="o">.</span><span class="ss">network-stability</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-21-2"><a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"Comprehensive network stability improvements"</span><span class="p">;</span> </span><span id="__span-21-3"><a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a> </span><span id="__span-21-4"><a id="__codelineno-21-4" name="__codelineno-21-4" href="#__codelineno-21-4"></a> <span class="ss">monitoring</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-21-5"><a id="__codelineno-21-5" name="__codelineno-21-5" href="#__codelineno-21-5"></a> <span class="ss">enable</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-21-6"><a id="__codelineno-21-6" name="__codelineno-21-6" href="#__codelineno-21-6"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-21-7"><a id="__codelineno-21-7" name="__codelineno-21-7" href="#__codelineno-21-7"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-21-8"><a id="__codelineno-21-8" name="__codelineno-21-8" href="#__codelineno-21-8"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Enable network monitoring"</span><span class="p">;</span> </span><span id="__span-21-9"><a id="__codelineno-21-9" name="__codelineno-21-9" href="#__codelineno-21-9"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-21-10"><a id="__codelineno-21-10" name="__codelineno-21-10" href="#__codelineno-21-10"></a> <span class="p">};</span> </span><span id="__span-21-11"><a id="__codelineno-21-11" name="__codelineno-21-11" href="#__codelineno-21-11"></a> </span><span id="__span-21-12"><a id="__codelineno-21-12" name="__codelineno-21-12" href="#__codelineno-21-12"></a> <span class="ss">interval</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-21-13"><a id="__codelineno-21-13" name="__codelineno-21-13" href="#__codelineno-21-13"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-21-14"><a id="__codelineno-21-14" name="__codelineno-21-14" href="#__codelineno-21-14"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">30</span><span class="p">;</span> </span><span id="__span-21-15"><a id="__codelineno-21-15" name="__codelineno-21-15" href="#__codelineno-21-15"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Monitoring interval in seconds"</span><span class="p">;</span> </span><span id="__span-21-16"><a id="__codelineno-21-16" name="__codelineno-21-16" href="#__codelineno-21-16"></a> <span class="ss">example</span> <span class="o">=</span> <span class="mi">60</span><span class="p">;</span> </span><span id="__span-21-17"><a id="__codelineno-21-17" name="__codelineno-21-17" href="#__codelineno-21-17"></a> <span class="p">};</span> </span><span id="__span-21-18"><a id="__codelineno-21-18" name="__codelineno-21-18" href="#__codelineno-21-18"></a> <span class="p">};</span> </span><span id="__span-21-19"><a id="__codelineno-21-19" name="__codelineno-21-19" href="#__codelineno-21-19"></a> </span><span id="__span-21-20"><a id="__codelineno-21-20" name="__codelineno-21-20" href="#__codelineno-21-20"></a> <span class="ss">secureDns</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-21-21"><a id="__codelineno-21-21" name="__codelineno-21-21" href="#__codelineno-21-21"></a> <span class="ss">enable</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-21-22"><a id="__codelineno-21-22" name="__codelineno-21-22" href="#__codelineno-21-22"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-21-23"><a id="__codelineno-21-23" name="__codelineno-21-23" href="#__codelineno-21-23"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-21-24"><a id="__codelineno-21-24" name="__codelineno-21-24" href="#__codelineno-21-24"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Enable secure DNS configuration"</span><span class="p">;</span> </span><span id="__span-21-25"><a id="__codelineno-21-25" name="__codelineno-21-25" href="#__codelineno-21-25"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-21-26"><a id="__codelineno-21-26" name="__codelineno-21-26" href="#__codelineno-21-26"></a> <span class="p">};</span> </span><span id="__span-21-27"><a id="__codelineno-21-27" name="__codelineno-21-27" href="#__codelineno-21-27"></a> </span><span id="__span-21-28"><a id="__codelineno-21-28" name="__codelineno-21-28" href="#__codelineno-21-28"></a> <span class="ss">providers</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-21-29"><a id="__codelineno-21-29" name="__codelineno-21-29" href="#__codelineno-21-29"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>listOf types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-21-30"><a id="__codelineno-21-30" name="__codelineno-21-30" href="#__codelineno-21-30"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">[</span> </span><span id="__span-21-31"><a id="__codelineno-21-31" name="__codelineno-21-31" href="#__codelineno-21-31"></a> <span class="s2">"1.1.1.1#cloudflare-dns.com"</span> </span><span id="__span-21-32"><a id="__codelineno-21-32" name="__codelineno-21-32" href="#__codelineno-21-32"></a> <span class="s2">"8.8.8.8#dns.google"</span> </span><span id="__span-21-33"><a id="__codelineno-21-33" name="__codelineno-21-33" href="#__codelineno-21-33"></a> <span class="p">];</span> </span><span id="__span-21-34"><a id="__codelineno-21-34" name="__codelineno-21-34" href="#__codelineno-21-34"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"List of DNS providers to use"</span><span class="p">;</span> </span><span id="__span-21-35"><a id="__codelineno-21-35" name="__codelineno-21-35" href="#__codelineno-21-35"></a> <span class="ss">example</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"9.9.9.9#dns.quad9.net"</span> <span class="p">];</span> </span><span id="__span-21-36"><a id="__codelineno-21-36" name="__codelineno-21-36" href="#__codelineno-21-36"></a> <span class="p">};</span> </span><span id="__span-21-37"><a id="__codelineno-21-37" name="__codelineno-21-37" href="#__codelineno-21-37"></a> <span class="p">};</span> </span><span id="__span-21-38"><a id="__codelineno-21-38" name="__codelineno-21-38" href="#__codelineno-21-38"></a> </span><span id="__span-21-39"><a id="__codelineno-21-39" name="__codelineno-21-39" href="#__codelineno-21-39"></a> <span class="ss">electron</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-21-40"><a id="__codelineno-21-40" name="__codelineno-21-40" href="#__codelineno-21-40"></a> <span class="ss">improve</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-21-41"><a id="__codelineno-21-41" name="__codelineno-21-41" href="#__codelineno-21-41"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-21-42"><a id="__codelineno-21-42" name="__codelineno-21-42" href="#__codelineno-21-42"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-21-43"><a id="__codelineno-21-43" name="__codelineno-21-43" href="#__codelineno-21-43"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Enable Electron app network stability improvements"</span><span class="p">;</span> </span><span id="__span-21-44"><a id="__codelineno-21-44" name="__codelineno-21-44" href="#__codelineno-21-44"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-21-45"><a id="__codelineno-21-45" name="__codelineno-21-45" href="#__codelineno-21-45"></a> <span class="p">};</span> </span><span id="__span-21-46"><a id="__codelineno-21-46" name="__codelineno-21-46" href="#__codelineno-21-46"></a> <span class="p">};</span> </span><span id="__span-21-47"><a id="__codelineno-21-47" name="__codelineno-21-47" href="#__codelineno-21-47"></a> </span><span id="__span-21-48"><a id="__codelineno-21-48" name="__codelineno-21-48" href="#__codelineno-21-48"></a> <span class="ss">connectionStability</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-21-49"><a id="__codelineno-21-49" name="__codelineno-21-49" href="#__codelineno-21-49"></a> <span class="ss">enable</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-21-50"><a id="__codelineno-21-50" name="__codelineno-21-50" href="#__codelineno-21-50"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-21-51"><a id="__codelineno-21-51" name="__codelineno-21-51" href="#__codelineno-21-51"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-21-52"><a id="__codelineno-21-52" name="__codelineno-21-52" href="#__codelineno-21-52"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Enable network connection stability enhancements"</span><span class="p">;</span> </span><span id="__span-21-53"><a id="__codelineno-21-53" name="__codelineno-21-53" href="#__codelineno-21-53"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-21-54"><a id="__codelineno-21-54" name="__codelineno-21-54" href="#__codelineno-21-54"></a> <span class="p">};</span> </span><span id="__span-21-55"><a id="__codelineno-21-55" name="__codelineno-21-55" href="#__codelineno-21-55"></a> </span><span id="__span-21-56"><a id="__codelineno-21-56" name="__codelineno-21-56" href="#__codelineno-21-56"></a> <span class="ss">switchDelayMs</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-21-57"><a id="__codelineno-21-57" name="__codelineno-21-57" href="#__codelineno-21-57"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-21-58"><a id="__codelineno-21-58" name="__codelineno-21-58" href="#__codelineno-21-58"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">5000</span><span class="p">;</span> </span><span id="__span-21-59"><a id="__codelineno-21-59" name="__codelineno-21-59" href="#__codelineno-21-59"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Delay in milliseconds before switching network interfaces"</span><span class="p">;</span> </span><span id="__span-21-60"><a id="__codelineno-21-60" name="__codelineno-21-60" href="#__codelineno-21-60"></a> <span class="ss">example</span> <span class="o">=</span> <span class="mi">3000</span><span class="p">;</span> </span><span id="__span-21-61"><a id="__codelineno-21-61" name="__codelineno-21-61" href="#__codelineno-21-61"></a> <span class="p">};</span> </span><span id="__span-21-62"><a id="__codelineno-21-62" name="__codelineno-21-62" href="#__codelineno-21-62"></a> <span class="p">};</span> </span><span id="__span-21-63"><a id="__codelineno-21-63" name="__codelineno-21-63" href="#__codelineno-21-63"></a> </span><span id="__span-21-64"><a id="__codelineno-21-64" name="__codelineno-21-64" href="#__codelineno-21-64"></a> <span class="c1"># Add helper service configuration options</span> </span><span id="__span-21-65"><a id="__codelineno-21-65" name="__codelineno-21-65" href="#__codelineno-21-65"></a> <span class="ss">helperService</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-21-66"><a id="__codelineno-21-66" name="__codelineno-21-66" href="#__codelineno-21-66"></a> <span class="ss">enable</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-21-67"><a id="__codelineno-21-67" name="__codelineno-21-67" href="#__codelineno-21-67"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-21-68"><a id="__codelineno-21-68" name="__codelineno-21-68" href="#__codelineno-21-68"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-21-69"><a id="__codelineno-21-69" name="__codelineno-21-69" href="#__codelineno-21-69"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Enable the network stability helper service"</span><span class="p">;</span> </span><span id="__span-21-70"><a id="__codelineno-21-70" name="__codelineno-21-70" href="#__codelineno-21-70"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-21-71"><a id="__codelineno-21-71" name="__codelineno-21-71" href="#__codelineno-21-71"></a> <span class="p">};</span> </span><span id="__span-21-72"><a id="__codelineno-21-72" name="__codelineno-21-72" href="#__codelineno-21-72"></a> </span><span id="__span-21-73"><a id="__codelineno-21-73" name="__codelineno-21-73" href="#__codelineno-21-73"></a> <span class="ss">startDelay</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-21-74"><a id="__codelineno-21-74" name="__codelineno-21-74" href="#__codelineno-21-74"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-21-75"><a id="__codelineno-21-75" name="__codelineno-21-75" href="#__codelineno-21-75"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> </span><span id="__span-21-76"><a id="__codelineno-21-76" name="__codelineno-21-76" href="#__codelineno-21-76"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Delay in seconds before starting the network stability service"</span><span class="p">;</span> </span><span id="__span-21-77"><a id="__codelineno-21-77" name="__codelineno-21-77" href="#__codelineno-21-77"></a> <span class="ss">example</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> </span><span id="__span-21-78"><a id="__codelineno-21-78" name="__codelineno-21-78" href="#__codelineno-21-78"></a> <span class="p">};</span> </span><span id="__span-21-79"><a id="__codelineno-21-79" name="__codelineno-21-79" href="#__codelineno-21-79"></a> </span><span id="__span-21-80"><a id="__codelineno-21-80" name="__codelineno-21-80" href="#__codelineno-21-80"></a> <span class="ss">restartSec</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-21-81"><a id="__codelineno-21-81" name="__codelineno-21-81" href="#__codelineno-21-81"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-21-82"><a id="__codelineno-21-82" name="__codelineno-21-82" href="#__codelineno-21-82"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">30</span><span class="p">;</span> </span><span id="__span-21-83"><a id="__codelineno-21-83" name="__codelineno-21-83" href="#__codelineno-21-83"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Time in seconds to wait before restarting the service on failure"</span><span class="p">;</span> </span><span id="__span-21-84"><a id="__codelineno-21-84" name="__codelineno-21-84" href="#__codelineno-21-84"></a> <span class="ss">example</span> <span class="o">=</span> <span class="mi">60</span><span class="p">;</span> </span><span id="__span-21-85"><a id="__codelineno-21-85" name="__codelineno-21-85" href="#__codelineno-21-85"></a> <span class="p">};</span> </span><span id="__span-21-86"><a id="__codelineno-21-86" name="__codelineno-21-86" href="#__codelineno-21-86"></a> <span class="p">};</span> </span><span id="__span-21-87"><a id="__codelineno-21-87" name="__codelineno-21-87" href="#__codelineno-21-87"></a> </span><span id="__span-21-88"><a id="__codelineno-21-88" name="__codelineno-21-88" href="#__codelineno-21-88"></a> <span class="c1"># Script path option required by network-stability-service.nix</span> </span><span id="__span-21-89"><a id="__codelineno-21-89" name="__codelineno-21-89" href="#__codelineno-21-89"></a> <span class="ss">scriptPath</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-21-90"><a id="__codelineno-21-90" name="__codelineno-21-90" href="#__codelineno-21-90"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>path<span class="p">;</span> </span><span id="__span-21-91"><a id="__codelineno-21-91" name="__codelineno-21-91" href="#__codelineno-21-91"></a><span class="c1"># … truncated — see source link above</span> </span></code></pre></div> </details> <h3 id="nixarchy-runnernix"><code>nixarchy-runner.nix</code><a class="headerlink" href="#nixarchy-runnernix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/nixarchy-runner.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/nixarchy-runner.nix</code></a></p> <ul> <li><strong>Enable option:</strong> GitHub Actions runner for the nixarchy repository</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-22-1"><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a> options<span class="o">.</span>services<span class="o">.</span><span class="ss">nixarchy-runner</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-22-2"><a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"GitHub Actions runner for the nixarchy repository"</span><span class="p">;</span> </span><span id="__span-22-3"><a id="__codelineno-22-3" name="__codelineno-22-3" href="#__codelineno-22-3"></a> </span><span id="__span-22-4"><a id="__codelineno-22-4" name="__codelineno-22-4" href="#__codelineno-22-4"></a> <span class="ss">url</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-22-5"><a id="__codelineno-22-5" name="__codelineno-22-5" href="#__codelineno-22-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-22-6"><a id="__codelineno-22-6" name="__codelineno-22-6" href="#__codelineno-22-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"https://github.com/olafkfreund/nixarchy"</span><span class="p">;</span> </span><span id="__span-22-7"><a id="__codelineno-22-7" name="__codelineno-22-7" href="#__codelineno-22-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Repository the runner registers against."</span><span class="p">;</span> </span><span id="__span-22-8"><a id="__codelineno-22-8" name="__codelineno-22-8" href="#__codelineno-22-8"></a> <span class="p">};</span> </span><span id="__span-22-9"><a id="__codelineno-22-9" name="__codelineno-22-9" href="#__codelineno-22-9"></a> </span><span id="__span-22-10"><a id="__codelineno-22-10" name="__codelineno-22-10" href="#__codelineno-22-10"></a> <span class="ss">buildDir</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-22-11"><a id="__codelineno-22-11" name="__codelineno-22-11" href="#__codelineno-22-11"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>path<span class="p">;</span> </span><span id="__span-22-12"><a id="__codelineno-22-12" name="__codelineno-22-12" href="#__codelineno-22-12"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"/mnt/games/nix-build"</span><span class="p">;</span> </span><span id="__span-22-13"><a id="__codelineno-22-13" name="__codelineno-22-13" href="#__codelineno-22-13"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-22-14"><a id="__codelineno-22-14" name="__codelineno-22-14" href="#__codelineno-22-14"></a><span class="s s-Multiline"> Where nix builds. Deliberately has no default: it is the setting that</span> </span><span id="__span-22-15"><a id="__codelineno-22-15" name="__codelineno-22-15" href="#__codelineno-22-15"></a><span class="s s-Multiline"> decides whether an ISO test finishes or wedges, and the right answer is</span> </span><span id="__span-22-16"><a id="__codelineno-22-16" name="__codelineno-22-16" href="#__codelineno-22-16"></a><span class="s s-Multiline"> a property of the host's disks rather than something this module can</span> </span><span id="__span-22-17"><a id="__codelineno-22-17" name="__codelineno-22-17" href="#__codelineno-22-17"></a><span class="s s-Multiline"> guess.</span> </span><span id="__span-22-18"><a id="__codelineno-22-18" name="__codelineno-22-18" href="#__codelineno-22-18"></a> </span><span id="__span-22-19"><a id="__codelineno-22-19" name="__codelineno-22-19" href="#__codelineno-22-19"></a><span class="s s-Multiline"> Pick for sustained write throughput and free space, in that order. A VM</span> </span><span id="__span-22-20"><a id="__codelineno-22-20" name="__codelineno-22-20" href="#__codelineno-22-20"></a><span class="s s-Multiline"> test that runs out of room does not fail cleanly -- qemu takes an I/O</span> </span><span id="__span-22-21"><a id="__codelineno-22-21" name="__codelineno-22-21" href="#__codelineno-22-21"></a><span class="s s-Multiline"> error mid-install and the test hangs until something times out, which</span> </span><span id="__span-22-22"><a id="__codelineno-22-22" name="__codelineno-22-22" href="#__codelineno-22-22"></a><span class="s s-Multiline"> reads as flakiness rather than as a full disk. A slow disk fails the</span> </span><span id="__span-22-23"><a id="__codelineno-22-23" name="__codelineno-22-23" href="#__codelineno-22-23"></a><span class="s s-Multiline"> same way: an SMR drive collapses to single-digit MB/s once its cache</span> </span><span id="__span-22-24"><a id="__codelineno-22-24" name="__codelineno-22-24" href="#__codelineno-22-24"></a><span class="s s-Multiline"> band fills, and a 16 GB VM install is exactly that write pattern, so</span> </span><span id="__span-22-25"><a id="__codelineno-22-25" name="__codelineno-22-25" href="#__codelineno-22-25"></a><span class="s s-Multiline"> pointing builds at the roomiest disk in the machine can reproduce the</span> </span><span id="__span-22-26"><a id="__codelineno-22-26" name="__codelineno-22-26" href="#__codelineno-22-26"></a><span class="s s-Multiline"> hang it was meant to prevent.</span> </span><span id="__span-22-27"><a id="__codelineno-22-27" name="__codelineno-22-27" href="#__codelineno-22-27"></a> </span><span id="__span-22-28"><a id="__codelineno-22-28" name="__codelineno-22-28" href="#__codelineno-22-28"></a><span class="s s-Multiline"> Note this is set machine-wide, not just for the runner: there is one</span> </span><span id="__span-22-29"><a id="__codelineno-22-29" name="__codelineno-22-29" href="#__codelineno-22-29"></a><span class="s s-Multiline"> nix daemon, so every build on the host follows. If the store is on a</span> </span><span id="__span-22-30"><a id="__codelineno-22-30" name="__codelineno-22-30" href="#__codelineno-22-30"></a><span class="s s-Multiline"> different filesystem, build output is copied rather than renamed at the</span> </span><span id="__span-22-31"><a id="__codelineno-22-31" name="__codelineno-22-31" href="#__codelineno-22-31"></a><span class="s s-Multiline"> end -- real, and the price of not building on the root filesystem.</span> </span><span id="__span-22-32"><a id="__codelineno-22-32" name="__codelineno-22-32" href="#__codelineno-22-32"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-22-33"><a id="__codelineno-22-33" name="__codelineno-22-33" href="#__codelineno-22-33"></a> <span class="p">};</span> </span><span id="__span-22-34"><a id="__codelineno-22-34" name="__codelineno-22-34" href="#__codelineno-22-34"></a> </span><span id="__span-22-35"><a id="__codelineno-22-35" name="__codelineno-22-35" href="#__codelineno-22-35"></a> <span class="ss">instances</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-22-36"><a id="__codelineno-22-36" name="__codelineno-22-36" href="#__codelineno-22-36"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>ints<span class="o">.</span>positive<span class="p">;</span> </span><span id="__span-22-37"><a id="__codelineno-22-37" name="__codelineno-22-37" href="#__codelineno-22-37"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> </span><span id="__span-22-38"><a id="__codelineno-22-38" name="__codelineno-22-38" href="#__codelineno-22-38"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-22-39"><a id="__codelineno-22-39" name="__codelineno-22-39" href="#__codelineno-22-39"></a><span class="s s-Multiline"> How many runners to register, and therefore how many jobs this machine</span> </span><span id="__span-22-40"><a id="__codelineno-22-40" name="__codelineno-22-40" href="#__codelineno-22-40"></a><span class="s s-Multiline"> will accept at once -- a runner takes one job at a time, so this is the</span> </span><span id="__span-22-41"><a id="__codelineno-22-41" name="__codelineno-22-41" href="#__codelineno-22-41"></a><span class="s s-Multiline"> only lever there is.</span> </span><span id="__span-22-42"><a id="__codelineno-22-42" name="__codelineno-22-42" href="#__codelineno-22-42"></a> </span><span id="__span-22-43"><a id="__codelineno-22-43" name="__codelineno-22-43" href="#__codelineno-22-43"></a><span class="s s-Multiline"> Two by default. One meant a release build, which owns the machine for</span> </span><span id="__span-22-44"><a id="__codelineno-22-44" name="__codelineno-22-44" href="#__codelineno-22-44"></a><span class="s s-Multiline"> hours, queued every other check behind it; and because GitHub keeps</span> </span><span id="__span-22-45"><a id="__codelineno-22-45" name="__codelineno-22-45" href="#__codelineno-22-45"></a><span class="s s-Multiline"> only one pending run per concurrency group, a third arrival cancelled</span> </span><span id="__span-22-46"><a id="__codelineno-22-46" name="__codelineno-22-46" href="#__codelineno-22-46"></a><span class="s s-Multiline"> the waiting second. The install check went a whole day without a CI</span> </span><span id="__span-22-47"><a id="__codelineno-22-47" name="__codelineno-22-47" href="#__codelineno-22-47"></a><span class="s s-Multiline"> result on a day it passed repeatedly by hand.</span> </span><span id="__span-22-48"><a id="__codelineno-22-48" name="__codelineno-22-48" href="#__codelineno-22-48"></a> </span><span id="__span-22-49"><a id="__codelineno-22-49" name="__codelineno-22-49" href="#__codelineno-22-49"></a><span class="s s-Multiline"> Raise it only against cores and RAM you can spare while a VM test is</span> </span><span id="__span-22-50"><a id="__codelineno-22-50" name="__codelineno-22-50" href="#__codelineno-22-50"></a><span class="s s-Multiline"> running. The point is to stop one long job monopolising the machine,</span> </span><span id="__span-22-51"><a id="__codelineno-22-51" name="__codelineno-22-51" href="#__codelineno-22-51"></a><span class="s s-Multiline"> not to parallelise the queue.</span> </span><span id="__span-22-52"><a id="__codelineno-22-52" name="__codelineno-22-52" href="#__codelineno-22-52"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-22-53"><a id="__codelineno-22-53" name="__codelineno-22-53" href="#__codelineno-22-53"></a> <span class="p">};</span> </span><span id="__span-22-54"><a id="__codelineno-22-54" name="__codelineno-22-54" href="#__codelineno-22-54"></a> </span><span id="__span-22-55"><a id="__codelineno-22-55" name="__codelineno-22-55" href="#__codelineno-22-55"></a> <span class="ss">extraLabels</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-22-56"><a id="__codelineno-22-56" name="__codelineno-22-56" href="#__codelineno-22-56"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>listOf lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-22-57"><a id="__codelineno-22-57" name="__codelineno-22-57" href="#__codelineno-22-57"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"nixos"</span> <span class="s2">"kvm"</span> <span class="s2">"big"</span> <span class="p">];</span> </span><span id="__span-22-58"><a id="__codelineno-22-58" name="__codelineno-22-58" href="#__codelineno-22-58"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-22-59"><a id="__codelineno-22-59" name="__codelineno-22-59" href="#__codelineno-22-59"></a><span class="s s-Multiline"> Labels the workflow selects on. `nixos` and `kvm` say what the machine</span> </span><span id="__span-22-60"><a id="__codelineno-22-60" name="__codelineno-22-60" href="#__codelineno-22-60"></a><span class="s s-Multiline"> is; `big` says it has room for the ISO test, so a future lighter runner</span> </span><span id="__span-22-61"><a id="__codelineno-22-61" name="__codelineno-22-61" href="#__codelineno-22-61"></a><span class="s s-Multiline"> can carry the same `nixos` label without being handed an hour-long job.</span> </span><span id="__span-22-62"><a id="__codelineno-22-62" name="__codelineno-22-62" href="#__codelineno-22-62"></a> </span><span id="__span-22-63"><a id="__codelineno-22-63" name="__codelineno-22-63" href="#__codelineno-22-63"></a><span class="s s-Multiline"> Hosts sharing a label share a queue: GitHub hands a job to whichever</span> </span><span id="__span-22-64"><a id="__codelineno-22-64" name="__codelineno-22-64" href="#__codelineno-22-64"></a><span class="s s-Multiline"> matching runner is free. That is the point when you add a second</span> </span><span id="__span-22-65"><a id="__codelineno-22-65" name="__codelineno-22-65" href="#__codelineno-22-65"></a><span class="s s-Multiline"> machine, and it is also why a host that should not receive heavy jobs</span> </span><span id="__span-22-66"><a id="__codelineno-22-66" name="__codelineno-22-66" href="#__codelineno-22-66"></a><span class="s s-Multiline"> must not claim `big`.</span> </span><span id="__span-22-67"><a id="__codelineno-22-67" name="__codelineno-22-67" href="#__codelineno-22-67"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-22-68"><a id="__codelineno-22-68" name="__codelineno-22-68" href="#__codelineno-22-68"></a> <span class="p">};</span> </span><span id="__span-22-69"><a id="__codelineno-22-69" name="__codelineno-22-69" href="#__codelineno-22-69"></a> </span><span id="__span-22-70"><a id="__codelineno-22-70" name="__codelineno-22-70" href="#__codelineno-22-70"></a> <span class="ss">minFree</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-22-71"><a id="__codelineno-22-71" name="__codelineno-22-71" href="#__codelineno-22-71"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>ints<span class="o">.</span>unsigned<span class="p">;</span> </span><span id="__span-22-72"><a id="__codelineno-22-72" name="__codelineno-22-72" href="#__codelineno-22-72"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">100</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span><span class="p">;</span> </span><span id="__span-22-73"><a id="__codelineno-22-73" name="__codelineno-22-73" href="#__codelineno-22-73"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-22-74"><a id="__codelineno-22-74" name="__codelineno-22-74" href="#__codelineno-22-74"></a><span class="s s-Multiline"> nix.settings.min-free on a runner host, in bytes. The shared 10 GiB</span> </span><span id="__span-22-75"><a id="__codelineno-22-75" name="__codelineno-22-75" href="#__codelineno-22-75"></a><span class="s s-Multiline"> floor is 1% of p620's store disk: nix collected nothing until an</span> </span><span id="__span-22-76"><a id="__codelineno-22-76" name="__codelineno-22-76" href="#__codelineno-22-76"></a><span class="s s-Multiline"> install VM was already short of room, and the failure arrived as a</span> </span><span id="__span-22-77"><a id="__codelineno-22-77" name="__codelineno-22-77" href="#__codelineno-22-77"></a><span class="s s-Multiline"> guest timeout eighty minutes in (nixarchy#663).</span> </span><span id="__span-22-78"><a id="__codelineno-22-78" name="__codelineno-22-78" href="#__codelineno-22-78"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-22-79"><a id="__codelineno-22-79" name="__codelineno-22-79" href="#__codelineno-22-79"></a> <span class="p">};</span> </span><span id="__span-22-80"><a id="__codelineno-22-80" name="__codelineno-22-80" href="#__codelineno-22-80"></a> </span><span id="__span-22-81"><a id="__codelineno-22-81" name="__codelineno-22-81" href="#__codelineno-22-81"></a> <span class="ss">maxFree</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-22-82"><a id="__codelineno-22-82" name="__codelineno-22-82" href="#__codelineno-22-82"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>ints<span class="o">.</span>unsigned<span class="p">;</span> </span><span id="__span-22-83"><a id="__codelineno-22-83" name="__codelineno-22-83" href="#__codelineno-22-83"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">200</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span><span class="p">;</span> </span><span id="__span-22-84"><a id="__codelineno-22-84" name="__codelineno-22-84" href="#__codelineno-22-84"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"nix.settings.max-free on a runner host, in bytes."</span><span class="p">;</span> </span><span id="__span-22-85"><a id="__codelineno-22-85" name="__codelineno-22-85" href="#__codelineno-22-85"></a> <span class="p">};</span> </span><span id="__span-22-86"><a id="__codelineno-22-86" name="__codelineno-22-86" href="#__codelineno-22-86"></a> </span><span id="__span-22-87"><a id="__codelineno-22-87" name="__codelineno-22-87" href="#__codelineno-22-87"></a> <span class="ss">vmImageDir</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-22-88"><a id="__codelineno-22-88" name="__codelineno-22-88" href="#__codelineno-22-88"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>nullOr lib<span class="o">.</span>types<span class="o">.</span>path<span class="p">;</span> </span><span id="__span-22-89"><a id="__codelineno-22-89" name="__codelineno-22-89" href="#__codelineno-22-89"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">null</span><span class="p">;</span> </span><span id="__span-22-90"><a id="__codelineno-22-90" name="__codelineno-22-90" href="#__codelineno-22-90"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"/mnt/data/vmtest"</span><span class="p">;</span> </span><span id="__span-22-91"><a id="__codelineno-22-91" name="__codelineno-22-91" href="#__codelineno-22-91"></a><span class="c1"># … truncated — see source link above</span> </span></code></pre></div> </details> <h3 id="defaultnix_9"><code>default.nix</code><a class="headerlink" href="#defaultnix_9" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/nixos-update-checker/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/nixos-update-checker/default.nix</code></a></p> <ul> <li><strong>Enable option:</strong> NixOS update checker service</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>flakeDir</code>, <code>checkInterval</code>, <code>enableMotd</code>, <code>user</code>, <code>group</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-23-1"><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-1"></a> options<span class="o">.</span>services<span class="o">.</span><span class="ss">nixos-update-checker</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-23-2"><a id="__codelineno-23-2" name="__codelineno-23-2" href="#__codelineno-23-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"NixOS update checker service"</span><span class="p">;</span> </span><span id="__span-23-3"><a id="__codelineno-23-3" name="__codelineno-23-3" href="#__codelineno-23-3"></a> </span><span id="__span-23-4"><a id="__codelineno-23-4" name="__codelineno-23-4" href="#__codelineno-23-4"></a> <span class="ss">flakeDir</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-23-5"><a id="__codelineno-23-5" name="__codelineno-23-5" href="#__codelineno-23-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>path<span class="p">;</span> </span><span id="__span-23-6"><a id="__codelineno-23-6" name="__codelineno-23-6" href="#__codelineno-23-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"/home/olafkfreund/.config/nixos"</span><span class="p">;</span> </span><span id="__span-23-7"><a id="__codelineno-23-7" name="__codelineno-23-7" href="#__codelineno-23-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Path to the flake directory to check for updates"</span><span class="p">;</span> </span><span id="__span-23-8"><a id="__codelineno-23-8" name="__codelineno-23-8" href="#__codelineno-23-8"></a> <span class="p">};</span> </span><span id="__span-23-9"><a id="__codelineno-23-9" name="__codelineno-23-9" href="#__codelineno-23-9"></a> </span><span id="__span-23-10"><a id="__codelineno-23-10" name="__codelineno-23-10" href="#__codelineno-23-10"></a> <span class="ss">checkInterval</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-23-11"><a id="__codelineno-23-11" name="__codelineno-23-11" href="#__codelineno-23-11"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-23-12"><a id="__codelineno-23-12" name="__codelineno-23-12" href="#__codelineno-23-12"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"monthly"</span><span class="p">;</span> </span><span id="__span-23-13"><a id="__codelineno-23-13" name="__codelineno-23-13" href="#__codelineno-23-13"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"weekly"</span><span class="p">;</span> </span><span id="__span-23-14"><a id="__codelineno-23-14" name="__codelineno-23-14" href="#__codelineno-23-14"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-23-15"><a id="__codelineno-23-15" name="__codelineno-23-15" href="#__codelineno-23-15"></a><span class="s s-Multiline"> How often to check for updates. Uses systemd timer format.</span> </span><span id="__span-23-16"><a id="__codelineno-23-16" name="__codelineno-23-16" href="#__codelineno-23-16"></a><span class="s s-Multiline"> Common values: daily, weekly, monthly</span> </span><span id="__span-23-17"><a id="__codelineno-23-17" name="__codelineno-23-17" href="#__codelineno-23-17"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-23-18"><a id="__codelineno-23-18" name="__codelineno-23-18" href="#__codelineno-23-18"></a> <span class="p">};</span> </span><span id="__span-23-19"><a id="__codelineno-23-19" name="__codelineno-23-19" href="#__codelineno-23-19"></a> </span><span id="__span-23-20"><a id="__codelineno-23-20" name="__codelineno-23-20" href="#__codelineno-23-20"></a> <span class="ss">enableMotd</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-23-21"><a id="__codelineno-23-21" name="__codelineno-23-21" href="#__codelineno-23-21"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-23-22"><a id="__codelineno-23-22" name="__codelineno-23-22" href="#__codelineno-23-22"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-23-23"><a id="__codelineno-23-23" name="__codelineno-23-23" href="#__codelineno-23-23"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Enable MOTD (Message of the Day) notifications for available updates"</span><span class="p">;</span> </span><span id="__span-23-24"><a id="__codelineno-23-24" name="__codelineno-23-24" href="#__codelineno-23-24"></a> <span class="p">};</span> </span><span id="__span-23-25"><a id="__codelineno-23-25" name="__codelineno-23-25" href="#__codelineno-23-25"></a> </span><span id="__span-23-26"><a id="__codelineno-23-26" name="__codelineno-23-26" href="#__codelineno-23-26"></a> <span class="ss">user</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-23-27"><a id="__codelineno-23-27" name="__codelineno-23-27" href="#__codelineno-23-27"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-23-28"><a id="__codelineno-23-28" name="__codelineno-23-28" href="#__codelineno-23-28"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"nixos-update-checker"</span><span class="p">;</span> </span><span id="__span-23-29"><a id="__codelineno-23-29" name="__codelineno-23-29" href="#__codelineno-23-29"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"User to run the update checker service as"</span><span class="p">;</span> </span><span id="__span-23-30"><a id="__codelineno-23-30" name="__codelineno-23-30" href="#__codelineno-23-30"></a> <span class="p">};</span> </span><span id="__span-23-31"><a id="__codelineno-23-31" name="__codelineno-23-31" href="#__codelineno-23-31"></a> </span><span id="__span-23-32"><a id="__codelineno-23-32" name="__codelineno-23-32" href="#__codelineno-23-32"></a> <span class="ss">group</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-23-33"><a id="__codelineno-23-33" name="__codelineno-23-33" href="#__codelineno-23-33"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-23-34"><a id="__codelineno-23-34" name="__codelineno-23-34" href="#__codelineno-23-34"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"nixos-update-checker"</span><span class="p">;</span> </span><span id="__span-23-35"><a id="__codelineno-23-35" name="__codelineno-23-35" href="#__codelineno-23-35"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Group for the update checker service"</span><span class="p">;</span> </span><span id="__span-23-36"><a id="__codelineno-23-36" name="__codelineno-23-36" href="#__codelineno-23-36"></a> <span class="p">};</span> </span><span id="__span-23-37"><a id="__codelineno-23-37" name="__codelineno-23-37" href="#__codelineno-23-37"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="ntfynix"><code>ntfy.nix</code><a class="headerlink" href="#ntfynix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/ntfy.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/ntfy.nix</code></a></p> <p>ntfy-sh — self-hosted push notification server.</p> <p>Wraps the upstream nixpkgs services.ntfy-sh module with a feature flag and injects the agenix-decrypted environment file for auth configuration.</p> <p>Quick-start after first deploy: ssh p510 -- sudo ntfy user add --role=admin <your-username> ssh p510 -- sudo ntfy user change-pass <your-username></p> <h1 id="then-subscribe-on-mobiledesktop-via-httpsntfyfreundcloudorguk">Then subscribe on mobile/desktop via https://ntfy.freundcloud.org.uk<a class="headerlink" href="#then-subscribe-on-mobiledesktop-via-httpsntfyfreundcloudorguk" title="Anchor link to this section">¶</a></h1> <p>Sending a notification (example): curl -u user:pass https://ntfy.freundcloud.org.uk/alerts -d "Hello!"</p> <p>Secrets required (edit before deploy): agenix -e secrets/ntfy-env.age Content: NTFY_AUTH_DEFAULT_ACCESS=deny-all</p> <p>Reference: https://ntfy.sh/docs/config/</p> <ul> <li><strong>Enable option:</strong> ntfy-sh push notification server</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-24-1"><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">ntfy</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-24-2"><a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"ntfy-sh push notification server"</span><span class="p">;</span> </span><span id="__span-24-3"><a id="__codelineno-24-3" name="__codelineno-24-3" href="#__codelineno-24-3"></a> </span><span id="__span-24-4"><a id="__codelineno-24-4" name="__codelineno-24-4" href="#__codelineno-24-4"></a> <span class="ss">baseUrl</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-24-5"><a id="__codelineno-24-5" name="__codelineno-24-5" href="#__codelineno-24-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-24-6"><a id="__codelineno-24-6" name="__codelineno-24-6" href="#__codelineno-24-6"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"https://ntfy.freundcloud.org.uk"</span><span class="p">;</span> </span><span id="__span-24-7"><a id="__codelineno-24-7" name="__codelineno-24-7" href="#__codelineno-24-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Public-facing base URL (required for attachments and iOS push)."</span><span class="p">;</span> </span><span id="__span-24-8"><a id="__codelineno-24-8" name="__codelineno-24-8" href="#__codelineno-24-8"></a> <span class="p">};</span> </span><span id="__span-24-9"><a id="__codelineno-24-9" name="__codelineno-24-9" href="#__codelineno-24-9"></a> </span><span id="__span-24-10"><a id="__codelineno-24-10" name="__codelineno-24-10" href="#__codelineno-24-10"></a> <span class="ss">port</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-24-11"><a id="__codelineno-24-11" name="__codelineno-24-11" href="#__codelineno-24-11"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>port<span class="p">;</span> </span><span id="__span-24-12"><a id="__codelineno-24-12" name="__codelineno-24-12" href="#__codelineno-24-12"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">2586</span><span class="p">;</span> </span><span id="__span-24-13"><a id="__codelineno-24-13" name="__codelineno-24-13" href="#__codelineno-24-13"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Local port ntfy-sh listens on (loopback only)."</span><span class="p">;</span> </span><span id="__span-24-14"><a id="__codelineno-24-14" name="__codelineno-24-14" href="#__codelineno-24-14"></a> <span class="p">};</span> </span><span id="__span-24-15"><a id="__codelineno-24-15" name="__codelineno-24-15" href="#__codelineno-24-15"></a> </span><span id="__span-24-16"><a id="__codelineno-24-16" name="__codelineno-24-16" href="#__codelineno-24-16"></a> <span class="ss">attachmentSizeLimit</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-24-17"><a id="__codelineno-24-17" name="__codelineno-24-17" href="#__codelineno-24-17"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-24-18"><a id="__codelineno-24-18" name="__codelineno-24-18" href="#__codelineno-24-18"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"15M"</span><span class="p">;</span> </span><span id="__span-24-19"><a id="__codelineno-24-19" name="__codelineno-24-19" href="#__codelineno-24-19"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Maximum size of a single attachment."</span><span class="p">;</span> </span><span id="__span-24-20"><a id="__codelineno-24-20" name="__codelineno-24-20" href="#__codelineno-24-20"></a> <span class="p">};</span> </span><span id="__span-24-21"><a id="__codelineno-24-21" name="__codelineno-24-21" href="#__codelineno-24-21"></a> </span><span id="__span-24-22"><a id="__codelineno-24-22" name="__codelineno-24-22" href="#__codelineno-24-22"></a> <span class="ss">attachmentTotalLimit</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-24-23"><a id="__codelineno-24-23" name="__codelineno-24-23" href="#__codelineno-24-23"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-24-24"><a id="__codelineno-24-24" name="__codelineno-24-24" href="#__codelineno-24-24"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"2G"</span><span class="p">;</span> </span><span id="__span-24-25"><a id="__codelineno-24-25" name="__codelineno-24-25" href="#__codelineno-24-25"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Total attachment cache size on disk."</span><span class="p">;</span> </span><span id="__span-24-26"><a id="__codelineno-24-26" name="__codelineno-24-26" href="#__codelineno-24-26"></a> <span class="p">};</span> </span><span id="__span-24-27"><a id="__codelineno-24-27" name="__codelineno-24-27" href="#__codelineno-24-27"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="ollamanix"><code>ollama.nix</code><a class="headerlink" href="#ollamanix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/ollama.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/ollama.nix</code></a></p> <p>Ollama coding-model server (services.ollama wrapper).</p> <p>Designed for p620's RX 7900 XTX (gfx1100, 24GB VRAM, ROCm). The single GPU comfortably fits each default model individually (qwen3.8:27b ~18GB, gemma4:26b MoE ~18GB) but NOT both at once (~36GB > 24GB), so MAX_LOADED_MODELS=1 forces deterministic evict-then-load on switch.</p> <p>Default model choices (Aug 2026): Persistent: qwen3.8:27b — 18GB Q4, 256K context. DENSE 27B, so unlike a MoE nothing here is free: everything that spills out of VRAM is paid for at full width. It stays affordable because the architecture is hybrid — only 16 of its 64 layers run full attention, the other 48 use linear attention with a constant recurrent state, so the KV cache barely grows with context. That is what makes a large <code>contextLength</code> practical on a 24GB card. On-demand: gemma4:26b — MoE with ~3.8B active params, very fast (~80-100 tok/s) for raw code-gen bursts.</p> <p>Bind address is configurable via <code>host</code> (default 127.0.0.1). Set to "0.0.0.0" to expose on all interfaces — note Ollama has no built-in auth, so restrict access via firewall / tailnet ACLs when bound wider. OLLAMA_ORIGINS="*" is set so browser UIs from any origin can call the API; this only matters once the bind is non-loopback.</p> <p>See docs/plans/2026-05-22-ollama-p620-litellm-design.md for the full design and the dual-tier model + GPU-contention rationale.</p> <ul> <li><strong>Enable option:</strong> Ollama coding-model server (loopback only)</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-25-1"><a id="__codelineno-25-1" name="__codelineno-25-1" href="#__codelineno-25-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">ollama-server</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-25-2"><a id="__codelineno-25-2" name="__codelineno-25-2" href="#__codelineno-25-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"Ollama coding-model server (loopback only)"</span><span class="p">;</span> </span><span id="__span-25-3"><a id="__codelineno-25-3" name="__codelineno-25-3" href="#__codelineno-25-3"></a> </span><span id="__span-25-4"><a id="__codelineno-25-4" name="__codelineno-25-4" href="#__codelineno-25-4"></a> <span class="ss">package</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-25-5"><a id="__codelineno-25-5" name="__codelineno-25-5" href="#__codelineno-25-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>package<span class="p">;</span> </span><span id="__span-25-6"><a id="__codelineno-25-6" name="__codelineno-25-6" href="#__codelineno-25-6"></a> <span class="ss">default</span> <span class="o">=</span> pkgs<span class="o">.</span>ollama-rocm<span class="p">;</span> </span><span id="__span-25-7"><a id="__codelineno-25-7" name="__codelineno-25-7" href="#__codelineno-25-7"></a> <span class="ss">defaultText</span> <span class="o">=</span> lib<span class="o">.</span>literalExpression <span class="s2">"pkgs.ollama-rocm"</span><span class="p">;</span> </span><span id="__span-25-8"><a id="__codelineno-25-8" name="__codelineno-25-8" href="#__codelineno-25-8"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-25-9"><a id="__codelineno-25-9" name="__codelineno-25-9" href="#__codelineno-25-9"></a><span class="s s-Multiline"> Ollama package. Defaults to `pkgs.ollama-rocm` for AMD GPUs (RDNA3</span> </span><span id="__span-25-10"><a id="__codelineno-25-10" name="__codelineno-25-10" href="#__codelineno-25-10"></a><span class="s s-Multiline"> / gfx1100 on p620). Switch to `pkgs.ollama-cuda` for NVIDIA hosts.</span> </span><span id="__span-25-11"><a id="__codelineno-25-11" name="__codelineno-25-11" href="#__codelineno-25-11"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-25-12"><a id="__codelineno-25-12" name="__codelineno-25-12" href="#__codelineno-25-12"></a> <span class="p">};</span> </span><span id="__span-25-13"><a id="__codelineno-25-13" name="__codelineno-25-13" href="#__codelineno-25-13"></a> </span><span id="__span-25-14"><a id="__codelineno-25-14" name="__codelineno-25-14" href="#__codelineno-25-14"></a> <span class="ss">persistentModels</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-25-15"><a id="__codelineno-25-15" name="__codelineno-25-15" href="#__codelineno-25-15"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>listOf lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-25-16"><a id="__codelineno-25-16" name="__codelineno-25-16" href="#__codelineno-25-16"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"qwen3.8:27b"</span> <span class="p">];</span> </span><span id="__span-25-17"><a id="__codelineno-25-17" name="__codelineno-25-17" href="#__codelineno-25-17"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-25-18"><a id="__codelineno-25-18" name="__codelineno-25-18" href="#__codelineno-25-18"></a><span class="s s-Multiline"> Models pulled at activation and used as the default coding model.</span> </span><span id="__span-25-19"><a id="__codelineno-25-19" name="__codelineno-25-19" href="#__codelineno-25-19"></a><span class="s s-Multiline"> Listed first in the load priority. Default qwen3.8:27b (~18GB,</span> </span><span id="__span-25-20"><a id="__codelineno-25-20" name="__codelineno-25-20" href="#__codelineno-25-20"></a><span class="s s-Multiline"> 256K context, strong agentic tool calling).</span> </span><span id="__span-25-21"><a id="__codelineno-25-21" name="__codelineno-25-21" href="#__codelineno-25-21"></a> </span><span id="__span-25-22"><a id="__codelineno-25-22" name="__codelineno-25-22" href="#__codelineno-25-22"></a><span class="s s-Multiline"> Leave empty on hosts whose GPUs are shared with something else — a</span> </span><span id="__span-25-23"><a id="__codelineno-25-23" name="__codelineno-25-23" href="#__codelineno-25-23"></a><span class="s s-Multiline"> persistent model holds its VRAM until `keepAlive` expires.</span> </span><span id="__span-25-24"><a id="__codelineno-25-24" name="__codelineno-25-24" href="#__codelineno-25-24"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-25-25"><a id="__codelineno-25-25" name="__codelineno-25-25" href="#__codelineno-25-25"></a> <span class="p">};</span> </span><span id="__span-25-26"><a id="__codelineno-25-26" name="__codelineno-25-26" href="#__codelineno-25-26"></a> </span><span id="__span-25-27"><a id="__codelineno-25-27" name="__codelineno-25-27" href="#__codelineno-25-27"></a> <span class="ss">onDemandModels</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-25-28"><a id="__codelineno-25-28" name="__codelineno-25-28" href="#__codelineno-25-28"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>listOf lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-25-29"><a id="__codelineno-25-29" name="__codelineno-25-29" href="#__codelineno-25-29"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"gemma4:26b"</span> <span class="p">];</span> </span><span id="__span-25-30"><a id="__codelineno-25-30" name="__codelineno-25-30" href="#__codelineno-25-30"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-25-31"><a id="__codelineno-25-31" name="__codelineno-25-31" href="#__codelineno-25-31"></a><span class="s s-Multiline"> Alternate models pulled at activation but only loaded into VRAM on</span> </span><span id="__span-25-32"><a id="__codelineno-25-32" name="__codelineno-25-32" href="#__codelineno-25-32"></a><span class="s s-Multiline"> request. Auto-evicted after `keepAlive` of idle. Default gemma4:26b</span> </span><span id="__span-25-33"><a id="__codelineno-25-33" name="__codelineno-25-33" href="#__codelineno-25-33"></a><span class="s s-Multiline"> (~18GB MoE, ~3.8B active params, very fast raw code-gen).</span> </span><span id="__span-25-34"><a id="__codelineno-25-34" name="__codelineno-25-34" href="#__codelineno-25-34"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-25-35"><a id="__codelineno-25-35" name="__codelineno-25-35" href="#__codelineno-25-35"></a> <span class="p">};</span> </span><span id="__span-25-36"><a id="__codelineno-25-36" name="__codelineno-25-36" href="#__codelineno-25-36"></a> </span><span id="__span-25-37"><a id="__codelineno-25-37" name="__codelineno-25-37" href="#__codelineno-25-37"></a> <span class="ss">modelsDir</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-25-38"><a id="__codelineno-25-38" name="__codelineno-25-38" href="#__codelineno-25-38"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>nullOr lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-25-39"><a id="__codelineno-25-39" name="__codelineno-25-39" href="#__codelineno-25-39"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">null</span><span class="p">;</span> </span><span id="__span-25-40"><a id="__codelineno-25-40" name="__codelineno-25-40" href="#__codelineno-25-40"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"/mnt/data/ollama/models"</span><span class="p">;</span> </span><span id="__span-25-41"><a id="__codelineno-25-41" name="__codelineno-25-41" href="#__codelineno-25-41"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-25-42"><a id="__codelineno-25-42" name="__codelineno-25-42" href="#__codelineno-25-42"></a><span class="s s-Multiline"> Override for where Ollama stores model blobs. Set this to a path</span> </span><span id="__span-25-43"><a id="__codelineno-25-43" name="__codelineno-25-43" href="#__codelineno-25-43"></a><span class="s s-Multiline"> on a large filesystem (~100GB+ recommended) — each Q4 model is</span> </span><span id="__span-25-44"><a id="__codelineno-25-44" name="__codelineno-25-44" href="#__codelineno-25-44"></a><span class="s s-Multiline"> ~17-20GB and multiple are typically pulled. When null, NixOS uses</span> </span><span id="__span-25-45"><a id="__codelineno-25-45" name="__codelineno-25-45" href="#__codelineno-25-45"></a><span class="s s-Multiline"> the default under /var/lib/ollama.</span> </span><span id="__span-25-46"><a id="__codelineno-25-46" name="__codelineno-25-46" href="#__codelineno-25-46"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-25-47"><a id="__codelineno-25-47" name="__codelineno-25-47" href="#__codelineno-25-47"></a> <span class="p">};</span> </span><span id="__span-25-48"><a id="__codelineno-25-48" name="__codelineno-25-48" href="#__codelineno-25-48"></a> </span><span id="__span-25-49"><a id="__codelineno-25-49" name="__codelineno-25-49" href="#__codelineno-25-49"></a> <span class="ss">keepAlive</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-25-50"><a id="__codelineno-25-50" name="__codelineno-25-50" href="#__codelineno-25-50"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-25-51"><a id="__codelineno-25-51" name="__codelineno-25-51" href="#__codelineno-25-51"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"5m"</span><span class="p">;</span> </span><span id="__span-25-52"><a id="__codelineno-25-52" name="__codelineno-25-52" href="#__codelineno-25-52"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-25-53"><a id="__codelineno-25-53" name="__codelineno-25-53" href="#__codelineno-25-53"></a><span class="s s-Multiline"> Auto-unload models after this idle time. On a workstation host,</span> </span><span id="__span-25-54"><a id="__codelineno-25-54" name="__codelineno-25-54" href="#__codelineno-25-54"></a><span class="s s-Multiline"> keep this low so the GPU is released for desktop work (Blender,</span> </span><span id="__span-25-55"><a id="__codelineno-25-55" name="__codelineno-25-55" href="#__codelineno-25-55"></a><span class="s s-Multiline"> games, video editing) when not actively coding. Use "-1" for</span> </span><span id="__span-25-56"><a id="__codelineno-25-56" name="__codelineno-25-56" href="#__codelineno-25-56"></a><span class="s s-Multiline"> always-loaded if Ollama is the only GPU consumer.</span> </span><span id="__span-25-57"><a id="__codelineno-25-57" name="__codelineno-25-57" href="#__codelineno-25-57"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-25-58"><a id="__codelineno-25-58" name="__codelineno-25-58" href="#__codelineno-25-58"></a> <span class="p">};</span> </span><span id="__span-25-59"><a id="__codelineno-25-59" name="__codelineno-25-59" href="#__codelineno-25-59"></a> </span><span id="__span-25-60"><a id="__codelineno-25-60" name="__codelineno-25-60" href="#__codelineno-25-60"></a> <span class="ss">contextLength</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-25-61"><a id="__codelineno-25-61" name="__codelineno-25-61" href="#__codelineno-25-61"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>nullOr lib<span class="o">.</span>types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-25-62"><a id="__codelineno-25-62" name="__codelineno-25-62" href="#__codelineno-25-62"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">null</span><span class="p">;</span> </span><span id="__span-25-63"><a id="__codelineno-25-63" name="__codelineno-25-63" href="#__codelineno-25-63"></a> <span class="ss">example</span> <span class="o">=</span> <span class="mi">32768</span><span class="p">;</span> </span><span id="__span-25-64"><a id="__codelineno-25-64" name="__codelineno-25-64" href="#__codelineno-25-64"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-25-65"><a id="__codelineno-25-65" name="__codelineno-25-65" href="#__codelineno-25-65"></a><span class="s s-Multiline"> Value for OLLAMA_CONTEXT_LENGTH — the context window the server uses</span> </span><span id="__span-25-66"><a id="__codelineno-25-66" name="__codelineno-25-66" href="#__codelineno-25-66"></a><span class="s s-Multiline"> for requests that do not set `num_ctx` themselves.</span> </span><span id="__span-25-67"><a id="__codelineno-25-67" name="__codelineno-25-67" href="#__codelineno-25-67"></a> </span><span id="__span-25-68"><a id="__codelineno-25-68" name="__codelineno-25-68" href="#__codelineno-25-68"></a><span class="s s-Multiline"> Ollama defaults to 4096 no matter what the model supports, so a</span> </span><span id="__span-25-69"><a id="__codelineno-25-69" name="__codelineno-25-69" href="#__codelineno-25-69"></a><span class="s s-Multiline"> 256K-context model like qwen3.8:27b is capped at 4096 unless this is</span> </span><span id="__span-25-70"><a id="__codelineno-25-70" name="__codelineno-25-70" href="#__codelineno-25-70"></a><span class="s s-Multiline"> raised. Cost is VRAM for the KV cache on top of the weights, so the</span> </span><span id="__span-25-71"><a id="__codelineno-25-71" name="__codelineno-25-71" href="#__codelineno-25-71"></a><span class="s s-Multiline"> ceiling is the card, not the model — raise it only as far as the</span> </span><span id="__span-25-72"><a id="__codelineno-25-72" name="__codelineno-25-72" href="#__codelineno-25-72"></a><span class="s s-Multiline"> headroom above the resident model allows.</span> </span><span id="__span-25-73"><a id="__codelineno-25-73" name="__codelineno-25-73" href="#__codelineno-25-73"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-25-74"><a id="__codelineno-25-74" name="__codelineno-25-74" href="#__codelineno-25-74"></a> <span class="p">};</span> </span><span id="__span-25-75"><a id="__codelineno-25-75" name="__codelineno-25-75" href="#__codelineno-25-75"></a> </span><span id="__span-25-76"><a id="__codelineno-25-76" name="__codelineno-25-76" href="#__codelineno-25-76"></a> <span class="ss">rocrVisibleDevices</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-25-77"><a id="__codelineno-25-77" name="__codelineno-25-77" href="#__codelineno-25-77"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-25-78"><a id="__codelineno-25-78" name="__codelineno-25-78" href="#__codelineno-25-78"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"0"</span><span class="p">;</span> </span><span id="__span-25-79"><a id="__codelineno-25-79" name="__codelineno-25-79" href="#__codelineno-25-79"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-25-80"><a id="__codelineno-25-80" name="__codelineno-25-80" href="#__codelineno-25-80"></a><span class="s s-Multiline"> Comma-separated indices of ROCm-visible devices. Defaults to the</span> </span><span id="__span-25-81"><a id="__codelineno-25-81" name="__codelineno-25-81" href="#__codelineno-25-81"></a><span class="s s-Multiline"> first discrete GPU only; prevents accidental fallthrough to an</span> </span><span id="__span-25-82"><a id="__codelineno-25-82" name="__codelineno-25-82" href="#__codelineno-25-82"></a><span class="s s-Multiline"> integrated GPU on hybrid-graphics systems.</span> </span><span id="__span-25-83"><a id="__codelineno-25-83" name="__codelineno-25-83" href="#__codelineno-25-83"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-25-84"><a id="__codelineno-25-84" name="__codelineno-25-84" href="#__codelineno-25-84"></a> <span class="p">};</span> </span><span id="__span-25-85"><a id="__codelineno-25-85" name="__codelineno-25-85" href="#__codelineno-25-85"></a> </span><span id="__span-25-86"><a id="__codelineno-25-86" name="__codelineno-25-86" href="#__codelineno-25-86"></a> <span class="ss">host</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-25-87"><a id="__codelineno-25-87" name="__codelineno-25-87" href="#__codelineno-25-87"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-25-88"><a id="__codelineno-25-88" name="__codelineno-25-88" href="#__codelineno-25-88"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"127.0.0.1"</span><span class="p">;</span> </span><span id="__span-25-89"><a id="__codelineno-25-89" name="__codelineno-25-89" href="#__codelineno-25-89"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"0.0.0.0"</span><span class="p">;</span> </span><span id="__span-25-90"><a id="__codelineno-25-90" name="__codelineno-25-90" href="#__codelineno-25-90"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-25-91"><a id="__codelineno-25-91" name="__codelineno-25-91" href="#__codelineno-25-91"></a><span class="s s-Multiline"># … truncated — see source link above</span> </span></code></pre></div> </details> <h3 id="opensshnix"><code>openssh.nix</code><a class="headerlink" href="#opensshnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/openssh/openssh.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/openssh/openssh.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="defaultnix_10"><code>default.nix</code><a class="headerlink" href="#defaultnix_10" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/plex-auto-languages/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/plex-auto-languages/default.nix</code></a></p> <p>Plex-Auto-Languages (PAL) — per-show audio + subtitle track preference memorization for Plex.</p> <p>Watches Plex for play events and scan events (via the Plex websocket API, no Plex Pass needed for that path — only the optional webhook integration requires Pass). When a user plays an episode, PAL records the audio/subtitle track choice; future episodes of the same series automatically get those tracks selected on play.</p> <p>Phase 1: tracking mode, all libraries with shows, no filter labels.</p> <p>Pattern mirrors modules/services/kometa/default.nix exactly (oci- containers + envsubst-rendered config + agenix env file). The lessons from the Kometa journey are baked in: no fictional systemd deps, real env-var substitution via envsubst-not-Kometa-magic, repo template as source of truth + rendered file under /var/lib for container mount.</p> <ul> <li><strong>Enable option:</strong> Plex-Auto-Languages</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-26-1"><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">plex-auto-languages</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-26-2"><a id="__codelineno-26-2" name="__codelineno-26-2" href="#__codelineno-26-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"Plex-Auto-Languages"</span><span class="p">;</span> </span><span id="__span-26-3"><a id="__codelineno-26-3" name="__codelineno-26-3" href="#__codelineno-26-3"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="plex-mcpnix"><code>plex-mcp.nix</code><a class="headerlink" href="#plex-mcpnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/plex-mcp.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/plex-mcp.nix</code></a></p> <p>Plex MCP server — niavasha/plex-mcp-server run as an SSE daemon.</p> <p>Exposes the local Plex Media Server (and optionally Sonarr/Radarr) to AI clients over the Model Context Protocol. Clients connect to: http://<host>:<port>/sse (SSE transport)</p> <p>plex-mcp-server's native --transport http uses a single shared session for the process lifetime, which wedges when a client reconnects. We instead run it in stdio mode behind mcp-proxy, which spawns a fresh stdio child per session — robust across reconnects, and consistent with features.arr-suite-mcp.</p> <p>Network: binds 0.0.0.0:<port> but the firewall opens it ONLY on tailscale0 (+ optional LAN interface) — never globally reachable. Loopback always works.</p> <p>Secret: the Plex auth token is loaded at runtime from agenix via LoadCredential (never in the Nix store), exported into the wrapper, and passed to the stdio child by mcp-proxy --pass-environment. PLEX_URL is non-secret and set as a plain unit Environment value.</p> <ul> <li><strong>Enable option:</strong> Plex MCP server (HTTP transport daemon)</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-27-1"><a id="__codelineno-27-1" name="__codelineno-27-1" href="#__codelineno-27-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">plex-mcp</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-27-2"><a id="__codelineno-27-2" name="__codelineno-27-2" href="#__codelineno-27-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"Plex MCP server (HTTP transport daemon)"</span><span class="p">;</span> </span><span id="__span-27-3"><a id="__codelineno-27-3" name="__codelineno-27-3" href="#__codelineno-27-3"></a> </span><span id="__span-27-4"><a id="__codelineno-27-4" name="__codelineno-27-4" href="#__codelineno-27-4"></a> <span class="ss">port</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-27-5"><a id="__codelineno-27-5" name="__codelineno-27-5" href="#__codelineno-27-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>port<span class="p">;</span> </span><span id="__span-27-6"><a id="__codelineno-27-6" name="__codelineno-27-6" href="#__codelineno-27-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">3010</span><span class="p">;</span> </span><span id="__span-27-7"><a id="__codelineno-27-7" name="__codelineno-27-7" href="#__codelineno-27-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Port the MCP server binds to (loopback always; tailnet + LAN via firewall)."</span><span class="p">;</span> </span><span id="__span-27-8"><a id="__codelineno-27-8" name="__codelineno-27-8" href="#__codelineno-27-8"></a> <span class="p">};</span> </span><span id="__span-27-9"><a id="__codelineno-27-9" name="__codelineno-27-9" href="#__codelineno-27-9"></a> </span><span id="__span-27-10"><a id="__codelineno-27-10" name="__codelineno-27-10" href="#__codelineno-27-10"></a> <span class="ss">plexUrl</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-27-11"><a id="__codelineno-27-11" name="__codelineno-27-11" href="#__codelineno-27-11"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-27-12"><a id="__codelineno-27-12" name="__codelineno-27-12" href="#__codelineno-27-12"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"http://127.0.0.1:32400"</span><span class="p">;</span> </span><span id="__span-27-13"><a id="__codelineno-27-13" name="__codelineno-27-13" href="#__codelineno-27-13"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"URL of the Plex Media Server the MCP server talks to."</span><span class="p">;</span> </span><span id="__span-27-14"><a id="__codelineno-27-14" name="__codelineno-27-14" href="#__codelineno-27-14"></a> <span class="p">};</span> </span><span id="__span-27-15"><a id="__codelineno-27-15" name="__codelineno-27-15" href="#__codelineno-27-15"></a> </span><span id="__span-27-16"><a id="__codelineno-27-16" name="__codelineno-27-16" href="#__codelineno-27-16"></a> <span class="ss">tokenFile</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-27-17"><a id="__codelineno-27-17" name="__codelineno-27-17" href="#__codelineno-27-17"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>path<span class="p">;</span> </span><span id="__span-27-18"><a id="__codelineno-27-18" name="__codelineno-27-18" href="#__codelineno-27-18"></a> <span class="ss">default</span> <span class="o">=</span> config<span class="o">.</span>age<span class="o">.</span>secrets<span class="o">.</span><span class="s2">"plex-token"</span><span class="o">.</span>path<span class="p">;</span> </span><span id="__span-27-19"><a id="__codelineno-27-19" name="__codelineno-27-19" href="#__codelineno-27-19"></a> <span class="ss">defaultText</span> <span class="o">=</span> lib<span class="o">.</span>literalExpression <span class="s s-Multiline">''config.age.secrets."plex-token".path''</span><span class="p">;</span> </span><span id="__span-27-20"><a id="__codelineno-27-20" name="__codelineno-27-20" href="#__codelineno-27-20"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-27-21"><a id="__codelineno-27-21" name="__codelineno-27-21" href="#__codelineno-27-21"></a><span class="s s-Multiline"> Path to a file containing ONLY the Plex auth token. Loaded into the</span> </span><span id="__span-27-22"><a id="__codelineno-27-22" name="__codelineno-27-22" href="#__codelineno-27-22"></a><span class="s s-Multiline"> unit at runtime via LoadCredential. Defaults to the agenix secret</span> </span><span id="__span-27-23"><a id="__codelineno-27-23" name="__codelineno-27-23" href="#__codelineno-27-23"></a><span class="s s-Multiline"> declared by this module.</span> </span><span id="__span-27-24"><a id="__codelineno-27-24" name="__codelineno-27-24" href="#__codelineno-27-24"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-27-25"><a id="__codelineno-27-25" name="__codelineno-27-25" href="#__codelineno-27-25"></a> <span class="p">};</span> </span><span id="__span-27-26"><a id="__codelineno-27-26" name="__codelineno-27-26" href="#__codelineno-27-26"></a> </span><span id="__span-27-27"><a id="__codelineno-27-27" name="__codelineno-27-27" href="#__codelineno-27-27"></a> <span class="ss">enableMutativeOps</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-27-28"><a id="__codelineno-27-28" name="__codelineno-27-28" href="#__codelineno-27-28"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-27-29"><a id="__codelineno-27-29" name="__codelineno-27-29" href="#__codelineno-27-29"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-27-30"><a id="__codelineno-27-30" name="__codelineno-27-30" href="#__codelineno-27-30"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-27-31"><a id="__codelineno-27-31" name="__codelineno-27-31" href="#__codelineno-27-31"></a><span class="s s-Multiline"> Enable Plex write/mutative tools (PLEX_ENABLE_MUTATIVE_OPS). Disabled</span> </span><span id="__span-27-32"><a id="__codelineno-27-32" name="__codelineno-27-32" href="#__codelineno-27-32"></a><span class="s s-Multiline"> by default for safety — read-only tools only.</span> </span><span id="__span-27-33"><a id="__codelineno-27-33" name="__codelineno-27-33" href="#__codelineno-27-33"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-27-34"><a id="__codelineno-27-34" name="__codelineno-27-34" href="#__codelineno-27-34"></a> <span class="p">};</span> </span><span id="__span-27-35"><a id="__codelineno-27-35" name="__codelineno-27-35" href="#__codelineno-27-35"></a> </span><span id="__span-27-36"><a id="__codelineno-27-36" name="__codelineno-27-36" href="#__codelineno-27-36"></a> <span class="ss">listenLanInterface</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-27-37"><a id="__codelineno-27-37" name="__codelineno-27-37" href="#__codelineno-27-37"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>nullOr lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-27-38"><a id="__codelineno-27-38" name="__codelineno-27-38" href="#__codelineno-27-38"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">null</span><span class="p">;</span> </span><span id="__span-27-39"><a id="__codelineno-27-39" name="__codelineno-27-39" href="#__codelineno-27-39"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"eno1"</span><span class="p">;</span> </span><span id="__span-27-40"><a id="__codelineno-27-40" name="__codelineno-27-40" href="#__codelineno-27-40"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-27-41"><a id="__codelineno-27-41" name="__codelineno-27-41" href="#__codelineno-27-41"></a><span class="s s-Multiline"> LAN interface to open the port on, in addition to tailscale0 and</span> </span><span id="__span-27-42"><a id="__codelineno-27-42" name="__codelineno-27-42" href="#__codelineno-27-42"></a><span class="s s-Multiline"> loopback. Set to the host's actual LAN NIC (confirm with `ip link`).</span> </span><span id="__span-27-43"><a id="__codelineno-27-43" name="__codelineno-27-43" href="#__codelineno-27-43"></a><span class="s s-Multiline"> null exposes the server only via Tailscale.</span> </span><span id="__span-27-44"><a id="__codelineno-27-44" name="__codelineno-27-44" href="#__codelineno-27-44"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-27-45"><a id="__codelineno-27-45" name="__codelineno-27-45" href="#__codelineno-27-45"></a> <span class="p">};</span> </span><span id="__span-27-46"><a id="__codelineno-27-46" name="__codelineno-27-46" href="#__codelineno-27-46"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="defaultnix_11"><code>default.nix</code><a class="headerlink" href="#defaultnix_11" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/power/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/power/default.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="defaultnix_12"><code>default.nix</code><a class="headerlink" href="#defaultnix_12" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/print/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/print/default.nix</code></a></p> <p><strong>Options:</strong> <code>enable</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-28-1"><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a> options<span class="o">.</span>services<span class="o">.</span><span class="ss">print</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-28-2"><a id="__codelineno-28-2" name="__codelineno-28-2" href="#__codelineno-28-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="p">{</span> </span><span id="__span-28-3"><a id="__codelineno-28-3" name="__codelineno-28-3" href="#__codelineno-28-3"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-28-4"><a id="__codelineno-28-4" name="__codelineno-28-4" href="#__codelineno-28-4"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Enable the HP print service"</span><span class="p">;</span> </span><span id="__span-28-5"><a id="__codelineno-28-5" name="__codelineno-28-5" href="#__codelineno-28-5"></a> <span class="p">};</span> </span><span id="__span-28-6"><a id="__codelineno-28-6" name="__codelineno-28-6" href="#__codelineno-28-6"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="rescreenshot-mcpnix"><code>rescreenshot-mcp.nix</code><a class="headerlink" href="#rescreenshot-mcpnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/rescreenshot-mcp.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/rescreenshot-mcp.nix</code></a></p> <ul> <li><strong>Enable option:</strong> rescreenshot-mcp MCP server for Claude Desktop</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>package</code>, <code>user</code>, <code>logLevel</code>, <code>autoConfigureClaudeDesktop</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-29-1"><a id="__codelineno-29-1" name="__codelineno-29-1" href="#__codelineno-29-1"></a> options<span class="o">.</span>services<span class="o">.</span><span class="ss">rescreenshot-mcp</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-29-2"><a id="__codelineno-29-2" name="__codelineno-29-2" href="#__codelineno-29-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"rescreenshot-mcp MCP server for Claude Desktop"</span><span class="p">;</span> </span><span id="__span-29-3"><a id="__codelineno-29-3" name="__codelineno-29-3" href="#__codelineno-29-3"></a> </span><span id="__span-29-4"><a id="__codelineno-29-4" name="__codelineno-29-4" href="#__codelineno-29-4"></a> <span class="ss">package</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-29-5"><a id="__codelineno-29-5" name="__codelineno-29-5" href="#__codelineno-29-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>package<span class="p">;</span> </span><span id="__span-29-6"><a id="__codelineno-29-6" name="__codelineno-29-6" href="#__codelineno-29-6"></a> <span class="ss">default</span> <span class="o">=</span> pkgs<span class="o">.</span>callPackage <span class="l">../../pkgs/rescreenshot-mcp</span> <span class="p">{</span> <span class="p">};</span> </span><span id="__span-29-7"><a id="__codelineno-29-7" name="__codelineno-29-7" href="#__codelineno-29-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"The rescreenshot-mcp package to use"</span><span class="p">;</span> </span><span id="__span-29-8"><a id="__codelineno-29-8" name="__codelineno-29-8" href="#__codelineno-29-8"></a> <span class="p">};</span> </span><span id="__span-29-9"><a id="__codelineno-29-9" name="__codelineno-29-9" href="#__codelineno-29-9"></a> </span><span id="__span-29-10"><a id="__codelineno-29-10" name="__codelineno-29-10" href="#__codelineno-29-10"></a> <span class="ss">user</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-29-11"><a id="__codelineno-29-11" name="__codelineno-29-11" href="#__codelineno-29-11"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-29-12"><a id="__codelineno-29-12" name="__codelineno-29-12" href="#__codelineno-29-12"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"olafkfreund"</span><span class="p">;</span> </span><span id="__span-29-13"><a id="__codelineno-29-13" name="__codelineno-29-13" href="#__codelineno-29-13"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"User to configure Claude Desktop for"</span><span class="p">;</span> </span><span id="__span-29-14"><a id="__codelineno-29-14" name="__codelineno-29-14" href="#__codelineno-29-14"></a> <span class="p">};</span> </span><span id="__span-29-15"><a id="__codelineno-29-15" name="__codelineno-29-15" href="#__codelineno-29-15"></a> </span><span id="__span-29-16"><a id="__codelineno-29-16" name="__codelineno-29-16" href="#__codelineno-29-16"></a> <span class="ss">logLevel</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-29-17"><a id="__codelineno-29-17" name="__codelineno-29-17" href="#__codelineno-29-17"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-29-18"><a id="__codelineno-29-18" name="__codelineno-29-18" href="#__codelineno-29-18"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"info"</span><span class="p">;</span> </span><span id="__span-29-19"><a id="__codelineno-29-19" name="__codelineno-29-19" href="#__codelineno-29-19"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"debug"</span><span class="p">;</span> </span><span id="__span-29-20"><a id="__codelineno-29-20" name="__codelineno-29-20" href="#__codelineno-29-20"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Log level for rescreenshot-mcp (trace, debug, info, warn, error)"</span><span class="p">;</span> </span><span id="__span-29-21"><a id="__codelineno-29-21" name="__codelineno-29-21" href="#__codelineno-29-21"></a> <span class="p">};</span> </span><span id="__span-29-22"><a id="__codelineno-29-22" name="__codelineno-29-22" href="#__codelineno-29-22"></a> </span><span id="__span-29-23"><a id="__codelineno-29-23" name="__codelineno-29-23" href="#__codelineno-29-23"></a> <span class="ss">autoConfigureClaudeDesktop</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-29-24"><a id="__codelineno-29-24" name="__codelineno-29-24" href="#__codelineno-29-24"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-29-25"><a id="__codelineno-29-25" name="__codelineno-29-25" href="#__codelineno-29-25"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-29-26"><a id="__codelineno-29-26" name="__codelineno-29-26" href="#__codelineno-29-26"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Automatically configure Claude Desktop with rescreenshot-mcp"</span><span class="p">;</span> </span><span id="__span-29-27"><a id="__codelineno-29-27" name="__codelineno-29-27" href="#__codelineno-29-27"></a> <span class="p">};</span> </span><span id="__span-29-28"><a id="__codelineno-29-28" name="__codelineno-29-28" href="#__codelineno-29-28"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="sqlite-backupnix"><code>sqlite-backup.nix</code><a class="headerlink" href="#sqlite-backupnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/sqlite-backup.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/sqlite-backup.nix</code></a></p> <ul> <li><strong>Enable option:</strong> Periodic sqlite backup of application databases</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>databases</code>, <code>readPaths</code>, <code>optional</code>, <code>readGroups</code>, <code>destination</code>, <code>keep</code>, <code>dates</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-30-1"><a id="__codelineno-30-1" name="__codelineno-30-1" href="#__codelineno-30-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">sqlite-backup</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-30-2"><a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"Periodic sqlite backup of application databases"</span><span class="p">;</span> </span><span id="__span-30-3"><a id="__codelineno-30-3" name="__codelineno-30-3" href="#__codelineno-30-3"></a> </span><span id="__span-30-4"><a id="__codelineno-30-4" name="__codelineno-30-4" href="#__codelineno-30-4"></a> <span class="ss">databases</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-30-5"><a id="__codelineno-30-5" name="__codelineno-30-5" href="#__codelineno-30-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>listOf types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-30-6"><a id="__codelineno-30-6" name="__codelineno-30-6" href="#__codelineno-30-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">[</span> </span><span id="__span-30-7"><a id="__codelineno-30-7" name="__codelineno-30-7" href="#__codelineno-30-7"></a> <span class="s2">"</span><span class="si">${</span>plexDbDir<span class="si">}</span><span class="s2">/com.plexapp.plugins.library.db"</span> </span><span id="__span-30-8"><a id="__codelineno-30-8" name="__codelineno-30-8" href="#__codelineno-30-8"></a> <span class="s2">"</span><span class="si">${</span>plexDbDir<span class="si">}</span><span class="s2">/com.plexapp.plugins.library.blobs.db"</span> </span><span id="__span-30-9"><a id="__codelineno-30-9" name="__codelineno-30-9" href="#__codelineno-30-9"></a> <span class="p">];</span> </span><span id="__span-30-10"><a id="__codelineno-30-10" name="__codelineno-30-10" href="#__codelineno-30-10"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-30-11"><a id="__codelineno-30-11" name="__codelineno-30-11" href="#__codelineno-30-11"></a><span class="s s-Multiline"> Absolute paths of the SQLite databases to snapshot. A missing file is</span> </span><span id="__span-30-12"><a id="__codelineno-30-12" name="__codelineno-30-12" href="#__codelineno-30-12"></a><span class="s s-Multiline"> skipped with a warning rather than failing the run, so a service that</span> </span><span id="__span-30-13"><a id="__codelineno-30-13" name="__codelineno-30-13" href="#__codelineno-30-13"></a><span class="s s-Multiline"> has not started yet does not break the others.</span> </span><span id="__span-30-14"><a id="__codelineno-30-14" name="__codelineno-30-14" href="#__codelineno-30-14"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-30-15"><a id="__codelineno-30-15" name="__codelineno-30-15" href="#__codelineno-30-15"></a> <span class="p">};</span> </span><span id="__span-30-16"><a id="__codelineno-30-16" name="__codelineno-30-16" href="#__codelineno-30-16"></a> </span><span id="__span-30-17"><a id="__codelineno-30-17" name="__codelineno-30-17" href="#__codelineno-30-17"></a> <span class="ss">readPaths</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-30-18"><a id="__codelineno-30-18" name="__codelineno-30-18" href="#__codelineno-30-18"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>listOf types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-30-19"><a id="__codelineno-30-19" name="__codelineno-30-19" href="#__codelineno-30-19"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">[</span> config<span class="o">.</span>services<span class="o">.</span>plex<span class="o">.</span>dataDir <span class="p">];</span> </span><span id="__span-30-20"><a id="__codelineno-30-20" name="__codelineno-30-20" href="#__codelineno-30-20"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-30-21"><a id="__codelineno-30-21" name="__codelineno-30-21" href="#__codelineno-30-21"></a><span class="s s-Multiline"> Directories the unit may read. ProtectSystem=strict hides everything</span> </span><span id="__span-30-22"><a id="__codelineno-30-22" name="__codelineno-30-22" href="#__codelineno-30-22"></a><span class="s s-Multiline"> else, so any path holding a listed database must appear here.</span> </span><span id="__span-30-23"><a id="__codelineno-30-23" name="__codelineno-30-23" href="#__codelineno-30-23"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-30-24"><a id="__codelineno-30-24" name="__codelineno-30-24" href="#__codelineno-30-24"></a> <span class="p">};</span> </span><span id="__span-30-25"><a id="__codelineno-30-25" name="__codelineno-30-25" href="#__codelineno-30-25"></a> </span><span id="__span-30-26"><a id="__codelineno-30-26" name="__codelineno-30-26" href="#__codelineno-30-26"></a> <span class="ss">optional</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-30-27"><a id="__codelineno-30-27" name="__codelineno-30-27" href="#__codelineno-30-27"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>listOf types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-30-28"><a id="__codelineno-30-28" name="__codelineno-30-28" href="#__codelineno-30-28"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">[</span> <span class="p">];</span> </span><span id="__span-30-29"><a id="__codelineno-30-29" name="__codelineno-30-29" href="#__codelineno-30-29"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-30-30"><a id="__codelineno-30-30" name="__codelineno-30-30" href="#__codelineno-30-30"></a><span class="s s-Multiline"> Databases whose failure must not fail the run. For a source sitting on</span> </span><span id="__span-30-31"><a id="__codelineno-30-31" name="__codelineno-30-31" href="#__codelineno-30-31"></a><span class="s s-Multiline"> known-bad media: the read is still attempted every night — a pending</span> </span><span id="__span-30-32"><a id="__codelineno-30-32" name="__codelineno-30-32" href="#__codelineno-30-32"></a><span class="s s-Multiline"> sector sometimes becomes readable again, and a reallocation on write</span> </span><span id="__span-30-33"><a id="__codelineno-30-33" name="__codelineno-30-33" href="#__codelineno-30-33"></a><span class="s s-Multiline"> can retire it — but an unrecoverable error is logged as a warning</span> </span><span id="__span-30-34"><a id="__codelineno-30-34" name="__codelineno-30-34" href="#__codelineno-30-34"></a><span class="s s-Multiline"> rather than turning the unit red. Reserve this for data that can be</span> </span><span id="__span-30-35"><a id="__codelineno-30-35" name="__codelineno-30-35" href="#__codelineno-30-35"></a><span class="s s-Multiline"> rebuilt; a database listed here is one nobody is watching.</span> </span><span id="__span-30-36"><a id="__codelineno-30-36" name="__codelineno-30-36" href="#__codelineno-30-36"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-30-37"><a id="__codelineno-30-37" name="__codelineno-30-37" href="#__codelineno-30-37"></a> <span class="p">};</span> </span><span id="__span-30-38"><a id="__codelineno-30-38" name="__codelineno-30-38" href="#__codelineno-30-38"></a> </span><span id="__span-30-39"><a id="__codelineno-30-39" name="__codelineno-30-39" href="#__codelineno-30-39"></a> <span class="ss">readGroups</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-30-40"><a id="__codelineno-30-40" name="__codelineno-30-40" href="#__codelineno-30-40"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>listOf types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-30-41"><a id="__codelineno-30-41" name="__codelineno-30-41" href="#__codelineno-30-41"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">[</span> config<span class="o">.</span>services<span class="o">.</span>plex<span class="o">.</span>group <span class="p">];</span> </span><span id="__span-30-42"><a id="__codelineno-30-42" name="__codelineno-30-42" href="#__codelineno-30-42"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-30-43"><a id="__codelineno-30-43" name="__codelineno-30-43" href="#__codelineno-30-43"></a><span class="s s-Multiline"> Groups the unit joins. Every directory on the path to a listed database</span> </span><span id="__span-30-44"><a id="__codelineno-30-44" name="__codelineno-30-44" href="#__codelineno-30-44"></a><span class="s s-Multiline"> must be traversable by one of them: a DynamicUser belongs to no group</span> </span><span id="__span-30-45"><a id="__codelineno-30-45" name="__codelineno-30-45" href="#__codelineno-30-45"></a><span class="s s-Multiline"> by default, and a 0700 service data directory turns a perfectly</span> </span><span id="__span-30-46"><a id="__codelineno-30-46" name="__codelineno-30-46" href="#__codelineno-30-46"></a><span class="s s-Multiline"> readable database into "not found" from inside the namespace — the</span> </span><span id="__span-30-47"><a id="__codelineno-30-47" name="__codelineno-30-47" href="#__codelineno-30-47"></a><span class="s s-Multiline"> stat fails on the directory, not the file.</span> </span><span id="__span-30-48"><a id="__codelineno-30-48" name="__codelineno-30-48" href="#__codelineno-30-48"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-30-49"><a id="__codelineno-30-49" name="__codelineno-30-49" href="#__codelineno-30-49"></a> <span class="p">};</span> </span><span id="__span-30-50"><a id="__codelineno-30-50" name="__codelineno-30-50" href="#__codelineno-30-50"></a> </span><span id="__span-30-51"><a id="__codelineno-30-51" name="__codelineno-30-51" href="#__codelineno-30-51"></a> <span class="ss">destination</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-30-52"><a id="__codelineno-30-52" name="__codelineno-30-52" href="#__codelineno-30-52"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-30-53"><a id="__codelineno-30-53" name="__codelineno-30-53" href="#__codelineno-30-53"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"/mnt/img_pool/backups/sqlite"</span><span class="p">;</span> </span><span id="__span-30-54"><a id="__codelineno-30-54" name="__codelineno-30-54" href="#__codelineno-30-54"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-30-55"><a id="__codelineno-30-55" name="__codelineno-30-55" href="#__codelineno-30-55"></a><span class="s s-Multiline"> Where snapshots are written. MUST be a different physical disk from</span> </span><span id="__span-30-56"><a id="__codelineno-30-56" name="__codelineno-30-56" href="#__codelineno-30-56"></a><span class="s s-Multiline"> services.plex.dataDir — the entire point is surviving that disk.</span> </span><span id="__span-30-57"><a id="__codelineno-30-57" name="__codelineno-30-57" href="#__codelineno-30-57"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-30-58"><a id="__codelineno-30-58" name="__codelineno-30-58" href="#__codelineno-30-58"></a> <span class="p">};</span> </span><span id="__span-30-59"><a id="__codelineno-30-59" name="__codelineno-30-59" href="#__codelineno-30-59"></a> </span><span id="__span-30-60"><a id="__codelineno-30-60" name="__codelineno-30-60" href="#__codelineno-30-60"></a> <span class="ss">keep</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-30-61"><a id="__codelineno-30-61" name="__codelineno-30-61" href="#__codelineno-30-61"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>int<span class="p">;</span> </span><span id="__span-30-62"><a id="__codelineno-30-62" name="__codelineno-30-62" href="#__codelineno-30-62"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">7</span><span class="p">;</span> </span><span id="__span-30-63"><a id="__codelineno-30-63" name="__codelineno-30-63" href="#__codelineno-30-63"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"How many timestamped snapshots to retain."</span><span class="p">;</span> </span><span id="__span-30-64"><a id="__codelineno-30-64" name="__codelineno-30-64" href="#__codelineno-30-64"></a> <span class="p">};</span> </span><span id="__span-30-65"><a id="__codelineno-30-65" name="__codelineno-30-65" href="#__codelineno-30-65"></a> </span><span id="__span-30-66"><a id="__codelineno-30-66" name="__codelineno-30-66" href="#__codelineno-30-66"></a> <span class="ss">dates</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-30-67"><a id="__codelineno-30-67" name="__codelineno-30-67" href="#__codelineno-30-67"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-30-68"><a id="__codelineno-30-68" name="__codelineno-30-68" href="#__codelineno-30-68"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"03:30"</span><span class="p">;</span> </span><span id="__span-30-69"><a id="__codelineno-30-69" name="__codelineno-30-69" href="#__codelineno-30-69"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-30-70"><a id="__codelineno-30-70" name="__codelineno-30-70" href="#__codelineno-30-70"></a><span class="s s-Multiline"> systemd OnCalendar expression. Defaults to a quiet hour: the backup</span> </span><span id="__span-30-71"><a id="__codelineno-30-71" name="__codelineno-30-71" href="#__codelineno-30-71"></a><span class="s s-Multiline"> reads ~1GB off a disk that is already struggling, so it should not</span> </span><span id="__span-30-72"><a id="__codelineno-30-72" name="__codelineno-30-72" href="#__codelineno-30-72"></a><span class="s s-Multiline"> compete with evening playback.</span> </span><span id="__span-30-73"><a id="__codelineno-30-73" name="__codelineno-30-73" href="#__codelineno-30-73"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-30-74"><a id="__codelineno-30-74" name="__codelineno-30-74" href="#__codelineno-30-74"></a> <span class="p">};</span> </span><span id="__span-30-75"><a id="__codelineno-30-75" name="__codelineno-30-75" href="#__codelineno-30-75"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="syncthingnix"><code>syncthing.nix</code><a class="headerlink" href="#syncthingnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/syncthing.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/syncthing.nix</code></a></p> <ul> <li><strong>Enable option:</strong> Syncthing file synchronization</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>user</code>, <code>syncHosts</code>, <code>deviceIds</code>, <code>masterHost</code>, <code>syncClaude</code>, <code>syncGemini</code>, <code>guiAddress</code>, <code>openFirewall</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-31-1"><a id="__codelineno-31-1" name="__codelineno-31-1" href="#__codelineno-31-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">syncthing</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-31-2"><a id="__codelineno-31-2" name="__codelineno-31-2" href="#__codelineno-31-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"Syncthing file synchronization"</span><span class="p">;</span> </span><span id="__span-31-3"><a id="__codelineno-31-3" name="__codelineno-31-3" href="#__codelineno-31-3"></a> </span><span id="__span-31-4"><a id="__codelineno-31-4" name="__codelineno-31-4" href="#__codelineno-31-4"></a> <span class="ss">user</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-31-5"><a id="__codelineno-31-5" name="__codelineno-31-5" href="#__codelineno-31-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-31-6"><a id="__codelineno-31-6" name="__codelineno-31-6" href="#__codelineno-31-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"olafkfreund"</span><span class="p">;</span> </span><span id="__span-31-7"><a id="__codelineno-31-7" name="__codelineno-31-7" href="#__codelineno-31-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"User to run Syncthing as"</span><span class="p">;</span> </span><span id="__span-31-8"><a id="__codelineno-31-8" name="__codelineno-31-8" href="#__codelineno-31-8"></a> <span class="p">};</span> </span><span id="__span-31-9"><a id="__codelineno-31-9" name="__codelineno-31-9" href="#__codelineno-31-9"></a> </span><span id="__span-31-10"><a id="__codelineno-31-10" name="__codelineno-31-10" href="#__codelineno-31-10"></a> <span class="ss">syncHosts</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-31-11"><a id="__codelineno-31-11" name="__codelineno-31-11" href="#__codelineno-31-11"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>listOf types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-31-12"><a id="__codelineno-31-12" name="__codelineno-31-12" href="#__codelineno-31-12"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"p620"</span> <span class="s2">"razer"</span> <span class="s2">"p510"</span> <span class="p">];</span> </span><span id="__span-31-13"><a id="__codelineno-31-13" name="__codelineno-31-13" href="#__codelineno-31-13"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"List of hosts to sync with"</span><span class="p">;</span> </span><span id="__span-31-14"><a id="__codelineno-31-14" name="__codelineno-31-14" href="#__codelineno-31-14"></a> <span class="p">};</span> </span><span id="__span-31-15"><a id="__codelineno-31-15" name="__codelineno-31-15" href="#__codelineno-31-15"></a> </span><span id="__span-31-16"><a id="__codelineno-31-16" name="__codelineno-31-16" href="#__codelineno-31-16"></a> <span class="ss">deviceIds</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-31-17"><a id="__codelineno-31-17" name="__codelineno-31-17" href="#__codelineno-31-17"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>attrsOf types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-31-18"><a id="__codelineno-31-18" name="__codelineno-31-18" href="#__codelineno-31-18"></a> <span class="ss">default</span> <span class="o">=</span> <span class="p">{</span> <span class="p">};</span> </span><span id="__span-31-19"><a id="__codelineno-31-19" name="__codelineno-31-19" href="#__codelineno-31-19"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-31-20"><a id="__codelineno-31-20" name="__codelineno-31-20" href="#__codelineno-31-20"></a><span class="s s-Multiline"> Device IDs for each host. Get these by running `syncthing --device-id`</span> </span><span id="__span-31-21"><a id="__codelineno-31-21" name="__codelineno-31-21" href="#__codelineno-31-21"></a><span class="s s-Multiline"> on each host after initial Syncthing setup.</span> </span><span id="__span-31-22"><a id="__codelineno-31-22" name="__codelineno-31-22" href="#__codelineno-31-22"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-31-23"><a id="__codelineno-31-23" name="__codelineno-31-23" href="#__codelineno-31-23"></a> <span class="ss">example</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-31-24"><a id="__codelineno-31-24" name="__codelineno-31-24" href="#__codelineno-31-24"></a> <span class="ss">p620</span> <span class="o">=</span> <span class="s2">"ABCDEFG-HIJKLMN-OPQRSTU-VWXYZ12-3456789-ABCDEFG-HIJKLMN-OPQRSTU"</span><span class="p">;</span> </span><span id="__span-31-25"><a id="__codelineno-31-25" name="__codelineno-31-25" href="#__codelineno-31-25"></a> <span class="p">};</span> </span><span id="__span-31-26"><a id="__codelineno-31-26" name="__codelineno-31-26" href="#__codelineno-31-26"></a> <span class="p">};</span> </span><span id="__span-31-27"><a id="__codelineno-31-27" name="__codelineno-31-27" href="#__codelineno-31-27"></a> </span><span id="__span-31-28"><a id="__codelineno-31-28" name="__codelineno-31-28" href="#__codelineno-31-28"></a> <span class="ss">masterHost</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-31-29"><a id="__codelineno-31-29" name="__codelineno-31-29" href="#__codelineno-31-29"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-31-30"><a id="__codelineno-31-30" name="__codelineno-31-30" href="#__codelineno-31-30"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"p620"</span><span class="p">;</span> </span><span id="__span-31-31"><a id="__codelineno-31-31" name="__codelineno-31-31" href="#__codelineno-31-31"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Primary host for conflict resolution (introducer)"</span><span class="p">;</span> </span><span id="__span-31-32"><a id="__codelineno-31-32" name="__codelineno-31-32" href="#__codelineno-31-32"></a> <span class="p">};</span> </span><span id="__span-31-33"><a id="__codelineno-31-33" name="__codelineno-31-33" href="#__codelineno-31-33"></a> </span><span id="__span-31-34"><a id="__codelineno-31-34" name="__codelineno-31-34" href="#__codelineno-31-34"></a> <span class="ss">syncClaude</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-31-35"><a id="__codelineno-31-35" name="__codelineno-31-35" href="#__codelineno-31-35"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-31-36"><a id="__codelineno-31-36" name="__codelineno-31-36" href="#__codelineno-31-36"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-31-37"><a id="__codelineno-31-37" name="__codelineno-31-37" href="#__codelineno-31-37"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Sync ~/.claude directory"</span><span class="p">;</span> </span><span id="__span-31-38"><a id="__codelineno-31-38" name="__codelineno-31-38" href="#__codelineno-31-38"></a> <span class="p">};</span> </span><span id="__span-31-39"><a id="__codelineno-31-39" name="__codelineno-31-39" href="#__codelineno-31-39"></a> </span><span id="__span-31-40"><a id="__codelineno-31-40" name="__codelineno-31-40" href="#__codelineno-31-40"></a> <span class="ss">syncGemini</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-31-41"><a id="__codelineno-31-41" name="__codelineno-31-41" href="#__codelineno-31-41"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-31-42"><a id="__codelineno-31-42" name="__codelineno-31-42" href="#__codelineno-31-42"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-31-43"><a id="__codelineno-31-43" name="__codelineno-31-43" href="#__codelineno-31-43"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Sync ~/.gemini directory"</span><span class="p">;</span> </span><span id="__span-31-44"><a id="__codelineno-31-44" name="__codelineno-31-44" href="#__codelineno-31-44"></a> <span class="p">};</span> </span><span id="__span-31-45"><a id="__codelineno-31-45" name="__codelineno-31-45" href="#__codelineno-31-45"></a> </span><span id="__span-31-46"><a id="__codelineno-31-46" name="__codelineno-31-46" href="#__codelineno-31-46"></a> <span class="ss">guiAddress</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-31-47"><a id="__codelineno-31-47" name="__codelineno-31-47" href="#__codelineno-31-47"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-31-48"><a id="__codelineno-31-48" name="__codelineno-31-48" href="#__codelineno-31-48"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"127.0.0.1:8384"</span><span class="p">;</span> </span><span id="__span-31-49"><a id="__codelineno-31-49" name="__codelineno-31-49" href="#__codelineno-31-49"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Address for Syncthing Web UI"</span><span class="p">;</span> </span><span id="__span-31-50"><a id="__codelineno-31-50" name="__codelineno-31-50" href="#__codelineno-31-50"></a> <span class="p">};</span> </span><span id="__span-31-51"><a id="__codelineno-31-51" name="__codelineno-31-51" href="#__codelineno-31-51"></a> </span><span id="__span-31-52"><a id="__codelineno-31-52" name="__codelineno-31-52" href="#__codelineno-31-52"></a> <span class="ss">openFirewall</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-31-53"><a id="__codelineno-31-53" name="__codelineno-31-53" href="#__codelineno-31-53"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-31-54"><a id="__codelineno-31-54" name="__codelineno-31-54" href="#__codelineno-31-54"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-31-55"><a id="__codelineno-31-55" name="__codelineno-31-55" href="#__codelineno-31-55"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Open firewall ports for Syncthing"</span><span class="p">;</span> </span><span id="__span-31-56"><a id="__codelineno-31-56" name="__codelineno-31-56" href="#__codelineno-31-56"></a> <span class="p">};</span> </span><span id="__span-31-57"><a id="__codelineno-31-57" name="__codelineno-31-57" href="#__codelineno-31-57"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="defaultnix_13"><code>default.nix</code><a class="headerlink" href="#defaultnix_13" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/sysprof/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/sysprof/default.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="defaultnix_14"><code>default.nix</code><a class="headerlink" href="#defaultnix_14" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/system/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/system/default.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="defaultnix_15"><code>default.nix</code><a class="headerlink" href="#defaultnix_15" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/tabby/default.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/tabby/default.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="torrent-vpnnix"><code>torrent-vpn.nix</code><a class="headerlink" href="#torrent-vpnnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/torrent-vpn.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/torrent-vpn.nix</code></a></p> <p>Transmission confined to a ProtonVPN WireGuard network namespace.</p> <p>Peer traffic leaves exclusively through the tunnel. The kill switch is structural rather than a firewall rule: the namespace has no route to the internet except wg-proton, so a dead tunnel means dead torrents instead of leaked ones. Everything else on the host — Plex, NFS, Tailscale, cloudflared, NZBGet, SABnzbd — keeps using the normal route and is untouched.</p> <p>root namespace torrent namespace ────────────── ───────────────── eno1 ── internet wg-proton ── default route (VPN only) :9091 socket-proxy ───── veth ───→ transmission RPC</p> <p>The RPC proxy is what keeps this a drop-in change: cloudflared, the *arr download-client settings, audiobookbay-automated, and LAN/tailnet clients all keep talking to the same host:9091 they did before.</p> <p>Only the plaintext interface is moved into the namespace; the encrypted UDP socket stays in the root namespace and uses the host's ordinary route. See https://www.wireguard.com/netns/.</p> <ul> <li><strong>Enable option:</strong> Transmission confined to a ProtonVPN WireGuard namespace</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-32-1"><a id="__codelineno-32-1" name="__codelineno-32-1" href="#__codelineno-32-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">torrentVpn</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-32-2"><a id="__codelineno-32-2" name="__codelineno-32-2" href="#__codelineno-32-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"Transmission confined to a ProtonVPN WireGuard namespace"</span><span class="p">;</span> </span><span id="__span-32-3"><a id="__codelineno-32-3" name="__codelineno-32-3" href="#__codelineno-32-3"></a> </span><span id="__span-32-4"><a id="__codelineno-32-4" name="__codelineno-32-4" href="#__codelineno-32-4"></a> <span class="ss">address</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-32-5"><a id="__codelineno-32-5" name="__codelineno-32-5" href="#__codelineno-32-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-32-6"><a id="__codelineno-32-6" name="__codelineno-32-6" href="#__codelineno-32-6"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"10.2.0.2/32"</span><span class="p">;</span> </span><span id="__span-32-7"><a id="__codelineno-32-7" name="__codelineno-32-7" href="#__codelineno-32-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-32-8"><a id="__codelineno-32-8" name="__codelineno-32-8" href="#__codelineno-32-8"></a><span class="s s-Multiline"> The `Address` field of the ProtonVPN WireGuard config. Unique to the</span> </span><span id="__span-32-9"><a id="__codelineno-32-9" name="__codelineno-32-9" href="#__codelineno-32-9"></a><span class="s s-Multiline"> downloaded config; not secret.</span> </span><span id="__span-32-10"><a id="__codelineno-32-10" name="__codelineno-32-10" href="#__codelineno-32-10"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-32-11"><a id="__codelineno-32-11" name="__codelineno-32-11" href="#__codelineno-32-11"></a> <span class="p">};</span> </span><span id="__span-32-12"><a id="__codelineno-32-12" name="__codelineno-32-12" href="#__codelineno-32-12"></a> </span><span id="__span-32-13"><a id="__codelineno-32-13" name="__codelineno-32-13" href="#__codelineno-32-13"></a> <span class="ss">gateway</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-32-14"><a id="__codelineno-32-14" name="__codelineno-32-14" href="#__codelineno-32-14"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-32-15"><a id="__codelineno-32-15" name="__codelineno-32-15" href="#__codelineno-32-15"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"10.2.0.1"</span><span class="p">;</span> </span><span id="__span-32-16"><a id="__codelineno-32-16" name="__codelineno-32-16" href="#__codelineno-32-16"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-32-17"><a id="__codelineno-32-17" name="__codelineno-32-17" href="#__codelineno-32-17"></a><span class="s s-Multiline"> Tunnel gateway, which is also the `DNS` field of the ProtonVPN config</span> </span><span id="__span-32-18"><a id="__codelineno-32-18" name="__codelineno-32-18" href="#__codelineno-32-18"></a><span class="s s-Multiline"> and its NAT-PMP responder. Name resolution inside the namespace must go</span> </span><span id="__span-32-19"><a id="__codelineno-32-19" name="__codelineno-32-19" href="#__codelineno-32-19"></a><span class="s s-Multiline"> through here — the host's stub resolver is not reachable from it.</span> </span><span id="__span-32-20"><a id="__codelineno-32-20" name="__codelineno-32-20" href="#__codelineno-32-20"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-32-21"><a id="__codelineno-32-21" name="__codelineno-32-21" href="#__codelineno-32-21"></a> <span class="p">};</span> </span><span id="__span-32-22"><a id="__codelineno-32-22" name="__codelineno-32-22" href="#__codelineno-32-22"></a> </span><span id="__span-32-23"><a id="__codelineno-32-23" name="__codelineno-32-23" href="#__codelineno-32-23"></a> <span class="ss">privateKeyFile</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-32-24"><a id="__codelineno-32-24" name="__codelineno-32-24" href="#__codelineno-32-24"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>path<span class="p">;</span> </span><span id="__span-32-25"><a id="__codelineno-32-25" name="__codelineno-32-25" href="#__codelineno-32-25"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-32-26"><a id="__codelineno-32-26" name="__codelineno-32-26" href="#__codelineno-32-26"></a><span class="s s-Multiline"> Runtime path to a file holding the `PrivateKey` of the ProtonVPN</span> </span><span id="__span-32-27"><a id="__codelineno-32-27" name="__codelineno-32-27" href="#__codelineno-32-27"></a><span class="s s-Multiline"> config, and nothing else. Read at service start, never at evaluation.</span> </span><span id="__span-32-28"><a id="__codelineno-32-28" name="__codelineno-32-28" href="#__codelineno-32-28"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-32-29"><a id="__codelineno-32-29" name="__codelineno-32-29" href="#__codelineno-32-29"></a> <span class="p">};</span> </span><span id="__span-32-30"><a id="__codelineno-32-30" name="__codelineno-32-30" href="#__codelineno-32-30"></a> </span><span id="__span-32-31"><a id="__codelineno-32-31" name="__codelineno-32-31" href="#__codelineno-32-31"></a> <span class="ss">peer</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-32-32"><a id="__codelineno-32-32" name="__codelineno-32-32" href="#__codelineno-32-32"></a> <span class="ss">publicKey</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-32-33"><a id="__codelineno-32-33" name="__codelineno-32-33" href="#__codelineno-32-33"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-32-34"><a id="__codelineno-32-34" name="__codelineno-32-34" href="#__codelineno-32-34"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"The `PublicKey` of the ProtonVPN config's `[Peer]` section."</span><span class="p">;</span> </span><span id="__span-32-35"><a id="__codelineno-32-35" name="__codelineno-32-35" href="#__codelineno-32-35"></a> <span class="p">};</span> </span><span id="__span-32-36"><a id="__codelineno-32-36" name="__codelineno-32-36" href="#__codelineno-32-36"></a> </span><span id="__span-32-37"><a id="__codelineno-32-37" name="__codelineno-32-37" href="#__codelineno-32-37"></a> <span class="ss">endpoint</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-32-38"><a id="__codelineno-32-38" name="__codelineno-32-38" href="#__codelineno-32-38"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-32-39"><a id="__codelineno-32-39" name="__codelineno-32-39" href="#__codelineno-32-39"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"185.159.157.1:51820"</span><span class="p">;</span> </span><span id="__span-32-40"><a id="__codelineno-32-40" name="__codelineno-32-40" href="#__codelineno-32-40"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"The `Endpoint` of the ProtonVPN config's `[Peer]` section."</span><span class="p">;</span> </span><span id="__span-32-41"><a id="__codelineno-32-41" name="__codelineno-32-41" href="#__codelineno-32-41"></a> <span class="p">};</span> </span><span id="__span-32-42"><a id="__codelineno-32-42" name="__codelineno-32-42" href="#__codelineno-32-42"></a> <span class="p">};</span> </span><span id="__span-32-43"><a id="__codelineno-32-43" name="__codelineno-32-43" href="#__codelineno-32-43"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="whatsapp-bridgenix"><code>whatsapp-bridge.nix</code><a class="headerlink" href="#whatsapp-bridgenix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/whatsapp-bridge.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/whatsapp-bridge.nix</code></a></p> <p>WhatsApp Bridge Systemd Service Persistent background service for WhatsApp Web API connection Follows docs/NIXOS-ANTI-PATTERNS.md security patterns</p> <p><em>No option declarations; see source for implementation.</em></p> <h3 id="whisper-servernix"><code>whisper-server.nix</code><a class="headerlink" href="#whisper-servernix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/whisper-server.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/whisper-server.nix</code></a></p> <p>whisper-server — local Whisper transcription HTTP API</p> <p>Wraps <code>whisper-server</code> from pkgs.whisper-cpp. Used by <code>voice-input</code> clients on razer + p620 to convert speech-to-text via a hold-to-talk hotkey.</p> <p>Default deployment: p620 hosts the server (it has the CPU/GPU budget), razer reaches it over the tailnet. p510 is irrelevant — headless.</p> <p>Service surface: POST http://p620:9300/inference multipart file=@audio.wav → transcript</p> <p>Designed to be cheap to run idle: the binary memory-maps the model and only burns CPU when a request comes in.</p> <ul> <li><strong>Enable option:</strong> Whisper.cpp HTTP transcription server</li> </ul> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-33-1"><a id="__codelineno-33-1" name="__codelineno-33-1" href="#__codelineno-33-1"></a> options<span class="o">.</span>features<span class="o">.</span><span class="ss">whisper-server</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-33-2"><a id="__codelineno-33-2" name="__codelineno-33-2" href="#__codelineno-33-2"></a> <span class="ss">enable</span> <span class="o">=</span> lib<span class="o">.</span>mkEnableOption <span class="s2">"Whisper.cpp HTTP transcription server"</span><span class="p">;</span> </span><span id="__span-33-3"><a id="__codelineno-33-3" name="__codelineno-33-3" href="#__codelineno-33-3"></a> </span><span id="__span-33-4"><a id="__codelineno-33-4" name="__codelineno-33-4" href="#__codelineno-33-4"></a> <span class="ss">port</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-33-5"><a id="__codelineno-33-5" name="__codelineno-33-5" href="#__codelineno-33-5"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>port<span class="p">;</span> </span><span id="__span-33-6"><a id="__codelineno-33-6" name="__codelineno-33-6" href="#__codelineno-33-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="mi">9300</span><span class="p">;</span> </span><span id="__span-33-7"><a id="__codelineno-33-7" name="__codelineno-33-7" href="#__codelineno-33-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"TCP port for the HTTP inference endpoint."</span><span class="p">;</span> </span><span id="__span-33-8"><a id="__codelineno-33-8" name="__codelineno-33-8" href="#__codelineno-33-8"></a> <span class="p">};</span> </span><span id="__span-33-9"><a id="__codelineno-33-9" name="__codelineno-33-9" href="#__codelineno-33-9"></a> </span><span id="__span-33-10"><a id="__codelineno-33-10" name="__codelineno-33-10" href="#__codelineno-33-10"></a> <span class="ss">model</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-33-11"><a id="__codelineno-33-11" name="__codelineno-33-11" href="#__codelineno-33-11"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>str<span class="p">;</span> </span><span id="__span-33-12"><a id="__codelineno-33-12" name="__codelineno-33-12" href="#__codelineno-33-12"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"base.en"</span><span class="p">;</span> </span><span id="__span-33-13"><a id="__codelineno-33-13" name="__codelineno-33-13" href="#__codelineno-33-13"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"small.en"</span><span class="p">;</span> </span><span id="__span-33-14"><a id="__codelineno-33-14" name="__codelineno-33-14" href="#__codelineno-33-14"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''</span> </span><span id="__span-33-15"><a id="__codelineno-33-15" name="__codelineno-33-15" href="#__codelineno-33-15"></a><span class="s s-Multiline"> ggml model name (passed to whisper-cpp-download-ggml-model). Sizes:</span> </span><span id="__span-33-16"><a id="__codelineno-33-16" name="__codelineno-33-16" href="#__codelineno-33-16"></a><span class="s s-Multiline"> tiny.en ≈ 40 MB, fastest, lowest accuracy</span> </span><span id="__span-33-17"><a id="__codelineno-33-17" name="__codelineno-33-17" href="#__codelineno-33-17"></a><span class="s s-Multiline"> base.en ≈ 150 MB, good balance for short dictation</span> </span><span id="__span-33-18"><a id="__codelineno-33-18" name="__codelineno-33-18" href="#__codelineno-33-18"></a><span class="s s-Multiline"> small.en ≈ 500 MB, more accurate, slower</span> </span><span id="__span-33-19"><a id="__codelineno-33-19" name="__codelineno-33-19" href="#__codelineno-33-19"></a><span class="s s-Multiline"> medium.en ≈ 1.5 GB</span> </span><span id="__span-33-20"><a id="__codelineno-33-20" name="__codelineno-33-20" href="#__codelineno-33-20"></a><span class="s s-Multiline"> ''</span><span class="p">;</span> </span><span id="__span-33-21"><a id="__codelineno-33-21" name="__codelineno-33-21" href="#__codelineno-33-21"></a> <span class="p">};</span> </span><span id="__span-33-22"><a id="__codelineno-33-22" name="__codelineno-33-22" href="#__codelineno-33-22"></a> </span><span id="__span-33-23"><a id="__codelineno-33-23" name="__codelineno-33-23" href="#__codelineno-33-23"></a> <span class="ss">openFirewallOnTailscale</span> <span class="o">=</span> lib<span class="o">.</span>mkOption <span class="p">{</span> </span><span id="__span-33-24"><a id="__codelineno-33-24" name="__codelineno-33-24" href="#__codelineno-33-24"></a> <span class="ss">type</span> <span class="o">=</span> lib<span class="o">.</span>types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-33-25"><a id="__codelineno-33-25" name="__codelineno-33-25" href="#__codelineno-33-25"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-33-26"><a id="__codelineno-33-26" name="__codelineno-33-26" href="#__codelineno-33-26"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s2">"Open the service port on the tailscale0 interface only."</span><span class="p">;</span> </span><span id="__span-33-27"><a id="__codelineno-33-27" name="__codelineno-33-27" href="#__codelineno-33-27"></a> <span class="p">};</span> </span><span id="__span-33-28"><a id="__codelineno-33-28" name="__codelineno-33-28" href="#__codelineno-33-28"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="xdg-portalnix"><code>xdg-portal.nix</code><a class="headerlink" href="#xdg-portalnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/xserver/xdg-portal.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/xserver/xdg-portal.nix</code></a></p> <p>XDG Desktop Portal Configuration Module Configures desktop integration for Wayland and X11 applications</p> <ul> <li><strong>Enable option:</strong> XDG desktop portal services</li> </ul> <p><strong>Options:</strong> <code>enable</code>, <code>backend</code>, <code>enableScreencast</code>, <code>suppressIconWarning</code>, <code>forcePortalOpen</code></p> <details class="note"> <summary>Options declaration (Nix)</summary> <div class="language-nix highlight"><pre><span></span><code><span id="__span-34-1"><a id="__codelineno-34-1" name="__codelineno-34-1" href="#__codelineno-34-1"></a> options<span class="o">.</span>modules<span class="o">.</span>services<span class="o">.</span><span class="ss">xdg-portal</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-34-2"><a id="__codelineno-34-2" name="__codelineno-34-2" href="#__codelineno-34-2"></a> <span class="ss">enable</span> <span class="o">=</span> mkEnableOption <span class="s2">"XDG desktop portal services"</span><span class="p">;</span> </span><span id="__span-34-3"><a id="__codelineno-34-3" name="__codelineno-34-3" href="#__codelineno-34-3"></a> </span><span id="__span-34-4"><a id="__codelineno-34-4" name="__codelineno-34-4" href="#__codelineno-34-4"></a> <span class="ss">backend</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-34-5"><a id="__codelineno-34-5" name="__codelineno-34-5" href="#__codelineno-34-5"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>enum <span class="p">[</span> <span class="s2">"sway"</span> <span class="s2">"gnome"</span> <span class="s2">"cosmic"</span> <span class="p">];</span> </span><span id="__span-34-6"><a id="__codelineno-34-6" name="__codelineno-34-6" href="#__codelineno-34-6"></a> <span class="ss">default</span> <span class="o">=</span> <span class="s2">"gnome"</span><span class="p">;</span> </span><span id="__span-34-7"><a id="__codelineno-34-7" name="__codelineno-34-7" href="#__codelineno-34-7"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''Primary desktop environment backend for portals''</span><span class="p">;</span> </span><span id="__span-34-8"><a id="__codelineno-34-8" name="__codelineno-34-8" href="#__codelineno-34-8"></a> <span class="ss">example</span> <span class="o">=</span> <span class="s2">"sway"</span><span class="p">;</span> </span><span id="__span-34-9"><a id="__codelineno-34-9" name="__codelineno-34-9" href="#__codelineno-34-9"></a> <span class="p">};</span> </span><span id="__span-34-10"><a id="__codelineno-34-10" name="__codelineno-34-10" href="#__codelineno-34-10"></a> </span><span id="__span-34-11"><a id="__codelineno-34-11" name="__codelineno-34-11" href="#__codelineno-34-11"></a> <span class="ss">enableScreencast</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-34-12"><a id="__codelineno-34-12" name="__codelineno-34-12" href="#__codelineno-34-12"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-34-13"><a id="__codelineno-34-13" name="__codelineno-34-13" href="#__codelineno-34-13"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-34-14"><a id="__codelineno-34-14" name="__codelineno-34-14" href="#__codelineno-34-14"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''Enable screencasting support through portals''</span><span class="p">;</span> </span><span id="__span-34-15"><a id="__codelineno-34-15" name="__codelineno-34-15" href="#__codelineno-34-15"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-34-16"><a id="__codelineno-34-16" name="__codelineno-34-16" href="#__codelineno-34-16"></a> <span class="p">};</span> </span><span id="__span-34-17"><a id="__codelineno-34-17" name="__codelineno-34-17" href="#__codelineno-34-17"></a> </span><span id="__span-34-18"><a id="__codelineno-34-18" name="__codelineno-34-18" href="#__codelineno-34-18"></a> <span class="ss">suppressIconWarning</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-34-19"><a id="__codelineno-34-19" name="__codelineno-34-19" href="#__codelineno-34-19"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-34-20"><a id="__codelineno-34-20" name="__codelineno-34-20" href="#__codelineno-34-20"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-34-21"><a id="__codelineno-34-21" name="__codelineno-34-21" href="#__codelineno-34-21"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''Suppress XDG icon protocol warnings''</span><span class="p">;</span> </span><span id="__span-34-22"><a id="__codelineno-34-22" name="__codelineno-34-22" href="#__codelineno-34-22"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-34-23"><a id="__codelineno-34-23" name="__codelineno-34-23" href="#__codelineno-34-23"></a> <span class="p">};</span> </span><span id="__span-34-24"><a id="__codelineno-34-24" name="__codelineno-34-24" href="#__codelineno-34-24"></a> </span><span id="__span-34-25"><a id="__codelineno-34-25" name="__codelineno-34-25" href="#__codelineno-34-25"></a> <span class="ss">forcePortalOpen</span> <span class="o">=</span> mkOption <span class="p">{</span> </span><span id="__span-34-26"><a id="__codelineno-34-26" name="__codelineno-34-26" href="#__codelineno-34-26"></a> <span class="ss">type</span> <span class="o">=</span> types<span class="o">.</span>bool<span class="p">;</span> </span><span id="__span-34-27"><a id="__codelineno-34-27" name="__codelineno-34-27" href="#__codelineno-34-27"></a> <span class="ss">default</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> </span><span id="__span-34-28"><a id="__codelineno-34-28" name="__codelineno-34-28" href="#__codelineno-34-28"></a> <span class="ss">description</span> <span class="o">=</span> <span class="s s-Multiline">''Force applications to use portal for file operations''</span><span class="p">;</span> </span><span id="__span-34-29"><a id="__codelineno-34-29" name="__codelineno-34-29" href="#__codelineno-34-29"></a> <span class="ss">example</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> </span><span id="__span-34-30"><a id="__codelineno-34-30" name="__codelineno-34-30" href="#__codelineno-34-30"></a> <span class="p">};</span> </span><span id="__span-34-31"><a id="__codelineno-34-31" name="__codelineno-34-31" href="#__codelineno-34-31"></a> <span class="p">}</span> </span></code></pre></div> </details> <h3 id="xdgnix"><code>xdg.nix</code><a class="headerlink" href="#xdgnix" title="Anchor link to this section">¶</a></h3> <p><a href="https://github.com/olafkfreund/nixos_config/blob/main/modules/services/xserver/xdg.nix"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg></span> <code>modules/services/xserver/xdg.nix</code></a></p> <p><em>No option declarations; see source for implementation.</em></p> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type="button" class="md-top md-icon" data-md-component="top" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class="md-footer"> <nav class="md-footer__inner md-grid" aria-label="Footer" > <a href="../security/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Security"> <div class="md-footer__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </div> <div class="md-footer__title"> <span class="md-footer__direction"> Previous </span> <div class="md-ellipsis"> Security </div> </div> </a> <a href="../spell/" class="md-footer__link md-footer__link--next" aria-label="Next: Spell Checking"> <div class="md-footer__title"> <span class="md-footer__direction"> Next </span> <div class="md-ellipsis"> Spell Checking </div> </div> <div class="md-footer__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg> </div> </a> </nav> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> <div class="md-copyright__highlight"> Built with MkDocs Material · Generated reproducibly with Nix (<code>nix build .#docs</code>) </div> Made with <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> Material for MkDocs </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <div class="md-progress" data-md-component="progress" role="progressbar"></div> <script id="__config" type="application/json">{"annotate": null, "base": "../../..", "features": ["navigation.tabs", "navigation.tabs.sticky", "navigation.sections", "navigation.indexes", "navigation.top", "navigation.instant", "navigation.instant.progress", "navigation.tracking", "navigation.footer", "search.suggest", "search.highlight", "search.share", "content.code.copy", "content.code.annotate", "content.tooltips", "toc.follow"], "search": "../../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> <script src="../../../assets/javascripts/bundle.d7400e89.min.js"></script> <script src="../../../javascripts/cursor.js"></script> </body> </html>