In the constant quest to remake every machine in your image, you need *nix config files. This repo is the "must have" set, packaged to install in one command.
Run rake (or rake install) from inside the repository. Install works against
your ~/ paths. It backs up anything it's about to clobber to a .bak file, but
whatever questionable decisions you made before installing these are on you.
Keep the repository somewhere stable and permanent. Once installed, moving or
deleting it breaks every symlink pointing back at it. Run rake uninstall before
you relocate or remove it.
Everything installs through a small set of installer classes in lib/, each
sharing the Installable concern (install / uninstall). The Rakefile is
just a manifest listing what to install and how:
Dotfile— symlinks a repo file or directory into~with a dot prefix (git/gitignore_global→~/.gitignore_global).from:names the source folder;as:overrides the target (the wholenvim/dir →~/.config/nvim).AppConfig— symlinks into~/.config/<app>/; sources mirror the target (config/alacritty/alacritty.toml→~/.config/alacritty/alacritty.toml).ShellConfig— the loader pattern (see below) forzshenv/zshrc.GitConfig— the loader pattern via git's native[include]forgitconfig.ClaudeConfig— symlinks into~/.claude/(CLAUDE.md,commands/,skills/) so Claude Code instructions and skills live in version control.bin/installs as a whole-dir symlink (~/.bin), likenvim/— executables keep their mode via git, no per-file class needed.
Backups: if a real file already lives at the target, it's renamed to
<file>.bak on install and restored on uninstall.
Files that other tools also write to — ~/.zshenv, ~/.zshrc, ~/.gitconfig —
are not symlinked to the repo. Homebrew, mise, rustup and friends append to
those files, and we don't want that landing in version control.
Instead, the repo owns a .default and each of these becomes a thin loader
that pulls in two files in order:
~/.zshrc (loader, tool-writable)
├── ~/.zshrc.default → repo (shared config, version-controlled)
└── ~/.zshrc.local → this machine only (never in the repo)
.default holds shared logic. .local holds anything machine-specific — work
credentials, $PATH tweaks, mise activate, SSL cert paths. Later wins, so
.local overrides .default, and anything a tool appends to the loader itself
overrides both.
The installer only creates a loader if one doesn't already exist, so it never stomps tool-managed lines on reinstall.
(system) → ~/.zshenv loader → .zshenv.default → .zshenv.local
(system) → ~/.zshrc loader → .zshrc.default → .zshrc.local
(.zshrc.default) → .git_prompt (git status in the prompt)
(.zshrc.default) → .aliases_shared + .aliases_shared.local
(.zshrc.default) → .zsh_aliases.local
.zshenv loads first (every shell), then .zshrc (interactive shells). Helper
functions safepathappend, safepathprepend, and safesource are defined in
.zshenv.default and used throughout.
The nvim config is the bulk of the repo and lives in nvim/, symlinked
wholesale as ~/.config/nvim. That means lazy-lock.json is version
controlled: rake install restores plugins to the locked versions, and
plugin upgrades are a deliberate act (rake plugins:update) with a
reviewable diff. Two things about the config are deliberate enough to
document:
Keybindings follow a semantic grammar — five input layers (\ do, g go,
[/] step, C- system, bare keys), five leader domain words (test, find,
search, explain, refactor), and which-key as the recall net. The grammar is
shared with two sibling editors (lore, vimoire); the full spec, philosophy,
and rulings live in KEYBINDINGS.md. The shell aliases the
editor family accordingly: rune (this config), alongside lore and
vimoire.
Colorschemes are a homegrown family in lua/palette/ — nightshade
(dark, default), daybreak (light), wisp (nightshade with washes behind
data) — one palette table each, mapped onto highlight groups by a shared
apply.lua. Switching is native :colorscheme <Tab>. The alacritty
background matches nightshade's, so terminal and editor share one black.
tmux.conf sources a static tmuxline.conf — a frozen statusbar snapshot
originally generated by tmuxline.vim.
The generator plugin is no longer active, so tmuxline.conf is now just a
standalone styling file. To regenerate it, re-enable the plugin in the nvim
config and re-snapshot.
Run rake uninstall from inside the repository. Also handy if an install fails
partway through — it removes the symlinks and restores any .bak backups.