OpenWorkflow is a TypeScript framework for building durable, resumable workflows that can pause for seconds or months, survive crashes and deploys, and resume exactly where they left off - all without extra servers to manage.
OpenWorkflow v1 is on the way. We're focused on getting it ready. Until then, the README and docs cover the current 0.x release. There isn't a release date yet, but you can follow along and get updates in our Discord.
import { defineWorkflow } from "openworkflow";
export const sendWelcomeEmail = defineWorkflow(
{ name: "send-welcome-email" },
async ({ input, step }) => {
const user = await step.run({ name: "fetch-user" }, async () => {
return await db.users.findOne({ id: input.userId });
});
await step.run({ name: "send-email" }, async () => {
return await resend.emails.send({
from: "me@example.com",
to: user.email,
replyTo: "me@example.com",
subject: "Welcome!",
html: "<h1>Welcome to our app!</h1>",
});
});
await step.run({ name: "mark-welcome-email-sent" }, async () => {
await db.users.update(input.userId, { welcomeEmailSent: true });
});
return { user };
},
);# npm
npx @openworkflow/cli init
# pnpm
pnpx @openworkflow/cli init
# bun
bunx @openworkflow/cli initThe CLI will guide you through setup and generate everything you need to get started.
Read ARCHITECTURE.md for a deep dive into how OpenWorkflow works under the hood.
Check out examples/ for working examples.
We welcome contributions! Please read CONTRIBUTING.md before submitting a pull request.
- Discord
- GitHub Issues - Report bugs and request features
- Roadmap - See what's coming next
