Getting started with Claude Code requires thoughtful setup to maximize its capabilities. These 15 tips will help you configure Claude Code for optimal performance, whether you’re working solo or as part of a team.
The native installer is the recommended way to install Claude Code — it self-updates in the background, so you stay on the latest version automatically:
Homebrew installs do not auto-update — run brew upgrade claude-code periodically.
Terminal window
npminstall-g@anthropic-ai/claude-code
The global npm install is the legacy method and is now deprecated — prefer the native installer above. If you’re already on an npm install, migrate with claude install. Avoid sudo npm install -g, which causes permission issues.
Terminal window
# Run Claude Code inside the official reference dev container
There is no standalone Docker image. For an isolated, reproducible environment, use the documented devcontainer, which also pairs well with --dangerously-skip-permissions for sandboxed automation.
One of the most impactful configuration changes is bypassing constant permission requests:
Terminal window
claude--dangerously-skip-permissions
This eliminates interruptions for:
File editing permissions
Basic command execution
Git operations
Package manager commands
Security Consideration
This is similar to Cursor’s “yolo mode” and it genuinely can run destructive commands without asking. Only use it inside a trusted, sandboxed context — a devcontainer, a throwaway VM, or CI on a branch. Never enable it on untrusted code, a shared machine, or anywhere a bad rm/git push --force would hurt. For a middle ground, combine --permission-mode plan with --allow-dangerously-skip-permissions so bypassing is available but not active by default.
Tip 4: Install GitHub CLI for Enhanced Integration
For large-scale refactoring and architectural work, lean on Claude Code’s real planning mechanisms rather than diving straight into edits:
Plan mode — Press Shift+Tab to cycle into plan mode (or launch with claude --permission-mode plan). Claude investigates and proposes a plan without touching files until you approve it.
opusplan model alias — Set --model opusplan so Opus does the reasoning during plan mode, then execution drops to Sonnet to save cost. See Tip 8.
Subagents — Delegate large, parallelizable investigations (e.g. “map every call site of this API”) to subagents so the main context stays lean.
--add-dir — Bring sibling repositories into scope for cross-repo refactors. See Tip 9.
When to Reach for Plan Mode
Refactoring entire modules or subsystems
Analyzing complex dependency graphs
Working with unfamiliar legacy codebases
Implementing architectural patterns across multiple files
Understand the model selection strategy for optimal results:
.claude/settings.json
{
"model": "opusplan"
}
The model field takes a single alias (opus, sonnet, haiku, opusplan, sonnet[1m]) or a full model id. There is no per-task modelPreferences map — instead you pick a default here and switch on the fly with /model <alias> mid-session, or override at startup with claude --model <alias>.
Model selection guidelines:
Fable 5 (fable): The highest-capability tier — complex multi-file refactorings, building from scratch, long-running tasks where quality matters more than cost. Switch with /model fable. See model comparison for plan inclusion details.
Opus 4.8 (opus): Complex architecture, system design, difficult debugging; raise effort for the hardest cases. The Claude Code default model.
Sonnet 4.6 (sonnet / sonnet[1m]): Routine development, standard features, refactoring, 1M context when needed
opusplan: Best of both — Opus during plan mode, Sonnet during execution; for maximum quality use fable during planning and Opus or Sonnet for implementation
Additional directories are scoped to the session: pass --add-dir at launch or use the /add-dir slash command mid-session. To make extra directories stick across sessions, set permissions.additionalDirectories in .claude/settings.json — it persists the same access without retyping flags:
.claude/settings.json
{
"permissions": {
"additionalDirectories": ["../docs/"]
}
}
If you’d rather not commit it to project settings, wrapping the launch command in a shell alias (see Tip 5) is still a fine quick hack.
Setup rarely fails loudly — it fails by being silently ignored. Here are the usual culprits and the fast fixes.
MCP server won’t connect. Run claude --debug "mcp" to see the actual error, then confirm the launcher is installed (which npx, which uvx). Python-only servers like mcp-server-git need uvx on PATH — npx will not work for them.
.claude/settings.json seems ignored. Check the scope and path: project settings live at .claude/settings.json in the repo root; user settings at ~/.claude/settings.json. A typo in a key (for example servers instead of mcpServers in .mcp.json, or hooks as an array instead of an object) makes Claude Code skip the block entirely with no error.
Permission prompts keep firing. Your allowedTools pattern probably doesn’t match. Tool names are case-sensitive (Read, not View) and Bash scoping uses the Bash(cmd:*) form. Use /permissions mid-session to add the exact rule, then copy it into settings.
The extension won’t launch. Reload the IDE window (Command Palette: “Developer: Reload Window”), or reinstall directly from the VS Code Marketplace.
With Claude Code properly configured, you’re ready to optimize your project context. Continue to CLAUDE.md Optimization to learn how to create effective persistent memory for your projects.