Local Development
Set up the source code with a minimal authless run or a seeded PostgreSQL and Redis stack.
All commands on this page run from the repository root unless stated otherwise. For a deployed instance, use Installation.
Prerequisites
- Bun
1.3.5, the version used by the repository and CI. - Node.js
20.19+or22.12+for the Vite web app. - A reachable Redis instance, or Docker with Compose to start one.
git clone https://github.com/durabullhq/durabull.git
cd durabull
bun install --frozen-lockfileOption A: Minimal local run
Use this path to try the dashboard without configuring login or PostgreSQL. If Redis is not already running, start a disposable local instance:
docker run -d --name durabull-dev-redis -p 127.0.0.1:6379:6379 redis:8-alpineThen start the API and web app:
bun run dev:authlessOpen http://localhost:5173. The API runs at http://localhost:3001/api; Vite proxies API and MCP requests from the web origin.
The launcher supplies defaults for authless mode, environment-managed connections, a MAIN
connection at redis://localhost:6379, and development-only secrets. Existing shell variables
override those defaults. It does not start Redis or unset DATABASE_URL.
If a repository .env already configures PostgreSQL and you want PGlite instead, run:
DATABASE_URL= bun run dev:authlessTo use another Redis instance, set the connection explicitly:
DURABULL_REDIS_URL_MAIN=redis://localhost:56379 bun run dev:authlessAuthless mode gives every visitor owner access. Keep this development stack on a trusted machine or behind access controls. An empty Redis instance has no queues to display.
Option B: Full stack with sample data
This path starts PostgreSQL and Redis in Docker and creates sample users, organizations, queues, jobs, and schedulers.
-
Copy the example configuration:
cp .env.example .env openssl rand -hex 32In
.env, replaceDURABULL_REDIS_URL_ENCRYPTION_KEYwith the generated value. Generate a separate value forDURABULL_SECRET_ENCRYPTION_KEYand another random secret forBETTER_AUTH_SECRET. LeaveDURABULL_AUTHLESSandDURABULL_ENV_CONNECTIONSunset orfalsefor the authenticated, database-managed workflow..envis a dotenv file: paste the generated values into it. Shell expressions such as$(openssl rand -hex 32)are not evaluated when the file is loaded. -
Start infrastructure and seed it:
bun docker bun docker:seedDefaults are PostgreSQL at
localhost:55432and Redis atlocalhost:56379. If you changeDURABULL_POSTGRES_PORTorDURABULL_REDIS_PORT, updateDATABASE_URLorREDIS_URLto match. -
Start the app:
bun run dev -
Open http://localhost:5173 and sign in with
admin@example.com/password. Select Acme Corporation → Acme Production to explore the seeded data. These credentials are for disposable development data only.
For mock workers, run bun docker:seed:workers; that command stays running until you stop it.
Generate continuous demo traffic
bun run dev starts only the API and web app. To add the workload generator in a separate terminal:
bun run workload:devOr start the API, web app, and workload together:
bun run dev:demoThe workload uses WORKLOAD_REDIS_URL, then REDIS_URL, then redis://127.0.0.1:6379. It resets
its known demo queues on startup by default. Use a disposable Redis database; see the
fleet workload guide
for isolation and retention settings.
Check your setup
curl -fsS http://localhost:3001/api/health
curl -fsS http://localhost:3001/api/modeHealth should report status: "ok"; mode should match your authentication, connection, and
persistence choices. Then verify connections, queues, job details, schedulers, and workers in the UI.
Health confirms that the API responds; it does not test every Redis connection.
Work on the docs
bun run dev:docsOpen http://localhost:3002/documentation. To validate the documentation site:
bun run --filter @durabull/docs typecheck
bun run build:docsReset development data
bun docker:down stops containers without deleting their volumes. Starting them again preserves
existing data.
bun docker:wipe deletes data from the configured development database and Redis instance.
Check the targets in .env before running it, then use bun docker:seed to recreate sample data.
bun docker:reset removes Docker volumes and recreates the infrastructure.