Canvas
A canvas that keeps up with your thinking.
Drag, connect, branch. Edges carry typed payloads between nodes so you never wonder what a handle emits.
Flowbase · Visual workflow engine
A visual workflow engine for developers who ship — typed nodes, real executions, first-class observability, and no vendor moat. Compose it in the canvas, run it on your infra.
MIT · Self-hostable · v0.1.0
The shift
Zapier hides your logic behind a wizard. n8n asks you to run a database and a queue yourself. The low-code tools you inherited behave like furniture — useful until you need to move them.
Flowbase treats automations the way your code is treated. Typed inputs. Real executions. Branching you can reason about. Logs you can grep. One binary you can host anywhere a container runs.
02Capabilities
Flowbase ships the smallest surface area that runs real production automations. Add a node when the job demands one — not because the UI had an empty slot.
Canvas
Drag, connect, branch. Edges carry typed payloads between nodes so you never wonder what a handle emits.
Runtime
Topological execution. Retries, step memoization, and replay — without you writing a scheduler.
Observability
Every node publishes realtime status. Timing, payloads, errors — streamed into the editor as it runs.
Triggers
Bring any event. Sign it, template the response, route the payload — no glue services required.
AI nodes
Chain prompts with typed variables. Handlebars for templating. Stream outputs into downstream nodes.
ai.prompt({ model: "sonnet-4", input:
$trigger.body.message
}) → $intentCredentials
AES via Cryptr. Scoped per user, selected per node. Never expose secrets to the browser.
How it works
Open the canvas. Drop a trigger, drag nodes into place, wire them together. Every edge is typed.
Flowbase topologically sorts your graph and dispatches it to Inngest. Retries, steps, replay — built in.
Status streams into the editor as the workflow executes. Drill into any node for payload, timing, errors.
Integrations
First-class integrations for messaging, AI providers, payments, and anything with an HTTP endpoint.
The shape of a workflow
import { defineWorkflow } from "flowbase";
export default defineWorkflow((w) => ({
name: "stripe → slack router",
trigger: w.webhook({ path: "/hook/stripe", verify: w.env.STRIPE_SECRET }),
nodes: {
intent: w.ai({
model: "sonnet-4",
input: "$trigger.body.description",
schema: w.z.object({ category: w.z.enum(["lead", "support", "spam"] })},
}),
route: w.branch(($intent.category, {
lead: w.slack({ channel: "#sales", text: `new lead: ${$trigger.body.email}` }),
support: w.gmail({ to: "support@acme.co" }),
spam: w.drop(),
}),
},
}))