The laptop I actually work on, and the reasoning behind how it’s set up. It’s deliberately terminal-first and reproducible - if this machine died, a new one would look like it within the hour.
The setup
#| Layer | What |
|---|
| Hardware | Framework Laptop 13 - AMD Ryzen 5 7640U, 30GB RAM, 2TB WD_BLACK SN770 (LUKS), Radeon 760M |
| OS | Zirconium 44 - an opinionated Fedora bootc image (immutable, image-based updates) running the Niri compositor |
| Terminal | foot + fish + zellij |
| Shell niceties | starship, atuin, zoxide |
| Editor | Neovim on LazyVim |
| Keyboard | MoErgo Go60 - split ergonomic |
| Phone | Pixel running GrapheneOS |
| CLI toolkit | ripgrep, fd, fzf, bat, eza, yazi, television, jq, yq, delta, gitui, bottom, dust, hyperfine |
| Containers | Rootless Podman + Distrobox |
| Tooling | mise for tools and tasks, chezmoi for dotfiles, Tailscale for access, kubectl + k9s, restic + rclone for backups |
| Secrets | 1Password CLI via fnox |
Why these choices
#| Decision | Reasoning |
|---|
| Image-based OS | Zirconium updates by swapping images, so the laptop stays reproducible and rolling back is free. |
| Terminal-first | foot is Wayland-native and fast; fish plus zellij makes long-lived sessions and SSH into the cluster pleasant. |
| Neovim on LazyVim | Keyboard-driven, behaves identically over SSH and locally, and its config is just files in chezmoi. |
| Rootless containers | Podman with no daemon and no root; Distrobox when a task wants another distro’s toolchain. |
| mise + chezmoi | Tools and configuration are declared, so any machine becomes my machine in minutes. |
| Tailscale | Private access to the homelab from anywhere without opening a port. |
| Split keyboard | Ergonomic and built to last - the biggest day-to-day quality-of-life upgrade I’ve made. |
| GrapheneOS | Hardened Android with no Google services by default. |