three surfaces, one model

The same underlying models power three quite different products. Confusing which one you're in is the most common source of "why can't Claude do X" — the chat app and the CLI have genuinely different capabilities.
SurfaceWhat it isBest for
Claude.aithe chat web app / desktop appconversations, research, writing, quick questions, Projects
Claude Codean agentic CLI/IDE tool that reads, edits, and runs code in your actual reporeal software engineering work — the rest of this section is about this one
API (Messages API)direct programmatic access — no UI at allbuilding your own product or automation on top of Claude

getting started with claude code

curl -fsSL https://claude.ai/install.sh | bash [help] the recommended install for macOS, Linux, and WSL — auto-updates in the background
brew install --cask claude-code | | Homebrew alternative; doesn't auto-update, run brew upgrade yourself |'ccs_inst2'
claude | | launches Claude Code in the current directory — it reads the repo it's launched from |'ccs_inst3'
Unlike the chat app, Claude Code starts with essentially no context about your project until it reads it — it discovers your codebase the same way a new engineer would: by looking at files, running commands, and reading whatever CLAUDE.md you've left for it (see Effective Prompting).
The terminal is one of several surfaces running the same underlying engine — a VS Code extension, a JetBrains plugin, a standalone desktop app, and a browser version at claude.ai/code all share the same CLAUDE.md files, settings, and MCP servers, so switching surfaces mid-project doesn't mean starting over.

what it's actually for

Beyond writing code from a description, the pattern that matters most day to day is letting Claude Code chain a whole task: reproduce a bug, fix it, run the tests, and commit — one instruction instead of four separate ones. It's also composable as a plain Unix tool, which matters more than it might sound:

tail -200 app.log | claude -p "Slack me if you see any anomalies"
git diff main --name-only | claude -p "review these changed files for security issues"
            
The -p flag runs Claude Code non-interactively — give it a prompt, let it finish, read the result — the mode that fits inside a script or a CI job rather than an interactive terminal session (see Claude Code for Remote/GPU Workflows for more on this).

prompting fundamentals that apply everywhere

These hold whether you're in a chat window or a terminal:
HabitWhy it matters
State the goal, not just the step"fix this bug" gives Claude room to find the actual root cause; "change line 42" doesn't
Give the why, not just the whatconstraints and reasons let Claude make good judgment calls on the parts you didn't specify
Say what you've already triedprevents re-treading dead ends you've already ruled out
Correct early, not at the enda wrong assumption compounds the longer a task runs before you catch it

one chat, a project, or a repo

A plain Claude.ai conversation is for something self-contained. A Project is for recurring work that shares context (a client, a course, a codebase you discuss but don't edit). Claude Code is for when Claude needs to actually read and change files in a real repository, not just talk about one.

related topics

Claude Code CLI Basics — the actual command reference, once you're past "what is this."
Effective Prompting with Claude — going deeper on the habits introduced above.
Choosing a Claude Model — which model to reach for and when.

reference

code.claude.com — overview
claude.ai