No description
  • QML 58%
  • Nix 25.5%
  • JavaScript 8.2%
  • Python 7.9%
  • CSS 0.2%
  • Other 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-03 22:18:10 -05:00
.codex Initial commit 2026-08-26 21:30:07 -05:00
archive/strider Initial commit 2026-08-26 21:30:07 -05:00
home update software 2026-09-03 22:18:10 -05:00
hosts Update external package pins 2026-08-30 18:50:27 -05:00
scripts Initial commit 2026-08-26 21:30:07 -05:00
secrets Initial commit 2026-08-26 21:30:07 -05:00
.gitignore Initial commit 2026-08-26 21:30:07 -05:00
.sops.yaml Initial commit 2026-08-26 21:30:07 -05:00
AGENTS.md update software 2026-09-03 22:18:10 -05:00
flake.lock update software 2026-09-03 22:18:10 -05:00
flake.nix update software 2026-09-03 22:18:10 -05:00
README.md point Forgejo URLs at truesilver.dev 2026-09-03 21:36:25 -05:00
WintermuteOS-ColorHistory.md and hyprpicker 2026-09-01 20:47:20 -05:00
WintermuteOS-HASS-screenshot.png Rename bar panel screenshots so cached cropped images are not served. 2026-08-31 09:13:43 -05:00
WintermuteOS-HASS.md Rename bar panel screenshots so cached cropped images are not served. 2026-08-31 09:13:43 -05:00
WintermuteOS-screenshot.png Add a wintermute desktop screenshot to WintermuteOS.md. 2026-08-31 09:21:17 -05:00
WintermuteOS-Syncthing-screenshot.png Rename bar panel screenshots so cached cropped images are not served. 2026-08-31 09:13:43 -05:00
WintermuteOS-Syncthing.md Rename bar panel screenshots so cached cropped images are not served. 2026-08-31 09:13:43 -05:00
WintermuteOS-Theming.md Rename WintermuteOS docs out of all-caps. 2026-08-31 08:48:17 -05:00
WintermuteOS-Webcam-screenshot.png Rename bar panel screenshots so cached cropped images are not served. 2026-08-31 09:13:43 -05:00
WintermuteOS-Webcam.md Rename bar panel screenshots so cached cropped images are not served. 2026-08-31 09:13:43 -05:00
WintermuteOS.md and hyprpicker 2026-09-01 20:47:20 -05:00

nixos-config

I'm Greg Helding. You can find me at helding.net, on GitHub at github.com/gthelding, and on Forgejo at truesilver.dev/greg.

This is my personal NixOS flake with shared Home Manager modules and per-host user profiles. Welcome, and thanks for stopping by - feel free to explore the layout, borrow ideas, and adapt anything useful for your own setup.

This README is a tour, not a step-by-step guide. It is intended as "here is my flake, read it and take what you like." Comments welcome. Keep roasting to a minimum.

Quick links: WintermuteOS | Home Assistant bar panel | Syncthing bar panel | Webcam settings panel | Hosts | What this repo manages | Repository layout | Audio | Molly tuning | Shell, terminal & prompt | Distrobox | Flake input note

WintermuteOS

WintermuteOS 1.0 — is my take on a custom, fully declarative desktop system on NixOS: it uses Wayland with Hyprland as the compositor, Quickshell as the shell. It is a Home Manager layer (home/greg/desktop-wintermute/), not a separate module tree.

I apply theming: WintermuteOS-Theming.md. Quickshell provides for useful custom widgets that a stock bar config cannot; current examples are the Home Assistant panel, the Syncthing panel, and the webcam settings panel on wintermute.

Hosts

