The control plane for
Python task queues
One dashboard for Celery, RQ, Dramatiq, Huey, arq, and taskiq. Retry, cancel, bulk-action, reconcile, and monitor across every engine. Built for Django, Flask, and FastAPI. Self-hosted. Open source.
Prefer to look first? The demo opens with one click into a populated dashboard (4 sample projects, fake data, no install). Mutations toast-block: it's a navigable preview, not a sandbox.
# Brain: bundled SQLite, dashboard, API. First boot prints a setup URL.
pip install z4j && z4j serve
# Or via Docker (multi-arch: amd64 + arm64):
docker compose up -d
# Then in your Django/Flask/FastAPI app:
pip install z4j-django z4j-celery z4j-celerybeat Run it your way.
From a homelab Raspberry Pi to a production Kubernetes cluster. Same feature set in every tier.
Pip (SQLite)
Install from PyPI. Runs as a single Python process with a local SQLite file. Two commands from zero to dashboard.
Docker (SQLite)
Single docker compose file. SQLite bundled, auto-mints secrets on first boot, auto-runs migrations. One command from clone to dashboard.
Docker (Postgres)
Two services: the z4j image + a Postgres sidecar. Central backups via pg_dump, range partitioning on events, horizontal brain replicas behind a load balancer.
Every Python task queue that matters.
Each engine adapter is a separate Apache-2.0 pip package. Install only the ones you need. Mix them freely within a project.
Celery
The industry standard, covered end-to-end.
Learn more
RQ
Lightweight Redis queue, fully instrumented.
Learn more
Dramatiq
Middleware-driven Dramatiq observability.
Learn more
Huey
Lightweight Redis/SQLite queue, first-class.
Learn more
arq
Async Redis queue for FastAPI-era Python.
Learn more
taskiq
Broker-agnostic async task framework.
Learn moreOne scheduler that drives every engine.
z4j-scheduler is a separate companion process that fires schedules against any of the six engines above. Schedules live in the database; edit from the dashboard, declarative config, or REST without restarting any daemon.
z4j-scheduler
Engine-agnostic dispatch, live editing, importer + exporter for every native scheduler. See the side-by-side comparison.
Learn morePer-engine adapters
Already running celery-beat / rq-scheduler / APScheduler? Surface those existing schedules in the z4j dashboard for gradual migration or permanent coexistence.
Learn moreMigration guide
One-shot importers from celery-beat, rq-scheduler, APScheduler, Huey, arq, taskiq, and crontab. Round-trip exporters too.
Learn moreThe same buttons. Every engine.
Other dashboards hide Retry on Huey, disable Bulk-Retry on arq, grey out Cancel on taskiq. z4j does not. One protocol primitive, one UI, every engine.
Engine adapters implement one universal primitive, submit_task(name, args, kwargs), that every task queue can satisfy.
When z4j is asked to retry a Huey task, it reads the original args from its own tasks table and lowers the action to submit_task. The user never knows the difference.
- Retry / Bulk-Retry / DLQ-Requeue polyfilled on every engine
- Cancel native on 5 engines
- Restart Worker native on Celery, graceful self-exit elsewhere
- Rate Limit Celery only (broker-side primitive)
# The one method every engine implements async def submit_task(
self,
name: str,
*,
args: tuple = (),
kwargs: dict | None = None,
queue: str | None = None,
eta: float | None = None,
priority: int | None = None,
) -> CommandResult:
...
What's included
Unified action surface
One button set. Every engine.
Learn moreStuck-task reconciliation
Tasks started forever. Fixed, automatically.
Learn moreHistorical trends
Success rate, failure rate, throughput over time.
Learn moreVisual task DAG
See your canvas: chains, groups, chords.
Learn moreNotification providers
Six native channels. Plug into the stack you already use.
Learn moreSeverity-aware subscriptions
Page on critical. Email on warning. Drop info into a Slack channel.
Learn moreCooldown and mute
One bad deploy posts once. Not three hundred times.
Learn moreRBAC built-in
Four roles. Every endpoint gated. UI mirrors server.
Learn moreMulti-user invitations
Mint a link. Email it automatically. Accept in one click.
Learn moreInstall into your stack.
First-class adapters for the three major Python web frameworks. Each is a single pip install.
How z4j stacks up.
Most dashboards cover one engine and stop at 'view.' See how z4j compares to the tools you might already be running.
Flower
The classic Celery viewer. Built in 2011.
See full comparisonRQ Dashboard
The simple web view for RQ.
See full comparisonGrafana + Prometheus
The DIY metrics approach. Great for SRE, wrong tool for task ops.
See full comparisonBuilt for production from day one.
Two rounds of pre-release security audits. No open HIGH or CRITICAL findings.
HMAC-chained audit log
Per-row HMAC plus prev_row_hmac chain. Tamper-evident against DBA-level row deletions.
Defense-in-depth rate limits
IP buckets on login (20/min), invitations (30/min), password-reset (10/min). Inline pruning, bounded memory.
Argon2id password hashing
64 MiB memory, 3 iterations. Policy: 3-of-4 character classes plus ~1,500-entry denylist.
Redaction pipeline
Recursive scrubber at the agent, defense-in-depth re-scrub on z4j. Zero unredacted args on the wire.
Wire-protocol HMAC
Every frame signed (HMAC v2). Replay guard (+/-60s + nonce + monotonic seq). Session-bound.
SSRF-hardened
Private-IP block + DNS-rebinding resolve-before-dial + scheme allow-list for webhooks, SMTP hosts, and channel URLs.
Ready to get started?
One Docker command. No credit card. No telemetry. No commercial-only gates.