dbos-transact-ts is a free, open source orchestration & scheduling project written in TypeScript and released under MIT. It has 1,360 GitHub stars, 92 forks and 7 open issues, and was last pushed 8 hours ago. On this registry it ranks #58 of 64 tracked projects in Orchestration & Scheduling, with 5 head-to-head comparisons available.

What is dbos-transact-ts?

DBOS Transact is an open-source TypeScript library that adds durable workflows, queues, and scheduling to existing Node.js programs by checkpointing their state in PostgreSQL, and it is built for teams running payments services, long-running data pipelines, or AI agents that must recover automatically from crashes and resume from the last completed step.

What it is

DBOS Transact is a lightweight durable workflow engine for TypeScript, published on npm as @dbos-inc/dbos-sdk and licensed under MIT. It lives in the Node.js and TypeScript ecosystem, and it is built directly on top of PostgreSQL rather than on a separate orchestration tier. A program gains durability by registering ordinary functions as workflows and steps: DBOS.registerWorkflow wraps a function, DBOS.runStep wraps each unit of work inside it, and DBOS.logger handles logging. The library checkpoints workflow state in Postgres as steps complete, so when a process fails and restarts, every workflow resumes from its last completed step instead of from the beginning. DBOS Transact is entirely contained in the library itself, so there is no additional infrastructure to configure or manage.

The concrete problem it solves is failure handling, which the README describes as costly and complicated, requiring complex state management and recovery logic plus heavyweight tools like external orchestration services. The specific thing it replaces is a self-managed workflow orchestrator or task queue system. A payments service must process transactions even if servers crash mid-operation, and a long-running data pipeline must resume seamlessly from checkpoints rather than restart when interrupted. DBOS Transact addresses both by moving that durability into Postgres and into annotations on ordinary application code.

Key capabilities

  • Durable workflows built from DBOS.registerWorkflow and DBOS.runStep, with state checkpointed in Postgres and automatic resume of all workflows from the last completed step after a failure.
  • Durable queues that let a workflow enqueue another workflow, with one of the running processes picking it up for execution.
  • Delivery guarantees for queued tasks: tasks complete and their callers receive results without needing to resubmit, even when the application is interrupted.
  • Queue flow control with per-queue or per-process concurrency limits, plus task timeouts, execution rate limiting, deduplication, and prioritization.
  • Postgres-backed primitives beyond queues and workflows, including notifications, scheduling, event processing, and programmatic workflow management.
  • Cron-based scheduling, reflected in the cronjob-scheduler topic.
  • Suitability for orchestrating business processes, building observable and fault-tolerant data pipelines, and operating AI agents or applications that depend on unreliable or non-deterministic APIs.

Who uses it and how

  • Payments teams that must reliably process transactions even when a server crashes mid-operation, using durable workflows to guarantee that each transaction reaches a completed state.
  • Data engineering teams running long-running pipelines that need to resume from checkpoints rather than restart from the beginning when a job is interrupted.
  • AI and agent builders operating agents that call unreliable or non-deterministic APIs, where checkpointed steps prevent repeated or lost side effects after a failure.
  • Microservices teams orchestrating business processes across services, using the library rather than a separate orchestration service.
  • Teams that need background task execution with concurrency limits, rate limiting, timeouts, and deduplication, and prefer to enqueue those tasks from within a durable workflow instead of standing up a separate task queue.

Getting started

Install the open-source library @dbos-inc/dbos-sdk from npm, connect it to a Postgres database, and annotate workflows and steps in the program; the quickstart at docs.dbos.dev/quickstart walks through that setup, with examples at docs.dbos.dev/examples.

How it compares

The facts provided name no comparable tools and no list of paid products that DBOS Transact replaces, so there is no basis for a like-for-like contrast here. On the evidence available, it stands alone in this registry.

When to use it — and when not to

A self-hoster must operate a PostgreSQL database, because Postgres is the only backing store the facts document, and durability is tied to it. The library is TypeScript and Node.js only, so teams working in other languages or unwilling to run Postgres should look elsewhere. The README excerpt provided is also incomplete, cutting off mid-sentence in the queues section, which suggests the full documentation at docs.dbos.dev rather than the repository README is the reliable source of detail.

project readme (upstream, from github) — read inline

GitHub Actions NPM Version Node Current License (MIT) Join Discord

DBOS Transact: Lightweight Durable Workflows

Documentation   •   Examples   •   GitHub   •   Discord

What is DBOS?

DBOS provides lightweight durable workflows built on top of Postgres. Instead of managing your own workflow orchestrator or task queue system, you can use DBOS to add durable workflows and queues to your program in just a few lines of code.

To get started, follow the quickstart to install this open-source library and connect it to a Postgres database. Then, annotate workflows and steps in your program to make it durable! That's all you need to do—DBOS is entirely contained in this open-source library, there's no additional infrastructure for you to configure or manage.

When Should I Use DBOS?

You should consider using DBOS if your application needs to reliably handle failures. For example, you might be building a payments service that must reliably process transactions even if servers crash mid-operation, or a long-running data pipeline that needs to resume seamlessly from checkpoints rather than restart from the beginning when interrupted.

Handling failures is costly and complicated, requiring complex state management and recovery logic as well as heavyweight tools like external orchestration services. DBOS makes it simpler: annotate your code to checkpoint it in Postgres and automatically recover from any failure. DBOS also provides powerful Postgres-backed primitives that make it easier to write and operate reliable code, including durable queues, notifications, scheduling, event processing, and programmatic workflow management.

Features

💾 Durable Workflows

DBOS workflows make your program durable by checkpointing its state in Postgres. If your program ever fails, when it restarts all your workflows will automatically resume from the last completed step.

