- QML 58%
- Nix 25.5%
- JavaScript 8.2%
- Python 7.9%
- CSS 0.2%
- Other 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .codex | ||
| archive/strider | ||
| home | ||
| hosts | ||
| scripts | ||
| secrets | ||
| .gitignore | ||
| .sops.yaml | ||
| AGENTS.md | ||
| flake.lock | ||
| flake.nix | ||
| README.md | ||
| WintermuteOS-ColorHistory.md | ||
| WintermuteOS-HASS-screenshot.png | ||
| WintermuteOS-HASS.md | ||
| WintermuteOS-screenshot.png | ||
| WintermuteOS-Syncthing-screenshot.png | ||
| WintermuteOS-Syncthing.md | ||
| WintermuteOS-Theming.md | ||
| WintermuteOS-Webcam-screenshot.png | ||
| WintermuteOS-Webcam.md | ||
| WintermuteOS.md | ||
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/binvia Home Manager - Per-host theming for terminal apps — e.g., btop and Neovim pick a colorscheme
by host (Neovim comes from the external
nvf-configflake vialib.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, andwebtoptracknixpkgs-stable(26.05) rather than unstable and have no Home Manager user environment - they are headless servers only. Secrets are managed viasops-nix; encrypted files live undersecrets/and are decrypted at runtime from each host's local key material.
socialruns Mastodon atgth.socialwith 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:
wintermutecarries 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.mollyuses 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=iHDis exported so mpv, OBS, and other VA-API consumers use the modern Intel Media Driver instead of falling back to legacyi965. - TLP charge thresholds: paired hysteresis with
START_CHARGE_THRESH_BAT0=75andSTOP_CHARGE_THRESH_BAT0=80to prevent constant micro-charging at 100%. - TLP power tuning on battery:
RUNTIME_PM_ON_BAT=autoandPCIE_ASPM_ON_BAT=powersupersavefor additional runtime PM and deeper PCIe link power savings. - thermald plus
power-profiles-daemondisabled, 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. ThestarshipThemeargument 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.nix—programs.ghosttyconfig taking{ theme, fontFamily?, fontSize?, opacity?, shaders?, extraSettings? }. Custom GLSL shaders (e.g.cursor_blaze.glsl) are pulled from the pinnedhackr-sh/ghostty-shaderscheckout, factored intoghostty-shaders.nixso the main config and the rmpc wrapper share one store path.ghostty +list-themeslists 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.confis 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 inhome/shared/packages/fastfetch/config-<host>.jsonc; the customcyber-fetch.pnglogo is shared via theimages/dir.
Distrobox
Distrobox containers are configured in hosts/common-base.nix with access to
Nix-installed executables. Three things make this work:
-
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
-
An init hook creates
/etc/profile.d/nix-path.shinside the container on first entry, which adds/etc/profiles/per-user/$USER/bintoPATH. This is necessary because NixOS normally setsPATHvia/etc/set-environmentduring login, and that mechanism doesn't exist inside the container. -
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.