Team angle: pick one surface as the team default even though they're interchangeable, because your runbooks and screenshots and onboarding docs have to assume something.
We standardized juniors on the VS Code extension first, deliberately. Not because it's the most powerful — because the inline diff view forces them to actually read what the agent wrote before accepting it. The terminal makes it too easy to tab away while 400 lines land. Reviewing habits first, autonomy second.
They're one engine with different chrome, so you can't really pick wrong — but the surfaces do push you toward different habits.
CLI is the canonical one. New features land there first, everything scriptable lives there, and every fix on this site is written against it. If you only learn one, learn this.
Desktop app is the CLI plus a session manager. The one genuine advantage: it makes parallel sessions in git worktrees a two-click affair instead of a mkdir ritual. When you graduate to running two agents at once, move here.
Web (claude.ai/code) runs in a cloud sandbox. Different mental model: you're not lending it your machine, you're handing it a repo. Great for kicking off long tasks from anywhere, and the sandbox means its permission mistakes can't touch your laptop. Environment variables and local services are where it differs — your .env doesn't exist there.
IDE extensions are strongest for the review half of the loop: inline diffs in your editor, accept/reject per hunk. Weakest for long autonomous runs.
For a beginner: terminal, in a repo you don't care about, with a CLAUDE.md you wrote yourself. Two weeks of that teaches you what the agent actually does. Then add surfaces as the need appears, not before.
This is the answer I needed. Follow-up: do hooks and CLAUDE.md carry across surfaces, or am I configuring four times?
Once. It's all repo-level config — .claude/settings.json, CLAUDE.md, hooks — and every surface reads the same files. The exception is the web sandbox, where machine-local things (env vars, credentials, anything your hooks shell out to) need to exist in the sandbox environment instead of your laptop.