Bernstein v2.0.0 - Web UI¶
Hand-curated release notes for the v2.0.0 cut. Overrides the auto-drafter output when the tag is published.
Why 2.0.0¶
Bernstein now ships a web interface. The CLI / TUI surface is unchanged. The major bump is signalling the new operator surface, not a breaking API change.
For everything else, v2.0.0 is a strict superset of v1.10.x - wheels install the same way, configs don't move, agents and adapters work as before.
What's new - Web UI¶
The UI ships in the wheel: bernstein gui serve boots a FastAPI server with the SPA mounted at /ui and the full /api/v1/* surface attached. No Node toolchain required at install time - the Vite bundle is committed under src/bernstein/gui/static/.
Default: http://127.0.0.1:8052/ui/.
Screenshots¶
Agents panel - live grid of running agent sessions with per-card token / cost / duration meters and a side drawer for the selected agent:

Tasks + Diff - task list with a per-task drawer showing the running git diff (split view, syntax-highlighted, copy + .patch download):

Top-level screens¶
| Screen | What it shows |
|---|---|
| Tasks | Live task list with per-task drawer (see below). |
| Agents | Registered adapters, status, last-seen. |
| Approvals | Pending tool-call approvals; approve / deny from the operator surface. |
| Audit | HMAC-signed audit chain browser + verifier. |
| Costs | Per-model spend, per-run summary, burn-rate. |
| Fleet | Multi-project fleet view (scaffold - data plane is real, UI is light). |
| Settings | Placeholder - wiring is contributor-welcome. |
Per-task drawer¶
Click any task row → side drawer with six tabs:
| Tab | What it shows |
|---|---|
| Summary | KPIs (tokens, cost, branch, approvals), plan steps from progress_log, basic task metadata. |
| Logs | SSE-streamed live logs with ANSI rendering, virtualised list, search, level filters, throughput. |
| Diff | git diff <base>...<branch> rendered as split / unified, syntax highlight, copy + .patch. |
| Gates | Quality gate report (/tasks/{id}/gates) with status buckets, auto-expand failures, polling. |
| Deps | Upstream / downstream task graph for depends_on. |
| Trace | Timeline from .sdd/traces/{task_id}.jsonl with filter chips and free-text search. |
What landed in feat/frontend-gui-phase1¶
8 PRs in the wave-4 sweep, plus the earlier production-grade Logs panel and the SPA build pipeline that preceded them:
| PR | Title |
|---|---|
| #1253 | fix(gui): normalise dev-proxy routing - apiGet contract hardened + a Pydantic /openapi.json 500 fix as a bonus. |
| #1254 | fix(gui): drawer close + KPI/Plan wiring + UX polish - ESC, click-outside, focus trap, drag-resize. |
| #1255 | feat(gui): real diff viewer for the Diff tab - GET /tasks/{id}/diff backend + split / unified UI. |
| #1256 | feat(gui): trace timeline panel - GET /tasks/{id}/trace reading .sdd/traces/*.jsonl. |
| #1257 | fix(cli): restore startup banner - regression from an earlier commit, now pinned by a test. |
| #1258 | feat(gui): quality-gates panel - GET /tasks/{id}/gates with generated_at / task_status annotations. |
| #1259 | fix(orchestrator): honour per-step cli + model in plan-driven runs - three dispatch-pipeline bugs that collapsed per-step cli: / model: directives. |
| #1260 | feat(gui): task dependency view - GET /tasks/{id}/graph-neighbors + Deps panel. |
The earlier work that the wave-4 PRs built on:
- Logs panel (commit
4a872ca17) - SSE stream, ANSI, virtualisation, search, level filters, throughput stats, keyboard shortcuts. The reference for every subsequent panel. - Tab-content router with stub panels (commit
e9eeb549c) - the shape every wave-4 panel filled in. - Bug-hunt rebuild (
62589d0ef, ~150 fixes) - the wheel-bundled SPA bundle baseline that wave-4 reset against.
Stack¶
React + React Router + React Query + Tailwind. Vite for the build. No new heavy front-end deps beyond that - Redux, MUI, Recharts, etc. are intentionally not in the tree.
Limitations - read this before you file an issue¶
This is a minimal demo of the operator surface, shipped because the core was capable of supporting it and operators asked for it. It is not a priority development direction for the maintainer. Specifically:
- No screenshot / GIF assets in the README yet.
- A11y audit hasn't been done end-to-end - several panels follow good patterns, but nothing has been verified against WCAG or screen readers.
- No dark / light theme toggle UI - the provider is wired, the switch isn't.
- No mobile-responsive pass - drawer + tables assume desktop viewports.
- Settings screen is a placeholder.
- Fleet screen is scaffolding - the data plane on the Python side is real, the UI is light.
- No front-end test suite - Python backend routes are covered, TS components aren't.
- No Playwright / e2e smoke test in CI.
Tracking issue for everything above + contributor pointers: #1262 - Web UI development - tracking issue + contributor welcome mat.
If you want to contribute - small PRs preferred, no need to coordinate. The integration branch was collaborative; staying that way.
Migration from v1.x¶
Nothing breaks. The new commands are additive:
bernstein gui- the new subcommand group.bernstein gui serve [--host …] [--port …] [--no-open] [--dev] [--minimal]- boots the FastAPI server with the SPA mounted.
The default port is 8052. --minimal skips mounting the full Bernstein API (useful for smoke tests). --dev skips the browser auto-open and expects a Vite dev server on :5173 for HMR.
If you have a wheel install, the SPA is already there. If you've checked the repo out and want to rebuild the SPA: cd web && npm install && npm run build.
Everything else¶
- All v1.10.x adapters, plan formats, audit chain, lineage, MCP server mode, A2A, cluster mode, GitHub App, air-gap wheelhouse profile - unchanged.
- The CLI / TUI surfaces are unchanged.
- The pre-existing
bernstein dashboardcommand (legacy TUI dashboard) is unchanged. The new web UI is a separate surface.
Source¶
Integration branch: feat/frontend-gui-phase1.
Tracking issue: #1262.