Workflow DevKit is in beta
use workflow brings durability, reliability, and observability to async JavaScript. Build apps and AI Agents that can suspend, resume, and maintain state with ease.
npm i workflowMove from hand-rolled queues and custom retries to durable, resumable code with simple directives.
export async function welcome(userId: string) {
"use workflow";
const user = await getUser(userId);
const { subject, body } = await generateEmail({
name: user.name, plan: user.plan
});
const { status } = await sendEmail({
to: user.email,
subject,
body,
});
return { status, subject, body };
}With a simple declarative API to define and use your workflows.
import { sleep } from "workflow";
import {
createUser,
sendWelcomeEmail,
sendOneWeekCheckInEmail
} from "./steps"
export async function userSignup(email) {
"use workflow";
// Create the user and send the welcome email
const user = await createUser(email);
await sendWelcomeEmail(email);
// Pause for 7 days
// without consuming any resources
await sleep("7 days");
await sendOneWeekCheckInEmail(email);
return { userId: user.id, status: "done" };
}import { Resend } from 'resend';
import { FatalError } from 'workflow';
export async function sendWelcomeEmail(email) {
"use step"
const resend = new Resend('YOUR_API_KEY');
const resp = await resend.emails.send({
from: 'Acme <onboarding@resend.dev>',
to: [email],
subject: 'Welcome!',
html: `Thanks for joining Acme.`,
});
if (resp.error) {
throw new FatalError(resp.error.message);
}
};
// Other steps...Start with plain async code. No queues to wire, no schedulers to tune, no YAML. Best‑in‑class DX that compiles reliability into your app with zero config.
Inspect every run end‑to‑end. Pause, replay, and time‑travel through steps with traces, logs, and metrics automatically captured — no extra services or setup.
Workflows can power a wide array of apps, from streaming realtime agents, to CI/CD pipelines, or multi day email subscriptions workflows.
The same code runs locally on your laptop, in Docker, on Vercel or any other cloud. Open source and portable by design.
export async function welcome(userId: string) {
"use workflow";
const user = await getUser(userId);
const { subject, body } = await generateEmail({
name: user.name, plan: user.plan
});
const { status } = await sendEmail({
to: user.email,
subject,
body,
});
return { status, subject, body };
}Build reliable, long-running processes with automatic retries, state persistence, and observability built in.
export async function aiAgentWorkflow(query: string) {
"use workflow";
// Step 1: Generate initial response
const response = await generateResponse(query);
// Step 2: Research and validate
const facts = await researchFacts(response);
// Step 3: Refine with fact-checking
const refined = await refineWithFacts(response, facts);
return { response: refined, sources: facts };
}See Workflow DevKit in action with one of our templates.