Skip to content

Session blueprint

A blueprint is one session auto-assembled into a node graph: a root node for the session, fanning out to everything it used. Open it from any session row (blueprint), the detail aside (⌗ blueprint), search hits, the timeline, or lineage.

A session blueprint fanning out from the session root node A session blueprint fanning out from the session root node

The session root on the left, fanning out to the tools, skills, subagents and files it touched.

Route: /blueprint/:provider/:id. Data: GET /api/sessions/:provider/blueprint/:id.


The server walks the session’s full transcript (including abandoned branches where the provider keeps them) and tallies:

Node kindGlyphBuilt from
tools⚙Every tool_use part, grouped by tool name (side list shows up to 60 samples. view / download invocations for the full dump)
skills used✦Skill tool calls plus <command-name> slash-command envelopes in prompts
rules§Global + project instruction files that apply to the project dir
skillsets✦Skill artifacts on disk in the same scopes
contexts❝Payloads extracted from (↑) and injected into (↓) this session. view context / download payload
reasoning∴Thinking blocks: count, char total, samples (view reasoning / download for the full dump)
subagents⎇Child runs. view transcript, open context, view reasoning on the node, or ⌗ open blueprint for the child graph
files▤Touched files with op, ± lines, bytes, edited line ranges

Each toggle in the filter bar carries its count. The search box filters nodes by name, path, or preview.


Shows the title, N prompts · M replies, then output tokens, cache hit %, duration, and tool-error count, badged with the model.

Selecting it opens the session rows. Provider, id, project, model, agent, status, messages, tokens in/out/reasoning, cache read/write, cache hit, tracked costs, actual spend, permission mode, git branch, updated. Plus the internals block:

To ask which session might have written this commit (heuristic only): GET /api/git/sessions?dir=<repo>&commit=<sha> returns ranked possible sessions by time window, branch, and touched-file overlap. Never treat the top hit as ground truth.

MetricMeaning
context per requestSparkline of context size across the session
peak / nowLargest and last observed context
compedSharp drops. A previous point above 20k tokens followed by one under 55% of it
thinkingReasoning blocks and a chars ÷ 4 token estimate
tool errorsTool results flagged isError
durationFirst to last message timestamp

Context comes from per-message usage (input + cacheRead + cacheWrite) when the provider records it. When it doesn’t, threadle falls back to cumulative chars ÷ 4 and marks the figure ~est. The same ~ prefix used on estimated token counts everywhere.

Compaction points are drawn as dashed vertical ticks on the sparkline.

For the full interactive curve (prompts, cache overlay, top growth), open Context growth.


File nodes are sorted by churn (additions + deletions) and capped at 30. A +N more files node toggles the full list. Clicking it again collapses back. Each file’s detail panel lists path, operation, ± lines, bytes written, last touched, and the edited line ranges when patch hunks exist. With open (floating viewer), open in your editor, and copy path / copy content on right-click for text files. See Open files & context.


Selecting the session root (or a subagent) exposes these in the detail panel and on right-click:

ActionWhat it does
view transcriptFloating interactive message list for that session (or child)
open contextFloating viewer for the reconstructed thread (preview-capped at 1.5 MB when large)
open context in …Write full context to ~/.config/threadle/tmp and open in your editor
copy pathProject directory path
⇓ download contextFull markdown download
→ workflow · referenceStore as a library payload tagged reference, seed a new workflow with that context node
library · referenceStore + tag only. Drag later from Library / palette
view reasoningFull thinking-block dump (subagent detail. Also on the ∴ reasoning node)
⌗ open blueprintChild blueprint (subagent only)

The blueprint topbar puts ≡ transcript first when the session has a transcript, then ↗ urls, then → workflow / ⇓ bundle.

Selecting a ❝ context node offers view context (payload body) and ⇓ download payload (raw JSON).


↗ urls opens a modal of every http(s) URL found in this session’s tool calls. WebFetch / fetch inputs, url fields, and URLs embedded in Bash/curl (and similar) summaries. Results bodies are not scanned, so links inside a fetched page do not flood the list.

ControlWhat it does
Filter boxMatch URL, domain, tool name, or sample summary
Domain dropdownPopup menu. Limit to one hostname (all domains clears)
Tool dropdownPopup menu. Limit to one tool name (all tools clears)
Row clickOpen the URL in a new tab
copyClipboard: filtered URLs, one per line

Counts are per distinct URL (same address called twice → n = 2). The list seeds from the blueprint tool samples, then merges any additional URLs from the full transcript’s tool_use parts.


Selecting a tool, skill, or reasoning node shows a scrollable sample list in the detail panel (capped at 60. +N more not shown · download for full). Actions sit under that list. Same place as rule-file open / open in …:

ActionWhat it does
view invocations / view reasoningFloating viewer for the full dump (preview-capped at 1.5 MB when large. Same banner as context)
⇓ download invocations / ⇓ download reasoningUncapped markdown of every call

Right-click the node for the same pair. See Open files & context.


DownloadEndpointContents
⇓ bundle/api/sessions/:provider/bundle/:idBlueprint + rendered context + reasoning + meta for the session and every subagent, one JSON
⇓ download context/api/sessions/:provider/context/:idThe active thread rendered to markdown. The reconstructed model context, with thinking and full tool I/O
⇓ download reasoning/api/sessions/:provider/reasoning/:idEvery thinking block, timestamped, as markdown
⇓ download invocations/api/sessions/:provider/invocations/:id?kind=tool|skill|reasoning&name=…Every tool / skill / reasoning call as markdown (name required except for reasoning)
⇓ download payload/api/payloads/:hashRaw library payload JSON

The context download reconstructs what the model saw. The provider-side prompt cache itself is not inspectable. Preview / materialize variants: ?preview=1 (JSON, size-capped) and ?materialize=1 (tmp file path for the editor). Invocations support ?preview=1 the same way (no materialize yet).

Some models strip thinking text and keep only a signature. The blueprint says so. content: redacted by the model (signature only). And hides the reasoning / invocations downloads, because counts survive but text does not.


  • Subagent detail → ⌗ open blueprint pushes the child blueprint with a breadcrumb back to the parent. Transcript / context / reasoning viewers work on the ⎇ node without leaving the parent blueprint.
  • → workflow seeds an editable canvas from this session plus its subagents.
  • ↗ urls lists outbound http(s) URLs from tool calls (domain / tool / text filters). See Outbound URLs.
  • The back arrow returns to the parent blueprint, or to wherever you came from (?from=timeline, ?from=lineage), else the Sessions view.

For the message-by-message transcript use view transcript on the blueprint / Sessions detail, the Search result panel, or double-click a session node on the canvas.

The same summary data (minus the graph) renders in the session info panel used by Sessions, Timeline, Lineage, and Search. Including ❯ resume in terminal, which copies the provider’s resume command for the session’s project dir.