37cf1833774725c90d8ef99dbfa81290364bea03
Sessions panel now shows on-disk JSONL history for the current directory (background scanner, ~1/s, deduped against live sessions). space/→ expands a session into a lazygit-style turn tree; j/k walks sessions and turns; v anchors a visual range; b materialises a new fully-decoupled branch file. ctrl-↓ is the commit point for attach/resume/spawn; live external sessions get a 3-second liveness guard (past_embeds skips the guard for sessions we killed ourselves). n opens a model-picker popup and spawns a fresh --session-id session; model aliases are auto-discovered by scanning the installed claude binary (no API call, no exec). ctrl-f toggles fullscreen for the embedded pane. Mouse is now captured: wheel always scrolls the feed, left-drag selects screen text copied on release via OSC 52 (like Claude Code). Native selection needs shift held. FeedCache stores per-entry rendered lines + wrapped heights, rebuilt only when the content fingerprint changes — work while holding the app mutex is proportional to what changed, and feed scroll now works past u16::MAX lines. Kind::User entries (deep-blue ❯ prefix) surface user prompts from request bodies via record_user_prompt. src/markdown.rs added: GFM table rendering (box-drawing, width-fitted columns) and heading # marker stripping, compensating tui-markdown 0.3.5 gaps without upgrading. The proxy tap now runs on a dedicated tokio task via a bounded mpsc channel (try_send; drop-on-full) so it never delays forwarded bytes. Listener is bound before the TUI starts so multi-instance port coexistence works from launch; CT_UPSTREAM added for fully offline testing. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
claude-thinking
A TUI that displays Claude Code's streams token-by-token — thinking, text, and tool calls — by sitting as a pass-through proxy between Claude Code and the Anthropic API.
No extra usage: it never issues requests of its own; it observes the SSE stream of requests Claude Code was already making, forwarding bytes verbatim and unbuffered.
claude ──ANTHROPIC_BASE_URL──▶ claude-thinking (127.0.0.1:8484) ──▶ api.anthropic.com
│
▼
TUI: live token feed
Usage
cargo build --release
./target/release/claude-thinking
Then point Claude Code at the proxy, either per-shell:
export ANTHROPIC_BASE_URL=http://127.0.0.1:8484
claude
or globally in ~/.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "http://127.0.0.1:8484" } }
Note: with the global setting, Claude Code can't reach the API while the proxy isn't running.
Keys
| key | action |
|---|---|
q / Esc |
quit |
Tab / Shift-Tab |
switch session |
j/k, arrows, PgUp/PgDn |
scroll (disables follow) |
f / G / End |
follow live tail |
g / Home |
jump to top |
Display
- ✻ thinking — dim italic, streamed token-by-token
- text — rendered as markdown (
tui-markdown) - ⚙ tool calls — input JSON pretty-printed on completion, raw fragments while streaming
- meta — message boundaries with model, context size, stop reason, token counts
- errors — API/stream errors in red
Sessions are keyed by the Claude Code session ID found in request metadata; concurrent requests (subagents) tap independently.
--headless runs the proxy without the TUI. CT_PORT overrides the port (default 8484).
Description
Languages
Rust
97.3%
Python
2.7%