up --interactive, Claude Code and Codex plugins that mirror every run into the chat, self-healing runs with an automatic post-failure autopsy, docs-driven development, serverless execution on Cloudflare, Telegram approvals, an interactive init wizard, smithers update, HTML run reports, and a batch of security and correctness fixes.
Breaking changes
- The bespoke gateway-WS collection stack is retired.
gateway-client/gateway-reactnow sit on TanStack DB collections viacreateSmithersCollectionswith per-mode providers. The documented workflow-UI hook surface is preserved on top of collections, so workflow UIs keep working unchanged; direct consumers of the old sync primitives need to migrate. - AI SDK 7 upgrade.
onStepFinishis renamed toonStepEnd, and Smithers now requires Node >= 22.
One Gateway daemon per workspace
The Gateway is now a singleton: CLI commands autostart one shared daemon per workspace (with identity checks so you never attach to the wrong one), and every run in that workspace flows through it over a single shared SQLite store.- Manage it explicitly with
bunx smithers-orchestrator gateway statusandbunx smithers-orchestrator gateway stop. - Idle spin-down: autostarted daemons exit after ~5 minutes with no WS clients, in-flight runs, crons, or timers.
SMITHERS_GATEWAY_IDLE_MStunes the window; an explicitbunx smithers-orchestrator gatewaynever idle-exits. - Escape hatch for CI, sandboxes, and containers: set
SMITHERS_NO_DAEMON=1(or pass--no-daemon) to opt out of autostart. Commands that genuinely need a daemon fail loud and name the hatch instead of silently spawning one. - DNS-rebinding defense: unauthenticated requests with a non-loopback
Hostare rejected (including correct handling of a bare::1), and the local UI gateway proxy blocks cross-origin requests. Remote binds that legitimately serve non-loopback Hosts use auth as the gate, or the explicitSMITHERS_GATEWAY_TRUST_ANY_HOST=1opt-out. - Tested under load: a new no-mocks test runs 50 concurrent workflows through one gateway owner: all 50 finish, every run is attributed exactly once, and per-run event sequences stay contiguous.
- Run lists filter by workflow across the gateway API and UI surfaces.
TanStack DB sync engine
The UI data layer moved to TanStack DB collections with per-mode providers behind one API. The sync guide covers the architecture.- Local mode: a QueryCollection provider over new
/v1/apiREST routes with SSE invalidation. - Multiplayer mode: an ElectricSQL provider over Postgres, through a hardened Electric sync proxy.
- The hooks, collections, and mutation API are identical in both modes, and a 3-lens adversarial audit of the sync engine resolved 10 findings before release.
Workflow UI toolkit
Workflow UIs are now a first-class authoring surface:- A reusable
gateway-uicomponent package and a workflow UI styleguide provide the primitives custom workflow UIs are built from. - A create-workflow builder UI with a code editor and live graph preview backs
bunx smithers-orchestrator make-workflow: describe a workflow in plain English and watch it get designed, scaffolded, and graph-verified. - Experimental:
bunx smithers-orchestrator ui --appserves a local UI app preview with a concierge chat that can create and launch workflows (ui.smithers.sh). It requires an LLM API key and is not yet part of the supported product surface.

Full-screen TUI monitor
bunx smithers-orchestrator up --interactive now opens a full-screen OpenTUI + React monitor with five modes (tree, graph, logs, timeline, and hijack), fed by the same live gateway-react hooks as the web UI, with inline approvals. For watching an already-detached run, smithers monitor is the cockpit equivalent.
Claude Code and Codex plugins: durable runs, inside the chat
Both plugins are covered in depth at plugins.smithers.sh.- Claude Code (integration guide): the plugin now mirrors every Smithers run into a live /workflows view by default, with a background monitor that surfaces approvals, human requests, failures, and stalls. It is driven by new versioned protocol commands (
bunx smithers-orchestrator claude tick|node-wait|monitor), and the graph layer derives Claude-native phase plans, including from persisted frames, so a restarted session picks the view back up. - Codex gets its own plugin whose skill drives the agent to run its work through Smithers and open a live
bunx smithers-orchestrator uiview per workflow.
Self-healing runs
When a run fails, Smithers now investigates itself:- Post-failure autopsy: the CLI auto-launches an autopsy workflow on run failure that diagnoses what went wrong from the event history and reports findings (guide).
- Fleet medic: the
monitor-smitherssweep gains an auto-remediation medic stage that proposes and applies fixes for stuck or degraded runs. bunx smithers-orchestrator supervisecontinues to watch for stale running runs and auto-resume them.

