Skip to main content

Open source · Self-hosted · No telemetry

The control plane for Python task queues.

One dashboard for Celery, RQ, Dramatiq, Huey, arq and taskiq. Persistent history, capability-aware controls, a live scheduler and a signed audit log, installed into the application you already run.

pip install z4j or Docker

The demo opens with sample projects, no account. Read the docs

The z4j project overview: task outcomes for the last 24 hours, agents and workers online, schedules needing attention and command delivery for a sample Django project
The z4j dashboard, sample project data

Your stack, as it is

Framework, workers, schedulers. One agent per layer, nothing rewritten.

How the layers connect
6
engines, one dashboard
3
frameworks, one line to install
791,650
tasks completed in the release soak
2.55M
audit rows, chain verified

Get running

Run it where your work runs.

From a single box to a replicated production install. Every path runs the same dashboard, the same engines and the same audit surface. Replicas, partitioned history and full-text search need PostgreSQL.

pip install z4j
z4j serve

Starts on :7700 with bundled SQLite and prints a setup URL. Python 3.11 or newer. Install guide

git clone https://github.com/z4jdev/z4j.git && cd z4j
docker compose up -d

One compose file, SQLite bundled in the multi-arch image (amd64 and arm64). Tail the logs for the setup URL. Install guide

git clone https://github.com/z4jdev/z4j.git && cd z4j
docker compose -f docker-compose.postgres.yml up -d

Adds PostgreSQL 17+ for replicas, partitioned history and full-text search. Write the .env with its secrets first; the guide has the exact block. Install guide

From signal to action

The alert is not the answer.

A notification says something broke. It does not say which argument, which worker, how many times, or whether it is still happening. z4j keeps the history, the schedule and the controls in one place.

Overview

Health at a glance.

  • Outcomes, failure rate, and agents and workers online for the window you choose.
  • Schedules needing attention surface before the breaker disables them.
  • Command delivery shows what is pending, done, failed and timed out.
Explore the platform
Project overview with task outcomes, agent connectivity, schedules needing attention and command delivery
Sample project data
Task history with state, priority, queue, worker, duration and start time, plus search, filters and saved views
Sample project data

Tasks

History that survives a restart.

  • Search, filters and saved views over the full task history, not only what the broker still remembers.
  • Arguments are redacted at the agent, before they leave your process.
  • Retry, cancel and bulk-retry appear only where the adapter advertises them, and each action lands on the audit log.
The action matrix, per engine

z4j-scheduler

One scheduler for every engine, built to be run in production.

celery-beat schedules one engine from one process, from a file you redeploy. z4j-scheduler keeps schedules in the database, drives all six engines, elects a leader on PostgreSQL, applies an explicit catch-up policy after an outage, and tells you when a fire slipped.

Schedule list with cron expressions, last and next runs, health, recent run history and run, hold and edit actions, with a misfire banner
Sample project data
  • Edit live

    Create, edit, hold and run from the dashboard, declarative config or REST. No daemon restart.

  • Catch-up policy per schedule

    After an outage each schedule decides for itself: skip what it missed, fire one, or fire every slot it owes.

  • Leader election

    Instances race for a Postgres advisory lock. Only the leader ticks; followers stay warm and one takes over once the database notices the leader is gone.

  • Misfire detection

    The brain flags an enabled schedule that slipped past its grace window: the failure with no event to show.

Capability celery-beat z4j-scheduler
Engines Celery only All six: Celery, RQ, Dramatiq, Huey, arq, taskiq
Edit without a daemon restart No Dashboard, declarative config, REST
Fire history per schedule No Buffered, acked, searchable
Audit log of schedule edits No HMAC-chained
Fire now No Dashboard and REST
HA / leader election Single instance only Postgres advisory-lock leader, rolling-restart safe
Catch-up after an outage All-or-nothing Per schedule: skip, fire one missed, or fire all missed

Import from celery-beat, django-celery-beat, rq-scheduler, APScheduler, cron, Huey, arq or taskiq with one command, verify the diff in the dashboard, then switch the old one off. Or run both during a migration window with the coexistence adapter. Full comparison, including where celery-beat is still the right choice

Architecture

Agents in your app. One control plane. One channel.

Each layer of your stack gets a pip package that runs inside your process: it redacts at capture, buffers locally, and opens one outbound HMAC-signed WebSocket. Events go out, commands come back, and nothing has to reach into your workers.

Your application Apache-2.0 agents
  • Frameworkz4j-django · z4j-flask · z4j-fastapi · z4j-bare
  • Workersz4j-celery · z4j-rq · z4j-dramatiq · z4j-huey · z4j-arq · z4j-taskiq
  • Schedulerz4j-celerybeat · z4j-rqscheduler · z4j-apscheduler · z4j-hueyperiodic · z4j-arqcron · z4j-taskiqscheduler
Agent runtime redaction at capture · local SQLite buffer · one outbound WebSocket
z4j control plane AGPL-3.0-or-later
  • BrainAPI · dashboard · rule engine · reconciliation
  • Schedulerz4j-scheduler, leader elected on PostgreSQL
  • DatabasePostgreSQL or SQLite: history, schedules, audit chain
