# Smithers > Durable AI workflow orchestration with JSX, Zod, SQLite, and real agent tooling. Smithers is a Bun/TypeScript framework for building resumable AI workflows as JSX trees. ## Quick Facts - Package name: `smithers-orchestrator` - Runtime: Bun `>= 1.3` - Primary authoring API: `createSmithers(...)` - Persistence: SQLite - Validation: Zod schemas - Public docs: `https://smithers.sh` - Full LLM bundle: `https://smithers.sh/llms-full.txt` ## Preferred Authoring Pattern ```tsx import { createSmithers } from "smithers-orchestrator"; import { z } from "zod"; const { Workflow, Task, smithers, outputs } = createSmithers({ analysis: z.object({ summary: z.string() }), review: z.object({ approved: z.boolean(), feedback: z.string() }), }); export default smithers((ctx) => ( {{ summary: `Analyze ${ctx.input.topic}` }} {{ approved: true, feedback: "LGTM" }} )); ``` ## Mental Model - JSX renders the current workflow frame. - Smithers extracts mounted tasks and control-flow metadata from that frame. - Ready tasks execute and persist validated outputs to SQLite. - The workflow re-renders with updated `ctx.outputMaybe(...)`, `ctx.output(...)`, and `ctx.latest(...)` values. - Resume works because task outputs and runtime metadata are durable. ## Core Components - ``: root container - ``: executable node - ``: ordered execution - ``: concurrent execution with optional cap - ``: conditional path selection - ``: iterative execution (`` remains as a deprecated alias) - ``: explicit durable approval gate - ``: serialized or capped group execution - ``: execute a subtree in a dedicated workspace ## Execution Entry Points - `runWorkflow(workflow, opts)`: execute a workflow programmatically - `renderFrame(workflow, frame)`: render/extract without executing - `smithers` CLI: `up`, `ps`, `logs`, `inspect`, `approve`, `deny`, `chat`, `hijack`, and `revert` workflows ## Important API Notes - Use `outputs.someKey` from `createSmithers(...)` as the `output` prop whenever possible. - String output keys still work, but are an escape hatch. - Custom Drizzle tables are supported as advanced output targets; if you use them, you manage their schema and migrations. - `createSmithers(...)` automatically adds the bookkeeping columns needed for schema-driven tables. - The package name is `smithers-orchestrator`, not `smithers`. ## Common Docs - [Introduction](https://smithers.sh/introduction) - [JSX API](https://smithers.sh/jsx/overview) - [JSX Quickstart](https://smithers.sh/jsx/quickstart) - [Execution Model](https://smithers.sh/concepts/execution-model) - [Data Model](https://smithers.sh/concepts/data-model) - [Workflow Component](https://smithers.sh/components/workflow) - [Task Component](https://smithers.sh/components/task) - [Loop Component](https://smithers.sh/components/loop) - [CLI Reference](https://smithers.sh/cli/overview) - [Tools Integration](https://smithers.sh/integrations/tools) - [CLI Agents](https://smithers.sh/integrations/cli-agents) - [SDK Agents](https://smithers.sh/integrations/sdk-agents) ## Burns The repository also contains `burns/`, a workspace-first local control plane for Smithers. Burns is a separate subproject with: - `burns/apps/web` - `burns/apps/daemon` - `burns/apps/desktop` - `burns/apps/cli` Use the root docs for Smithers runtime/API questions and the `burns/README.md` plus `burns/docs/` for Burns-specific development.