- Nix 71%
- Python 12%
- JavaScript 10%
- TypeScript 4%
- HTML 3%
- 1 more language <1%
molly's nixos config #
One flake managing three x86_64-linux hosts:
| host | role | Mycelium IPv6 |
|---|---|---|
| chi | Framework 12 laptop — Niri + Noctalia, Stylix theming, Home Manager desktop | 5ec:6edc:7495:220e:6f58:1bae:13be:cbf5 |
| halo | Strix Halo server — public edge (Caddy/Cloudflare), identity (ratlogin), pubnix, Tangled git, LLM gateway | 517:1053:3359:7f4a:8994:c16:4241:e900 |
| misty | Media/storage — Jellyfin + *arr, Navidrome, Seerr, Nextcloud, Invidious, Harmonia binary cache, Nix builder | 45a:adb:d00f:1128:b131:a28:551b:c1da |
Clan Core manages the controller-free Mycelium mesh. Iroh provides a separate
NAT-traversing SSH/deployment path to halo and misty; see NETWORK.md.
The canonical repository lives on Tangled: https://tangled.org/molly.computer/nixos.
layout #
flake.nix — inputs and the chi/halo/misty configurations
inventory.nix — Clan fleet registry and service roles
keys.nix — central SSH public keys
hosts/chi/ — Framework 12 config, desktop modules, hardware
hosts/halo/ — pubnix server config
hosts/misty/ — media server config
users/<person>/ — account definitions (declared once; rosters opt in)
modules/ — shared + per-service modules (caddy, auth, media, …)
home/ — chi Home Manager modules
pkgs/ — locally packaged software
patches/ — patches for upstream packages
static/ — served assets (logos, fonts)
images/ — misty installer image
scripts/ — one-shot operational scripts
secrets/ — SOPS-encrypted credentials only; never store plaintext
hosts/*/hardware-configuration.nix is generated by nixos-generate-config
and is intentionally excluded from the formatter. Keep it byte-identical unless
the hardware itself changes.
services #
halo is the only public edge; everything below is fronted by its Caddy
(modules/caddy.nix). "ratlogin (proxy)" means an oauth2-proxy guard sits in
front of an app with no SSO of its own; "ratlogin (OIDC)" means the app
authenticates against ratlogin itself. Services marked misty are reached from
halo over Mycelium.
| Endpoint | Service | Auth |
|---|---|---|
daze.lol, tilde.daze.lol |
pubnix landing page | public |
tilde.daze.lol/~user |
per-user websites (/home/<user>/public_html) |
public |
tilde.daze.lol/users |
generated member directory | public |
*.daze.lol |
per-user vanity domains + ATProto handle records | public |
planet.daze.lol |
aggregated member blogs (+ atom.xml) |
public |
search.daze.lol |
SearXNG | public |
paste.daze.lol |
Microbin pastebin and file host | public |
rsshub.daze.lol |
RSSHub feed generator | public |
scryphil.daze.lol |
static site | public |
auth.daze.lol |
ratlogin, the OIDC provider | ATProto OAuth |
pds.daze.lol |
Tranquil PDS | ATProto |
hold.daze.lol |
ATCR container registry | ATProto |
cdn.daze.lol |
Garage S3 (Hold blob downloads) | internal |
knot.daze.lol |
Tangled knot (git) | Tangled DID |
spindle.daze.lol |
Tangled spindle (CI) | Tangled DID |
code.daze.lol |
Forgejo | ratlogin (OIDC) |
tasks.daze.lol |
Vikunja | ratlogin (OIDC) |
game.daze.lol |
RomM ROM library and web emulator | ratlogin (OIDC) |
yt.daze.lol |
Invidious (misty) | ratlogin (OIDC) |
video.daze.lol |
Jellyfin (misty) | ratlogin (OIDC, in-app plugin) |
requests.daze.lol |
account request portal | ratlogin (proxy) |
dash.daze.lol |
homepage dashboard | ratlogin (proxy) |
music.daze.lol |
Navidrome (misty) | ratlogin (proxy) |
files.daze.lol |
FileBrowser (misty) | ratlogin (proxy) |
niri.daze.lol |
niri agent harness UI | ratlogin (proxy) |
pds-admin.daze.lol |
PDS Operator | ratlogin (proxy) |
route.daze.lol/ui |
CLIProxyAPI management UI | ratlogin (proxy) |
route.daze.lol |
CLIProxyAPI LLM gateway (/zeta/*, /zeta-lsp/*) |
API key |
chat.daze.lol |
Open WebUI (route + OpenRouter ZDR models) | WebUI account |
cloud.daze.lol |
Nextcloud (misty) | Nextcloud account |
seerr.daze.lol |
Seerr requests (login shim) | Jellyfin Quick Connect |
Non-HTTP listeners on halo, opened in modules/hardening.nix:
| Listener | Service | Auth |
|---|---|---|
gemini://gemini.daze.lol/~user/ (:1965) |
Agate capsules | public |
gopher://gopher.daze.lol/1/~user/ (:70) |
geomyidae holes | public |
irc.daze.lol:6697 (+ gamja over /socket) |
soju bouncer | soju accounts |
:4567 (TCP/UDP) |
i2pd router and tilde eepsite | loopback proxies |
:4242, :2965, :29665 |
Reticulum TCP and AutoInterface | Reticulum |
deploying #
Deployments originate from chi. Clan selects Iroh first and Mycelium as the fallback for halo and misty:
nix develop -c clan machines update halo
nix develop -c clan machines update misty
# chi is the local workstation
sudo nixos-rebuild switch --flake .#chi
checks #
nix fmt
nix flake check
for h in chi halo misty; do
nix eval --raw .#nixosConfigurations.$h.config.system.build.toplevel.drvPath
done
The formatter is treefmt with Alejandra, Statix, and deadnix. nix flake check
runs the formatting check and the package self-tests; evaluate each host
separately after touching flake.nix, flake.lock, modules/common.nix, or
shared inputs.
secrets #
SOPS with age. Only recipients, Clan's encrypted vars/, and ciphertext under
secrets/ belong in Git; keep private keys outside the repository. halo and
misty use their persistent SSH host keys as SOPS identities.
backups #
Clan borgbackup stores encrypted, deduplicated backups on misty under
/var/lib/borgbackup/<host>. The clan.core.state folders declared on chi and
halo are backed up daily at 01:00; halo stops its database-backed services for
the duration of the run (see hosts/halo/configuration.nix) so the archives
are consistent.
# on a client, back up now / list archives
sudo systemctl start borgbackup-job-misty.service
borg-job-misty list
agent browser vm #
misty runs one declarative NixOS MicroVM (hosts/misty/agent-browser.nix) with
Chromium and Playwright for browser agents. Reach it through misty:
ssh -J molly@misty -p 10022 agent@127.0.0.1
Work persists in /workspace. The guest reaches the public internet but not the
LAN, Mycelium, or misty's loopback, and its SSH port is bound to misty's loopback
only. Chromium works headlessly and require("playwright-core") resolves;
Google routinely serves its anti-bot CAPTCHA to automated/datacenter traffic, so
use a signed-in profile or another engine when real Google results are needed.
model hosting (halo) #
halo serves local GGUF models (Qwen3.8-Flash, Qwen3-0.6B, Zeta) via llama.cpp
for the route.daze.lol gateway. hosts/halo/models-paused.nix is a temporary
override that removes those services and model closures; remove its import to
resume.