Hot Reload Prompts
Build useful
AI workflows.
Smithers is a TypeScript orchestrator for real AI workloads. Build durable, strictly typed, and human-readable agents using React.
Run this to get started
$
npx smithers-orchestrator initClick to Copy
Review.tsx
import { createSmithers, Loop } from “smithers-orchestrator”;
import { z } from “zod”;
const { Workflow, Task, smithers, outputs } = createSmithers({ review: z.object({ approved: z.boolean(), feedback: z.string() }) });
export default smithers((ctx) => {
const review = ctx.latest(outputs.review, “review”);
return (
<Workflow name=“code-review”>
<Loop until={review?.approved}>
<Task agent={reviewer}>
<AnalyzeCodePrompt code={ctx.input.code} />
</Task>
{!review?.approved && (
<Task agent={coder}>
<FixCodePrompt feedback={review?.feedback ?? ""} />
</Task>
)}
</Loop>
</Workflow>
);
});
Every completed node is checkpointed to SQLite. Never lose hours of LLM generation to a validation crash again.
runs.sqlite
✓AnalyzeCodePrompt
✓FixCodePrompt
RunCIWorkflow
Define LLM outputs with Zod. Smithers handles the validation loop autonomously.
Mix Codex, Claude Code, and Gemini directly out of the box. No heavy wrappers.
Philosophy
Human-readable,
LLM-writable.
Most orchestrators produce unreadable JSON graphs or hide complexity behind magic abstractions. Smithers uses TSX components so your agent plans look like React applications.
StateReads checkpoint from SQLite
RenderJSX tree builds continuously
ExecutionDiffs trigger LLM agent network
smithers-cli
~smithers ps
RUN_IDWORKFLOWSTATUSSTEP
a7b93code-reviewPAUSEDhuman-approval
x9m42update-docsDONE-
~smithers approve a7b93
[+] Approved step human-approval. Resuming background loop.
~
A boring CLI that just works.
No bloated TUI required. If you know how to use docker compose, you know how to run Smithers. Core functionality is built into a standard, scriptable CLI.
- 01Run workflows seamlessly in the background or stream directly to standard out.
- 02Inspect runs, approve paused
<Approval />bounds, and cancel rogue agents via CLI.
Orchestrate without the headache.
A single dependency, standard TypeScript, and a SQLite file. That’s all you need.