Host Hardware Role User / Profile
molly ThinkPad X1 Gen 11 Daily-driver laptop (Wayland + Hyprland) greg (home/greg/molly.nix)
wintermute System76 Thelio desktop (AMD GPU) Workstation — WintermuteOS 1.0 (Wayland + Hyprland + Quickshell) greg (home/greg/default.nix)
hosaka Geekom mini-PC Ham-shack desktop — WintermuteOS (Wayland + Hyprland + Quickshell, gruvbox) w9gth (home/w9gth/default.nix)
matrix Proxmox VM Matrix Synapse homeserver Headless server (no Home Manager)
social Proxmox VM Mastodon server (gth.social) Headless server (no Home Manager)
webtop Proxmox VM Remote desktop (Guacamole/xrdp/XFCE) Headless server (no Home Manager)

What this repo manages

  • NixOS system configuration per host under hosts/
  • Shared and user-specific Home Manager modules under home/
  • Host-aware user services
  • Headless service hosts for Matrix Synapse and Mastodon on nixpkgs-stable
  • Scripts synced into ~/.local/bin via Home Manager
  • Per-host theming for terminal apps — e.g., btop and Neovim pick a colorscheme by host (Neovim comes from the external nvf-config flake via lib.mkNvim "<theme>").

Repository layout

flake.nix                  Flake entrypoint and host definitions
hosts/
  common-base.nix          Shared baseline across all hosts
  common-server.nix        Shared baseline for the stable-branch servers
  quiet-boot.nix           Quiet graphical boot (plymouth) for desktop hosts
  molly/                   Laptop system config + hardware (Wayland + Hyprland)
  wintermute/              Workstation system config + hardware
  hosaka/                  Ham-shack desktop config + hardware
  matrix/                  Matrix Synapse server config + hardware
  social/                  Mastodon server config + hardware
  webtop/                  Remote-desktop server config + hardware
  iso/                     Custom installer ISO config
secrets/
  matrix/                  sops-encrypted Synapse secrets
  social/                  sops-encrypted Mastodon secrets
  webtop/                  sops-encrypted remote-desktop secrets
home/
  greg/                    Home Manager profile for user greg (wintermute, molly)
    default.nix            Entry point (wintermute / WintermuteOS)
    desktop-wintermute/    wintermute's Hyprland + Quickshell layer (forked per host;
                           Syncthing widget in quickshell/, [doc](WintermuteOS-Syncthing.md);
                           StreamCam settings on the screenrecord glyph, [doc](WintermuteOS-Webcam.md))
    molly.nix              Entry point (Wayland + Hyprland laptop)
    desktop/               molly's Hyprland desktop layer (forked per host)
    ntfy.nix               ntfy desktop notifications
  w9gth/                   Home Manager profile for user w9gth (hosaka)
    default.nix            Entry point (Wayland + Hyprland)
    desktop/               hosaka's Hyprland desktop layer (forked per host)
  shared/
    bash.nix               Shell + starship config (parameterized per host)
    ghostty.nix            Parameterized ghostty terminal config
    ghostty-shaders.nix    Pinned ghostty-shaders fetch (shared by ghostty/rmpc)
    rmpc.nix               rmpc config + ghostty wrapper (wintermute only)
    fastfetch.nix          Parameterized fastfetch config (per-host logo)
    gdb.nix                GDB defaults (Intel syntax)
    packages/              User package sets (cli, desktop, dev, media, etc.)
    starship*.toml         Starship prompt themes (selected per host)
    wintermuteos/
      themes/              Complete theme records and generators
      hass/                Home Assistant bar module ([doc](WintermuteOS-HASS.md))
scripts/                   Helper scripts (backups, git helpers, rsync exclude)

Note: matrix, social, and webtop track nixpkgs-stable (26.05) rather than unstable and have no Home Manager user environment - they are headless servers only. Secrets are managed via sops-nix; encrypted files live under secrets/ and are decrypted at runtime from each host's local key material.

social runs Mastodon at gth.social with a manual nginx config (SSL is terminated by an external reverse proxy). SMTP credentials are sourced from encrypted secrets.

Audio

