Relay is a queue and scheduler you call like a function. Durable retries, observability, and zero servers to babysit — add it to your app in a few lines.
$ npm i @relay/sdk
# enqueue a job in one line
await relay.run("send-email", { to: user.email });Works with any Node, Bun, or edge runtime.
Durable, observable, and pleasant to use.
Exponential backoff, dead-letter queues, and replay — built in.
Human-readable schedules.
Every run, traced.
Your job payloads are type-checked from enqueue to handler — no stringly-typed surprises.
Per-queue concurrency control.
Define a handler, enqueue from anywhere — payloads are type-checked end to end.
import { defineJob } from "@relay/sdk";
export const sendWelcome = defineJob({
name: "send-welcome",
retries: 5,
run: async ({ userId }: { userId: string }) => {
const user = await db.users.find(userId);
await email.send(user.email, "welcome");
},
});
// elsewhere — fully typed, no stringly-typed payloads
await sendWelcome.enqueue({ userId: user.id });Same code runs on Node, Bun, and the edge.
One package, any runtime.
A typed function — that's the whole API.
Call relay.run() from anywhere in your app.
Traces, retries, and metrics in the dashboard.
Drops into the stack you already run
Start free. Scale when your job volume does.
For apps in production.
Add Relay in a few lines and watch your queue actually behave.
Free forever for small projects · no card required