Serverless and sandboxes
- Cloudflare: serverless resume and cron ticks with run-lease claims let a Worker own a durable run without a long-lived process, alongside a Cloudflare sandbox provider (integration guide).
- Run on plue: a plue sandbox provider and a
run-on-plueworkflow run any Smithers workflow on a real remote Freestyle VM, verified end to end (example).
Integrations: Telegram, GitHub, and Linear
- A new integrations package delivers external webhook events (GitHub, Linear, Telegram) into workflows, with durable persisted integration event state.
- Telegram becomes an approval surface: a Bot API helper package, inline approval buttons, a mini-app approval page with
initDataverification, and a daily-digest summary bot; see telegram.smithers.sh and the Telegram guide.
Docs-driven development
A new docs-driven development family of workflows treats your docs as the contract and drives agents to meet it:ddd-bug-scan finds where the code disagrees with the docs, ddd-generate-docs writes the missing contract, and ddd-improve closes the gap. The family also includes DDD quality-loop and test-coverage workflows, a spec pack, a dedicated workflow UI, and a feature-triage library, all covered by real-run e2e tests.
CLI
- Interactive
initwizard (init.smithers.sh) with à-la-carte workflow/skill/agent-doc selection and persisted skill deselections;--yes/--non-interactivefor CI. Non-interactive re-init now runs as a durable, replayable system workflow, falling back to the imperative path if the workflow cannot load. bunx smithers-orchestrator make-workflow "<task>"dispatches the create-workflow builder from a plain-English description, andinit [prompt]chains straight into it: install the pack and describe your first workflow in one command. A seeded make-workflow tutorial teaches the authoring loop.bunx smithers-orchestrator updatedetects how Smithers was installed (bunx/npx, global bun/npm/pnpm/yarn, project-local) and upgrades it or prints the exact command, plus a passive once-a-day update notice (SMITHERS_NO_UPDATE_CHECKopts out).- HTML run reports:
bunx smithers-orchestrator workflow run --reportemits an HTML report with open-in-browser. bunx smithers-orchestrator bugfiles bug reports with scrubbed run context (how we handle them).- Agent availability probing: the CLI now probes whether agent CLIs can actually run instead of trusting auth files on disk.
- Version-pinned LLM docs:
bunx smithers-orchestrator docs/docs-fullservellms.txt/llms-full.txtpinned to the installed version, with a git-tag fallback for older--docs-versionrequests. - Project-local CLI resolution: a globally-installed
smithersresolves and delegates to the nearest project-local install, the way tsx and bunx do. - waiting-quota is handled consistently across the CLI, TUI, gateway, and UI: paused exit code, waiting badge/tone, and active-run treatment instead of reading as failed or terminal.
Agents
- OpenClaw is now a supported agent (openclaw.smithers.sh): a new adapter, a native OpenClaw plugin with an orchestrate skill, and working session resume (
--session-idemitted, resume metadata persisted). - elizaOS ships as the opt-in
@smithers-orchestrator/agent-elizapackage, wrapping the elizaOS AgentRuntime with an elizaOS-conventions authoring/loading layer;@elizaos/corestays out of default installs. - A review agent tier joins the generated
agents.ts, so plan/implement/review pools are first-class in fresh installs. - SSRF fixes in agent tools: the http tool no longer attaches configured secret headers to hosts outside the allowlist, and the transcription tool rejects loopback/private/link-local audio URLs unless explicitly opted in.
- MCP stdio deadlock fixed: the transport now drains the server’s stderr pipe, so a verbose MCP server can no longer stall the session once the OS pipe buffer filled.
Workflow pack
- Every user-facing seeded workflow now ships a custom UI: the init pack seeds per-workflow browser UIs built on the new
gateway-uipackage, opened withbunx smithers-orchestrator ui RUN_ID. - Fresh installs default the implement pool to Claude Sonnet 5 in the generated
agents.ts. - Re-init detects drifted seeded pack files and offers an interactive update, so upgrading the pack no longer means diffing by hand.
- Plan and review now run as model-diverse panels whose moderator synthesizes a single verdict, with resilient failover when one CLI cannot authenticate. The Panel component’s moderator is gated on actual panelist outputs instead of synthesizing a verdict blind.
- System workflows: internal durable processes (like re-init) are marked
system: trueand hidden from default listings while staying explicitly runnable, so frontends show only your workflows. - Cron and event triggers turn a push into a pipeline: see automate.smithers.sh.

