Claude Code Setup
Capture every Claude Code conversation automatically with zero code changes.
Quick Start
The simplest way to capture Claude Code conversations:
tapes start claude This automatically:
- Starts the tapes daemon with auto-selected ports
- Configures Claude Code to route through the proxy
- Tags all conversations with
agent_name: claude - Shuts down cleanly when you exit Claude Code
Conversations are stored in the Postgres database you configure (see Manual Setup or tapes local up).
Manual Setup
For more control over ports and configuration, use tapes serve:
1. Start tapes
tapes serve \
--provider anthropic \
--upstream "https://api.anthropic.com" \
--proxy-listen "0.0.0.0:8080" \
--postgres "postgres://tapes:tapes@localhost:5432/tapes?sslmode=disable" The --provider anthropic flag is required. Default provider is ollama.
If :8081 is busy, add --api-listen "0.0.0.0:8082" or another free port.
2. Configure Claude Code
Add to your shell config (~/.zshrc or ~/.bashrc):
export ANTHROPIC_BASE_URL="http://localhost:8080" Match your --upstream and ANTHROPIC_BASE_URL to avoid path conflicts:
| Upstream | Base URL |
|---|---|
https://api.anthropic.com | http://localhost:8080 |
https://api.anthropic.com/v1 | http://localhost:8080/v1 |
Mismatched paths cause 404 errors (e.g., upstream /v1 with base URL without /v1).
Reload your shell:
source ~/.zshrc # or ~/.bashrc 3. Use Claude Code
claude All conversations are now captured in your Postgres database.
Verify It's Working
Check that conversations are being captured:
curl http://localhost:8081/v1/stats You should see turn_count increase with each message:
{
"session_count": 1,
"turn_count": 4,
"root_count": 1,
"completed_count": 1,
"total_cost": 0.0123,
"input_tokens": 1820,
"output_tokens": 540,
"total_duration_ns": 8421000000,
"tool_calls": 2
} What You Get
- Full conversation history - Every message, tool call, and response
- Token usage tracking - Input/output tokens and cache hits per conversation
- Cost analysis - Track API spending across sessions
- Semantic search - Find past work by meaning (setup guide)
Query Your Data
List Sessions
curl http://localhost:8081/v1/sessions View a Conversation Chain
Fetch the ancestry chain for a leaf hash (a "stem"):
curl http://localhost:8081/v1/stems/<hash> Search Conversations
After enabling semantic search:
curl "http://localhost:8081/v1/search?q=how%20did%20I%20fix%20the%20auth%20bug" Stop Using tapes
Remove the environment variable from your shell config:
# export ANTHROPIC_BASE_URL="http://localhost:8080" # Commented out Reload your shell:
source ~/.zshrc Claude Code now connects directly to Anthropic. Your captured data in Postgres is preserved.
Troubleshooting
Not Capturing Conversations
Verify the environment variable is set:
echo $ANTHROPIC_BASE_URL Should output: http://localhost:8080
404 Errors
Check your base URL and upstream path combination. Both must match:
# Option 1: No /v1 suffix on either
--upstream "https://api.anthropic.com"
export ANTHROPIC_BASE_URL="http://localhost:8080"
# Option 2: /v1 suffix on both
--upstream "https://api.anthropic.com/v1"
export ANTHROPIC_BASE_URL="http://localhost:8080/v1" Mismatched paths (e.g., upstream with /v1 and base URL without) cause 404s.
Wrong Provider Default
tapes defaults to ollama provider. For Claude Code, explicitly set:
tapes serve --provider anthropic ... Port Already in Use
Kill the process using port 8080:
lsof -ti :8080 | xargs kill -9 API Server Port Conflict
If port 8081 is busy, tapes exits silently. Free the port or use a different one:
# Check what's using port 8081
lsof -ti :8081
# Or specify a different API port
tapes serve --api-listen ":8082" ... Config Precedence
Local .tapes/ directory overrides ~/.tapes/ config. Check for a local config:
ls -la .tapes/ Delete or rename the local directory to use global config.
Verify tapes is Running
curl http://localhost:8081/ping Should return: "pong"
Next Steps
- Enable semantic search - Find conversations by meaning
- Set up agent skills - Search from within Claude Code
- Explore the API - Full API reference