geocam.cloud · lesson

Claude Code — the 2026 Method

Not a feature tour. What changed between the tutorial era and now, and how the people who built the tool actually use it: verification as the primary quality lever, context as the real budget, and picking a harness sized to the task.

Lesson v1.0 · Written against Claude Code v2.1.240, August 2026 · companion sheet: Claude Code Practice

00Start here

Most Claude Code tutorials — including good ones — teach the early-2026 workflow: write a CLAUDE.md, use plan mode, approve permissions one at a time, clear context between tasks, maybe use a subagent.

That advice is not wrong. It is incomplete in a way that costs most of the leverage. Between March and August 2026, Claude Code stopped being "an AI that edits your files" and became a runtime for fleets of agents. The people who built it changed how they use it accordingly.

Two statements from the Claude Code team anchor the shift:

Boris Cherny, creator and head of Claude Code, June 2026: he stopped using plan mode entirely — "the newer models don't actually need a planning step." His workflow now "looks less like typing prompts and more like managing armies of agents."

reflecting on a year of Claude Code

Cat Wu, head of product for Claude Code: "The model performs best if you treat it like an engineer you're delegating to, not a pair programmer you're guiding line by line."

Everything below follows from those two sentences.

01Audit your own setup first

Before any technique, check what you have. Most people who feel Claude Code is "fine but not transformative" are running it with nothing configured — every session starts from zero and every correction dies when the session ends.

Run these and see what comes back:

