Homelab
The machines in my basement and the repo that runs them, a Docker Swarm with a private registry, push-to-deploy, backups and a shared design system.
Every app on this site's project list runs at home, on a few small machines behind a single Caddy gateway. This website does too.
One repo for how things run
An infra repo holds one folder per service: its compose file, an example .env, and a short README. Pushing to main deploys whatever changed, through a self-hosted GitHub Actions runner.
Each app lives in its own repo and owns its image: tests run on GitHub's runners, then the image is built, pushed to my private registry and rolled out by commit hash. infra owns how it runs: environment, volumes, networks, secrets and the route on the gateway. A new app is a folder in one repo and a workflow file in the other.
The boring parts that matter
- Nightly restic backups to a NAS and to the cloud, with a written restore procedure.
- Secrets never go in git: they live in per-service
.envfiles and Swarm secrets on the host. - A written app standard and design system, so every app I build has the same structure, the same sign-in (passkeys) and looks like part of one family.