Use Case
Process jobs at any scale, no Redis cluster required
BullMQ is the industry standard for Node.js job queues. Lux gives you a Redis-compatible backend for it inside the same project as your app data, cache, metrics, and realtime state.
The problem
BullMQ is the standard for Node.js job queues. But it needs Redis. So now you're managing a Redis instance (or paying for Upstash, ElastiCache, or Redis Cloud) just for queues. Then you need Bull Board or a custom dashboard to actually see what's happening inside those queues. Then alerting when jobs fail silently at 3am. You're maintaining three separate pieces of infrastructure for what should be simple: run this function later. And if your queue throughput needs to grow, you're looking at Redis Cluster, which means slot migration, cross-slot errors, and a whole new category of operational pain.
Without Lux
Four pieces of infrastructure for something that should just work.
Self-managed Redis
Queue backend
BullMQ
Job processing
Bull Board
Monitoring UI
Alerting
Custom setup
With Lux
Point BullMQ-compatible workloads at your Lux connection string and keep queues close to the rest of your app state.
Lux
Queue backend + app database + operational visibility
Get started in 30 seconds
import { Queue, Worker } from "bullmq" const connection = { host: "your-project.db.luxdb.dev", port: 6380, password: "database-password", tls: {} } const emailQueue = new Queue("emails", { connection }) await emailQueue.add("welcome", { to: "user@example.com", template: "welcome" }) const worker = new Worker("emails", async (job) => { await sendEmail(job.data.to, job.data.template) }, { connection })
If you already use BullMQ with Redis, the only change is the connection object.
How it works
Lux is Redis-compatible at the protocol level. BullMQ uses Redis lists, sorted sets, and Lua scripts internally to manage job lifecycle. Lux supports all of these, so BullMQ works with zero code changes. Point your Queue and Worker constructors at your Lux connection string and everything just works. No adapter, no wrapper library, no compatibility mode.
Lux keeps queue state in the same managed project as your app data, logs, metrics, and connection surface. The near-term product direction is clear operational visibility from the dashboard without deploying a separate queue admin service.
BullMQ's job lifecycle involves multiple Redis commands per job (ZADD, RPUSH, BRPOPLPUSH, etc.). Lux's multi-threaded Rust engine can process independent queue operations across cores, which is why queue-like workloads are a natural fit for the engine.
Migration is a five-minute task. Spin up a Lux Cloud instance, update your connection config, deploy. If you're running delayed jobs or rate-limited queues, those work too. Lux handles the sorted set operations that BullMQ uses for job scheduling with full fidelity.
Advanced patterns
import { Queue, Worker, QueueScheduler } from "bullmq" const connection = { host: "your-project.db.luxdb.dev", port: 6380, password: "database-password", tls: {} } const invoiceQueue = new Queue("invoices", { connection }) const reportQueue = new Queue("reports", { connection }) await invoiceQueue.add("generate", { userId: "usr_123" }, { delay: 60000, attempts: 3, backoff: { type: "exponential", delay: 5000 } }) await reportQueue.add("weekly-summary", {}, { repeat: { pattern: "0 9 * * MON" } }) const invoiceWorker = new Worker("invoices", async (job) => { const pdf = await generateInvoice(job.data.userId) await uploadToS3(pdf) }, { connection, concurrency: 10, limiter: { max: 100, duration: 60000 } })
Delayed jobs, exponential backoff, cron repeats, concurrency limits, and rate limiting. All powered by Lux.
Feature deep-dive
BullMQ Compatible
Lux implements the Redis protocol that BullMQ depends on. Lists, sorted sets, hashes, Lua scripting, pub/sub. Swap your connection string and everything works. No shim library, no adapter layer, no "mostly compatible." Your existing producers, workers, and job definitions stay exactly the same.
Operational Visibility
Queue state lives in the same Lux project as your logs, metrics, and app data. That gives the dashboard one place to grow queue visibility instead of forcing every team to bolt on a separate admin panel.
Multi-Core Runtime
Every BullMQ operation maps to Redis commands. ZADD for scheduling, RPUSH/BRPOPLPUSH for queue movement, HSET for job data. Lux is built to process independent queue operations across cores, so queue-heavy workloads can benefit from the same multi-threaded runtime as the rest of the database.
Multi-core
Queue command execution
Built-in
Dashboard monitoring
Zero
Config migration from Redis