Skip to content
Get started
Get started
Free, Open Source Job Queue for Your Stack
Free & open source MIT licensed

Background jobs.
Your stack.

Background jobs for Node.js, Deno, Python, PHP, Go, Rust, Elixir and Bun. Free, open source, hosted by you.

add a jobTCP :6789
bunqueue serverRuns on Bun. Runs on your infrastructure.
MIT
process a jobTCP :6789
Your workersThe same language, or a different one.
The server runs on Bun. Your application keeps its runtime.

Free, including the server.Every queue feature ships under MIT.

Your infrastructure.Run locally, on a VPS, or in Docker.

Bun app? Embed it.Queue and worker in one process.

Your first job, end to end.

Choose how to run the queue. Both options are free, with the same core queue features.

1 Run your own server

With Docker running, choose a base and copy the command. No Bun installation needed.

The default: a compact musl base with a shell and apk. Same bunqueue features on AMD64 and ARM64.

Terminal window
docker run -d --name bunqueue \
--restart unless-stopped \
-p 127.0.0.1:6789:6789 \
-p 127.0.0.1:6790:6790 \
-v bunqueue-data:/app/data \
egeominotti/bunqueue:alpine

Check that the server is ready:

Terminal window
curl --fail http://127.0.0.1:6790/health
Client connection
127.0.0.1:6789 TCP
HTTP API
127.0.0.1:6790 HTTP
Storage
bunqueue-data Docker volume

Ports stay local to your machine. SQLite data persists in the volume when you replace the container. Run one variant at a time.

These tags follow new releases. Pin a version or digest for deployment.

Docker & deployment options

2 Connect your app and worker

Open another terminal. Install a client, save the example, then run it.

Terminal window
npm install bunqueue-client
jobs.mjs
import { Queue, Worker } from 'bunqueue-client';
const options = {
embedded: false,
connection: { host: '127.0.0.1', port: 6789 },
};
const queue = new Queue('emails', options);
const worker = new Worker(
'emails',
async (job) => {
console.log('Processing:', job.data.to);
return { sent: true };
},
options
);
worker.on('error', (error) => console.error(error));
await queue.add('welcome', { to: 'hello@example.com' });
Terminal window
node jobs.mjs

You should see Processing: hello@example.com. Your application and worker use the same queue name and TCP address.

PHP, Go, Rust, Elixir & all SDK guides

The useful parts. All included.

Start with a queue and a worker. Add the controls your workload needs.

Make failed work retryable.

Retries with backoff, stall recovery and a dead letter queue you can inspect and replay.

Retries & recovery

Control what runs next.

Priorities, delayed jobs, rate limits, concurrency controls and FIFO groups.

Queue controls

Schedule and coordinate.

Cron schedules and parent-child job flows. A separate workflow engine adds in-process orchestration on Bun.

Flows & dependencies

See what is happening.

Job queries, Prometheus metrics, health probes and events. Connect AI tools through the native MCP server.

Monitoring & operations

Official clients share the Queue/Worker/Flow core. Check the SDK capability matrix for language-specific APIs.

Start small. Keep your options.

Choose storage when you need it. Your application keeps the same queue API.

Try it in memory

The default. Nothing to provision. Jobs are ephemeral and disappear when the process exits.

Persist to SQLite

One file, owned by one process. Run embedded on Bun or connect clients to a standalone server.

Run multiple brokers

Use PostgreSQL as the shared store for several active servers. Operate the database and routing yourself.

Storage, durability & deployment trade-offs
Coming from BullMQ?

A familiar way to work.

Keep the Queue and Worker mental model. bunqueue uses its own engine and protocol, with SQLite or PostgreSQL for persistence.

Read the migration guide

Moving a Node.js app?Use bunqueue-client and connect to a bunqueue server. Your application stays on Node.js.

Check the differences first.Review compatibility and scheduling behavior in the full comparison. Explore the benchmark methodology for performance evidence.

A few things, made clear.

The cost, the name, and the connection.

Is there anything I have to pay for?

bunqueue is completely free and open source under the MIT license. The server, clients and queue features are included. There is no paid plan or feature paywall. If you rent a server or database, you pay your infrastructure provider.

Why is it called bunqueue?

The core engine uses Bun and its native APIs. The standalone server and embedded runtime require Bun. Network clients use their own runtime, including Node.js, Deno, Python, PHP, Go, Rust and Elixir.

Do I need a bunqueue account or a hosted service?

No. Start the included server on your machine or your own infrastructure, then point your client at its host and TCP port. A Bun application can also use embedded mode without a separate server.

Why is my client not connecting?

For server mode, start the server first and use a reachable hostname with TCP port 6789. Port 6790 is the HTTP API. Inside Docker, localhost refers to that container. For embedded mode, run on Bun and set embedded: true on both Queue and Worker.

More answers in the FAQ

Your jobs. Your infrastructure.

Free and open source, from the first local job to production.

Explore the documentation