My personal Claude Code configuration — operating notes (CLAUDE.md), status line, commands, skills, hooks, and settings. Clone it on any machine and run one script to get the same setup.
[Fable · high] 🟢 14% (142K/1000K) | 📁 evex-backend | 🌿 master | ⏱️ Jun 8, 9:14am
git clone https://github.com/mattkuda/claude-code-setup.git
cd claude-code-setup
./install.shThen restart Claude Code so it reloads ~/.claude/settings.json.
The installer copies files into ~/.claude/. It will not overwrite an existing settings.json or .mcp.json — those get seeded only on a fresh install.
| Path | What it is |
|---|---|
CLAUDE.md |
Global operating notes — model-delegation policy (Fable orchestrates → Sonnet implements → Opus escalates) + response formatting |
settings.example.json |
Template for ~/.claude/settings.json — hooks, statusline, env vars, plugins |
mcp.example.json |
Template for ~/.claude/.mcp.json — MCP servers (Supabase etc.) |
statusline/statusline.sh |
Bash script that renders the status line |
commands/ |
Slash commands (/review-branch) |
skills/ |
Skills (grill-me, html-spec) |
hooks/ |
Stop hooks (mirror-ai-title.sh — auto-populates the session title; stop-sound-main-only.sh — chimes only on the main agent, not sub-agents) |
install.sh |
Copies everything into ~/.claude/ |
statusline/statusline.sh reads JSON on stdin from Claude Code and prints:
[Model · effort] <colored dot> <context %> (<tokens used>/<context size>) | 📁 cwd | 🌿 branch | ⏱️ last message time
- 🟢 < 60% context, 🟡 60–80%, 🔴 ≥ 80%
- The right segment shows the absolute time of your last sent message, read from the session transcript (
transcript_path) — the last entry you typed, ignoring tool results — formatted likeJun 8, 9:14am. It's deliberately absolute, not relative (13m ago): the status line only re-renders on Claude Code's refresh cadence, so a relative value freezes when you switch away and come back, whereas an absolute timestamp stays correct with nothing to update. Falls back to a per-session tmpfile in~/.claude/statusline/if the transcript isn't readable. - Git branch only shows when the cwd is inside a repo
Wired up in settings via:
"statusLine": {
"type": "command",
"command": "$HOME/.claude/statusline/statusline.sh"
}hooks/mirror-ai-title.sh is a Stop hook that copies Claude Code's native ai-title into the session's displayed custom-title, so the title chip auto-populates without a manual /rename. It makes no LLM call — it only mirrors the title Claude already generated — keeps no state/marker files, and respects a manual /rename (it backs off if the current title was never one of Claude's ai-titles, and otherwise keeps the chip in sync as the ai-title evolves). Requires jq. Wired up in settings.example.json as a second Stop hook.
hooks/stop-sound-main-only.sh is the Stop-sound wrapper. Claude Code converts a Stop hook to SubagentStop for sub-agents, so a plain sound hook chimes once per sub-agent. This wrapper checks the hook payload for an agent_id (present only inside a sub-agent / teammate call) and stays silent for those — so with the delegation workflow you hear one chime, when the main agent finishes and it's your turn. Uses jq if present, else a grep fallback.
- Stop / Notification hooks play
Glass.aiffwhen the main agent finishes a turn or needs permission — handy when working in another window. The Stop sound is gated to the main agent only (stop-sound-main-only.sh), so parallel sub-agents don't each chime. CLAUDE_CODE_EFFORT=high(pluseffort/effortLevel) — high is the sweet spot; xhigh/max tend to overthink simple steps and cost more without better results.defaultMode: bypassPermissions+dangerously-skip-permissions: trueskip most permission prompts. Read these before installing — they trade safety for speed. Remove them if you'd rather be prompted before destructive tool calls.- Plugins:
frontend-design,swift-lsp,feature-dev,superpowers(official);andrej-karpathy-skills(fromforrestchang/andrej-karpathy-skills);warp(fromwarpdotdev/claude-code-warp).
CLAUDE.md loads into every session as always-on guidance. It sets a delegation policy — the main model (Fable / Opus) orchestrates and plans, spawns Sonnet sub-agents for the actual implementation, and escalates to Opus only when Sonnet's output misses the bar — plus a response-formatting convention. No plugin or custom agents required; sub-agents are spun up on the fly.
After pulling new commits, re-run ./install.sh to push the latest commands/skills/hooks/statusline into ~/.claude/. Your local settings.json, .mcp.json, and CLAUDE.md are left untouched — diff them against the repo versions manually if you want to pull in new defaults.
MIT.