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. Automation rules that act on failures, scheduler misfire detection, and failure fingerprinting. 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, and tells you when it slips.
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. The brain watches every enabled schedule and flags a misfire the moment an expected fire slips past its grace window.
z4j-scheduler
Engine-agnostic dispatch, live editing, importer + exporter for every native scheduler. See the side-by-side comparison.
Learn moreMisfire detection
Brain-side detection when an enabled interval or cron schedule fails to fire on time. Per-operator fire attribution and partitioned fire history come with it.
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 moreRules that act on failures, with the guardrails to trust them.
Per-project rules match a task or scheduler trigger and run a governed action: notify an operator, retry a task, or cancel a task. Every rule ships with a circuit breaker, a kill switch, and a dry-run mode, so automation never becomes the incident.
A rolling-window circuit breaker trips a runaway rule into notify-only before it can amplify an incident. A per-project kill switch stops every rule at once. Dry-run mode records exactly what a rule would have done without touching anything.
Destructive actions (retry, cancel) require an admin who has passed a fresh MFA check, re-verified at the moment the rule fires. Every firing lands on the HMAC-chained audit log. A rule can even condition on an issue fingerprint, so it fires for one specific failure signature.
See the rule engineGoverned actions
Notify an operator, retry a task, or cancel a task on a matched trigger. Task events and scheduler events both fire rules.
Learn moreCircuit breaker + kill switch
A runaway rule trips into notify-only. One kill switch halts all automation for a project. Reset-circuit and delete from the dashboard.
Learn moreDry-run mode
Record what a rule would have fired without acting, so a new rule proves itself against real traffic first.
Learn moreFailure fingerprinting
The same exception across runs and engines collapses to one issue. Rules can target a single signature.
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
Automation rule engine
Match a trigger. Run a governed action. Every firing on the audit chain.
Learn moreIssues: failure fingerprinting
The same bug across every run collapses into one issue.
Learn moreScheduler reliability
Know when a schedule should have fired and did not.
Learn moreUnified 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
Seven 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 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.