clover's snow globe

This codebase contains declarative configuration to run my home server, a computer sitting in my closet used daily to power my activities. It first and foremost acts as a file store for my ongoing and archived projects for paper clover. Secondly, it contains a ton of apps for me and friends to use, from Jellyfin and Navidrome for media consumption to git hosting and render farms.

The system is built out of a NixOS base (just to install the system itself), using Podman containers scheduled by Nomad and virtual machines to run the services. Changes automatically get a staging deployment on Snow Globe for testing and review. Production promotion is a separate, explicit step.

change → preview → review

The deployment tool defaults to Snow Globe at root@10.0.0.1:22.

python3 tools/deploy.py stage shale
python3 tools/deploy.py stage dashboard

These upload working files and print the preview URL. Service previews use separate ZFS storage; the dashboard preview uses disposable accounts and files, with read-only observations of the real host. Test the app and keep its preview available for review. Repeating the command updates that preview.

After approval, commit the reviewed changes on main and run python3 tools/deploy.py prod. The release workflow backs up state, activates the release, and checks production health. Single-writer services can have a brief interruption. Code rollback and data restore are separate operations.

GPU AI changes are tested directly in production. VM integration uses disposable guests on the real machine. Most other work follows the preview workflow above; isolated host testing is documented in tools/rehearsal.md. The complete agent workflow is in AGENTS.md.

filesystem layout

The computer mounts the ZFS root dataset under /srv, meaning "server," loosely following the linux convention. Within, it's a unique structure:

srv/
+--- clover/ [dataset]       user-data storage, what I mount as /Volumes/clover
     +--- Archive/<year>     personal archive. one folder per year, scrambled within.
     +--- Asset/             resources, sample packs, audio plugins, stock videos
          +--- Blender/      
          +--- Font/
          +--- Samples/      
          +--- Texture/      
          +--- Video/      
     +--- Documents/
     +--- Project/           currently active project files
     +--- Media/ [dataset]   files from the world-wide-web. managed partially manually
          +--- jellyfin/
          +--- mirror/
          +--- music/        (used by navidrome)
          +--- music-intake/ (to be manually indexed)
          +--- seedbox/
          +--- vm/           (virtual machine images)
     +--- Published/         source of truth for `paperclover.net/file`
+--- prod/ [dataset]         production application data
     +--- shale/ [dataset]   (each service is its own dataset)
     +--- ...
+--- staging/                staging deployments use this space for temporary clones
     +--- postgres-9f06f74b/ [dataset]
+--- vm/ [dataset]           virtual machines
     +--- clover-sandbox/    [dataset]

Media is its own dataset so it can be snapshotted independently of personal data. Personal files share a dataset to allow fast moves between top-level folders; services use separate datasets for copy-on-write previews. No automatic snapshot retention policy is configured. Hardware, encryption, permissions, and recovery boundaries are documented in tools/snowglobe-hardware.md.