Personal macOS development environment managed with Chezmoi. Keyboard-centric workflow with extensive automation and tool integration.
- Key Features
- Installation
- Chezmoi & ASDF
- Shell Environment
- Git & 1Password
- Terminal Tools
- AI & LLM Integration
- Neovim
- macOS Automation
| Feature | Description |
|---|---|
| π€ Agent Memory | Beads integration for AI task tracking |
| π Secure Identity | 1Password SSH agent with work/personal switching |
| π³ Git Worktrees | Worktree management with PR integration |
| π Neovim | Custom LSP, AI commits, refactoring tools |
| π Fish Shell | 30+ custom productivity functions |
| π¦ Brewfile | 300+ formulas and casks |
| βοΈ ASDF | Version manager with automatic switching |
- Install 1Password: Required for SSH agent and secret management.
sh -c "$(curl -fsLS get.chezmoi.io/lb)" -- init --apply kapral18- Chezmoi installs and initializes from this repository
- Prompts for:
- Primary email and SSH public key
- Secondary credentials (if personal machine)
- Work machine confirmation
- PGP cache TTL preference
- Applies all dotfiles, scripts, and configs
- Installs Homebrew packages
- Configures language version managers (cargo, go, npm, uv)
- Applies macOS system preferences
Configuration management with templates and scripts.
Key Concepts:
-
Conditional Logic (
.isWork): Templates use{{ .isWork }}to handle:- Different Git identities and SSH keys
- Work-specific ASDF plugins
- Separate Homebrew cask installations
- Different PGP cache timeouts
-
Executable Scripts: Files with
executable_prefix go to~/bin:home/exact_bin/executable_f-wtree β ~/bin/f-wtree -
Automated Hooks: Scripts in
.chezmoiscripts/run automatically:run_once_before_*- One-time setup (e.g., Xcode installation)run_once_after_*- One-time post-install (e.g., Homebrew setup)run_onchange_after_*- Run when template changes (e.g., package updates)
Version manager for languages and tools.
How it works:
-
Declarative Plugins (
asdf_plugins.tmpl): Conditionally install pluginsnodejs ruby {{ if ne .isWork true }}lua{{ end }} -
Version Pinning (
.tool-versions.tmpl): Pin tool versionsnodejs 20.11.0 ruby 3.2.2 -
Automatic Switching:
cdinto a project and the right versions activate via ASDF shims.
Fish is the primary shell, with Zsh and Bash also configured.
Git worktree helpers for easier branch management.
Create worktrees from:
- Existing local branches
- Remote branches (
origin,upstream) - Fork branches (
f-wtree add user/branch) - New branches from
HEAD - Nested directories for
feature/new-uiβ../feature/new-ui/
PR reviewer workflow:
- Search by PR number or keywords
- Select with
fzf(shows diff, description, CI status) - Fetch PR metadata via GitHub API
- Add contributor's fork temporarily
- Create worktree for PR branch
- Launch named tmux session
Interactive cleanup:
- Removes worktree directories
- Deletes local branches
- Cleans up fork remotes
- Removes empty parent directories
- Purges paths from zoxide
- Kills tmux sessions
30+ scripts in ~/bin:
| Script | Purpose |
|---|---|
f-add-patch-to-prs |
Add .patch files to PRs |
f-appid |
Get macOS bundle identifiers |
f-apply-app-icons |
Apply custom app icons from YAML |
f-check-backport-progress |
Check backport status |
f-cp-files-for-llm |
Concatenate project files for LLM context |
f-fuzzy-brew-search |
Interactive Homebrew search |
f-gh-subissues-create |
Create GitHub sub-issues |
f-history-sync |
Sync fish history via 1Password |
f-list-prs |
Advanced PR filtering |
f-pdf-diff |
Visual PDF comparison |
f-tmux-lowfi |
Control lowfi music player |
f-to-gif / f-vid-ipad |
Video processing |
All scripts include error handling, --help text, and Fish completions.
Manage separate Git identities (personal/work) automatically.
- Global config sets
sshCommand = ssh -o IdentityFile="~/.ssh/primary_public_key.pub" - Points to public key (safe on disk)
- 1Password SSH agent fetches matching private key from vault
- Conditional include
[includeIf "gitdir:~/work/"]loads work config - Work config points to
work_public_key.pubfor different private key
Result: Automatic identity switching based on directory, no private keys on disk.
Aliases:
git wtgrab <worktree>- Transfer uncommitted changes between worktreesgit squash <n>- Interactive squashgit u- Fetch, rebase, and prunegit hide/unhide- Ignore local changes to tracked files
Defaults:
rerere- Auto-resolve repeated conflictsrebase.autoSquash = truerebase.updateRefs = truediff.algorithm = histogrammerge.conflictStyle = zdiff3feature.manyFiles = true
gh-dash: Terminal UI for GitHub PRs and issues
- Separate views for work/personal repos
- Custom filters and layouts
- Config:
home/dot_config/exact_gh-dash/config.yml
TUIs:
- gitui - Fast keyboard-driven UI
- lazygit - Simple terminal interface
- tig - History viewer
Prefix: C-Space
Plugins:
| Plugin | Function |
|---|---|
tpm |
Plugin manager |
tmux-resurrect + tmux-continuum |
Auto-save sessions every 15min |
tmux-pain-control |
Pane resize/swap |
tmux-sessionist |
Session switching |
tmux-fzf-url |
Extract URLs from scrollback |
tmux-theme-catppuccin |
Theme |
Neovim Integration:
Ctrl-Shift-h/j/k/l- Passthrough to Neovim- Vi mode for navigation and copy
Default terminal emulator (GPU-accelerated).
Config (home/dot_config/exact_ghostty/config):
- Hidden titlebar, no shadows
- JetBrainsMono Nerd Font 14pt
- Copy-on-select
- Shell integration
Language server for Fish scripts:
- Completions
- Syntax checking
- Go-to-definition
- Diagnostics
AI tools for CLI and editor. Credentials in 1Password, configs in repo.
| Tool | Purpose | Config |
|---|---|---|
| Crush | Terminal AI assistant | Charmbracelet tap |
| Ollama | Local LLM runtime | run_onchange_after_05-add-ollama-models.sh |
| OpenEncode | CLI AI agent | Homebrew |
| Amp | AI coding tool with MCP | dot_config/amp/settings.json |
| Cursor | AI code editor (work) | .isWork conditional |
Ollama Models:
gpt-ossdeepseek-r1
Neovim Integration:
- AI commit message generation
- Backends: Ollama, Cloudflare AI, OpenRouter
Custom IDE setup.
| Feature | Description |
|---|---|
| Dynamic Winbar | Project-relative file paths |
| Smart Tab | Copilot β snippets β bracket jumping |
| Minimal View | Conceal long className to β¦ |
| Keymaps | jkβESC, Alt-j/k jump 10, Ctrl-Alt-j/k move lines |
Filter when searching definitions/references:
- Exclude tests,
node_modules - Exclude import statements
- Show CODEOWNERS info
- Run
describe/itblock under cursor - Handle parameterized tests
- Debug mode
- Update snapshots
Generate commit messages from staged changes:
- Backends: Ollama, Cloudflare AI, OpenRouter
- Conventional commits format
Move code to new files:
- Select exported code
- Specify target file
- Auto-update import paths
Jump between source and test files with Ctrl-^.
LargeFiles- Find files by line countCpFromDownloads- Copy from Downloadsowner-code-search- Search by CODEOWNERSshow-file-owner- Display file owner
Lua-based automation.
Keyboard mouse control:
h/j/k/lto move cursor- Grid mode for precise positioning
Hyper key + movement:
Hyper + h- Snap leftHyper + l- Snap rightHyper + k- Snap topHyper + j- Snap bottomHyper + m- Maximize
Script: f-apply-app-icons
- YAML mapping (
app_icons/icon_mapping.yaml) - Uses
fileiconto apply icons - Assets in
app_icons/assets/
| System | File | Purpose |
|---|---|---|
| Homebrew | readonly_dot_Brewfile.tmpl |
macOS apps, CLI tools, fonts |
| Cargo | readonly_dot_default-cargo-crates |
Rust packages |
| Go | readonly_dot_default-golang-pkgs |
Go tools |
| Gems | readonly_dot_default-gems |
Ruby packages |
| npm | readonly_dot_default-npm-pkgs |
Node.js globals |
| uv | readonly_dot_default-uv-tools.tmpl |
Python tools |
| eget | readonly_dot_default-eget-packages.tmpl |
GitHub releases |
Install scripts run via chezmoi hooks when files change.
- Tmux sessions auto-restore
f-wtree add feature/new-ui- new worktree + tmux sessionf-wtree prs 12345- checkout PR- Jest runner in Neovim
- AI-generated commit
f-wtree remove- cleanup
brew update && brew upgrade
chezmoi applysh -c "$(curl -fsLS get.chezmoi.io/lb)" -- init --apply kapral18- Chezmoi configs:
home/ - Neovim:
home/dot_config/exact_nvim/ - Fish:
home/dot_config/fish/ - Scripts:
home/exact_bin/ - Brewfile:
home/readonly_dot_Brewfile.tmpl
See also: AGENTS.md for AI agent instructions
