My Claude Code configuration, shared publicly for reference. Includes install script and tests suite.
Keep CLAUDE.md minimal - a set of focused rules beats a sprawling prompt.
Use hooks, not prompt instructions. Hard rules belong in hooks, not "reminders" to the LLM. Hooks are enforced mechanically. Instructions are mere suggestions that waste context (and tokens!).
Cross-platform notifications for long tasks. Do you scroll the Internet while Claude is working? Have Claude send a notification when a long-running turn completes. Configurable with CLAUDE_NOTIFICATION_THRESHOLD (default 120 seconds) and CLAUDE_NOTIFICATION_METHOD (default say; use notification for visual popups).
Terse output style Use flat language, avoid synchopatic filler phrases ("Great idea!", "You're absolutely right!"). Summarize edits concisely. Less noise, direct feedback.
Behaviors enforced by hooks:
- Hard block destructive commands such as
rm -rfanddrop table users - Send notifications at the end of long-running turns (default: 120 seconds)
- macOS: uses
say(audio) by default; setCLAUDE_NOTIFICATION_METHOD=notificationfor visual popups viaosascript - Windows: uses PowerShell
BurntToastif available; silently skipped otherwise - Linux: silently skipped (no built-in notification tool assumed)
- macOS: uses
The install script halts if you are not me.
If you want to use it:
- Fork this repo
- Review and customize
settings.hooks.json,CLAUDE-user.md, and the hook scripts for your own setup - Edit
install.shto check for your own username instead ofnoahlz - Run
./install.shfrom your fork
Running someone else's Claude Code config without reviewing it first is a bad idea — hooks run automatically and can have broad system access.
- Node.js >= 18 (installation and test suite)
- macOS, Windows, or Linux (notifications are cross-platform)
git clone https://github.com/noahlz/claude-code-config.git
cd claude-code-config
./install.shThe script creates symlinks into your ~/.claude/ (Claude user home) into files in the repo. If a file already exists at a target path, it is backed up as <filename>.bak before being replaced. Running it again on already-linked files is safe — those are silently skipped.
This project has executable code...so we need unit tests!
npm test- Test hook scriptsnpm run test:integration- Test hooks viaclaude -p --model haikunpm run test:all
NOTE: Integration tests require an Anthropic API key and use real tokens!
I (with Claude) completely re-wrote my user-level CLAUDE.md after watching these two videos by Matt Pocock:
"How to actually force Claude Code to use the right CLI (don't use CLAUDE.md)"
Check them out!

