Skip to main content

One Schedules page. Six native schedulers, plus our own.

z4j surfaces six Python task schedulers in one dashboard: celery-beat, rq-scheduler, APScheduler, Huey periodic, arq cron, and taskiq. Plus z4j-scheduler, an engine-agnostic dynamic scheduler that drives any of the six engines from one service with live editing and a tamper-evident audit log of edits.

Engine-agnostic dynamic scheduler

z4j-scheduler

One service that drives Celery, RQ, Dramatiq, Huey, arq, and taskiq. Schedules live in z4j's database; edit live from the dashboard or REST without restarting any daemon. To our knowledge it is the only Python scheduler that combines engine-agnostic dispatch, live editing, HA leader election, and a tamper-evident HMAC-chained audit log of edits in one service.

Engine-agnostic dispatch

One scheduler service, six engines. Run Celery + RQ + Huey side by side and edit them all from the same dashboard.

Live editing, no restart

Create, pause, rename, or delete a schedule from the dashboard or REST API. The scheduler sleeps until the next due fire or a change delivered by the brain's watch stream, waking at least every 30 seconds, so it applies the edit as soon as the change arrives. No pod restart, no static config redeploy.

HA leader election

Run multiple instances with the postgres leader backend; only one dispatches. Postgres advisory-lock leader, safe across rolling restarts. Takeover waits for the database to notice the old leader is gone, so fires can slip during a handover; the brain detects the misfire and each schedule's catch-up policy decides what happens to the missed slot.

Importer + exporter, no lock-in

Import existing schedules from celery-beat, django-celery-beat, rq-scheduler, APScheduler, or system crontab. Export a reviewable Celery, RQ, APScheduler, or crontab file at any time; tests pin each exporter's rendered output.

Full feature breakdown Read the docs Honest framing: scheduler is still not battle-tested at large scale; operate with a fast-response posture and check the CHANGELOG for recent load-test fixes.

Per-engine adapters

Or keep your existing scheduler. We ship an adapter for each.

If z4j-scheduler is more than you need, the supported Celery beat, RQ Scheduler, APScheduler, Huey, arq, and taskiq integrations surface schedules in the same dashboard. Keep the upstream scheduler running and use only the controls its adapter explicitly supports.

How to choose

Which scheduler for which engine?

Every engine has a default pairing. You can also pair any engine with APScheduler if you prefer a single scheduling runtime.

Engine Default scheduler Capabilities
Any (all six) z4j-scheduler z4j-scheduler List schedules, Create schedule, Update schedule, Delete schedule, Enable / disable, Trigger-now, Cron, interval, one-shot and solar triggers, Selectable leadership: single instance by default, or global / per-project PostgreSQL election for HA, Explicit catch-up policy after an outage, Static import diff (--verify) showing inserts, updates and deletes before a cutover
Celery Celery Beat z4j-celerybeat List schedules, Create schedule, Update schedule, Delete schedule, Enable / disable, Trigger-now
RQ rq-scheduler z4j-rqscheduler List schedules, Create schedule, Update schedule, Delete schedule, Enable / disable, Trigger-now
Dramatiq APScheduler z4j-apscheduler List schedules, Create schedule, Update schedule, Delete schedule, Enable / disable, Trigger-now
Huey Huey @periodic_task z4j-hueyperiodic List schedules, Create schedule, Update schedule, Delete schedule, Enable / disable, Trigger-now
arq arq cron_jobs z4j-arqcron List schedules, Create schedule, Update schedule, Delete schedule, Enable / disable, Trigger-now
taskiq taskiq scheduler z4j-taskiqscheduler List schedules, Create schedule, Update schedule, Delete schedule, Enable / disable, Trigger-now

Quick install

Add a scheduler to your app

Install the scheduler package alongside your engine adapter, then register its adapter in the process that runs the scheduler. The Django, Flask and FastAPI adapters discover z4j-celerybeat on their own; the other scheduler adapters are constructed in that process and passed to install_agent(schedulers=[...]), as each scheduler's docs show.

bash
# Celery + celery-beat
pip install z4j-celery z4j-celerybeat

# RQ + rq-scheduler
pip install z4j-rq z4j-rqscheduler

# Dramatiq + APScheduler (engine-agnostic scheduler)
pip install z4j-dramatiq z4j-apscheduler

# Huey with @periodic_task decorators
pip install z4j-huey z4j-hueyperiodic

# arq with WorkerSettings.cron_jobs
pip install z4j-arq z4j-arqcron

# taskiq schedule sources
pip install z4j-taskiq z4j-taskiqscheduler

Need a scheduler for a custom stack?

APScheduler works with any engine. Or implement the SchedulerAdapter Protocol: nine methods, where a read-only adapter refuses the write methods and advertises only list.