PipeWire is enabled in hosts/common-base.nix for all desktop hosts (including molly and wintermute). Host-specific audio tuning lives in each host's configuration.nix rather than the shared module:

  • wintermute carries a low-latency profile (92-low-latency, fixed 512-quantum at 48 kHz) and a wireplumber rule (99-no-suspend) that prevents ALSA nodes from suspending. This suits a workstation with always-connected speakers and recording use.
  • molly uses default PipeWire behavior: dynamic quantum and normal node suspend, which is friendlier to laptop battery life.

Client machines also run voxtype (Vulkan-accelerated TTS) as a system service — the package and NixOS module are pulled from the voxtype flake input.

Molly (X1 Gen 11) tuning

molly is the machine formerly known as strider, reborn on an XFS root (no ZFS, so linuxPackages_latest is never blocked) running Wayland + Hyprland instead of Plasma. The retired strider config is kept for reference under archive/strider/. In addition to the shared baseline, molly applies a few laptop-specific tweaks in hosts/molly/configuration.nix:

  • VA-API: LIBVA_DRIVER_NAME=iHD is exported so mpv, OBS, and other VA-API consumers use the modern Intel Media Driver instead of falling back to legacy i965.
  • TLP charge thresholds: paired hysteresis with START_CHARGE_THRESH_BAT0=75 and STOP_CHARGE_THRESH_BAT0=80 to prevent constant micro-charging at 100%.
  • TLP power tuning on battery: RUNTIME_PM_ON_BAT=auto and PCIE_ASPM_ON_BAT=powersupersave for additional runtime PM and deeper PCIe link power savings.
  • thermald plus power-profiles-daemon disabled, so TLP owns power management without contention.

Shell, terminal & prompt

The interactive look-and-feel is factored into small parameterized Home Manager modules under home/shared/, each imported per user profile with host-specific arguments (the same idiom as bash.nix). The underlying packages all come from the shared CLI package set, so these modules only own the config:

  • bash.nix — shell config plus the starship prompt. The starshipTheme argument selects a theme file: starship.toml (wintermute and hosaka), starship-cyber-powerline.toml (molly's neon powerline). Hosaka's old pastel-powerline file remains on disk unused.
  • ghostty.nixprograms.ghostty config taking { theme, fontFamily?, fontSize?, opacity?, shaders?, extraSettings? }. Custom GLSL shaders (e.g. cursor_blaze.glsl) are pulled from the pinned hackr-sh/ghostty-shaders checkout, factored into ghostty-shaders.nix so the main config and the rmpc wrapper share one store path. ghostty +list-themes lists the 460+ built-in themes.
  • rmpc.nix — wintermute-only rmpc config: a ghostty terminal wrapper (ghostty/rmpc.conf), config.ron, and the gruvbox TUI theme. The wrapper .conf is a plain ghostty config with a @shaders@ placeholder substituted to the pinned shader path at build. Molly and hosaka dropped rmpc (cliamp remains on $mod+SHIFT+M).
  • fastfetch.nix — takes { configFile, imagesDir? } and installs the XDG config (and optional logo images). Per-host configs live in home/shared/packages/fastfetch/config-<host>.jsonc; the custom cyber-fetch.png logo is shared via the images/ dir.

Distrobox

Distrobox containers are configured in hosts/common-base.nix with access to Nix-installed executables. Three things make this work:

  1. Bind mounts expose the Nix store and user profile symlinks into every container (read-only):

    • /nix/store
    • /etc/profiles/per-user
    • /etc/static/profiles/per-user
  2. An init hook creates /etc/profile.d/nix-path.sh inside the container on first entry, which adds /etc/profiles/per-user/$USER/bin to PATH. This is necessary because NixOS normally sets PATH via /etc/set-environment during login, and that mechanism doesn't exist inside the container.

  3. Podman is the container runtime (virtualisation.podman).

Flake input note

The Neovim config inputs (nvf-config, nvf-config-stable) point at a private Forgejo mirror over SSH (truesilver.dev). All other inputs are public GitHub sources. If you're not on that network, replace those two URLs with the upstream before running nix flake update.