Personal development environment for macOS, managed with GNU Stow.
Fish shell, Neovim (LazyVim), tmux, and Ghostty — configured to work together with a unified theme system that syncs dark/light mode across all tools.
Each package has its own README with the full details (aliases, plugins, keymaps, settings).
| Package | Description |
|---|---|
fish |
Shell configuration, aliases, functions, and completions |
nvim |
LazyVim-based Neovim setup for Ruby/Rails, TypeScript, Lua, and Swift/iOS |
tmux |
Terminal multiplexer with Catppuccin theme, vim-style navigation, and agent traffic lights |
pi |
pi coding agent extensions (tmux status reporting) |
ghostty |
Ghostty terminal emulator settings |
claude |
Claude Code global settings, instructions, custom agents, and slash commands |
lazydocker |
Lazydocker custom commands (e.g. recreate backend/frontend/test services) |
lazygit |
Lazygit config (main branch names for upstream detection) |
All other dependencies (fish, neovim, tmux, ghostty, fonts, etc.) are declared in the Brewfile.
git clone https://github.com/akabiru/dotfiles.git ~/dotfiles
cd ~/dotfiles
# Install all Homebrew dependencies (formulae, casks, VS Code extensions, etc.)
brew bundle
# Symlink all packages
stow fish nvim tmux ghostty claude lazydocker lazygit bin pi
# Or symlink individually
stow fish
stow nvimAfter stowing, install tmux plugins:
# Start tmux, then press prefix + I to install plugins via TPM
tmuxThe Brewfile captures the full development environment:
| Category | Examples |
|---|---|
| Taps | anomalyco/tap, withgraphite/tap |
| Formulae | fish, neovim, tmux, starship, ripgrep, gh, nodenv, rbenv, postgresql, redis, stow, lazygit, lazydocker, ollama, overmind, hledger |
| Casks | Ghostty, Arc, Firefox, Docker Desktop, OrbStack, RubyMine, Zed, VS Code, Spotify, JetBrainsMono Nerd Font |
| VS Code Extensions | Ruby LSP, Claude Code, GitLens, Prettier, ESLint, Docker, Terraform, Go, and more |
| Go packages | gopls, wails |
| npm globals | corepack, yarn |
To update the Brewfile after installing new packages:
brew bundle dump --forceA unified dark/light mode system that keeps Neovim, tmux, and Ghostty in sync, driven by the fish theme function.
┌──────────────┐ writes ┌──────────────┐
│ theme [mode] │ ───────────────▶│ ~/.theme-mode │
│ (fish func) │ │ (dark/light/ │
└──────┬───────┘ │ auto) │
│ └───────┬───────┘
│ applies directly │ read on focus/startup
▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Ghostty │ │ tmux │ │ Neovim │
│ config edit │ │ @catppuccin │ │ vim.o.back- │
│ │ │ _flavor │ │ ground │
└──────────────┘ └──────────────┘ └──────────────┘
| Mode | Behavior |
|---|---|
dark |
Force Catppuccin Mocha everywhere |
light |
Force Catppuccin Latte everywhere |
auto |
Follow macOS system appearance (detected via defaults read -g AppleInterfaceStyle) |
- Fish —
themefunction writes~/.theme-modeand applies changes immediately - Neovim —
FocusGainedautocmd reads~/.theme-modeand updates background - tmux — reads
~/.theme-modeat startup, sets catppuccin flavor before plugin loads - Ghostty — config file updated directly by
themefunction
# Create the package directory mirroring the target structure
mkdir -p newpkg/.config/newpkg
# Add your config files
vim newpkg/.config/newpkg/config
# Symlink it
stow newpkgStow will create symlinks from ~/.config/newpkg/ pointing to your dotfiles repo. A README.md at the package root is safe: stow's default ignore list skips README.*, so it documents the package on GitHub without being symlinked into ~.
MIT