A multi-backend job queue with a BullMQ-like API. PostgreSQL, SQLite, or in-memory — switch stores in one line. First-class TypeScript for Deno, Node.js, and Bun.
Delays, cron expressions, and human-readable intervals like "every 2 hours" or "in 10 minutes".
Fixed, exponential, or custom backoff. Configure max attempts, delays, and failure handling.
Per-worker and global cross-worker concurrency limits with distributed locking.
Sliding window rate limiter. Set max jobs per duration to protect downstream services.
Parent-child job trees. A parent waits until all children complete before executing.
Reactive job observables and a rich event bus — progress, stalled, drained, and more.
import { Queue, Worker } from '@conveyor/core';
import { MemoryStore } from '@conveyor/store-memory';
const store = new MemoryStore();
const queue = new Queue<{ email: string }>('notifications', { store });
// Process jobs with full type safety
const worker = new Worker('notifications', async (job) => {
await sendEmail(job.data.email);
}, { store, concurrency: 5 });
// Add a job — runs immediately
await queue.add('welcome', { email: '[email protected]' });
// Schedule a job — runs in 30 seconds
await queue.add('reminder', { email: '[email protected]' }, {
delay: 30_000,
});Switch stores in one line. Zero lock-in, identical API.
Production-grade. LISTEN/NOTIFY for real-time events, row-level locking.
Recommended for productionEmbedded. WAL mode, zero config. Deno, Node.js, and Bun drivers.
Great for edge & embeddedZero dependencies. Instant tests, no infrastructure. Perfect for development.
Best for testingGet started in under a minute. Full TypeScript, zero infrastructure.
Read the docs