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.
Smithers 0.27.0: one Gateway per workspace, a TanStack DB sync engine, a full-screen TUI monitor, and a security-hardening pass.
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.

A run streaming live step transitions into the UI as each task starts and finishes. The same live collections now power the web UI, the TUI monitor, and the chat plugins.
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.

Durability is the point: a run that crashes mid-flight resumes from its last checkpoint, and in 0.27.0 a run that fails gets an automatic autopsy.
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.

Seeded workflows ship with their own UIs: the implement workflow's live view, one of the per-workflow UIs installed by smithers init.
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.