Four Places to Run Claude Code — and What Each One Silently Drops
A cloud session clones your repo into a fresh Anthropic VM — so your personal skills, agents and every MCP server you added with `claude mcp add` are simply not there. Surface choice isn't a UI preference, it's a capability choice. Here's the decision rule by task shape, plus the commit that makes your setup portable.
- #claude-code
- #vs-code
- #cli
- #setup
- #workflow
Here's the detail that reframed this whole question for me. A cloud session at claude.ai/code runs in a fresh Anthropic-managed VM with your repository cloned into it — and the docs are blunt about what that means: your ~/.claude/CLAUDE.md, your user-level skills/, agents/ and commands/, and every MCP server you ever added with claude mcp add are not available. Only what's committed to the repo travels. Meanwhile, the VS Code extension bundles its own private copy of the CLI but does not put claude on your PATH, so plenty of people believe they have the terminal Claude and don't.
So "am I using Claude in the wrong place?" is the wrong question. The right one: which surface does this task shape need, and does that surface still have my config?
The four surfaces, by what only they can do
The terminal CLI — the superset. It's the only surface with --print and the Agent SDK, so the only one you can script or drop into CI; the only one that runs agent teams; and the only one with the full set of slash commands and skills. It also keeps ! for a quick shell command and tab completion, both of which the VS Code panel drops. Best for: anything automated, anything unattended, and anything needing a command the GUIs only expose as a subset.
The VS Code extension — the reviewing surface. Selected text is picked up automatically; Option+K (Alt+K on Windows/Linux) turns your selection into an @app.ts#5-10 reference. In Plan mode, VS Code opens the plan as a full Markdown document you can leave inline comments on before Claude touches anything — that alone is worth the switch on a risky refactor. @terminal:name pulls a terminal's output into the prompt with no copy-paste. Needs VS Code 1.94.0 or later. Best for: work you have to read line by line before accepting.
The desktop app's Code tab — the parallelism surface. Note it's a different tab from the Chat tab most people mean by "the desktop app". Every session gets its own Git worktree automatically (the CLI needs an explicit --worktree), stored under <project-root>/.claude/worktrees/. It's also the only surface that accepts image and PDF attachments — "not available" in the CLI — and it has /btw (Cmd+;) for a side chat that reads your main thread but adds nothing back to it. Best for: three or four tasks at once without them fighting over your files.
The web (claude.ai/code) — the async surface, in research preview for Pro, Max and Team. Sessions run on Anthropic's infrastructure and survive you closing the laptop; you can watch them from the mobile app. There's no separate compute charge for the VM — it draws on the same rate limits as the rest of your usage. Best for: long, self-contained jobs you want to walk away from.
The decision rule I use
- Will I read every diff? → VS Code extension. The native diff, plus the fact that you can edit Claude's proposal inside the diff before accepting it, is the whole point.
- Is it three independent tasks? → desktop Code tab. Automatic worktrees mean you don't hand-roll the isolation.
- Does it need to run without me — overnight, or while I'm in meetings? → web/cloud session.
- Does anything script, pipe, or automate it? → CLI. No GUI has
--print. - Everything else → CLI. It's the superset, so you never lose a feature by defaulting there.
Make your config portable (the part everyone skips)
The cloud VM's rule is simple: the repo travels, your home directory doesn't. Repo-level CLAUDE.md, .claude/settings.json hooks, .claude/rules/, .claude/skills/, .claude/agents/, .claude/commands/ and .mcp.json all arrive with the clone. User-scoped anything does not — and claude mcp add writes to your user config, which is exactly why your MCP servers vanish in the cloud. Declare project servers in .mcp.json instead.
# 1. Move the config you actually rely on out of ~/.claude and into the repo
mkdir -p .claude/agents .claude/skills .claude/commands
mv ~/.claude/agents/code-reviewer.md .claude/agents/
# 2. Commit it — this is what a cloud VM will see
git add CLAUDE.md .claude .mcp.json && git commit -m "chore: portable claude config"
git push # --cloud clones from GitHub, not from your disk, so push first
# 3. Fire an async task and pull it back later
claude --cloud "run the test suite and fix whatever breaks"
claude --teleport # picks the cloud session AND checks out its branch
Two gotchas before you rely on this. --cloud and --teleport don't show up in claude --help, though the CLI accepts them. And handoff from the terminal is one-way: you can pull a cloud session down with --teleport, but you can't push a terminal session up. Only the desktop app does that, through its Continue in menu, which pushes your branch plus a summary of the conversation — and it requires a clean working tree.
Why this matters more from São Paulo than from San Francisco
On a Brazilian schedule working with a US or European team, the surface split is your handoff protocol. End of your day: claude --cloud on the migration nobody wants to babysit. It keeps running while you sleep and doesn't care that your laptop is shut. Next morning, claude --teleport pulls that session and its branch straight into your terminal, and a teammate five timezones away could read the progress the whole time. That's not a productivity hack — it's how you stop being the person whose work is only visible during your own working hours. Careful with the two flags, though: --resume only reopens history from this machine, so it will never list a cloud session.
One caveat if you're not on GitHub: cloning and pull-request creation require it. GitLab and Bitbucket repos can be sent up as a local bundle, but the session can't push results back to the remote.
Today: run which claude. If it comes back empty while the VS Code panel works fine, you've been running one surface and assuming you had two — install the standalone CLI. Then ls ~/.claude/agents ~/.claude/skills and move the one you'd genuinely miss into your repo's .claude/.
Sources
Keep reading
More guides like this one.
The 7 Levels of Claude Code — Find Yours, Climb One
Most engineers stall at level 3, treating Claude Code like a smarter terminal. Here's the ladder from chat to agent teams — with the exact file or command that moves you up each rung.
The settings.json That Stops the Permission Prompts
Permission rules are the one Claude Code setting that merges across files instead of overriding. Understand that and you can build an allowlist that actually holds — and stop approving the same command forty times a day.
Why Claude Ignores Your CLAUDE.md
Your CLAUDE.md is not configuration — it is a user message Claude reads and tries to follow. That one fact explains every rule it keeps breaking, and it changes how you write the file.