This release adds 3 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+14 more
Summary
AI summaryBernstein v2.0.0 adds a web UI with FastAPI‑mounted SPA and full /api/v1/* surface.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Medium |
Web UI ships in wheel with `bernstein gui serve` booting FastAPI server at /ui and full /api/v1 surface. Web UI ships in wheel with `bernstein gui serve` booting FastAPI server at /ui and full /api/v1 surface. Source: granite4.1:8b-q6_K@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Default web UI URL is http://127.0.0.1:8052/ui/. Default web UI URL is http://127.0.0.1:8052/ui/. Source: granite4.1:8b-q6_K@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Adds a web UI accessible via `bernstein gui serve`. Adds a web UI accessible via `bernstein gui serve`. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Feature | Medium |
Agents panel shows live grid of agent sessions with token/cost/duration meters. Agents panel shows live grid of agent sessions with token/cost/duration meters. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Feature | Medium |
Tasks view includes a Diff drawer displaying syntax‑highlighted `git diff` with copy/download options. Tasks view includes a Diff drawer displaying syntax‑highlighted `git diff` with copy/download options. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Feature | Medium |
Adds a real diff viewer for the Diff tab using `GET /tasks/{id}/diff`. Adds a real diff viewer for the Diff tab using `GET /tasks/{id}/diff`. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Feature | Low |
Web UI serves SPA at `/ui` and exposes full API under `/api/v1/*`. Web UI serves SPA at `/ui` and exposes full API under `/api/v1/*`. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Feature | Low |
Audit screen provides HMAC‑signed audit chain browser and verifier. Audit screen provides HMAC‑signed audit chain browser and verifier. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Feature | Low |
Costs screen reports per‑model spend, run summaries, and burn‑rate. Costs screen reports per‑model spend, run summaries, and burn‑rate. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Feature | Low |
Fleet view offers a multi‑project fleet overview (data plane functional). Fleet view offers a multi‑project fleet overview (data plane functional). Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Feature | Low |
Settings screen is currently a placeholder for future configuration options. Settings screen is currently a placeholder for future configuration options. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Feature | Low |
Trace timeline panel reads trace data from `.sdd/traces/*.jsonl` via `GET /tasks/{id}/trace`. Trace timeline panel reads trace data from `.sdd/traces/*.jsonl` via `GET /tasks/{id}/trace`. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Feature | Low |
Quality‑gates panel shows gate reports with status buckets and auto‑expands failures via `GET /tasks/{id}/gates`. Quality‑gates panel shows gate reports with status buckets and auto‑expands failures via `GET /tasks/{id}/gates`. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Feature | Low |
Task dependency view displays upstream/downstream graph using `GET /tasks/{id}/graph-neighbors`. Task dependency view displays upstream/downstream graph using `GET /tasks/{id}/graph-neighbors`. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Bugfix | High |
Honours per‑step CLI and model directives in plan‑driven runs, fixing dispatch pipeline bugs. Honours per‑step CLI and model directives in plan‑driven runs, fixing dispatch pipeline bugs. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Bugfix | Medium |
Fixes normalisation of dev‑proxy routing and corrects Pydantic 500 error in `/openapi.json`. Fixes normalisation of dev‑proxy routing and corrects Pydantic 500 error in `/openapi.json`. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Bugfix | Medium |
Restores the startup banner that was missing after a regression. Restores the startup banner that was missing after a regression. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Bugfix | Medium |
Fixes several regressions (~150 fixes) in the wheel‑bundled SPA build pipeline. Fixes several regressions (~150 fixes) in the wheel‑bundled SPA build pipeline. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Bugfix | Low |
Improves drawer behavior (close on ESC, click‑outside, focus trap, drag‑resize). Improves drawer behavior (close on ESC, click‑outside, focus trap, drag‑resize). Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Other | Low |
affected_surface affected_surface Source: granite4.1:8b-q6_K@2026-05-21 Confidence: low |
— |
Full changelog
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.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About chernistry/bernstein
Deterministic multi-agent orchestrator for 18 CLI coding agents (Claude Code, Codex, Cursor, Aider, Gemini CLI, OpenAI Agents SDK, and more). MCP server mode (stdio + HTTP/SSE) exposes the orchestrator to any MCP client. Git worktree isolation per agent, HMAC-chained audit trail, cost-aware model routing via contextual bandit. ~11K monthly PyPI downloads, Apache 2.0.
Related context
Related tools
Beta — feedback welcome: [email protected]