<UI>. The UI still
runs in the browser, still talks to the Gateway through gateway-react, and can
keep the same .smithers/ui/<workflow>.tsx file. The change is ownership: the
workflow TSX names the UI entry, so any Gateway that registers the workflow can
serve the right UI without out-of-band launcher code.
Before
Older launchers mounted UI from the Gateway side:.smithers/gateway.ts
.smithers/ui/release.tsx file was auto-mounted. That convention is replaced by
an explicit workflow declaration.
After
Add<UI> inside the workflow’s root <Workflow>:
.smithers/workflows/release.tsx
ui option:
.smithers/gateway.ts
entry paths are resolved relative to the workflow file when entryFile is
provided. Existing self-mounting UI files that end with
createGatewayReactRoot(<App />) can stay as-is.
Entry vs Source
Useentry for existing Gateway UI files:
source for a browser-safe module that exports a React component. The
Gateway mounts it with React and passes props plus boot metadata:
source at the workflow module itself. Workflow modules often
import Node/Bun APIs, agents, prompts, and database setup that cannot run in the
browser.
Checklist
- Add
UIto the workflow’ssmithers-orchestratorimport. - Add
<UI entry="../ui/<workflow>.tsx" title="..." />as a direct child of the root<Workflow>. - Remove
ui: { entry, title }fromgateway.register; keepentryFile. - Leave the browser UI file in
.smithers/ui/<workflow>.tsxunless you want to convert it to thesourcecomponent-export shape. - Verify with
bunx smithers-orchestrator gatewayand open/workflows/<workflow>or runbunx smithers-orchestrator ui RUN_ID.
<UI> during register(). The component renders nothing
into the workflow graph and does not execute client code on the backend.