Skip to content

Releases: 0bserver07/StackUnderflow

v0.6.1

02 May 03:36
e6d9bdd

Choose a tag to compare

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

01 May 05:04
d047a58

Choose a tag to compare

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 + new list_sessions + list_projects tools (#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

01 May 00:45
4722038

Choose a tag to compare

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_source propagation 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

30 Apr 23:59
5526846

Choose a tag to compare

Wave 2 of the multi-provider initiative.

Highlights

  • 🧱 Multi-provider foundationSessionRef.source_kind/source_hint, ingest_log v002 schema migration, pluggable ProviderPricer modules. JSONL adapters need zero changes.
  • 🆕 Cursor adapter (beta) — reads state.vscdb, rowid-resumable, opt-in via STACKUNDERFLOW_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

30 Apr 21:17
37b5061

Choose a tag to compare

Added

  • MCP server (stackunderflow.mcp). New FastMCP stdio server exposing a session_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-glm directly through stackunderflow.adapters.claude.ClaudeAdapter — stateless, no SQLite, no ingest dependency. Adds runtime dep mcp>=1.2.0 and console script stackunderflow-mcp. Smoke-tested against ~1018 local sessions; tool-call and error filters return real records. Contributed by @zh4ngx (PR #9).
  • stackunderflow mcp CLI subcommand as an alias for the stackunderflow-mcp console script — discoverable via stackunderflow --help.
  • docs/mcp.md — full reference for the MCP server: install, Claude Desktop / Claude Code / Cursor wire-up, session_query tool 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_ingest now 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/reindex after 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 new auto_reindex_on_ingest setting (default True, env AUTO_REINDEX_ON_INGEST) for power users who want to disable it. Per-project re-index, not full reindex_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 by aggregator.summarise.
    • Implemented as an in-process memo on routes.data keyed 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/refresh with new data all bump the signature
      and force a fresh build. is_reindexing and config are overlaid on
      the cached payload per request so live config edits aren't masked.
  • tool_count_distribution split off /api/dashboard-data onto its own GET /api/tool-distribution endpoint (mirrors the §D1 pattern that previously moved command_details to /api/commands). On chimera the dashboard payload drops from 846,774 → 846,274 bytes (wc -c on 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's CommandToolDistChart now 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: When 8rem → 7rem (timestamps fit cleanly), %Total /
      Tools / Steps 4rem → 5rem so headers don't wedge against their sort
      chevrons; Prompt keeps the slack as the only flex column.
    • OutlierCommandsTable: When 7rem → 8rem to match the sibling commands
      table; Cost 5rem → 6rem so $1,234.56 has breathing room.
    • SessionEfficiencyTable: Edit / Read / Search / Bash 4rem → 5rem
      (Search + chevron previously overflowed w-16); Idle Total / Idle Max
      5rem → 6rem so the two-word headers stay on one line; Class 8rem → 9rem
      for the research-heavy badge.
    • 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-nowrap to guarantee
    single-line headers at the 1280px breakpoint.

v0.3.5 — Reindex fix + cost-tab UX

25 Apr 20:32
fee6800

Choose a tag to compare

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

25 Apr 19:26
a63e106

Choose a tag to compare

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

25 Apr 18:03
43fb7db

Choose a tag to compare

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

25 Apr 00:14
f9e0c86

Choose a tag to compare

Opt-in visibility for heuristic dashboard tabs, plus a proper Settings page.

Highlights

  • /settings page — 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.
  • PersistencelocalStorage['suf:beta'] + localStorage['suf:tabs'].

Fixed

  • Direct loads or hard-refreshes of /settings no longer 404 (added an SPA catch-all in server.py).

See CHANGELOG.md for the full list.

Install

pip install --upgrade stackunderflow
stackunderflow start

v0.3.1

24 Apr 04:25
14e4d42

Choose a tag to compare

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-data payload −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.05 on chimera.
  • Theme — full dark + light mode across every component, header toggle, localStorage persistence.
  • 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).
  • NixOSflake.nix with nix build, nix run, nix develop.

See CHANGELOG.md for the full rundown.

Install

pip install --upgrade stackunderflow
stackunderflow start

Or with Nix:

nix run github:0bserver07/StackUnderflow/v0.3.1 -- init