Personal macOS dotfiles managed by chezmoi. Source of
truth lives in this repo (~/dev/dotfiles); chezmoi renders/copies into ~.
brew install chezmoi
chezmoi init --apply rlch/dotfilesYou'll be prompted once for role:
| role | machine | extras |
|---|---|---|
mbp |
MacBook Pro M5 Max | Brewfile.heavy (Ollama) |
mini |
Mac mini (or anything else) | base Brewfile only |
The role is persisted to ~/.config/chezmoi/chezmoi.toml. Re-run
chezmoi init to be re-prompted.
chezmoi diff # preview pending changes
chezmoi apply # deploy
chezmoi cd # cd into source dir
chezmoi edit ~/.config/foo/bar # edit source for a deployed fileEdit files inside this repo (dot_config/..., dot_claude/..., Brewfile),
not the deployed copies in ~ — the next chezmoi apply will overwrite them.
| Concern | Tool |
|---|---|
| Manager | chezmoi |
| Shell | fish 4 + fisher |
| Terminal | Ghostty |
| Multiplexer | tmux |
| Window manager | AeroSpace |
| Editor | Neovim (LazyVim base, no AI plugins) |
| Prompt | starship |
| History | atuin |
| Versions | mise (node, python, go, bun) |
| Git TUI | lazygit |
| Containers | OrbStack |
| AI CLIs | Claude Code, Codex, Hermes Agent (heavy hardware) |
| Local LLM | Ollama (heavy hardware) |
| Browser | Firefox + tridactyl |
| Notes | Obsidian |
| Launcher | Raycast |
| Secrets | 1Password CLI |
.chezmoi.toml.tmpl → renders ~/.config/chezmoi/chezmoi.toml on init
.chezmoiignore → files in this repo that shouldn't deploy to ~
.chezmoiscripts/ → run-on-change install hooks (brew, fisher)
Brewfile → base packages, every machine
Brewfile.heavy → installed only when role = mbp
dot_claude/ → ~/.claude/ (Claude Code settings)
dot_config/ → ~/.config/ (everything else)
dot_ is a chezmoi prefix that maps to a leading . in ~. Other prefixes:
private_ (0700/0600 perms), executable_ (0755), create_ (write once,
never overwrite), run_onchange_ (script that re-runs when its rendered
content changes).
See CLAUDE.md for the agent-oriented deep dive (conventions,
invariants, common tasks).
subflow runs a headless fetch -> EN/ZH merge -> push flow.
Examples:
# Movie
subflow fetch movie "Oppenheimer 2023"
# TV episode (explicit show + episode tag)
subflow fetch tv "Breaking Bad S01E01" --show "Breaking Bad" --season-episode S01E01
# Prefer WEB/AMZN releases, avoid BluRay/DVD
subflow fetch tv "Succession S02E01" --show "Succession" --season-episode S02E01 --prefer-tag web --prefer-tag amzn --avoid-tag bluray --avoid-tag dvd
# Shift an already-downloaded subtitle by +1.5s
subflow shift ~/Downloads/subtitleflow/Succession.S02E01.zh.srt --seconds 1.5
# Test without uploading to mini
subflow fetch tv "Severance S02E01" --show "Severance" --season-episode S02E01 --dry-runDefaults:
- push host:
richards-mac-mini - movie dir:
/Users/rjm/Server/data/media/movies - tv dir:
/Users/rjm/Server/data/media/tv - TV output filename:
<show>[.<SxxExx>].zh.srt - merged cue text format: English first line, Chinese second line