Realtime operational dashboard for BullMQ. AGPL-3.0 licensed.
- Queue observability with auto-discovery
- Live job inspection, structured logs, and progress
- Socket.IO realtime updates
- In-memory rolling-window metrics
- Job and queue admin actions
- Workspace RBAC with email/password auth
- Bookmarks and Discord alerts
- Node.js 24+
- pnpm 11+
- Doppler CLI
- PostgreSQL 18+ (
DATABASE_URL) - Redis (
REDIS_URL, optional; separate from your BullMQ Redis instances)
This repo uses Doppler for all secrets. There is no local .env workflow.
- Install the Doppler CLI and log in:
brew install dopplerhq/cli/doppler # macOS
doppler login- Link the repo (creates project
unqueue/ configdevif needed):
pnpm doppler:setup- Add secrets using
.env.exampleas a key reference:
pnpm doppler:secretsGenerate an encryption key:
node -e "console.log(JSON.stringify([{keyId:1,key:require('crypto').randomBytes(32).toString('base64')}]))"Set it in Doppler:
doppler secrets set ENCRYPTION_KEYS='[{"keyId":1,"key":"..."}]'
doppler secrets set BETTER_AUTH_SECRET="$(openssl rand -base64 32)"For local dev, leave VITE_API_URL empty — the platform calls http://localhost:3001 directly. In production, set VITE_API_URL to the public API origin (e.g. https://unqueueserver.parthk.dev) and COOKIE_DOMAIN to your parent domain (e.g. .parthk.dev) so auth cookies work across platform and API subdomains.
-
Set
DATABASE_URLandREDIS_URLin Doppler (see.env.example). -
Install dependencies and migrate:
pnpm install
pnpm db:generate
pnpm db:migrate- Start dev servers:
pnpm dev- Platform: http://localhost:5174
- API: http://localhost:3001
- (Optional) Run the demo BullMQ worker:
pnpm demo-workerThen add your BullMQ Redis instance in Settings.
Unqueue connects to your Redis instances (separate from the app's own REDIS_URL). Each registered instance uses two persistent connections: one for queue reads and admin actions, and one for BullMQ QueueEvents realtime subscriptions.
- Create a dedicated ACL user per environment — do not share the
defaultsuperuser. - Use TLS (
rediss://) for managed providers (Redis Cloud, Upstash, ElastiCache, Azure Cache). - If your provider requires ACL auth, set username and password in the connection form.
- Match the BullMQ key prefix to what your workers use (default:
bull).
Monitoring only (view queues, jobs, metrics, bookmarks):
@readon BullMQ keys, or at minimum:SCAN,GET,HGET,HGETALL,LRANGE,ZRANGE,ZCARD,LLEN,TYPE,PING,INFO,SUBSCRIBE/PSUBSCRIBE(for events)
Admin actions (retry/remove jobs, pause/drain/clean/obliterate queues):
- Above plus write commands BullMQ uses:
DEL,HDEL,HSET,LPUSH,RPUSH,ZADD,ZREM,LREM,EVAL/EVALSHA,MULTI,EXEC, etc.
Example Redis 7 ACL (adjust key patterns to your prefix):
ACL SETUSER unqueue-read on >your-password ~bull:* &* +@read +ping +info +psubscribe +subscribe
ACL SETUSER unqueue-admin on >your-password ~bull:* &* +@read +@write +@pubsub +ping +info
rediss://username:password@host:6380/0
Paste a URL in the connection form to pre-fill host, port, username, password, DB index, and TLS.
Two compose files:
| File | Services |
|---|---|
docker-compose.infra.yml |
Postgres, PgBouncer, Redis |
docker-compose.yml |
Server, Platform |
Deploy infra and app as separate Dokploy compose stacks (or environments). Point DATABASE_URL at PgBouncer (pgbouncer:5432 in-network, port 6432 externally) and REDIS_URL at redis://:REDIS_PASSWORD@redis:6379.
Infra stack: set env vars from .env.infra.example in Dokploy compose environment.
App stack: secrets in Doppler; run with doppler run -- docker compose up (see pnpm compose:up). Connection URLs (DATABASE_URL, REDIS_URL): .env.example.
App stack (local):
pnpm compose:up:buildapps/platform- React SPA (Vite, TanStack Router/Query/Table/Virtual)apps/server- Hono API, oRPC, Socket.IO, BullMQ integrationpackages/*- Shared libraries
pnpm testUnit tests do not require Doppler. Commands that touch the database (db:migrate, dev, build) run through doppler run.
AGPL-3.0 - see LICENSE. Hosted official instance: https://app.unqueue.dev