claude --version                 # are you actually current?
ls ~/.claude/skills/             # domain knowledge, loaded on demand
ls ~/.claude/agents/             # reusable subagent definitions
ls ~/.claude/commands/           # repeated workflows
ls ~/.claude/workflows/          # saved orchestrations
grep -c hooks ~/.claude/settings.json   # deterministic rules
ls ~/.claude/projects/*/memory/  # auto-memory: what Claude has kept about you
claude mcp list                  # tools beyond the shell (browser, mail, trackers)
If this is emptyWhat you are losing
skills/Every piece of domain knowledge you have ever explained is re-explained next session
agents/No reusable reviewer, researcher or verifier — you rebuild them in prose each time
commands/Your most-repeated prompt is retyped, slightly differently, forever
hooksEvery rule is advisory. Nothing is guaranteed
memory/Claude meets you as a stranger every session; every preference is restated
All of themYour setup does not compound. This is the single biggest gap
The highest-leverage idea on this page: when Claude gets something wrong, don't correct it in chat — write a rule. A correction fixes one turn. A rule in CLAUDE.md, a skill, a hook, or a memory fixes every future run. Your error rate should trend down over months. If it isn't, you are re-teaching the same lessons daily.

02The four shifts

Plan mode → auto mode plus a full brief

The old loop: prompt → Claude plans → you read the plan → you approve → Claude codes → you approve fifteen tool calls. The new loop: you write one complete brief, Claude works, you review the result.

Plan mode still earns its place when you are uncertain about the approach or unfamiliar with the code. But for work where you know what you want, the planning step is now overhead — modern models plan implicitly. Auto mode, a separate classifier that reviews each action and blocks only genuinely risky ones, removes the per-tool prompts.

The corollary is uncomfortable but true: if you find yourself interrupting Claude often, your brief was incomplete, not the model weak.

Prompt engineering → context minimalism

The arc ran: prompt engineering (craft the magic words) → context engineering (stuff the right context in) → context minimalism (give a lean prompt, minimal tools, and a way to fetch context; let the model work out the rest).

Concretely: don't paste six files into your prompt. Say "read src/auth/ and the last twenty commits touching it" and let Claude pull what it needs — ideally through a subagent, so the reading never lands in your context at all.

Correcting in chat → writing rules

Covered above. This is the one that compounds.

One agent → a harness per task

There is now a ladder of orchestration primitives, and picking the right rung is a real skill. That is section 06.

03Verification — the primary lever

Cherny calls this "probably the most important thing to get great results out of Claude Code," estimating it is worth 2–3× on the quality of the final result. The official best-practices guide leads with it.

The logic is simple. Claude stops when the work looks done. Without a check it can run, "looks done" is the only signal available — and you become the verification loop. Every mistake waits for you to notice it.

Give Claude something that returns pass or fail and the loop closes on its own: Claude does the work, runs the check, reads the result, iterates.

The ladder

Four rungs, in increasing order of setup cost and of how reliably an unattended run finishes correctly:

RungMechanismUse when
1 · In-prompt"…then run the tests and fix any failures"Any task, today, zero setup
2 · /goalA separate fast model re-checks the condition after every turn; Claude keeps working until it holdsSubstantial work with a verifiable end state
3 · Stop hookA script that blocks the turn from ending until your check passesA rule that must hold in every session
4 · AdversarialA fresh agent, seeing only the diff and the criteria, tries to refute the resultHigh-stakes changes; long unattended runs

Rung 4 deserves its own note. The agent that did the work is the worst judge of the work — models carry a self-preferential bias toward their own output. A reviewer in a fresh context sees the diff and your criteria but not the reasoning that produced them, so it evaluates on the merits. That is why /code-review runs in a subagent.

One caveat worth taking seriously: a reviewer prompted to find gaps will report some, even when the work is sound — that is what it was asked to do. Chasing every finding produces over-engineering: defensive code, extra abstraction, tests for cases that cannot happen. Tell the reviewer to "flag only gaps that affect correctness or the stated requirements."

Rewrite your prompts

✗  implement email validation
✓  write validateEmail. test cases: a@b.com true,
   'invalid' false, 'a@.com' false. run the tests after implementing.

✗  make the dashboard look better
✓  [paste screenshot] implement this. take a screenshot of the result,
   compare it to the original, list the differences, fix them.

✗  the build is failing
✓  the build fails with: [paste]. fix it, verify the build succeeds,
   address the root cause — don't suppress the error.

And always: ask for evidence, not assertions. "Show me the test output" beats "confirm it works." Reviewing evidence is faster than re-running the check yourself, and it works for sessions you were not watching.

04Context is the budget

Performance degrades as the context window fills. Everything Claude reads, every command output, every failed attempt lives there. A million-token window does not exempt you — it moves the cliff.

Five tools, each for a different job. Most people know two.

ToolWhat it doesUse when
/clearWipes context entirelyBetween unrelated tasks — almost certainly more often than you do
/compactSummarises the conversation; cheap, keeps momentum, fuzzy on detailMid-task and running long
/rewindJump back to any earlier message; restore conversation, code, or bothA failed attempt happened
/btwSide question whose answer never enters history"What's the flag for X?" mid-task
SubagentsResearch in a separate context, reporting back a summaryAny investigation that reads many files

Two rules of thumb

CLAUDE.md discipline

Your CLAUDE.md loads on every single session. That makes it precious real estate, and the most common failure is bloat: if it is too long, Claude ignores half of it because the important rules get lost in the noise.

The test for every line: "would removing this cause Claude to make a mistake?" If not, cut it.

IncludeExclude
Commands Claude cannot guessAnything derivable by reading the code
Style rules that differ from defaultsStandard language conventions
Test runner, and how to run a single testDetailed API docs — link instead
Branch and PR conventionsInformation that changes frequently
Environment quirks, required variablesFile-by-file descriptions of the codebase
Non-obvious gotchas"Write clean code"

Diagnostics. If Claude keeps violating a rule you wrote, the file is too long. If Claude asks questions the file answers, the phrasing is ambiguous. IMPORTANT works — but only on one line; emphasise everything and nothing stands out.

Allocation rule: things that apply broadly go in CLAUDE.md. Things that apply sometimes go in a skill — loaded on demand, costing nothing until relevant.

05How to write a prompt now

Delegation means full task context in turn one: goal, constraints, acceptance criteria. Think hard once rather than iterating fast.

GOAL        what "done" looks like, in one sentence
CONTEXT     which files; what pattern to follow
            ("look at HotDogWidget.php — follow that pattern")
CONSTRAINTS what must not change; what is out of scope;
            libraries you will and will not accept
VERIFY      the exact command or check that proves it works

Let Claude interview you

For anything large, start minimal and make Claude extract the spec from you:

I want to build [one line]. Interview me in detail using the
AskUserQuestion tool. Ask about technical implementation, UI/UX,
edge cases, concerns, and tradeoffs. Don't ask obvious questions —
dig into the hard parts I might not have considered. Keep
interviewing until we've covered everything, then write SPEC.md.

Then clear the context and execute the spec in a fresh session. Clean context, written reference. Time spent making the spec precise pays off far more than time spent watching the implementation.

Three more techniques

06The parallelism ladder

This is where the leverage lives, and where most tutorials stop. Five rungs, each a different answer to "who holds the plan?"

RungWho decides what runs nextScaleUse for
WorktreesYou3–5 sessionsIndependent features in parallel, no collisions
Agent viewYou, from one screenManyWatching and steering background sessions
SubagentsClaude, turn by turnA few per turnResearch, verification, anything context-hungry
WorkflowsA scriptDozens–hundredsMigrations, audits, sweeps, deep research
Agent teamsA lead agentA handful of peersDebate, competing hypotheses, cross-layer work

Worktrees

Cherny calls running three to five git worktrees simultaneously "the single biggest productivity unlock." Each is an isolated checkout with its own session, so edits never collide.

claude --worktree oauth-migration          # isolated checkout + session
claude --worktree oauth-migration --tmux   # …in a tmux pane
claude --add-dir ../other-repo             # one session, several repos

Name them, alias them so switching is one keystroke, and give each session a distinct colour so you can tell them apart at a glance.

Agent view

claude agents gives one screen for every session, grouped Needs input / Working / Completed. This is your control plane once more than two things are running. Rename sessions religiously — or set a hook to do it — or the list becomes unreadable.

Subagents — the cheapest, most underused

Just append "use subagents" to a hard prompt. Two canonical uses: research ("investigate how our auth handles token refresh, and whether we have existing OAuth utilities to reuse") and adversarial verification. They read forty files in their context and hand you back a paragraph.

Fork or fresh — decide deliberately. Since 2.1.232 a subagent forks by default: it inherits the whole conversation and the prompt cache, so it starts already knowing what you have discussed. That is right for "go finish the thing we just designed." It is exactly wrong for review — a fork inherits your reasoning and its bias. For verification, name a fresh agent type (Explore, code-reviewer, one of your own) or say "in a fresh context, seeing only the diff."

Sessions talk to each other. Type @ in the prompt to mention another running session; ListAgents and SendMessage do the same from inside a turn, across worktrees, machines and Remote Control. The canonical use: the session that owns the shared interface finishes, then tells the three sessions waiting on it — instead of you relaying.

---
name: security-reviewer
description: Reviews code for security vulnerabilities
tools: Read, Grep, Glob, Bash
model: opus
---
You are a senior security engineer. Review for injection (SQL, XSS,
command), authN/authZ flaws, secrets in code, insecure data handling.
Provide specific line references and suggested fixes.

Dynamic workflows — the big one

A dynamic workflow is a JavaScript script that orchestrates subagents at scale. Claude writes the script; a runtime executes it in the background while your session stays responsive.

The critical difference from everything above: the plan moves out of a context window and into code. Loops, branching and intermediate results live in script variables. Your context only ever holds the final answer. That is what makes hundreds of agents possible.

use a workflow to audit every route handler under src/routes/ for
missing auth checks, and adversarially verify each finding

ultracode: <task>        # keyword trigger, single turn
/effort ultracode        # xhigh + automatic workflows, whole session
/deep-research <question> # bundled: fans out, cross-checks, cites
/workflows               # watch · p pause · x stop · s save as command

Workflows exist because they fix three specific failure modes of a single agent:

  1. Agentic laziness — partial progress, declares done early.
  2. Self-preferential bias — the model likes its own work; a separate verifier does not.
  3. Goal drift — detail lost through summarisation; isolated agents hold focused goals.

Six patterns Claude composes from: classify-and-act, fan-out-and-synthesize, adversarial verification, generate-and-filter, tournament (pairwise comparison beats absolute scoring when ranking many items), and loop-until-done.

They are token-hungry. Save them for the biggest jobs, not twenty-line tweaks. Test on one directory before running on a whole repo. You can budget directly in the prompt ("use 10k tokens").

Agent teams

Experimental and off by default. The one case where teams beat everything else is adversarial debate:

Users report the app exits after one message instead of staying
connected. Spawn 5 teammates to investigate different hypotheses.
Have them talk to each other and try to disprove each other's
theories, like a scientific debate. Write the consensus to
DIAGNOSIS.md.

Sequential investigation suffers from anchoring — once one theory is explored, everything after bends toward it. Independent investigators actively trying to falsify each other produce a surviving theory far more likely to be the real cause. Start with three to five.

07Making it permanent

MechanismLoadsEnforcementUse for
CLAUDE.mdEvery sessionAdvisoryConventions that always apply
SkillsOn demand, when relevantAdvisoryDomain knowledge and repeatable workflows
HooksAt lifecycle eventsDeterministicThings that must happen with zero exceptions
Output stylesEvery session, in the system promptAdvisoryA different role or default format
Auto-memoryIndex every session; facts on recallAdvisoryWhat Claude learns about you and your work that no file records
.claude/rules/Every session, path-scopedAdvisoryConventions that apply to one part of a repo

Memory — the one most people have never opened

Claude keeps a per-project memory directory (~/.claude/projects/<project>/memory/): one fact per file with a short frontmatter, and a MEMORY.md index that is loaded into every session. Four kinds — user (who you are), feedback (corrections you gave, with the why), project (goals and constraints not derivable from the code) and reference (URLs, tickets, dashboards). Claude writes them on its own; /remember forces one.

The allocation test, extended: if it is in git, it is not a memory. If it is a convention, it is CLAUDE.md. If it is something Claude could only learn by working with you, it is a memory. "George prefers evidence over assertions" is a memory. "Run tests with make check" is not.

Read the index every month or so. Stale memories are worse than none — a pointer to a file you renamed in June will be followed in September. Delete freely; it is a directory of markdown, nothing more.

Sessions are permanent too

claude --continue            # pick up the most recent session here
claude --resume              # choose from this directory's sessions
claude remote-control --continue   # …and drive it from your phone

A session you name is a session you can find. Name them by outcome ("oauth-migration-tests-green"), not by topic — the agent view sorts by state, and the name should tell you what "done" meant.

Skills

The rule of thumb from the team: if you do something more than once a day, make it a skill or a command. Check them into git — they compound, and they travel between projects.

.claude/skills/fix-issue/SKILL.md
---
name: fix-issue
description: Fix a GitHub issue
disable-model-invocation: true
---
Analyze and fix the GitHub issue: $ARGUMENTS.
1. gh issue view    2. search the codebase   3. implement the fix
4. write+run tests  5. lint and typecheck    6. commit  7. open a PR

Now /fix-issue 1234 works. disable-model-invocation: true means Claude will not fire it on its own — right for anything with side effects.

Hooks

Hooks are deterministic; CLAUDE.md is advisory. Anything you truly cannot tolerate being skipped belongs in a hook.

HookWhat it does
PostToolUseAuto-format after every edit — kills a whole class of nitpicking
StopRun your test suite; block the turn from ending until it passes
PostCompactRe-inject critical instructions after context compression
UserPromptSubmitAuto-rename the session so agent view stays readable
NotificationPing you when a long task finishes or needs input

You do not have to hand-write these. Ask: "write a hook that runs prettier after every file edit" or "write a hook that blocks writes to the migrations folder."

08Models and effort — where to spend

The single most expensive habit of advanced users is running the strongest model at the highest effort for everything, including grep. Spend judgement on judgement; spend nothing on reading.

ModelCharacterPut it on
Fable 5The strongest reasoning; slow; rationedArchitecture, the review of an unfamiliar codebase, the decision you will live with for a year
Opus 5 (1M)Daily driver; the million-token windowYour main session. Almost everything
Sonnet 5Fast, cheap, very capable on bounded tasksWorkflow fan-out stages, mechanical migrations, formatting sweeps
Haiku 4.5Classifier speedTriage, filtering, "does this file mention X" across a thousand files
/model                 # switch the main session
/effort low|medium|high|xhigh|max   # reasoning budget per turn
/effort ultracode      # xhigh + workflows by default, whole session
/fast                  # Opus at faster output — not a smaller model
/advisor fable         # a stronger model consulted on the hard turns
/usage                 # what is actually driving your limits — by skill, plugin, MCP, subagent

Effort is per-agent, not per-session. In a subagent definition or a workflow call, effort: low on the stage that reads files and effort: max on the stage that judges them is the difference between a workflow you can afford to run nightly and one you run once. The same goes for model:. A ten-finder, three-judge review with Sonnet finders and an Opus judge costs a fraction of the all-Opus version and finds the same bugs.

Fast mode is not a downgrade. /fast keeps Opus and trades some latency headroom for faster output. Use it for the interactive turns where you are waiting on the screen; turn it off for the unattended ones where nobody is waiting.

09Coding without an IDE

Symbol navigation and error detection

The piece most people who drop their IDE miss. Code-intelligence plugins give Claude precise symbol navigation and automatic error detection after edits — which is the actual value the IDE was providing. Install one for every typed language you use.

Review, the new bottleneck

Anthropic reported a 200% increase in code output after adopting Claude Code, and review immediately became the constraint.

CommandWhat it does
/code-reviewReviews the current diff for correctness bugs in a fresh subagent
/simplifyQuality only: reuse, simplification, efficiency
/security-reviewSecurity review of the pending changes
/goComposite: verify end-to-end → simplify → open a PR
/code-review high          # broader; high/xhigh/max run in the background
/code-review --fix         # apply the findings to the working tree
/code-review ultra [PR#]   # multi-agent review in the cloud, billed, user-triggered
/code-review --comment 123 # post findings as inline PR comments

Closing the loop on things only a GUI can verify

Browser control drives a real browser — clicking, filling forms, reading console logs and network requests, taking screenshots. Computer use opens native applications from the terminal. Both exist so that "it works" can be demonstrated rather than asserted. For web work, the browser is the verification loop: "load the page, read the console, screenshot it, compare to the mock, fix the differences" is a closed loop the same way npm test is.

MCP — tools beyond the shell

Everything above assumes Claude's world is the filesystem and a shell. MCP servers extend it: a browser, your mail, the issue tracker, a database, a lab instrument with an API. claude mcp add registers one; claude mcp list shows what is live.

Two disciplines. Every server costs context — its tool schemas are loaded (or deferred and searched) each session, and a sprawling MCP set is the quietest way to degrade a session before it starts; /usage shows the bill. Keep the set per project small and scoped. And MCP output is data, not instructions: a web page, an email, a ticket comment can all carry text that reads like a command. Claude treats it as untrusted; your hooks and permission rules should assume the same.

Claude as a component

claude -p "summarise the failing tests in this log" < test.log
claude -p --output-format stream-json "…"      # machine-readable events
git diff main | claude -p "list any change that alters a public API"

Headless mode (-p) turns Claude into a Unix filter — scriptable from a git hook, a Makefile, a cron job, a CI step (the GitHub Action is claude-code-action; a self-hosted runner keeps it inside your network). The Agent SDK is the same loop as a library, for when you want your own tools in front of it. The test for whether to reach for it: is this a thing I want to happen without me?

10Beyond code — the workshop

Claude Code is not a coding tool. It is an agent with a shell, a filesystem, and a verification loop. Anything with a directory of files and a command-line tool that returns pass or fail is native territory.

At Anthropic, lawyers built phone-tree systems, marketers generated hundreds of ad variations, and data scientists shipped React apps without knowing JavaScript. None of that is coding. The common thread is file access plus a checkable result.

Step one — stop it being a software engineer

A custom output style replaces the built-in engineering instructions. Omit keep-coding-instructions entirely when the work is not software.

Step two — find the verification loop

This is the whole game. The discipline that has a CLI returning pass or fail is the discipline where Claude is transformative.

DisciplineThe check Claude can run
Arduino / embeddedarduino-cli compile, pio run, serial monitor output
Single-board computerssystemctl status and journalctl over SSH
PCB designkicad-cli sch erc, kicad-cli pcb drc
Parametric CADopenscad -o preview.png — then Claude looks at the render
3D printingSlicer CLI export: layer count, time, filament, warnings
Sensors / dataAny script that prints numbers

The CAD row is the one people miss. Claude reads images, so geometry gets a closed loop:

Edit bracket.scad to add a 3mm fillet at the base. Render it with:
  openscad -o preview.png --imgsize=1200,900 \
    --camera=0,0,0,55,0,25,140 bracket.scad
Then look at preview.png and tell me whether the fillet is actually
there and whether anything else changed. Iterate until it's right.

That is a closed verification loop for physical geometry: Claude writes the model, renders it, looks at the render, and fixes what is wrong — with no human in the loop until the part is right. The same trick applies to slicing, where overhang warnings and support volume become a numeric signal to optimise against.

Step three — pick the right rung

Deep research is the strongest single move for hardware. Component selection is exactly the kind of question that gets a plausible, confidently wrong answer from a single pass — a pin that does not exist, a voltage range off by a factor. Because a research workflow fans out, cross-checks sources against each other and votes on each claim, you get a citation-backed comparison instead.

/deep-research Compare the INA219, INA226 and INA228 for measuring
0–5A at 48V: accuracy, common-mode voltage limits, I2C address
options, availability, and price at qty 10. Cite datasheets.

Adversarial teams for intermittent faults. A board that resets randomly under load is an anchoring trap — the "it must be the power supply" theory that eats a weekend. Give four teammates separate hypotheses (brownout, watchdog, heap fragmentation, RF), hand them the logs, and tell them to disprove each other.

Step four — write the domain knowledge down

Every hardware discipline has conventions Claude cannot guess: your net naming, your module patterns and tolerances, your printers' real measured shrinkage, the strapping-pin gotchas of the microcontroller you actually use. Each becomes a skill, written once.

The most quietly valuable is an inventory of what is on the bench. "Design a driver circuit" produces a very different — and far more useful — answer when Claude knows what is in the parts drawers.

11Planning and learning

The same machinery — a brief, a verification loop, a place where knowledge persists — applies when the output is a plan or an understanding rather than a file. The failure mode is also the same: Claude does the thinking, you nod, nothing persists.

Planning

Learning

The verification loop for learning is you being tested. An explanation you read is not a check; a question you answer is. So the prompts invert: Claude's job is to make you produce the artifact.

Teach me <topic>. One concept at a time. After each, ask me a
question that I can only answer if I understood it. Don't move on
until I get it right, and don't give me the answer — give me a
smaller question.

I'm going to explain <topic> back to you. Find the holes and the
places where my model is subtly wrong. Don't be polite about it.

Give me a problem that exercises <concept>, with a way to check my
answer. I'll do it; you check. Do not solve it.

12Away from the keyboard

Most of the hobby work — and the longest software runs — happen when you are not in front of the terminal. The tooling for that is newer than the rest of this page and under-used.

ToolWhat it doesUse for
claude remote-control / claude rcThe session stays on the workstation; you drive it from a phone or the web. Photos go straight into the turnAt the bench: "here is the board, here is the scope trace — what is wrong?"
/voiceHold spacebar to dictateHands on the iron, on the printer, on the model
/loop 10m <prompt>Re-run a prompt on an interval; omit the interval and Claude self-pacesWatch a print, a serial log, a long test run, a deploy — and tell you only when something changes
/goal check-insAn unattended goal checks in at 30 min, 1 h, 2 h, and resumes after a restartOvernight runs you want a morning report from
/scheduleCloud routines on a cron — they run with the laptop shutNightly audits, weekly reviews, "check whether the part is back in stock"
Cloud sessionsThe same Claude Code in a managed sandbox, from claude.ai/codeWork from a machine that has nothing installed
ArtifactsA private, shareable live page that updates in placeBOM, wiring reference, build log, a plan someone else needs to read

The pattern that ties them together is the one from section 03: give the unattended run a way to know it is done. A /loop without a condition is noise; a /loop with "stop when the serial log shows BOOT OK three times in a row" is an instrument.

13Tools on the PATH

An agent is exactly as capable as the command-line tools it can call. Claude cannot make a PDF, OCR a datasheet, or run DRC by wanting to — it needs a binary on the PATH that does it and returns an exit code. Installing the right twenty tools is the cheapest upgrade on this page.

Three selection rules. Prefer tools with a non-interactive mode (--batch, --headless, -p) — an agent cannot answer a TUI prompt. Prefer machine-readable output (--json, exit codes) over pretty output — it is the difference between a check and a report. Prefer one tool that does a thing well over a GUI app with a CLI bolted on.

Documents — markdown in, anything out

ToolInstallWhat Claude gets
pandocbrew install pandocThe universal converter: md → docx, html, epub, odt, pptx, LaTeX; docx → md (so Claude can read Word files). Use --reference-doc for house Word styles
typstbrew install typstmd-like source → PDF in milliseconds with real typography. The modern answer to "give me a PDF"; pandoc targets it (-t typst)
tectonicbrew install tectonicSelf-contained LaTeX engine for pandoc's --pdf-engine when a reviewer wants LaTeX output; downloads packages on demand
weasyprintuv tool install weasyprintHTML + CSS → PDF with page-break control. Right when the source is already HTML — like this site
LibreOfficebrew install --cask libreofficesoffice --headless --convert-to pdf x.docx — the only faithful docx/xlsx/pptx → PDF; also docx → odt, xlsx → csv
pdftotext, pdfinfobrew install popplerExtract datasheet text with layout (-layout) so Claude reads a pinout table as a table
qpdfbrew install qpdfSplit, merge, rotate, decrypt PDFs — pull pages 12–15 of a 400-page reference manual before reading
ocrmypdf / tesseractbrew install ocrmypdfScanned PDFs and photographed labels become searchable text
mmdcnpm i -g @mermaid-js/mermaid-cliMermaid → SVG/PNG for diagrams in the docs Claude writes
dotbrew install graphvizDependency graphs, state machines, call graphs as images Claude can then look at
pandoc report.md -o report.docx --reference-doc=house.docx
pandoc report.md -o report.pdf --pdf-engine=typst
pandoc spec.docx -t gfm -o spec.md          # read what a colleague sent
soffice --headless --convert-to pdf --outdir out/ deck.pptx
pdftotext -layout -f 12 -l 15 datasheet.pdf - | head -200

Search, data and shaping

ToolInstallWhat Claude gets
rg, fdbrew install ripgrep fdClaude's own search uses them; fd respects .gitignore so agents stop reading node_modules
jq, yqbrew install jq yqJSON and YAML/TOML querying — turns any --json output into a precise check
mlr (Miller)brew install millerCSV/TSV/JSON like awk with headers — the sensor log becomes a query
sqlite3, duckdbbrew install sqlite duckdbAsk SQL questions of a CSV without writing a program; DuckDB reads Parquet and JSON too
bat, tree, tldrbrew install bat tree tlrcOrientation: a readable map of a directory; the flag for a tool nobody remembers
exiftoolbrew install exiftoolMetadata of photos, PDFs, STLs — and stripping it before anything is published

Code quality — the hooks need something to call

ToolInstallWhat Claude gets
Formattersbrew install prettier ruff shfmt clang-format · cargo fmt / gofmt ship with the toolchainThe PostToolUse hook in the kit dispatches to whichever are installed. No formatter, no hook
Language serversvia /plugin (code-intelligence plugins) or brew install the serverGo-to-definition and after-edit diagnostics — the part of the IDE that mattered
ghbrew install ghIssues, PRs, checks, releases from the shell; gh run watch is a verification loop for CI
difft, deltabrew install difftastic git-deltaStructural diffs — a reviewer agent sees moved code as moved, not as delete+add
hyperfinebrew install hyperfine"Make it faster" becomes a number with a confidence interval
watchexec / entrbrew install watchexecRe-run the check on every save — the loop without the agent in it
uvbrew install uvPython envs and tools without the venv dance: uv run, uv tool install, uvx
tmuxbrew install tmuxclaude --worktree x --tmux needs it; also the place a serial monitor lives while Claude reads it

Images and media — so Claude can look

ToolInstallWhat Claude gets
magick (ImageMagick)brew install imagemagickCrop, annotate, diff two screenshots (compare), montage four renders into one image Claude reads once
ffmpegbrew install ffmpegFrames out of a video of the mechanism; GIFs of a UI flow; audio transcoding
screencapturebuilt inscreencapture -x shot.png — any macOS window becomes something Claude can verify

The bench

ToolInstallWhat Claude gets
arduino-clibrew install arduino-cliCompile and upload without the IDE; monitor streams serial to a file Claude tails
pio (PlatformIO)uv tool install platformioSame, for every board family; pio test is a real verification loop for firmware
esptooluv tool install esptoolFlash, read MAC, dump partitions on ESP32/8266
tiobrew install tioA serial terminal that logs to a file (-l) — cleaner than screen for agents
kicad-cliships in KiCad.app; add /Applications/KiCad/KiCad.app/Contents/MacOS to PATHsch erc, pcb drc, export Gerbers, BOM and 3D renders — all checkable
openscadbrew install --cask openscadRender to PNG so Claude can see the part; export STL for the slicer
Slicer CLIprusa-slicer --export-gcode / bambu-studio / orca-slicer --slice from the .app bundlePrint time, filament, overhang and support warnings as text — a number to optimise
Tell Claude what is installed. A one-line list in CLAUDE.md"available: pandoc, typst, soffice, kicad-cli, openscad, tio" — saves a probing which per tool per session, and stops it proposing wkhtmltopdf when you have weasyprint. Better: make the list a skill (doc-tools, bench-tools) with the exact invocations that work on your machine, so the knowledge loads only when a document or a board is in play.

14The starter kit

Four files that turn the ideas above into configuration. Copy them into ~/.claude/ and adapt. Nothing here is specific to one machine.

Register the hook in ~/.claude/settings.json:

"hooks": {
  "PostToolUse": [{
    "matcher": "Write|Edit",
    "hooks": [{ "type": "command",
                "command": "~/.claude/hooks/format.sh",
                "timeout": 30 }]
  }]
}
Because the hook skips formatters that are not installed, it does nothing until you install one — and then starts working with no further configuration. Test it before trusting it: introduce a formatting error through an edit and check that the file comes back corrected.

15What to do, in order

This week — thirty minutes

Next week

The month after

16Anti-patterns

PatternSymptomFix
The kitchen sink sessionOne task, then an unrelated one, then backClear context between unrelated tasks
Correcting over and overThree corrections, still wrongAfter two, clear and write a better prompt
The over-specified CLAUDE.mdClaude ignores rules you definitely wrotePrune ruthlessly; move sometimes-rules to skills
The trust-then-verify gapPlausible code, broken edge casesIf you cannot verify it, do not ship it
The infinite exploration"Investigate X" consumes the context windowScope it, or delegate it to subagents
Correcting instead of rulingThe same mistake, every session, foreverWrite the rule. This is the one that matters
Workflows for small jobsLarge token bill, tiny changeWorkflows are for genuine fan-outs
Interrupting constantlyRedirecting every few minutesThe brief was incomplete — write the full brief
Reviewing with a forkThe reviewer agrees with everythingReview in a fresh context that sees only the diff
Opus for grepLimits hit by lunchtimeCheap model, low effort on the reading stages; /usage to find them
MCP sprawlSessions feel dull from turn oneScope servers per project; check /usage
Planning in the build sessionThe spec and the code argue in one contextInterview → document → /clear → execute
Letting Claude do the exerciseYou "learned" it; you cannot reproduce itTutor output style; you produce the artifact

The one-paragraph version

Give Claude a way to check its own work — that is worth two to three times on quality and it is the whole ballgame. Write one complete brief up front instead of steering turn by turn. Guard your context like a budget: clear often, rewind past failures, delegate reading to subagents. When Claude gets something wrong, write a rule rather than a correction, so your setup compounds instead of resetting. And when a job is bigger than one conversation can hold, don't try to hold it — move the plan into a harness: worktrees for independent work, subagents for research and review, workflows for anything that fans out. Spend the strong model on judgement and the cheap one on reading. None of this is specific to code — any domain with a directory of files and a command that returns pass or fail works the same way, and so does planning and learning, once the thing being verified is a document or your own understanding.