Flowplane

Flowplane is a human-in-the-loop (HITL) control plane. It adds a first-class approval layer — "pause this step until a human decides" — on top of the durable engine you already use (Inngest, Temporal, Trigger.dev), or Flowplane's own bundled engine.

You keep your workflow code, your engine, and your infra. Flowplane owns the decision: who needs to approve, what they see, the policy that gates it, the quorum, the SLA, and the durable record of what was decided and why.

The one-liner

Durable execution is a solved, crowded space. Flowplane doesn't compete with it — it sits on top and makes the human decision a first-class, AI-native object.

The decision-first model

The root object in Flowplane is a decision, not a run. A decision is keyed by the engine's run (engine + externalRunId + stepRef) — it does not require Flowplane to execute your steps. Your engine runs the work; Flowplane tracks the decision on top of it.

That inversion is what lets Flowplane work with engines it doesn't control: you add awaitApproval as one step inside your own function, the engine pauses (via its own wait-for-event/signal primitive), and Flowplane records a pending decision. When a human decides, Flowplane signals the engine to resume. Flowplane is a step in your path — never the orchestrator.

What you get

  • awaitApproval — pause for a human decision from inside your existing function, without handing Flowplane control of the workflow.
  • Rich context — reviewers see the actual AI output, fields, diffs, and tool calls, not a bare yes/no prompt.
  • Policy gate — declarative rules decide whether a human is even needed, with an AI-judged option bounded by a mandatory floor.
  • Quorum — configurable M-of-N approvals; reject-wins by default.
  • SLA + reminders — decisions never rot silently.
  • The Inbox — a reviewer-first dashboard, plus email (Slack/DocuSign coming).

Start with the Quickstart, or read the core concepts first.