[{"data":1,"prerenderedAt":633},["ShallowReactive",2],{"guide:/guides/claude-code-tips":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"tag":10,"date":11,"body":12,"_type":327,"_id":628,"_source":629,"_file":630,"_stem":631,"_extension":632},"/guides/claude-code-tips","guides",false,"","Claude Code tips to work faster","Practical Claude Code tips: widen permissions for safe actions, run agents in parallel with worktrees, wire hooks for awareness, and stop babysitting the terminal.","Workflow","2026-08-15",{"type":13,"children":14,"toc":613},"root",[15,23,30,60,191,205,211,232,238,243,249,254,260,280,286,323,391,396,402,454,460,489,495,508,514,535,541,554,560,581,587,607],{"type":16,"tag":17,"props":18,"children":19},"element","p",{},[20],{"type":21,"value":22},"text","Claude Code rewards a little setup. A handful of habits turn it from \"watch it work\" into \"let it work while you do something else\". Here are the ones that pay off fastest.",{"type":16,"tag":24,"props":25,"children":27},"h2",{"id":26},"_1-let-it-run-the-safe-things-unattended",[28],{"type":21,"value":29},"1. Let it run the safe things unattended",{"type":16,"tag":17,"props":31,"children":32},{},[33,35,41,43,50,52,58],{"type":21,"value":34},"The biggest speed-up is not typing faster. It is not being ",{"type":16,"tag":36,"props":37,"children":38},"em",{},[39],{"type":21,"value":40},"asked",{"type":21,"value":42}," so often. Widen ",{"type":16,"tag":44,"props":45,"children":47},"code",{"className":46},[],[48],{"type":21,"value":49},"permissions.allow",{"type":21,"value":51}," for the repetitive, safe actions and tighten ",{"type":16,"tag":44,"props":53,"children":55},{"className":54},[],[56],{"type":21,"value":57},"permissions.deny",{"type":21,"value":59}," around secrets and destructive commands:",{"type":16,"tag":61,"props":62,"children":66},"pre",{"className":63,"code":64,"language":65,"meta":7,"style":7},"language-json shiki shiki-themes github-light github-dark","{\n  \"permissions\": {\n    \"allow\": [\"Bash(npm run test:*)\", \"Bash(npm run lint)\", \"Read(./src/**)\"],\n    \"deny\": [\"Read(./.env*)\", \"Bash(rm:*)\"]\n  }\n}\n","json",[67],{"type":16,"tag":44,"props":68,"children":69},{"__ignoreMap":7},[70,82,97,141,173,182],{"type":16,"tag":71,"props":72,"children":75},"span",{"class":73,"line":74},"line",1,[76],{"type":16,"tag":71,"props":77,"children":79},{"style":78},"--shiki-default:#24292E;--shiki-dark:#E1E4E8",[80],{"type":21,"value":81},"{\n",{"type":16,"tag":71,"props":83,"children":85},{"class":73,"line":84},2,[86,92],{"type":16,"tag":71,"props":87,"children":89},{"style":88},"--shiki-default:#005CC5;--shiki-dark:#79B8FF",[90],{"type":21,"value":91},"  \"permissions\"",{"type":16,"tag":71,"props":93,"children":94},{"style":78},[95],{"type":21,"value":96},": {\n",{"type":16,"tag":71,"props":98,"children":100},{"class":73,"line":99},3,[101,106,111,117,122,127,131,136],{"type":16,"tag":71,"props":102,"children":103},{"style":88},[104],{"type":21,"value":105},"    \"allow\"",{"type":16,"tag":71,"props":107,"children":108},{"style":78},[109],{"type":21,"value":110},": [",{"type":16,"tag":71,"props":112,"children":114},{"style":113},"--shiki-default:#032F62;--shiki-dark:#9ECBFF",[115],{"type":21,"value":116},"\"Bash(npm run test:*)\"",{"type":16,"tag":71,"props":118,"children":119},{"style":78},[120],{"type":21,"value":121},", ",{"type":16,"tag":71,"props":123,"children":124},{"style":113},[125],{"type":21,"value":126},"\"Bash(npm run lint)\"",{"type":16,"tag":71,"props":128,"children":129},{"style":78},[130],{"type":21,"value":121},{"type":16,"tag":71,"props":132,"children":133},{"style":113},[134],{"type":21,"value":135},"\"Read(./src/**)\"",{"type":16,"tag":71,"props":137,"children":138},{"style":78},[139],{"type":21,"value":140},"],\n",{"type":16,"tag":71,"props":142,"children":144},{"class":73,"line":143},4,[145,150,154,159,163,168],{"type":16,"tag":71,"props":146,"children":147},{"style":88},[148],{"type":21,"value":149},"    \"deny\"",{"type":16,"tag":71,"props":151,"children":152},{"style":78},[153],{"type":21,"value":110},{"type":16,"tag":71,"props":155,"children":156},{"style":113},[157],{"type":21,"value":158},"\"Read(./.env*)\"",{"type":16,"tag":71,"props":160,"children":161},{"style":78},[162],{"type":21,"value":121},{"type":16,"tag":71,"props":164,"children":165},{"style":113},[166],{"type":21,"value":167},"\"Bash(rm:*)\"",{"type":16,"tag":71,"props":169,"children":170},{"style":78},[171],{"type":21,"value":172},"]\n",{"type":16,"tag":71,"props":174,"children":176},{"class":73,"line":175},5,[177],{"type":16,"tag":71,"props":178,"children":179},{"style":78},[180],{"type":21,"value":181},"  }\n",{"type":16,"tag":71,"props":183,"children":185},{"class":73,"line":184},6,[186],{"type":16,"tag":71,"props":187,"children":188},{"style":78},[189],{"type":21,"value":190},"}\n",{"type":16,"tag":17,"props":192,"children":193},{},[194,196,203],{"type":21,"value":195},"The agent stops interrupting you for the boring stuff and only stops for what actually matters. See ",{"type":16,"tag":197,"props":198,"children":200},"a",{"href":199},"/guides/claude-code-settings-json",[201],{"type":21,"value":202},"your Claude Code settings.json, explained",{"type":21,"value":204},".",{"type":16,"tag":24,"props":206,"children":208},{"id":207},"_2-write-a-claudemd-and-keep-it-short",[209],{"type":21,"value":210},"2. Write a CLAUDE.md and keep it short",{"type":16,"tag":17,"props":212,"children":213},{},[214,216,222,224,230],{"type":21,"value":215},"A ",{"type":16,"tag":44,"props":217,"children":219},{"className":218},[],[220],{"type":21,"value":221},"CLAUDE.md",{"type":21,"value":223}," at the root of your repository is read at the start of every session. It is where you put the things you would otherwise repeat in every prompt: how to run the tests, which package manager the project uses, the conventions your codebase actually follows. Keep it to what is not obvious from the code, because everything in it costs context on every single turn. Press ",{"type":16,"tag":44,"props":225,"children":227},{"className":226},[],[228],{"type":21,"value":229},"#",{"type":21,"value":231}," during a session to append a line to it without leaving the terminal.",{"type":16,"tag":24,"props":233,"children":235},{"id":234},"_3-scope-prompts-narrowly",[236],{"type":21,"value":237},"3. Scope prompts narrowly",{"type":16,"tag":17,"props":239,"children":240},{},[241],{"type":21,"value":242},"An agent told to \"improve the app\" wanders; one told to \"add pagination to the users table\" ships. Narrow, well-bounded tasks finish faster, are easier to review, and are safe to run in parallel.",{"type":16,"tag":24,"props":244,"children":246},{"id":245},"_4-plan-first-on-anything-non-trivial",[247],{"type":21,"value":248},"4. Plan first on anything non-trivial",{"type":16,"tag":17,"props":250,"children":251},{},[252],{"type":21,"value":253},"For a change that touches several files, ask for the plan before the edits. Plan mode (cycle to it with shift+tab) lets the agent explore and propose without touching anything, which is far cheaper than reviewing a wrong diff. Approve the plan, then let it run.",{"type":16,"tag":24,"props":255,"children":257},{"id":256},"_5-run-several-at-once-with-worktrees",[258],{"type":21,"value":259},"5. Run several at once with worktrees",{"type":16,"tag":17,"props":261,"children":262},{},[263,265,271,273,279],{"type":21,"value":264},"Once tasks are narrow, run them in parallel. ",{"type":16,"tag":266,"props":267,"children":268},"strong",{},[269],{"type":21,"value":270},"Git worktrees",{"type":21,"value":272}," give each agent its own branch and folder so they never collide, the clean way to have three sessions going at once. Full walkthrough in ",{"type":16,"tag":197,"props":274,"children":276},{"href":275},"/guides/claude-code-git-worktrees",[277],{"type":21,"value":278},"Claude Code with git worktrees",{"type":21,"value":204},{"type":16,"tag":24,"props":281,"children":283},{"id":282},"_6-turn-repeated-prompts-into-slash-commands",[284],{"type":21,"value":285},"6. Turn repeated prompts into slash commands",{"type":16,"tag":17,"props":287,"children":288},{},[289,291,297,299,305,307,313,315,321],{"type":21,"value":290},"Any prompt you have typed three times belongs in ",{"type":16,"tag":44,"props":292,"children":294},{"className":293},[],[295],{"type":21,"value":296},".claude/commands/",{"type":21,"value":298},". A file named ",{"type":16,"tag":44,"props":300,"children":302},{"className":301},[],[303],{"type":21,"value":304},"review.md",{"type":21,"value":306}," becomes ",{"type":16,"tag":44,"props":308,"children":310},{"className":309},[],[311],{"type":21,"value":312},"/review",{"type":21,"value":314},", and ",{"type":16,"tag":44,"props":316,"children":318},{"className":317},[],[319],{"type":21,"value":320},"$ARGUMENTS",{"type":21,"value":322}," carries whatever you type after it:",{"type":16,"tag":61,"props":324,"children":328},{"className":325,"code":326,"language":327,"meta":7,"style":7},"language-markdown shiki shiki-themes github-light github-dark","---\ndescription: Review the current diff for bugs and missing tests\n---\n\nReview `git diff` for correctness bugs and missing test coverage.\nFocus on $ARGUMENTS. Report findings only, do not fix anything.\n","markdown",[329],{"type":16,"tag":44,"props":330,"children":331},{"__ignoreMap":7},[332,341,349,356,365,383],{"type":16,"tag":71,"props":333,"children":334},{"class":73,"line":74},[335],{"type":16,"tag":71,"props":336,"children":338},{"style":337},"--shiki-default:#005CC5;--shiki-default-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold",[339],{"type":21,"value":340},"---\n",{"type":16,"tag":71,"props":342,"children":343},{"class":73,"line":84},[344],{"type":16,"tag":71,"props":345,"children":346},{"style":78},[347],{"type":21,"value":348},"description: Review the current diff for bugs and missing tests\n",{"type":16,"tag":71,"props":350,"children":351},{"class":73,"line":99},[352],{"type":16,"tag":71,"props":353,"children":354},{"style":337},[355],{"type":21,"value":340},{"type":16,"tag":71,"props":357,"children":358},{"class":73,"line":143},[359],{"type":16,"tag":71,"props":360,"children":362},{"emptyLinePlaceholder":361},true,[363],{"type":21,"value":364},"\n",{"type":16,"tag":71,"props":366,"children":367},{"class":73,"line":175},[368,373,378],{"type":16,"tag":71,"props":369,"children":370},{"style":78},[371],{"type":21,"value":372},"Review ",{"type":16,"tag":71,"props":374,"children":375},{"style":88},[376],{"type":21,"value":377},"`git diff`",{"type":16,"tag":71,"props":379,"children":380},{"style":78},[381],{"type":21,"value":382}," for correctness bugs and missing test coverage.\n",{"type":16,"tag":71,"props":384,"children":385},{"class":73,"line":184},[386],{"type":16,"tag":71,"props":387,"children":388},{"style":78},[389],{"type":21,"value":390},"Focus on $ARGUMENTS. Report findings only, do not fix anything.\n",{"type":16,"tag":17,"props":392,"children":393},{},[394],{"type":21,"value":395},"Commit them and your whole team gets the same shortcuts.",{"type":16,"tag":24,"props":397,"children":399},{"id":398},"_7-wire-hooks-for-awareness",[400],{"type":21,"value":401},"7. Wire hooks for awareness",{"type":16,"tag":17,"props":403,"children":404},{},[405,407,413,415,420,422,428,430,436,438,444,446,452],{"type":21,"value":406},"Use ",{"type":16,"tag":197,"props":408,"children":410},{"href":409},"/guides/claude-code-hooks",[411],{"type":21,"value":412},"Claude Code hooks",{"type":21,"value":414}," so the terminal reaches ",{"type":16,"tag":36,"props":416,"children":417},{},[418],{"type":21,"value":419},"you",{"type":21,"value":421}," instead of the other way round: a ",{"type":16,"tag":44,"props":423,"children":425},{"className":424},[],[426],{"type":21,"value":427},"Stop",{"type":21,"value":429}," hook to know a run finished, a ",{"type":16,"tag":44,"props":431,"children":433},{"className":432},[],[434],{"type":21,"value":435},"Notification",{"type":21,"value":437}," hook to know one is blocked on you. Even a one-line ",{"type":16,"tag":197,"props":439,"children":441},{"href":440},"/guides/claude-code-sound-when-done",[442],{"type":21,"value":443},"sound when it finishes",{"type":21,"value":445}," lets you look away with confidence. A ",{"type":16,"tag":44,"props":447,"children":449},{"className":448},[],[450],{"type":21,"value":451},"PostToolUse",{"type":21,"value":453}," hook running your formatter after every edit is the other easy win: the agent stops producing diffs full of whitespace noise.",{"type":16,"tag":24,"props":455,"children":457},{"id":456},"_8-keep-the-context-lean",[458],{"type":21,"value":459},"8. Keep the context lean",{"type":16,"tag":17,"props":461,"children":462},{},[463,465,471,473,479,481,487],{"type":21,"value":464},"Long, sprawling sessions get slower and compact more. Start fresh sessions for unrelated tasks rather than piling everything into one: ",{"type":16,"tag":44,"props":466,"children":468},{"className":467},[],[469],{"type":21,"value":470},"/clear",{"type":21,"value":472}," wipes the context to start clean, ",{"type":16,"tag":44,"props":474,"children":476},{"className":475},[],[477],{"type":21,"value":478},"/compact",{"type":21,"value":480}," summarises it when you want to carry on, and ",{"type":16,"tag":44,"props":482,"children":484},{"className":483},[],[485],{"type":21,"value":486},"/context",{"type":21,"value":488}," shows you what is actually filling the window. Shorter turns mean more finished work and less to hold in your head.",{"type":16,"tag":24,"props":490,"children":492},{"id":491},"_9-delegate-the-wide-reading",[493],{"type":21,"value":494},"9. Delegate the wide reading",{"type":16,"tag":17,"props":496,"children":497},{},[498,500,506],{"type":21,"value":499},"When a task means searching across the codebase or checking twenty files, let the agent fan out to ",{"type":16,"tag":197,"props":501,"children":503},{"href":502},"/guides/claude-code-subagents",[504],{"type":21,"value":505},"subagents",{"type":21,"value":507},". They read in their own context and hand back a summary, so your main conversation stays about the change you are making rather than the forty files that turned out to be irrelevant.",{"type":16,"tag":24,"props":509,"children":511},{"id":510},"_10-resume-instead-of-re-explaining",[512],{"type":21,"value":513},"10. Resume instead of re-explaining",{"type":16,"tag":17,"props":515,"children":516},{},[517,519,525,527,533],{"type":21,"value":518},"You rarely need to rebuild context from scratch. ",{"type":16,"tag":44,"props":520,"children":522},{"className":521},[],[523],{"type":21,"value":524},"claude -c",{"type":21,"value":526}," picks up the last session in the current directory, and ",{"type":16,"tag":44,"props":528,"children":530},{"className":529},[],[531],{"type":21,"value":532},"claude --resume",{"type":21,"value":534}," lets you choose from earlier ones. When you come back to a task the next morning, that is a lot cheaper than pasting the background again.",{"type":16,"tag":24,"props":536,"children":538},{"id":537},"_11-review-the-diff-not-the-summary",[539],{"type":21,"value":540},"11. Review the diff, not the summary",{"type":16,"tag":17,"props":542,"children":543},{},[544,546,552],{"type":21,"value":545},"The agent's account of what it did is a summary, and summaries are where mistakes hide. Read ",{"type":16,"tag":44,"props":547,"children":549},{"className":548},[],[550],{"type":21,"value":551},"git diff",{"type":21,"value":553}," yourself before committing, and commit in small enough steps that the diff stays readable. A session that ran for twenty minutes and produced one enormous commit is a session you cannot really review, however good it was.",{"type":16,"tag":24,"props":555,"children":557},{"id":556},"_12-script-the-one-shot-jobs",[558],{"type":21,"value":559},"12. Script the one-shot jobs",{"type":16,"tag":17,"props":561,"children":562},{},[563,565,571,573,579],{"type":21,"value":564},"Not everything needs an interactive session. ",{"type":16,"tag":44,"props":566,"children":568},{"className":567},[],[569],{"type":21,"value":570},"claude -p \"…\"",{"type":21,"value":572}," runs a single prompt and prints the answer, which makes it usable from a shell script, a git hook or a CI job: generating a changelog entry, summarising a diff, triaging a log file. Combine it with ",{"type":16,"tag":44,"props":574,"children":576},{"className":575},[],[577],{"type":21,"value":578},"--output-format json",{"type":21,"value":580}," when something downstream has to parse the result.",{"type":16,"tag":24,"props":582,"children":584},{"id":583},"_13-stop-babysitting-the-terminal",[585],{"type":21,"value":586},"13. Stop babysitting the terminal",{"type":16,"tag":17,"props":588,"children":589},{},[590,592,597,599,605],{"type":21,"value":591},"The habit that quietly costs the most is ",{"type":16,"tag":36,"props":593,"children":594},{},[595],{"type":21,"value":596},"checking",{"type":21,"value":598},": alt-tabbing to see whether a run is done or stuck. That is the exact thing ",{"type":16,"tag":197,"props":600,"children":602},{"href":601},"/",[603],{"type":21,"value":604},"Blooby",{"type":21,"value":606}," removes. It gives each Claude Code session a live desktop mascot (busy while it works, looking up when it needs you, celebrating when it finishes), so awareness becomes a glance instead of a task. It sets up its own hooks, needs no account, and works across as many sessions as you run.",{"type":16,"tag":608,"props":609,"children":610},"style",{},[611],{"type":21,"value":612},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":7,"searchDepth":84,"depth":84,"links":614},[615,616,617,618,619,620,621,622,623,624,625,626,627],{"id":26,"depth":84,"text":29},{"id":207,"depth":84,"text":210},{"id":234,"depth":84,"text":237},{"id":245,"depth":84,"text":248},{"id":256,"depth":84,"text":259},{"id":282,"depth":84,"text":285},{"id":398,"depth":84,"text":401},{"id":456,"depth":84,"text":459},{"id":491,"depth":84,"text":494},{"id":510,"depth":84,"text":513},{"id":537,"depth":84,"text":540},{"id":556,"depth":84,"text":559},{"id":583,"depth":84,"text":586},"content:guides:claude-code-tips.md","content","guides/claude-code-tips.md","guides/claude-code-tips","md",1]