You write the agent. Mikku keeps it running.
Durable execution for AI agents and background jobs, self-hosted on your own Postgres. Every LLM call is a checkpoint, rate limits get waited out, and your prompts never leave your servers.
AI agents
Agent loops that survive anything
Wrap each LLM call and tool call in a step and your agent becomes a durable run. Mikku checkpoints every step in your Postgres and replays the log on resume, so a crash, redeploy, or week-long wait never loses work. Prompts, keys, and outputs stay on your servers.
Agent run
research-agent v1 · wf_3fa8d1c2
LLM calls run exactly once
step.ai memoizes each call. A crash mid-run never re-bills a completed call on resume.
Rate limits, waited out
A 429 retries with backoff floored at the provider's Retry-After, so you wait instead of hammering.
Humans in the loop
Park the run until someone approves the action. It costs nothing while it waits, for days if needed.
Publish
Publish in one line
Install the SDK, set your keys once, and hand Mikku the request. The rest is the queue's problem. Typed end to end, from publish to delivery.
import { MikkuClient } from "@mikku.dev/sdk"; const mikku = new MikkuClient(); const msg = await mikku.publish({ url: "https://api.example.com/order-paid", body: { orderId: "ord_123" }, headers: { "x-tenant": "acme" }, delaySeconds: 30, maxAttempts: 5, idempotencyKey: "ord_123:paid",}); // 202 Accepted { id: "msg_9f2c4a1b", status: "queued" }Schedule and cap
Delay delivery or cap the attempt budget from the same publish call.
Idempotency keys
Publish the same message twice and Mikku delivers it exactly once.
Any language
Not on TypeScript? Generate a client from the OpenAPI spec.
Fan out
One publish, every endpoint
Group your destinations into a fanout and publish once. Mikku delivers an independent message to each endpoint, so a single dead consumer dead-letters on its own without holding up the rest.
Publish to a name
Reference a fanout by name and Mikku delivers to every endpoint in it.
Independent retries
Each endpoint gets its own attempts, backoff, and dead-letter queue.
Edit without redeploying
Add or remove endpoints from the dashboard or API; new publishes pick them up.
Workflows
Jobs that sleep for a week and resume intact
Write a function that runs a step, sleeps until a future date, or waits for an external signal. Mikku checkpoints every step and replays the rest, so a run survives crashes and redeploys and picks up with its state intact. Your code stays on your servers.
Workflow run
order-flow v3 · wf_7c1a2f9e
Steps run exactly once
Each step memoizes its result, so a completed step never runs again across resumes.
Durable sleep and signals
Park a run until a future date or an external event, for days or weeks, at no cost while it waits.
Parallel steps and children
Run independent steps concurrently, or start a child workflow and await its result.
Monitor
Filter the firehose, watch it land
Every message your account publishes, in one table. Filter by status or destination and the list keeps itself current as deliveries land, no refresh button to hit.
Status and search filters
Narrow to just failures, or search by destination. The counts follow your filter.
Live by default
The table polls quietly in the background and pauses while the tab is hidden.
Open for the full story
Click any row for its payload, headers, retry policy, and every attempt.
Observability
See every attempt, not just the last error
Open any message for its whole history: each attempt, the response code, how long it took, and the worker that handled it.
Message details
msg_b3f0a91c · POST /webhooks/order-paid
Three failures, then a 200 on the fourth. Backoff spaced out the retries.
Response capture
The response body is saved with every attempt, truncated to 4KB.
Flexible backoff
Exponential, linear, or fixed retry spacing, with jitter applied.
Cancel in flight
Stop any message that hasn't been delivered yet.
Recovery
Recover failures without leaving the page
Messages that exhaust their retries land in the dead-letter queue. Select a batch and retry, or resend one as a fresh copy. You never touch the database.
Bulk retry
Send a batch back to pending with a fresh attempt budget.
Resend
Clone a delivered or failed message into a brand new one.
Scoped and safe
Every action is scoped to your account. You never touch the database.
Scheduling
Schedules without a cron server
Write a cron expression and Mikku turns each tick into a message, with the same signing and retries as everything else. Pause or edit from the dashboard.
Standard cron
Standard 5-field cron expressions, evaluated in UTC.
Inspectable runs
Each tick is a normal message you can open and inspect.
One-off sends
Build and send a single message from a form, no cron needed.
Stop hand-rolling retry logic.
Create an API key and run your first background job or durable agent in two minutes. No queue to stand up, no cron server to babysit.