Personal dotfiles for John Stegeman, managed with haven. Works on both macOS and Linux.
- haven for dotfile and environment management with cross-platform support
- Ayu Dark as the color theme across every tool that supports theming
- Fish shell with a Starship prompt (native jj support) and
zefor frecency navigation - Jujutsu (jj) as the version control system
- Neovim as the editor
- Ghostty as the terminal, with tmux for multiplexing
- herdr and Orca for running AI coding agents in panes and worktrees
- Kanata for keyboard remapping with the Gallium layout, and AeroSpace for window management
- 1Password integration for secrets management (macOS)
- Homebrew and mise for packages, both tracked in this repo
Ayu Dark, everywhere. Each tool applies it through its own mechanism:
| Tool | Ayu Dark via |
|---|---|
| Fish shell | fish_config theme choose "Ayu Dark" (fish/themes/Ayu Dark.theme) |
| Starship prompt | [palettes.ayu-dark] in starship.toml |
| Neovim | ayu colorscheme via AstroNvim |
| Helix | built-in ayu_dark theme |
| Zed | Ayu Dark / Ayu Light |
| VS Code | Ayu Dark theme, from the teabyii.ayu extension |
| Ghostty | theme = "Ayu" |
| Wezterm | inline ANSI table in wezterm.lua |
| tmux | tmux/ayu.conf |
| bat | --theme='Ayu Dark' |
| delta | syntax-theme = "Ayu Dark" |
| Atuin | [theme] name = "ayu-dark" |
| btop | color_theme = "ayu" |
| herdr | [theme] name = "ayu-dark" |
| zellij | theme "ayu_dark" (config still tracked; zellij is being retired) |
Fish is the default shell. Zsh is configured as a fallback but sees no real use.
Starship with the Ayu Dark palette, initialized from config.fish
(starship init fish + enable_transience). Transience is on, so finished prompt lines
collapse.
<os> <directory> [python env] [status] <vcs>
❯
VCS comes from Starship's native modules with [vcs] order = ["jj", "git"]: inside a jj
repo the jj_* modules render from a single jj call (bookmark, change ID, lines
added/removed, per-file flags), and the git_* modules take over elsewhere. There are no
[custom] prompt modules.
Managed with fisher, listed in
fish/fish_plugins:
jorgebucaran/autopair.fish— automatic bracket and quote pairingnickeb96/puffer-fish—...expands to../.., and so onPatrickF1/fzf.fish— fzf integrationjohnstegeman/fish-take—take <dir>, mkdir and cd in one step
fisher update installs and updates them all.
cd is wrapped by ze, a frecency-based directory jumper (its ze.sh and zex.sh live
in ~/bin). .. is a small tracked function. There is no zoxide.
| Editor | Role | Notes |
|---|---|---|
| Neovim | Primary | $EDITOR; AstroNvim with the ayu colorscheme. The config is its own repo at ~/.config/nvim — only its flash plugin spec is tracked here |
| Helix | Configured, not installed | helix/config.toml and Ayu Dark are tracked for whenever it is |
| Zed | Secondary | What hv ed opens the source directory in |
| VS Code | Available | Settings tracked as a symlinked settings.json |
| Terminal | Role |
|---|---|
| Ghostty | Primary |
| tmux | Multiplexer — tpm plugins, prefix Ctrl+Space |
| herdr | Terminal workspace manager for AI coding agents |
| Orca | Agent worktrees, terminals and runtimes |
| Wezterm | Alternative — cask tracked in brew/Brewfile.macos, not currently installed |
zellij's config is still tracked, but zellij is being retired and nothing here depends on it.
jj is the primary VCS and the configured haven backend
([vcs] backend = "jj"). This repo is colocated jj + git. Git is configured for the
repositories that still need it — delta as pager, SSH commit signing through 1Password,
diff3 conflicts. See docs/version-control.md.
Two mechanisms, both tracked here:
- Homebrew — one Brewfile per module (
brew/Brewfile.shell,.utilities,.vcs,.cloud,.k8s,.macos,.ai), selected bymodules/*.toml. - mise — runtimes and CLI tools (
mise/mise.*.toml, plustoolsinmise.toml).
haven list prints the authoritative inventory of both. docs/utilities.md
describes the tools themselves and docs/apps.md covers GUI apps.
Kanata remaps the keyboard to the
Gallium layout from ~/config/Gallium.cfg. On macOS
it runs as a user LaunchDaemon whose plist is a haven template that resolves the binary
path.
Window management is AeroSpace with
felixkratz/borders drawing focus rings. See docs/keyboard.md.
- 1Password for secrets; SSH keys live in 1Password and are used through its SSH agent
- Orbstack for containers and Linux VMs
- Finicky for URL routing
- Homebrew paths handled for both Apple Silicon (
/opt/homebrew) and Intel (/usr/local)
| Doc | Contents |
|---|---|
| Fish Shell | Prompt, plugins, tool integrations, every tracked function |
| Utilities | CLI tools and what they replace |
| macOS Apps | Homebrew casks — GUI apps with descriptions |
| Version Control | jj workflow, multi-remote setup, git configuration |
| Keyboard | Gallium layout, Kanata, Helix keybindings, window management |
| Python | uv for versions, virtual environments and dependencies |
| Java | mise for JDKs, jbang for scripting |
| Customizing | Forking, adding functions and plugins, secrets, templates |
| Installation | Setup steps — partially reworked, sections still reference chezmoi |
haven init gh:johnstegeman/haven --applySSH keys and other secrets are managed through haven's 1Password integration. Private keys live in 1Password and are used through its SSH agent — no plaintext keys on disk.
| File | Purpose |
|---|---|
~/.config/fish/config.fish |
Fish shell configuration |
~/.config/fish/fish_plugins |
Fisher plugin list |
~/.config/starship.toml |
Starship prompt (Ayu Dark palette) |
~/.config/git/config |
Git configuration |
~/.config/jj/config.toml |
Jujutsu configuration |
~/.config/helix/config.toml |
Helix configuration |
~/.config/nvim/ |
Neovim — config maintained outside this repo |
~/.config/ghostty/config |
Ghostty terminal |
~/.config/wezterm/wezterm.lua |
Wezterm terminal |
~/.tmux.conf |
tmux (sources ~/.config/tmux/ayu.conf) |
~/.config/herdr/config.toml |
herdr workspace manager |
~/.config/aerospace/aerospace.toml |
AeroSpace window manager |
~/.config/atuin/config.toml |
Atuin history |
~/.config/btop/btop.conf |
btop |
~/.config/bat/config |
bat |
~/.config/mise/config.toml |
mise |
~/config/Gallium.cfg |
Kanata layout |