Operators browser dashboard · REST · CLI

One protocol. Capability-aware controls.

Six engines do not have six identical feature sets. Pretending otherwise is how a dashboard offers you a button that silently does nothing.

Every engine adapter implements one universal primitive, submit_task(name, args, kwargs), that every task queue can satisfy. Beyond that, each adapter advertises the operations its engine can genuinely perform, and the dashboard renders only those. The brain stores observed task arguments redacted, so it never pretends that copy can safely drive a retry.

  • Retry and bulk-retry gated by the loaded adapter's capability contract
  • Cancel shown only where the engine has safe cancellation semantics
  • DLQ requeue engine-specific; Celery's generic adapter does not advertise it
  • Restart worker native on Celery, graceful self-exit elsewhere
  • Rate limit Celery only, because it is a broker-side primitive
The full action matrix, per engine
z4j-core/protocols/queue_engine.py python
# 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:
    ...

Automation

Rules that act on failures, with the brakes built in.

A per-project rule matches a task or scheduler trigger and runs a governed action: notify an operator, retry a task, or cancel a task. The guardrails are the point, so they ship with every rule.

Creating, editing, re-arming, or re-enabling a destructive rule requires admin authority, and browser-session mutations also require a fresh MFA check. When a rule fires, the runner rechecks that its creator still holds project-admin membership, and the firing lands on the audit log. See the rule engine

Security posture

Controls we implemented, and boundaries we wrote down.

A control plane is worth what its weakest documented boundary is worth, so we publish both. One limitation is open by choice, not by oversight: a role that can write z4j's database tables can defeat both in-database boundaries.

HMAC-chained audit log

Per-row HMAC plus a prev_row_hmac chain, signed with a key held apart from the application secret, with the head and row count authenticated separately. Catches any write that did not come through the audit service. Against the database role itself, export the head off-box and verify against it.

Argon2id password hashing

64 MiB memory, 3 iterations. Passwords shorter than 16 characters require 3-of-4 character classes, and every password is checked against the denylist.

RBAC and opt-in MFA

Three project-scoped roles, TOTP MFA with single-use recovery codes and trusted devices, and a fresh-MFA gate in front of sensitive routes. All of it in the open-source build.

Defense-in-depth rate limits

Per-worker IP buckets on login (20/min), invitation preview plus accept (30/min shared), and password-reset request plus confirm (10/min shared). Multi-worker fleets need a reverse-proxy limit for one shared ceiling.

Redaction pipeline

A rule-based recursive scrubber at the agent, with a defense-in-depth re-scrub on the brain. Built-in patterns cover recognized secrets and PII, and you add application-specific patterns.

SSRF-hardened outbound

Private and special-use destinations are blocked for webhooks, channel URLs, and SMTP. HTTP targets use scheme allow-lists and DNS-pinned dialing; SMTP is re-resolved before send.

What we do not claim. z4j publishes its threat model and known limitations, including the ones we have not fixed yet. It is not certified for any compliance framework, and the controls are designed to be mappable to an audit rather than to stand in for one. Read the boundaries before you run production workloads on it.

In the free release

No commercial tier holds the useful half.

Twelve of the 32 capabilities that ship in the open-source build. The commercial license exists only for organizations whose policies exclude AGPL, and it is the same software.

Comparison

Honest about what you already run.

Most dashboards cover one engine and stop at view. Each comparison says where the other tool is the better choice, because sometimes it is.

Questions

Before you install it.

Do I have to rewrite my tasks?

No. z4j observes and governs the queues you already run. You install a small Apache-2.0 agent package into your existing application, and your task code, your broker, and your workers stay exactly as they are.

Which task queues does z4j support?

Celery, RQ, Dramatiq, Huey, arq, and taskiq. Each engine adapter is a separate Apache-2.0 pip package, and you can mix several inside one project.

How is this different from Flower?

Flower is a read-only Celery viewer whose state lives in memory and is lost on restart. z4j persists task history in its own database, covers six engines, offers retry, cancel, and bulk controls only where an adapter advertises that capability, adds roles and MFA, and records every privileged action on an HMAC-chained audit log. Both read the same broker, so you can run them side by side while you evaluate.

Is it really free, or is the useful half paywalled?

Every feature ships in the open-source release. There is no commercial-only tier, no telemetry, and no phone-home. A commercial license exists only for organizations whose policies exclude AGPL, and it is the same software.

What does it cost to run?

Start with pip and bundled SQLite on one box. Move to Docker, and to PostgreSQL when you want horizontal replicas, partitioned history, and full-text search. The brain runs in your environment, so the only bill is your own infrastructure.

Is z4j production ready?

z4j is designed for self-hosted production and publishes its threat model and known limitations. Implemented controls include Argon2id password hashing, an HMAC-chained audit log, defense-in-depth rate limits, outbound-target validation, HTTPS-only webhooks by default, and opt-in TOTP MFA with single-use recovery codes. Passwords shorter than 16 characters must use 3 of 4 character classes. Read the published threat model for the boundaries these controls do not cover, and note that z4j is not certified for any compliance framework.

See it with real data first.

Open the demo, break something, then install it against your own workers. No account, no credit card, no telemetry.