Releases: 0bserver07/StackUnderflow
v0.6.1
Polish + correctness pass on v0.6.0. See CHANGELOG.md.
Fixed
- Cursor sessions: $0 → real cost (composer-* + cursor-auto now estimated at Sonnet rates; vendor-prefixed models delegate to upstream pricer). Cursor total in /api/compare jumped from $0.0000 → $14.4367 on real data.
<synthetic>model sentinel no longer leaks into compare/cost reports. v004 migration cleans 221 existing polluted rows.- Currency conversion no longer silently degrades to USD-with-foreign-symbol when Frankfurter is unreachable. Embedded rate snapshot + UI warning banner.
Changed
- Cursor adapter derives per-workspace project_slug from bubble file paths (was collapsing 9 conversations into 1 "cursor" project; now 7 distinct workspaces).
- v005 migration reparents existing legacy cursor sessions.
Tests
- +96 defensive empty-source / malformed-data tests covering 10 beta adapters.
- 1328 passing total (was 1187 at v0.6.0).
v0.6.0
v0.6.0 — full multi-provider pipeline + cost correctness + UI surfaces
See CHANGELOG.md for the complete entry list.
Highlights
- Multi-currency, CSV/JSON export, model aliases (#33–#35)
- 7 new optimize patterns + plan budgets + compare mode + yield analysis + context-budget (#37, #39–#42)
- Fast-mode (Claude Opus priority tier) detection through the entire pipeline including SQLite (#44, #48)
- Streaming JSONL reader (185MB → <1KB peak) + Cursor parse cache (3-8× speedup) (#38, #43)
- Cursor + Cline adapters default-on; 12 others remain beta-opt-in (#49)
- Public Python API (
list_projects/process/list_sessions) reads the store, provider-tagged (#50) - MCP server multi-provider —
session_query+ newlist_sessions+list_projectstools (#51) - Cursor v3 vscdb fix — was ingesting 0 sessions on real Cursor data (#52)
- Dashboard surfaces for compare, yield, plan, optimize, context-budget (#47)
- Codeburn attribution scrub from shipped code (#36)
Pipeline verified end-to-end
After this release a clean ingest produces:
- 188 projects, 228K messages, 1106 sessions, 7 providers (claude, codex, cursor, cline, gemini, droid, qwen) in the local store
- Public Python API + MCP both surface the same data
Tests
1187 passing, 2 skipped (was 882 at v0.5.0 — +305 new tests)
v0.5.0 — Full codeburn parity
Full codeburn replication. All 16 providers from codeburn's TypeScript catalog now have Python adapters in StackUnderflow.
Highlights
- 🎯 16/16 codeburn providers replicated — claude, codex stable (default ON); 14 others beta-flagged opt-in
- 🆕 5 PRs of new adapters in this release: #27 #28 #29 #30 #31
- 📊 805 backend tests passing (up from 527 in v0.4.0 — +278 new tests)
All beta flags
STACKUNDERFLOW_BETA_CURSOR=1
STACKUNDERFLOW_BETA_CLINE=1
STACKUNDERFLOW_BETA_KILOCODE=1
STACKUNDERFLOW_BETA_ROOCODE=1
STACKUNDERFLOW_BETA_OPENCODE=1
STACKUNDERFLOW_BETA_CURSOR_AGENT=1
STACKUNDERFLOW_BETA_QWEN=1
STACKUNDERFLOW_BETA_GEMINI=1
STACKUNDERFLOW_BETA_COPILOT=1
STACKUNDERFLOW_BETA_CODEIUM=1 # discovery stub — protobuf schema deferred
STACKUNDERFLOW_BETA_CONTINUE=1 # defensive SQLite parser
STACKUNDERFLOW_BETA_DROID=1
STACKUNDERFLOW_BETA_KIRO=1
STACKUNDERFLOW_BETA_OPENCLAW=1
STACKUNDERFLOW_BETA_PI=1
All default OFF. Combine freely.
Deferred
cost_sourcepropagation through adapter → DB → enricher → cost collectors. The≈UI marker stays dormant until that lands.- Codeium protobuf decoding (no published schema; ships as discovery-only stub).
See CHANGELOG.md for adapter-by-adapter detail.
🤖 Generated with Claude Code
v0.4.0
Wave 2 of the multi-provider initiative.
Highlights
- 🧱 Multi-provider foundation —
SessionRef.source_kind/source_hint,ingest_logv002 schema migration, pluggableProviderPricermodules. JSONL adapters need zero changes. - 🆕 Cursor adapter (beta) — reads
state.vscdb, rowid-resumable, opt-in viaSTACKUNDERFLOW_BETA_CURSOR=1 - 🆕 Cline adapter (beta) — reads VS Code globalStorage tasks, vendor-prefix cost routing, opt-in via
STACKUNDERFLOW_BETA_CLINE=1 - 🎨 Dashboard polish — provider chips on every session row and project card; estimated-cost markers (
≈) for sessions where the provider doesn't surface per-message tokens
What's in this release
PRs: #20 (foundation), #22 (cursor), #21 (cline), #23 (UI polish), #24 (API provider field fix), #25 (release)
527 backend tests passing. Frontend typecheck + build clean.
See CHANGELOG.md for details.
Deferred
cost_source propagation through adapter → DB → enricher → cost collectors. The current adapter raw field doesn't survive the pipeline cleanly. Worth a follow-up PR.
🤖 Generated with Claude Code
v0.3.6 — MCP server, dashboard cache, auto-reindex, polish
Added
- MCP server (
stackunderflow.mcp). New FastMCP stdio server exposing asession_query(session_id, limit, kind="tool_calls"|"errors"|"all")tool to MCP clients (Claude Desktop, Claude Code, Cursor, etc.). Walks Claude-Code-format JSONL logs across~/.claude,~/.claude-opus,~/.claude-sonnet,~/.claude-haiku,~/.claude-glmdirectly throughstackunderflow.adapters.claude.ClaudeAdapter— stateless, no SQLite, no ingest dependency. Adds runtime depmcp>=1.2.0and console scriptstackunderflow-mcp. Smoke-tested against ~1018 local sessions; tool-call and error filters return real records. Contributed by @zh4ngx (PR #9). stackunderflow mcpCLI subcommand as an alias for thestackunderflow-mcpconsole script — discoverable viastackunderflow --help.docs/mcp.md— full reference for the MCP server: install, Claude Desktop / Claude Code / Cursor wire-up,session_querytool reference, supported agent roots, architectural rationale, known limitations.- README MCP section with a copy-paste Claude Desktop config block and a pointer to
docs/mcp.md. - Auto-reindex after ingest.
run_ingestnow refreshes the search, tag, and Q&A indexes for every project that gained new messages, so users no longer have to POST to/api/search/reindex,/api/tags/reindex,/api/qa/reindexafter ingest. Each service is invoked in its own try/except — a beta-service failure (tags or Q&A) cannot break ingest, and search itself fails soft. Gated by a newauto_reindex_on_ingestsetting (defaultTrue, envAUTO_REINDEX_ON_INGEST) for power users who want to disable it. Per-project re-index, not fullreindex_all— only the touched projects are touched.
Changed
/api/dashboard-data~29x faster on warm hits. Live measurement against the
chimera test project (~18k messages, 827 KB payload):- Cold (cache miss): 1381.9 ms
- Hot (cache hit): 46.0–48.3 ms across 5 consecutive runs
- Hot output is byte-identical to cold (same MD5)
- Per-phase breakdown of the cold path: SQL fetch ~135–310 ms,
json.loads
loop ~235–295 ms, classifier+enricher+formatter ~180 ms, aggregator
~445 ms — every phase dominated byaggregator.summarise. - Implemented as an in-process memo on
routes.datakeyed by
(slug, tz_offset), with a(MAX(sessions.last_ts), SUM(message_count))
signature pulled in one SQL query. Adding a session, growing an existing
session, or running/api/refreshwith new data all bump the signature
and force a fresh build.is_reindexingandconfigare overlaid on
the cached payload per request so live config edits aren't masked.
tool_count_distributionsplit off/api/dashboard-dataonto its ownGET /api/tool-distributionendpoint (mirrors the §D1 pattern that previously movedcommand_detailsto/api/commands). On chimera the dashboard payload drops from 846,774 → 846,274 bytes (wc -con real curls); the bucket map itself is 501 bytes / 66 buckets there. On busier projects with hundreds of distinct tool counts the saving is materially larger. The Overview tab'sCommandToolDistChartnow lazy-fetches the map after mount, so the chart renders an empty state for ~1 RTT instead of blocking initial paint.- Cost-tab table column widths hand-tuned so cells no longer look cramped:
CommandCostList:When8rem → 7rem (timestamps fit cleanly),%Total/
Tools/Steps4rem → 5rem so headers don't wedge against their sort
chevrons;Promptkeeps the slack as the only flex column.OutlierCommandsTable:When7rem → 8rem to match the sibling commands
table;Cost5rem → 6rem so$1,234.56has breathing room.SessionEfficiencyTable:Edit/Read/Search/Bash4rem → 5rem
(Search+ chevron previously overflowedw-16);Idle Total/Idle Max
5rem → 6rem so the two-word headers stay on one line;Class8rem → 9rem
for theresearch-heavybadge.SessionCompareView: numeric columns (A,B,Δ) get fixed 10rem widths
so the metric-label column gets the slack, and the loading skeleton matches.
- All four cost-table headers now wrap with
whitespace-nowrapto guarantee
single-line headers at the 1280px breakpoint.
v0.3.5 — Reindex fix + cost-tab UX
Fixed
- Full-text search returned 0 for any project ingested after the pipeline → stats rename. `SearchService.reindex_all`, `TagService.reindex_all`, and `QaService.reindex_all` all imported `from ..pipeline import process` — module gone since 0.3.0. Hitting Reindex silently failed. All three now use `queries.get_project_stats(conn, project_id=...)`.
- Reindex was deleting its own work for projects with duplicate slugs (claude + codex). `index_project` does `DELETE WHERE project = ?`, so iteration 2 wiped iteration 1. Now groups by slug, concatenates, indexes once.
Verified: chimera-scoped `refactor` search returns 74 hits (was 0 with the same query yesterday).
Changed (UX pass on the dashboard)
- Cost-tab table page-size default 25 → 10
- `TokenCompositionDonut` taller + bigger radii — reads as a hero card
- `Top Sessions by Cost` y-axis: `<short_id> · ` instead of bare hash
- Overview `Date Range` mini-card: locale-formatted instead of ISO slice
- Overview layout: `CacheRoiCard` + `TokenCompositionDonut` share a 2-col grid
- Per-message JSON toggle in the session viewer
- Commands + Messages tab cells wrap instead of single-line truncate
- All Overview chart heights standardised at 280; `ToolUsageBarChart` capped at 420
See CHANGELOG.md.
v0.3.4 — Cost-tab pagination, Cost Saved fix, formatCost unification
Fixed
- Cost Saved rendered raw token-rate units. Backend stores `cost_saved_base_units` as `tokens × $/M-rate` without the /1M divisor — frontend was passing the raw value to `formatCost`. Result: `$2,346,042,618` instead of `$2,346.04` on a busy project.
- Pagination added to the Cost-tab tables: `Most Expensive Commands`, `Outlier Commands` (high-tool / high-step sections), and `Retry Alerts`. Real Prev/Next + N/page (10 / 25 / 50 / 100). The previous "Show all (N)" toggle on outliers was a row-dump.
- `formatCost` consolidated into one canonical implementation in `services/format.ts`. 11 drifted local copies replaced — most were missing the `≥$1,000` thousands-separator branch (`$5421` instead of `$5,421`), and two were stuck on `toFixed(4)` always (Total Cost mini-card showed `$5421.0345`).
See CHANGELOG.md.
Install
```
pip install --upgrade stackunderflow
stackunderflow start
```
v0.3.3 — Project list dedup
Fixed
Duplicate projects in /api/projects — same project used through both Claude and Codex appeared twice in the dashboard projects list (one row with each provider's stats), making the Est. Cost sort look broken. The schema's `UNIQUE (provider, slug)` permits this; `/api/projects` now groups by slug and merges stats additively.
Verified on a 166-project DB: 7 duplicate slugs collapsed, 166 → 159 rows. Costs sum across providers (e.g. chimera: $7,379 claude → $7,414 claude+codex).
See CHANGELOG.md.
Install
```
pip install --upgrade stackunderflow
stackunderflow start
```
v0.3.2 — Beta features + /settings
Opt-in visibility for heuristic dashboard tabs, plus a proper Settings page.
Highlights
/settingspage — Theme toggle, "Show beta features" switch, per-tab visibility (Default / Shown / Hidden), reset.- Beta tags — Q&A and Tags dashboard tabs marked BETA. Default-on for upgrading users; can be hidden via Settings.
- Header gear icon opens Settings.
- Persistence —
localStorage['suf:beta']+localStorage['suf:tabs'].
Fixed
- Direct loads or hard-refreshes of
/settingsno longer 404 (added an SPA catch-all inserver.py).
See CHANGELOG.md for the full list.
Install
pip install --upgrade stackunderflow
stackunderflow startv0.3.1
Cost tab (token-burn + waste attribution), NixOS flake, full light/dark theme, OpenAI Codex adapter, plus the polish pass on top.
Highlights
- Cost tab — 11 interactive components answering "where did my tokens go?": top sessions/commands by cost, per-tool attribution, token composition, cache ROI, outlier commands, retry alerts, session efficiency, week-over-week trends.
- New API —
/api/cost-data,/api/commands(paginated),/api/interaction/{id},/api/sessions/compare. - Performance —
/api/dashboard-datapayload −65% on a real project (2.37 MB → 823 KB).summarise()warm latency −45% (793 ms → 436 ms). - Real bug fixes — retry detection: 0 → 127 signals on chimera; error cost:
$0→$2.05on chimera. - Theme — full dark + light mode across every component, header toggle,
localStoragepersistence. - Navigation — breadcrumb + back button for deep-links, URL-persisted Cost tab filters, cross-tab routing service.
- Codex — source adapter for OpenAI Codex sessions (previously in Unreleased).
- NixOS —
flake.nixwithnix build,nix run,nix develop.
See CHANGELOG.md for the full rundown.
Install
pip install --upgrade stackunderflow
stackunderflow startOr with Nix:
nix run github:0bserver07/StackUnderflow/v0.3.1 -- init