Sign in Book a demo 134

Capability matrix

What Claude Code, Codex, the Python/TS SDK, and generic OTLP agents each support in TokenJam.

TokenJam takes telemetry from four kinds of source: Claude Code, OpenAI Codex, the Python / TypeScript SDK, and any OTLP-compliant agent wired straight to the ingest endpoint. They are not equivalent. Each source exposes a different set of hooks upstream (or none), so each one lights up a different slice of the product.

This page is the honest per-capability breakdown. Rows are capabilities, columns are sources, cells say what you actually get.

Onboarding entry points

SourceCommand
Claude Codetj init --claude-code
Codex CLItj init --codex
Python SDKtj init, then @watch() + patch_*() in your code
Generic OTLPNone. Point your exporter at tj serve’s /api/v1/spans

What each source supports

CapabilityClaude CodeCodex CLIPython / TS SDKGeneric OTLP
Live captureYes. OTLP log events convert to spansYes. Same converter, dedicated Codex event parsersYes. In-process @watch() + patch_*() spansYes. POST /api/v1/spans with any GenAI-semconv payload
Historical backfillYes. tj backfill claude-code reads ~/.claude/projects/*.jsonlYes. tj backfill codex reads ~/.codex/sessions/N/A. SDK telemetry is live-onlyPartial. tj backfill otlp --source-file replays an OTLP dump
Zero-token statuslineYes. tj statusline wired into ~/.claude/settings.jsonNo. Codex has no custom-command status line hookN/A. No TUI to wireN/A. Depends on the host agent’s own UI
Resume-brief hookYes. SessionStart hook re-injects prior contextNo. Codex has no hook system tj integrates withN/A. Use record_llm_call() / record_tool_call() manuallyN/A
Per-terminal identityYes. claude shell wrapper sets a distinct instance ID per terminalNo. Codex hardcodes one service name, so every terminal collapses into one tileYes. Caller sets agent_id per @watch()Partial. Only if the agent sets its own resource attributes
Dashboard (Lens web UI)YesYesYesYes
AnalyzersYesYesYesYes
In-loop MCP serverNo, by design. An in-loop MCP measured +36% quota overhead on CC subscription usersNo, by design. Same reasoningYes. This is the primary intended useYes, if the host agent supports MCP tool-calling

Reading the matrix

The dashboard and analyzers are source-agnostic. They read from the local DuckDB store, not from whichever path put the spans there. Once telemetry lands, tj optimize, tj cost, and the Lens web UI treat a backfilled Claude Code session and a live SDK span the same way.

The MCP server is deliberately off for coding agents. An in-request-path MCP server pays tool-definition overhead on every turn. A measured A/B put that at +36% model-weighted quota for Claude Code subscription users, so the coding-agent paths ship a zero-token statusline instead. The MCP still fits SDK and API integrations, where tj already sits in the request path. See MCP server.

The remaining Codex gap is the statusline, and it is upstream. Codex’s status line accepts a fixed list of built-in items and has no command-backed slot to inject an external line into, so tj stays fully out of band for Codex through OTel plus the tj CLI. Historical backfill is no longer a gap: tj backfill codex reads the session transcripts Codex writes to ~/.codex/sessions/.