Skip to main content
z4j vs. Flower

Flower Alternative: z4j vs. Flower for Celery Monitoring

The classic Celery viewer. Built in 2011.

Scope
Celery only
Positioning
Read-only viewer
License
BSD-3, open source
Flower upstream project
what Flower does well

Credit where it's due

Battle-tested on Celery for over a decade
Single process, no database, very simple to deploy
Live broker-event stream gives good real-time feel
Familiar to anyone who has ever run Celery in production
why teams switch

Reasons to choose z4j over Flower

Persistent task history (Postgres-backed)

Flower keeps tasks in memory; everything vanishes on restart. z4j writes every task event to Postgres with an HMAC-chained audit log, so you can search 'what failed last Friday' a month later.

Real actions, not a viewer

Retry, cancel, bulk-retry, purge-queue with filters, requeue from DLQ. Flower is read-only by design, z4j is built for operators who need to fix things, not just watch them.

Full schedule CRUD for Celery Beat

Create, edit, delete, enable/disable, and trigger-now from the UI. Flower's beat viewer is read-only and doesn't write back to your scheduler config.

RBAC + invitations + password reset

Owner / Admin / Operator / Viewer roles per project. Mint invitation links, SMTP auto-send, single-use tokens. Flower's single basic-auth user was always a compromise.

Multi-engine, not Celery-only

If half your stack is Celery and half is RQ or Dramatiq or arq, z4j is one dashboard for all of it. Same retry button, same audit log, same WebSocket frames.

Tamper-evident audit log

Every task action and config change is HMAC-chained. SOC 2 / HIPAA / FedRAMP audits stop being a Slack-screenshot scramble.

Reconciliation closes the 'task stuck on started' gap

Workers crash. Flower never finds out and the task sits as 'started' forever. z4j's reconciler probes the result backend and closes the loop automatically.

Secret redaction is built in

Recursive scrubber on args/kwargs/exception payloads, with per-task overrides. Flower shows raw arguments in the UI, one of the top reasons teams move off it.

capability matrix

z4j vs. Flower, feature by feature

Capability Flower z4j
Engine coverage Celery only Celery, RQ, Dramatiq, Huey, arq, taskiq
Persistent history In-memory only, lost on restart Postgres-backed, every task ever seen
Actions (retry, cancel, bulk) None, strictly a viewer Universal across every engine
Bulk operations None bulk_retry, purge_queue with filters
Schedule management Read-only via Celery Beat viewer Full CRUD: create, edit, delete, enable/disable, trigger-now
RBAC / multi-user Single basic-auth user Owner / Admin / Operator / Viewer per project
Invitation flow None Admin mints links, SMTP auto-send, single-use tokens
Password reset N/A (no user model) Constant-time, single-use tokens, session revoke
Audit log None HMAC-chained, tamper-evident
Reconciliation worker None - tasks stuck 'started' stay that way Periodic probe closes the gap automatically
Historical trends None Built-in: success, failure, p50/p95/p99 over time
Visual DAG (chains/groups/chords) Flat parent/child list Tidy-tree SVG with runtime badges
Secret redaction Raw args shown in UI Recursive scrubber + per-task overrides
Notifications None Email / Slack / Telegram / webhook, SSRF-hardened
Real-time updates Polling WebSocket with HMAC-signed frames
migration guide

Cut over from Flower in a week (or a weekend)

  1. 1

    Keep Flower running during the migration

    z4j and Flower don't interfere. Leave Flower up; install z4j alongside; compare views during the cut-over week. Turn Flower off when you're confident.

  2. 2

    Install the z4j-celery adapter in the same worker process

    Flower subscribes to Celery's broker events via a separate process. z4j-celery uses the same events, plus worker signals, plus the result backend for reconciliation. Both can observe concurrently.

  3. 3

    Point z4j at the same broker + result backend

    z4j reads your existing CELERY_BROKER_URL + CELERY_RESULT_BACKEND. No data migration. Historical tasks that Flower forgot on its last restart won't appear in z4j, but every task after z4j install is persistent.

  4. 4

    Mint per-operator users

    Flower's single-user basic-auth was always a compromise. z4j has real RBAC: invite your team, give each person a login, make operators actual operators. Audit log shows who retried what and when.

  5. 5

    Delete your Flower docker-compose entry

    Keep the compose file in git. If you hit a z4j bug, you can re-enable Flower in one minute. You won't need to.

frequently asked

z4j vs. Flower: FAQ

Is z4j a drop-in replacement for Flower?

z4j observes the same Celery broker events Flower does, plus worker signals and the result backend. You can run both side by side during the cut-over and turn Flower off when you're ready. There is no data migration; z4j picks up tasks from the moment it starts.

Does z4j work with Celery Beat?

Yes. The z4j-celerybeat adapter exposes full schedule CRUD: create, edit, delete, enable/disable, and trigger-now from the UI. Reads write back to the scheduler the worker uses (django-celery-beat, redbeat, or the default file-backed scheduler).

Is z4j open source?

Yes. z4j (server + dashboard + API) is AGPL v3. The agents that ship inside your worker are Apache 2.0, safe to import into any project, commercial or otherwise. Source on GitHub at github.com/z4jdev.

Can I self-host z4j?

Self-hosting is the default. There is no SaaS option. Three deployment paths: pip + SQLite (homelab / single dev), Docker + SQLite (small teams), Docker + Postgres (production). One docker compose up and you're running.

Does z4j support engines other than Celery?

Yes. Celery, RQ, Dramatiq, Huey, arq, and taskiq. All six engines feed the same dashboard with the same retry/cancel/audit primitives. If you have heterogeneous queues, this is the main reason to pick z4j over Flower.

How does z4j compare to Flower for performance overhead?

Both watch the same Celery broker events. z4j adds a small Postgres write per task event, so per-task overhead is roughly equivalent until you start running at thousands of tasks per second; at that scale z4j's batched writes outperform Flower's full re-render of the in-memory state.

What about Flower's HTTP API?

z4j has a richer REST + WebSocket API documented at z4j.dev/api. Anything you scripted against Flower's API has an equivalent in z4j (usually with more filters and a tamper-evident audit trail of who called it).

honest trade-offs

Where we don't win

Flower has been around since 2011. It is battle-tested on Celery in a way z4j will not be for another year.

Flower is a single-process deploy: one container, no database. z4j needs SQLite at minimum, Postgres for production. That is a real operational delta.

If your stack is pure Celery and you only need a viewer, Flower is fine.

other comparisons

Compared to other dashboards

Try z4j alongside Flower, no migration required

Run both for a week. Compare. Decide.