My personal dev environment for working with Claude Code on macOS. It sets up a terminal, shell, and prompt, and installs the devloop plugin for structured feature work. Everything is managed with symlinks — clone it, run the install script, and it wires itself into place.
This is opinionated and intentionally simple. It's not a framework. It's an example of what works for me. Look through it, take what's useful, ignore the rest.
Ghostty config with split panes and a project picker. Cmd+P (Ghostty keybind) or Ctrl+P (zsh widget) opens a fuzzy finder to jump between project directories.
Zsh with a Starship prompt showing git branch, language versions, and status. Modular config in zsh/conf.d/ — path, prompt, aliases, widgets, SSH agents, and a local override file (~/.zshrc.local) for machine-specific config that isn't tracked.
Workflow skills are provided by the devloop plugin (/dl:brainstorm → /dl:research → /dl:plan → /dl:design → /dl:implement → /dl:review). The install script registers the devloop marketplace and installs the plugin automatically. See the guide for a walkthrough.
Personal Claude config (hooks, statusline, global instructions) stays in this repo under claude/. Its settings.json also enables two plugins: dl@devloop-marketplace (the workflow skills above) and swift-lsp@claude-plugins-official (Swift language server).
Small scripts symlinked to ~/.local/bin/:
| Command | What it does |
|---|---|
cheat |
Render markdown cheatsheets with glow |
view-brainstorm |
Browse brainstorm decision logs |
view-research |
Browse research artifacts |
view-plan |
Browse saved plans with fzf + glow |
view-design |
Browse saved designs (ctrl-d opens diagrams) |
view-implement |
Browse implementation notes |
view-review |
Browse code review findings |
open-diagrams |
Open .mmd architecture diagrams in the browser |
picker-paths |
Manage project picker search directories |
claude-context |
Statusline showing directory, git branch, context %, session cost |
See the cheatsheet for the full reference.
Two distinct hook layers, wired differently.
Git hooks (git-hooks/, wired via a global core.hooksPath):
pre-commit— runsshellcheckandshfmton staged shell scripts (skips zsh files).post-commit— appends the commit message to~/.claude/activity.log.
Claude Code hooks (claude/hooks/, wired via settings.json):
check-branch.sh— aPreToolUsehook matching Bashgit commitcalls. Blocks the commit if the current branch ismain/master, requiring afeature/<slug>branch first. Resolves the actual target repo from a leadingcd <dir> &&orgit -C <dir>in the command, so multi-repo commands (e.g.cd ../other-repo && git commit ...) get checked against that repo's branch, not just the hook's own invocation cwd.log-activity.sh— fires onSessionStart,PostToolUse,SubagentStart, andSubagentStop, appending structured activity lines to the same~/.claude/activity.log.
Requires macOS and Homebrew, and Claude Code ≥ 2.1.181 (≥ 2.1.198 for /dl:implement all) — devloop's floor, needed for nested subagent depth and custom agent support; the higher bar for all mode reflects subagents defaulting to background from that version, which /dl:implement all needs to run in the foreground to keep each task's verify-and-commit step atomic.
git clone https://github.com/minusblindfold/devenv.git ~/path/of/your/choice
cd ~/path/of/your/choice
./install.sh
./verify.shRestart your terminal after install.
The install script is idempotent — safe to run multiple times. It symlinks everything into place and backs up any existing files to ~/.dotfiles_backup/<timestamp>/ before replacing them. Dependencies are installed automatically via the Brewfile:
| Tool | Purpose |
|---|---|
ghostty |
Terminal emulator |
claude-code@latest |
Claude Code CLI |
fzf |
Fuzzy finder (project picker, viewers) |
glow |
Markdown renderer (cheat, viewers) |
starship |
Shell prompt |
jq |
JSON processing (bin scripts) |
gh |
GitHub CLI |
shellcheck |
Shell script linter (pre-commit hook) |
shfmt |
Shell script formatter (pre-commit hook) |
bun |
JS runtime (bunx ccusage for cost tracking) |
font-jetbrains-mono-nerd-font |
Nerd font for terminal icons |
Troubleshooting
font-jetbrains-mono-nerd-font not found
On Homebrew older than 4.x, cask fonts live in a separate tap:
brew tap homebrew/cask-fonts
brew install --cask font-jetbrains-mono-nerd-fontFiles ending in .symlink are linked into $HOME with a dot prefix (e.g., git/gitconfig.symlink → ~/.gitconfig). For tools with complex layouts, there's a dedicated install_*() function in install.sh. Run ./install.sh after adding anything.
./uninstall.shRemoves all symlinks and config that install.sh created. Only removes symlinks that point back to this repo — real files and user customizations are left untouched. Homebrew packages are left in place (uninstall manually if needed). Safe to run multiple times.
Pull the repo and re-run ./install.sh. Symlinked config updates in place. The devloop plugin updates separately via claude plugin update dl@devloop-marketplace.
- Guide — terminal setup, the skill workflow, rules, and tips
- Cheatsheet — quick reference for all keybindings, commands, and CLI tools
- devloop — the Claude Code plugin powering the workflow skills
examples/rule-packs/— copy-paste starter rule packsdocs/rules.md— rule file format spec
