Product

The runtime under your agents and automations.

Four things every production workflow needs, built into one SDK and one dashboard: steps that survive crashes, queues that stay fair, people in the loop, and a trace of everything.

01

Durable execution

Every step’s result is saved. Crashes, deploys and timeouts resume where they stopped.

02

Flow control

Concurrency, rate limits, debounce and fair queueing per customer, set in one line.

03

Human in the loop

Pause any run for an approval in chat or email, for seconds or for weeks.

04

Observability

Traces with every prompt, tool call, token and cent, searchable for 90 days.

01 · Durable execution

When a step breaks, the run doesn’t start over.

Orrindel saves the result of every step. Fix the bug, press replay, and the run picks up at the step that failed, with everything before it intact.

  1. 01RunFive steps start. Each result is saved as it lands.
  2. 02Failissue-refund sends no amount. Retries can’t fix a bug, so it stops at 3/3.
  3. 03FixChange one token. Deploy. The failed run is still waiting.
  4. 04ReplaySteps 1–3 come back from memo in 0 ms. Only the broken step runs again.
Steps restored
0
Time not re-spent
0.00s
LLM calls repeated
0
Duplicate refunds
0
refund-flow.tsrun_01JAX9TQticket #48213● running
1export const refundFlow = orrindel.workflow(
2 { id: "refund-flow", trigger: "ticket.created" },
3 async ({ event, step }) => {
4
5 const intent = await step.run("classify", () => llm.classify(event.body))
6 const account = await step.run("fetch-account", () => crm.get(event.customerId))
7 const charges = await step.run("find-charges", () => billing.list(account.id))
8 const refund = await step.run("issue-refund", () =>
9 billing.refund(charges.duplicate.id, charges.duplicate.amount))
10 await step.run("reply", () => mail.send(event.from, refunded(refund)))
11 }
12)
StepTimeSaved output
●classify0.00s
·fetch-accountqueued
·find-chargesqueued
·issue-refundqueued
·replyqueued
attempt log
replay
—
0s1s2s3s4s
02 · Primitives

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 } })
03 · Flow control

One noisy customer shouldn’t slow down everyone else.

Set a concurrency limit and a fairness key, and Orrindel serves each account in turn. A burst from your biggest customer no longer puts the smallest one at the back of the line.

acct_bigco · 40 jobs
0/40 done · waited p95 0.0s
acct_ridge · 8 jobs
0/8 done · waited p95 0.0s
acct_tern · 3 jobs
0/3 done · waited p95 0.0s
t = 0.0srunning 1/4 queued running doneconcurrency: { limit: 4, key: "event.accountId" }
04 · Human in the loop

Let a person say yes before the agent does anything permanent.

Any step can pause for a decision. The run waits, for seconds or for days, then carries on down the branch the person picked. Every answer is recorded with who gave it and when.

Timeout
24h, then escalates to #support-leads
Channels
Slack, Teams, email or your own UI
Audit
who, when, and what they saw
Cost while waiting
$0.00
orrindel#support-approvals09:22

Refund needs approval: $49.00 to Jamie Alvarez for ticket #48213. The March charge appears twice.

amount
$49.00 USD
charges
ch_31x · ch_30q (Mar 3)
agent confidence
0.94
policy
refund window 60d ✓
◷ expires in 23:59:59
run_01JAX9TQrefund-flow
✓draft_reply1.60s · 182 words
◷wait_for_approvalwaiting · 0s
·send_refundqueued
·close_ticketqueued
05 · Observability

See every prompt, tool call and token, in the order it happened.

Each run keeps a full trace: what the model was asked, what it answered, which tools it called and what that cost. Hover a span to open it.

span0s2s4s6sms
support-triage6800
└ classify1200
└ search_docs800
└ embed_query170
└ fetch_account420
└ draft_reply3200
└ lookup_export340
└ requeue_export220
└ grade_reply700
└ send_reply500
LLM calltool calleval
draft_replyLLM · 3.20s
model
large
tokens
2,904 → 312
cost
$0.0031
tool calls
2
INPUT
System: You are a support engineer… Context: 4 passages, account ac_2Hv (business, eu-west)…
OUTPUT
"Hi Priya, large exports over 2 GB were timing out in eu-west this morning. We’ve raised the limit and re-queued yours…"
spend · last 24h$50.42 total1.9M tokenspeak 14:00 · $4.60budget alert at $80/day · ok
00:0006:0012:0018:0023:00

Get started

Move one workflow this week.

Pick the flow that pages you most. Wrap its calls in steps, deploy, and watch the next failure fix itself.

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.