Code review service
The open-code-review service that backs/code-review grew verification teeth: finding-verification helpers, impact quizzes with verified walkthroughs, sticky PR status comments, cache-token-aware usage accounting, and a monthly spend cap with claim-slot quotas.
Engine and scheduler fixes
- Agent final-output JSON extraction (
extractLastBalancedJson) is now a single O(n) pass; a 200KB prose payload previously blocked the event loop about 1.7 seconds. - Timer durations like
1dnow park instead of busy-looping: the scheduler’s duration parser matches the engine grammar (d unit, case-insensitive), and duration-timer deadlines stay anchored across decide passes. - Subflows with arbitrarily-named outputs work as documented via an opt-in
smithers(build, { output })resolution. - The jj repo probe is bounded with a 1.5s timeout so a hung jj no longer blocks durability startup; skipped workspace snapshots and failed durable-resume restores log structured warnings instead of silent nulls.
- The agent trace buffer and DevTools run store are now bounded (head+tail retention, configurable run/event caps).
TaskgainsdepsOptionalfor tolerating failed upstream dependencies, and human task kinds survive the snapshot pipeline.
Security hardening
Beyond the gateway host defense and agent-tool SSRF fixes: canonical 3-segment JWTs with timing-safe signature comparison, OIDC PR-claim verification in the review server, a hardened Electric sync proxy, run idempotency enforcement, and a structuredTOOL_NETWORK_ISOLATION_UNENFORCED warning when allowNetwork:false cannot be enforced at the OS level (Linux).
Windows CI
The full typecheck and test suites now run on Windows in CI (sharded), with LF line-ending normalization via.gitattributes and numerous Windows-specific test and portability fixes.
Migration notes
- Consumers importing the old gateway-WS sync primitives (
createGatewayCollection, SyncProvider-era APIs) should move tocreateSmithersCollections/SmithersCollectionsProvider; workflow UIs using the documented gateway-react hooks keep working unchanged. - Ensure Node >= 22 before upgrading; SDK-agent callers using
onStepFinishmust rename toonStepEnd. - CI, containers, and sandboxes that must not spawn a background gateway should set
SMITHERS_NO_DAEMON=1(or pass--no-daemon); commands that genuinely need a daemon then fail loud instead of autostarting. - Remote gateway binds that legitimately serve non-loopback Hosts need auth (the token is the gate) or the explicit
SMITHERS_GATEWAY_TRUST_ANY_HOST=1opt-out. - http-tool configurations that rely on
defaultHeadersreaching hosts other than thebaseUrlhost must now list those hosts inallowedHosts; transcription of private/loopback audio URLs requiresallowedAudioHostsorallowPrivateAudioUrl.