Docs

From zero to a durable workflow in ten minutes.

Install the SDK, write one function, run the local dev server and watch your first step retry itself. Everything below runs on the free plan.

01 · Quickstart

Your first workflow, in your language.

Workflows live in your repo, deploy with your app and run on your cloud or ours. TypeScript, Python and Go SDKs share one runtime and one dashboard.

workflows/onboarding.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  1. STEP 01
    Install the SDK
    $ npm i @orrindel/sdk
    or pip install orrindel · go get orrindel.dev/sdk
  2. STEP 02
    Run the dev server
    $ npx orrindel dev
    Local dashboard on :8288, with replay and traces
  3. STEP 03
    Deploy with your app
    $ git push
    Workflows register on boot. No separate workers.
03 · Reference

Six calls cover almost every workflow you’ll write.

No new language and no YAML. You write normal functions and wrap the parts that talk to the outside world.

step.run()01

Run it once, keep the result

Wrap any call. The result is saved, so a retry or replay reads it back instead of calling again.

const acct = await step.run("fetch-account",
  () => crm.get(event.customerId))
step.sleep()02

Wait days without a server

Pause a run for minutes or months. Nothing polls and nothing is billed while it sleeps.

await step.sleep("trial-ends", "14d")
await step.run("send-offer", sendOffer)
step.waitForEvent()03

Pause until something happens

Hold a run until a matching event arrives, like a paid invoice or a signed form, with a timeout.

const paid = await step.waitForEvent("paid",
  { event: "invoice.paid", timeout: "7d" })
retries04

Retry with backoff, by default

Failed steps retry on their own: 3 times, with exponential backoff. Errors you mark final stop at once.

step.run("charge", charge, {
  retries: 3, backoff: "exponential" })
concurrency05

Limit how much runs at once

Cap parallel runs per key, like one per customer, so a burst from one account never starves the rest.

orrindel.workflow({ id: "sync",
  concurrency: { limit: 2, key: "event.accountId" } })
step.invoke()06

Call another workflow

Compose workflows. The parent waits for the child's result, and both show up in one trace.

const lead = await step.invoke("enrich",
  { function: enrichLead, data: { email } })
Questions

Things people ask on day one.

No. Workflows are ordinary functions in your codebase. You wrap the calls you want to make durable in step.run and deploy as usual. Most teams move one flow in an afternoon.

Each step.run, sleep and waitForEvent is one step. Retries of a failed step are free, sleeping costs nothing, and steps restored from memo during a replay are never billed.

Step inputs and outputs are stored in the region you pick (us-east, eu-west or ap-south) and encrypted with per-workspace keys. Enterprise plans can run the whole runtime in your own cloud account.

A queue delivers messages. Orrindel keeps the state of the whole run: which steps finished, what they returned, what is waiting and why. That is what makes retries, waits of several days and replays possible without extra code.

Yes, and you decide how carefully. Mark a tool as needing approval and the run pauses for a person. Mark it idempotent and a retry can never run it twice.

Runs pause and resume where they stopped. Nothing is lost and nothing runs twice. Our status history and incident write-ups are public.

Help

Stuck? Ask the engineers who built it.

Community chat is answered by the core team on weekdays. Paid plans get a shared channel with a named engineer.

orrindel

Durable runtime for AI agents and automations. Every run, in plain text.

Book a 20-minute demo →
All systems normal
99.99% uptime · last 90 days
90 days agotoday
regions us-east · eu-west · ap-south
soc 2 type ii · gdpr · hipaa (baa)
sdk v4.2.1 · node · python · go
© 2026 Orrindel Labs, Inc.PrivacyTermsSecurityMade in plain text.

Create a free website with Framer, the website builder loved by startups, designers and agencies.