Skip to content

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:

Agents panel

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

Tasks with Diff drawer

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 dashboard command (legacy TUI dashboard) is unchanged. The new web UI is a separate surface.

Source

Integration branch: feat/frontend-gui-phase1.

Tracking issue: #1262.