Open-source BullMQ dashboard. Drop-in for any Node or Bun backend.
Workbench is a modern dashboard for BullMQ. Runs jobs, flows, schedulers and metrics, all served from your own backend behind your own auth.
- Zero infrastructure — mounts as a route in your existing app
- Adapters for Hono, Elysia, Express, Fastify, NestJS, and Next.js
- Flows & DAG view, metrics, schedulers, search
- Dark-mode UI, basic-auth-protected by default
- MIT licensed
Website: getworkbench.dev
npx @getworkbench/cli initThe CLI detects your framework, installs the matching @getworkbench/<fw> package, injects the mount (or scaffolds a route file for Next.js), writes .env.example entries, and optionally drops a docker-compose.yml for Redis.
Pick the adapter that matches your stack:
Hono
npm i @getworkbench/hono bullmq honoimport { Hono } from "hono";
import { Queue } from "bullmq";
import { workbench } from "@getworkbench/hono";
const app = new Hono();
const emailQueue = new Queue("email", { connection: { url: process.env.REDIS_URL! } });
app.route("/jobs", workbench({ queues: [emailQueue] }));
export default app;Elysia
bun add @getworkbench/elysia bullmq elysiaimport { Elysia } from "elysia";
import { Queue } from "bullmq";
import { workbench } from "@getworkbench/elysia";
const emailQueue = new Queue("email", { connection: { url: process.env.REDIS_URL! } });
new Elysia()
.mount("/jobs", workbench({ queues: [emailQueue], basePath: "/jobs" }))
.listen(3000);Express
npm i @getworkbench/express bullmq expressimport express from "express";
import { Queue } from "bullmq";
import { workbench } from "@getworkbench/express";
const app = express();
const emailQueue = new Queue("email", { connection: { url: process.env.REDIS_URL! } });
app.use("/jobs", workbench({ queues: [emailQueue] }));
app.listen(3000);Fastify
npm i @getworkbench/fastify bullmq fastifyimport Fastify from "fastify";
import { Queue } from "bullmq";
import { workbench } from "@getworkbench/fastify";
const app = Fastify();
const emailQueue = new Queue("email", { connection: { url: process.env.REDIS_URL! } });
await app.register(workbench({ queues: [emailQueue] }), { prefix: "/jobs" });
await app.listen({ port: 3000 });NestJS
npm i @getworkbench/nestjs bullmqimport { NestFactory } from "@nestjs/core";
import { Queue } from "bullmq";
import { workbench } from "@getworkbench/nestjs";
import { AppModule } from "./app.module";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const emailQueue = new Queue("email", { connection: { url: process.env.REDIS_URL! } });
await workbench(app, "/jobs", { queues: [emailQueue] });
await app.listen(3000);
}
bootstrap();Works on both the Express (default) and Fastify NestJS platforms.
Next.js (App Router)
npm i @getworkbench/next bullmq// app/jobs/[[...workbench]]/route.ts
import { Queue } from "bullmq";
import { workbench } from "@getworkbench/next";
const emailQueue = new Queue("email", { connection: { url: process.env.REDIS_URL! } });
export const { GET, POST, PUT, PATCH, DELETE } = workbench({
queues: [emailQueue],
basePath: "/jobs",
});Next doesn't host BullMQ workers itself — run them in a sibling process. See examples/with-next.
Visit http://localhost:PORT/jobs.
| Option | Type | Description |
|---|---|---|
queues |
Queue[] |
BullMQ Queue instances to display. Required. |
auth |
{ username, password } |
Basic auth credentials. Strongly recommended in prod. |
title |
string |
Dashboard title. Default: "Workbench". |
logo |
string |
Logo URL to display in the nav. |
basePath |
string |
Override base path detection. Required for @getworkbench/elysia and @getworkbench/next. |
readonly |
boolean |
Disable actions (retry, remove, promote). |
tags |
string[] |
Fields from job.data to extract as filterable tags. |
| Package | Description |
|---|---|
@getworkbench/core |
Core + API router + UI |
@getworkbench/hono |
Hono adapter |
@getworkbench/elysia |
Elysia adapter |
@getworkbench/express |
Express adapter |
@getworkbench/fastify |
Fastify adapter |
@getworkbench/nestjs |
NestJS adapter |
@getworkbench/next |
Next.js App Router adapter |
@getworkbench/cli |
npx @getworkbench/cli init |
Hyper is distributed via a source-component registry, so its Workbench integration ships separately as a hyper add @getworkbench component in the pontusab/hyper repo.
Is it BullMQ-only? Yes. Bull (legacy) is not supported.
What Node version? 18+ (or Bun 1.1+ for the Elysia adapter).
Can I run it without auth? Yes, omit the auth option. Don't do that in production.
Does it require a separate service? No. It mounts as a route in your existing backend.
bun i
bun run build
bun run typecheck
# end-to-end smoke test against every example
docker compose up -d redis
bun run smokeSee CONTRIBUTING.md.
MIT © Pontus Abrahamsson