Standalone Mode
Run Bullstudio as its own process and connect it to Redis.
Use standalone mode when you want the fastest setup: one command, one Redis URL, and no app changes.
Run with npx
npx bullstudio -r redis://localhost:6379Defaults:
| Setting | Default |
|---|---|
| Dashboard URL | http://localhost:4000 |
| Redis | redis://localhost:6379 |
| Prefix discovery | all prefixes |
| Dashboard protection | disabled unless a password is set |
CLI options
bullstudio \
--redis redis://localhost:6379 \
--port 4000 \
--prefix bull,stage \
--username operator \
--password secret \
--no-open| Option | Short | Description |
|---|---|---|
--redis <url> | -r | Redis connection URL. |
--port <port> | -p | HTTP port. |
--prefix <prefixes> | Comma-separated Redis key prefixes. Omit to auto-discover. | |
--username <user> | Dashboard login username when auth is enabled. | |
--password <pass> | Enables dashboard login. | |
--no-open | Do not open the browser automatically. |
Environment variables
REDIS_URL=redis://localhost:6379 \
PORT=4000 \
REDIS_PREFIX=bull,stage \
BULLSTUDIO_USERNAME=operator \
BULLSTUDIO_PASSWORD=secret \
bullstudio| Variable | Description |
|---|---|
REDIS_URL | Redis connection URL. |
PORT | HTTP port. |
REDIS_PREFIX | Comma-separated Redis key prefixes. |
BULLSTUDIO_USERNAME | Login username when BULLSTUDIO_PASSWORD is set. |
BULLSTUDIO_PASSWORD | Enables dashboard login. |
BULLSTUDIO_POLL_ENABLED | Set to false to disable polling entirely. |
BULLSTUDIO_POLL_INTERVAL | Default poll interval in milliseconds (default 2000). |
BULLSTUDIO_POLL_MIN_INTERVAL | Minimum interval in milliseconds operators can select. |
BULLSTUDIO_POLL_ALLOW_OVERRIDE | Set to false to pin the interval and hide the in-dashboard control. |
Command-line flags take precedence over environment variables for the same setting.
Polling
Standalone mode polls Redis to keep live views current. To ease load on pay-per-command or shared Redis, slow polling down, pin it, or turn it off with the BULLSTUDIO_POLL_* variables above. These mirror the embedded polling config.
# Poll every 10s instead of the 2s default
BULLSTUDIO_POLL_INTERVAL=10000 bullstudio -r redis://localhost:6379
# Disable polling; operators refresh each view manually
BULLSTUDIO_POLL_ENABLED=false bullstudio -r redis://localhost:6379Operators can still choose their own interval (or Off) from the sidebar, bounded by BULLSTUDIO_POLL_MIN_INTERVAL and BULLSTUDIO_POLL_ALLOW_OVERRIDE.
Docker
Use host.docker.internal when Redis is running on your machine and Bullstudio is running in Docker Desktop:
docker run --rm \
-p 4000:4000 \
-e REDIS_URL=redis://host.docker.internal:6379 \
emirce/bullstudioDocker Compose:
services:
bullstudio:
image: emirce/bullstudio
ports:
- "4000:4000"
environment:
REDIS_URL: redis://redis:6379
BULLSTUDIO_USERNAME: operator
BULLSTUDIO_PASSWORD: secret
depends_on:
- redis
redis:
image: redis:7-alpine
ports:
- "6379:6379"Redis URLs
# local
bullstudio -r redis://localhost:6379
# password
bullstudio -r redis://:[email protected]:6379
# username and password
bullstudio -r redis://username:[email protected]:6379
# TLS
bullstudio -r rediss://username:[email protected]:6380Redis Cluster
Cluster mode is detected automatically: point REDIS_URL at any cluster node
and Bullstudio connects with a cluster client seeded from that node,
discovering the rest of the topology itself. Queue and prefix discovery scans
every master node, so hash-tag prefixes (e.g. {orders}) are found wherever
their slots live.
# any node of the cluster works as the seed
bullstudio -r redis://cluster-node.example.com:6379BullMQ requires each queue's keys to share a cluster slot. You can achieve
this with either a hash-tagged prefix, such as prefix: "{myprefix}", or a
hash-tagged queue name, such as new Queue("{cluster}"). For multiple queues,
use distinct hash tags or prefixes so their slots can be distributed across
the cluster's masters.
Health check
curl http://localhost:4000/health{
"status": "ok",
"timestamp": "2026-06-01T10:00:00.000Z",
"redis": "configured"
}Add a test BullMQ queue
Use this against a local Redis to make the dashboard show data.
import { Queue } from "bullmq";
import IORedis from "ioredis";
const connection = new IORedis("redis://localhost:6379", {
maxRetriesPerRequest: null,
});
const emailQueue = new Queue("email", { connection });
await emailQueue.add("send-welcome-email", {
to: "[email protected]",
template: "welcome",
});
await emailQueue.close();
await connection.quit();Refresh http://localhost:4000. The queue appears in Overview and Jobs.