Managed with GNU Stow.
git clone <your-dotfiles-repo-url> ~/dotfiles
cd ~/dotfiles
./bootstrap
./scripts/install-tools.sh
./scripts/doctor.shbootstrap will:
- install Linux prerequisites for Homebrew (Linux only)
- install Homebrew if needed
- install
stowif needed - run
./installto create all symlinks
Use these scripts to install package managers, runtimes, and cargo CLI tools:
cd ~/dotfiles
./scripts/install-tools.shThis uses:
Brewfilefor cross-platform Homebrew packagesBrewfile.macosfor macOS-only packages/casksBrewfile.linuxfor Linux-only Homebrew packagesmise.tomlfor language runtimescargo-tools.txtfor cargo-installed binaries
PHP is intentionally not managed by mise right now because Herd is in use.
Current mise runtimes: Rust, Bun, Python, Node.js, Java, Gradle, and Ruby.
Validate the setup:
cd ~/dotfiles
./scripts/doctor.shcd ~/dotfiles
./bootstrap
./scripts/install-tools.sh
./scripts/doctor.sh
./scripts/audit-tools.shbootstrap/install-tools.sh will call scripts/install-linux-prereqs.sh when running on Linux.
Use these scripts for a locked-down Linux VPS flow:
cd ~/dotfiles
TAILSCALE_AUTHKEY=tskey-auth-... ./scripts/bootstrap-vps.sh
./scripts/install-tools-vps.sh
./scripts/doctor-vps.shDefaults:
- admin user:
christian - SSH keys: copies
/root/.ssh/authorized_keysintochristianon first run
Important flags:
VPS_USER=...sets the admin username (defaultchristian)VPS_USER_SSH_PUBKEY='ssh-ed25519 ...'appends a key for the admin userVPS_PASSWORDLESS_SUDO=1(default) configures NOPASSWD sudo for the admin userDOTFILES_REPO=https://...clones the dotfiles repo into~/dotfileson the VPSALLOW_PUBLIC_SSH=1keeps port 22 open in UFW (useful for first bootstraps)SKIP_UFW=1skips firewall setupINSTALL_VPS_CARGO_TOOLS=1installscargo-tools.vps.txtTAILSCALE_REQUIRED=0letsdoctor-vps.shpass when Tailscale is intentionally not connected yet
Note: if Tailscale is not connected when the firewall is configured, ALLOW_PUBLIC_SSH
is automatically promoted to 1 with a warning to prevent SSH lockout. Rerun the
bootstrap after Tailscale is connected to close port 22.
Generate a snapshot of what is currently installed:
cd ~/dotfiles
./scripts/audit-tools.shBy default this writes files to audit/latest/.
If you already have stow:
cd ~/dotfiles
./installaerospace->~/.aerospace.toml(macOS only)git->~/.gitconfigkitty->~/.config/kittynu->~/.config/nushellnvim->~/.config/nvimopencode->~/.config/opencode/*pi->~/.pi/*starship->~/.config/starship.tomlzellij->~/.config/zellij
# preview changes
stow -nv -t ~ <package>
# (re)link package
stow -R -t ~ <package>
# unlink package
stow -D -t ~ <package>- Create a package folder in this repo.
- Mirror the target path under that package (for example
foo/.config/foo/config.toml). - Run
stow -R -t ~ foo.
The pi/ package is linked into ~/.pi and is laid out for Pi's global config:
pi/.pi/agent/settings.json— global Pi settingspi/.pi/agent/keybindings.json— custom Pi shortcutspi/.pi/agent/extensions/— TypeScript extensionspi/.pi/agent/prompts/— Markdown prompt templatespi/.pi/agent/skills/— skills withSKILL.mdpi/.pi/agent/themes/— theme JSON files
Runtime state like ~/.pi/agent/auth.json and ~/.pi/agent/sessions/ stays local and is not tracked in git.
See pi/README.md for a quick guide to what belongs in each folder.