Permissions: Stop Clicking 'Allow' on Everything
The #2 complaint about Claude Code is permission fatigue. Here's how to configure auto-accept for tools you trust and keep review for things that matter.
The Permission Problem
You ask Claude Code to refactor a component. It wants to read a file — allow. Edit a file — allow. Read another file — allow. Run a test — allow. Five clicks before anything happens.
This is the number two complaint about Claude Code (number one is cost). And it's completely fixable. You just have to configure it once.
Setting Up allowedTools
The magic lives in your settings.json. There are three levels:
Project-level (.claude/settings.json in your repo) — shared with your team via git. Best for project-specific tools.
User-level (~/.claude/settings.json) — your personal defaults across all projects.
Here's what a solid starting config looks like:
{
"permissions": {
"allow": [
"Read",
"Glob",
"Grep",
"LS",
"Bash(npm test*)",
"Bash(npm run lint*)",
"Bash(npx tsc*)",
"Bash(git status*)",
"Bash(git diff*)",
"Bash(git log*)"
],
"deny": [
"Bash(rm -rf*)",
"Bash(git push --force*)",
"Bash(git reset --hard*)"
]
}
}Read operations are always safe to auto-accept. Test and lint commands are safe. Destructive git commands? Always review.
The /permissions Command
Already in a session and tired of clicking? Type /permissions to manage permissions on the fly.
Trust Levels: What to Auto-Accept vs Always Review
Always auto-accept (safe):
Read— reading files never changes anythingGlob— searching file names is harmlessGrep— searching file contents is harmlessLS— listing directories is harmlessBash(git status*)— read-only git commandsBash(git diff*)— read-only git commandsBash(git log*)— read-only git commands
Auto-accept with patterns (mostly safe):
Bash(npm test*)— running testsBash(npm run lint*)— running lintersBash(npx tsc*)— type checkingBash(cat *)— reading file contentsEdit— if you trust Claude Code's edits (most people get here after a week)
Always review (potentially destructive):
Bash(rm *)— deleting filesBash(git push*)— pushing to remoteBash(git checkout*)— switching branchesBash(git reset*)— resetting changesBash(npm publish*)— publishing packagesBash(curl*)— making network requests- Any command that touches production
The Progressive Trust Approach
Don't configure everything on day one. Start conservative and open up as you build trust:
Week 1: Auto-accept reads only. Review everything else. Learn what Claude Code actually does.
Week 2: Auto-accept reads + test/lint commands. You now trust it won't run weird shell commands.
Week 3: Auto-accept edits too. You've seen enough edits to trust the quality.
Week 4+: You're only reviewing destructive operations and network calls. That's the sweet spot.
One More Thing: The Accept Button
When a permission prompt does appear, you have options beyond just "allow":
- y — Allow this once
- a — Allow this tool for the entire session
- n — Deny this request
- Escape — Cancel the current operation
The "a" option is your friend for exploratory sessions where you trust the general direction but didn't pre-configure permissions.
Stay in the loop
New guides, templates, and tips. No spam. Unsubscribe anytime.
Plan Mode: Think Before You Build
The one toggle that saves you 30-40% on tokens and prevents Claude Code from sprinting in the wrong direction.
How to Prompt Claude Code (It's Not What You Think)
The biggest mistake? Treating Claude Code like ChatGPT. Good prompts are specific, bounded, and lean on CLAUDE.md — not clever wording.