You add durable workflows to your existing TypeScript program by registering ordinary functions as workflows and steps:

async function stepOne() {
  DBOS.logger.info('Step one completed!');
}

async function stepTwo() {
  DBOS.logger.info('Step two completed!');
}

async function workflowFunction() {
  await DBOS.runStep(stepOne);
  await DBOS.runStep(stepTwo);
}
const workflow = DBOS.registerWorkflow(workflowFunction);

Workflows are particularly useful for

  • Orchestrating business processes so they seamlessly recover from any failure.
  • Building observable and fault-tolerant data pipelines.
  • Operating an AI agent, or any application that relies on unreliable or non-deterministic APIs.

Read more ↗️

📒 Durable Queues

DBOS queues help you durably run tasks in the background. You can enqueue a workflow from a durable workflow and one of your processes will pick it up for execution. DBOS manages the execution of your tasks: it guarantees that tasks complete, and that their callers get their results without needing to resubmit them, even if your application is interrupted.

Queues also provide flow control, so you can limit the concurrency of your tasks on a per-queue or per-process basis. You can also set timeouts for tasks, rate limit how often queued tasks are executed, deduplicate tasks, or prioritize tasks.

You can add queues to your workflows in just a couple lines of code. They don't require a separate queueing service or message broker—just Postgres.

import { DBOS } from '@dbos-inc/dbos-sdk';

const queueName = 'example_queue';

async function taskFunction(task) {
  // ...
}
const taskWorkflow = DBOS.registerWorkflow(taskFunction, { name: 'taskWorkflow' });

async function queueFunction(tasks) {
  const handles = [];

  // Enqueue each task so all tasks are processed concurrently.
  for (const task of tasks) {
    handles.push(await DBOS.startWorkflow(taskWorkflow, { queueName })(task));
  }

  // Wait for each task to complete and retrieve its result.
  // Return the results of all tasks.
  const results = [];
  for (const h of handles) {
    results.push(await h.getResult());
  }
  return results;
}
const queueWorkflow = DBOS.registerWorkflow(queueFunction, { name: 'queueWorkflow' });

// Queue configuration is stored in Postgres, so register the queue after launch.
await DBOS.launch();
await DBOS.registerQueue(queueName);

Read more ↗️

⚙️ Programmatic Workflow Management

Your workflows are stored as rows in a Postgres table, so you have full programmatic control over them. Write scripts to query workflow executions, batch pause or resume workflows, or even restart failed workflows from a specific step. Handle bugs or failures that affect thousands of workflows with power and flexibility.

// Create a DBOS client connected to your Postgres database
const client = await DBOSClient.create({ systemDatabaseUrl: process.env.DBOS_SYSTEM_DATABASE_URL! });

// Find all workflows that errored between 3:00 and 5:00 AM UTC on 2025-04-22
const workflows = await client.listWorkflows({
  status: 'ERROR',
  startTime: '2025-04-22T03:00:00Z',
  endTime: '2025-04-22T05:00:00Z',
});

for (const workflow of workflows) {
  // Check which workflows failed due to an outage in a service called from Step 2
  const steps = await client.listWorkflowSteps(workflow.workflowID);
  if (steps && steps.length >= 3 && steps[2].error instanceof ServiceOutage) {
    // To recover from the outage, restart those workflows from Step 2
    await client.forkWorkflow(workflow.workflowID, 2);
  }
}

Read more ↗️

🎫 Exactly-Once Event Processing

Use DBOS to build reliable webhooks, event listeners, or Kafka consumers by starting a workflow exactly-once in response to an event. Acknowledge the event immediately while reliably processing it in the background.

For example:

async function handleMessage(request: Request): Promise<void> {
  const eventId = request.body['event_id'];
  // Use the event ID as an idempotency key to start the workflow exactly-once
  await DBOS.startWorkflow(messageWorkflow, { workflowID: eventId })(request.body['event']);
}

Read more ↗️

📅 Durable Scheduling

Schedule workflows using cron syntax, or use durable sleep to pause workflows for as long as you like (even days or weeks) before executing.

You can schedule a workflow in a few lines of code:

async function scheduledFunction(schedTime: Date, context: unknown) {
  DBOS.logger.info(`I am a workflow scheduled to run every 30 seconds`);
}

const scheduledWorkflow = DBOS.registerWorkflow(scheduledFunction, { name: 'scheduledWorkflow' });

// Schedules are stored in Postgres, so create the schedule after launch.
await DBOS.launch();
await DBOS.applySchedules([
  {
    scheduleName: 'every-30-seconds',
    workflowFn: scheduledWorkflow,
    schedule: '*/30 * * * * *',
  },
]);

You can add a durable sleep to any workflow with a single line of code. It stores its wakeup time in Postgres so the workflow sleeps through any interruption or restart, then always resumes on schedule.

async function reminderWorkflowFunction(email: string, timeToSleep: number): Promise<void> {
  await DBOS.runStep(() => sendConfirmationEmail(email));
  await DBOS.sleep(timeToSleep);
  await DBOS.runStep(() => sendReminderEmail(email));
}
const reminderWorkflow = DBOS.registerWorkflow(reminderWorkflowFunction);

Read more ↗️

📫 Durable Notifications

Pause your workflow executions until a notification is received, or emit even

readme truncated — read the full docs on github

Frequently asked questions

Is dbos-transact-ts free to use?

dbos-transact-ts is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does dbos-transact-ts do?

Database-Backed Durable TypeScript Workflows

What is dbos-transact-ts written in?

dbos-transact-ts is primarily written in TypeScript. Its source is publicly available at https://github.com/dbos-inc/dbos-transact-ts, and it has 1,360 GitHub stars.