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.
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.
z4j-scheduler
Our own scheduler. Engine-agnostic, highly available, and safe to migrate onto.
pip install z4j-schedulerDetails
Celery Beat
Native database scheduling for Django and Celery.
pip install z4j-celerybeatDetails
rq-scheduler
Persistent dashboard management for native RQ schedules.
pip install z4j-rqschedulerDetails
APScheduler
Dashboard management for the APScheduler 3 jobstore.
pip install z4j-apschedulerDetails
Huey @periodic_task
Manage code-defined Huey schedules with durable overrides.
pip install z4j-hueyperiodicDetails
arq cron_jobs
Manage code-defined arq cron jobs with durable overrides.
pip install z4j-arqcronDetails
taskiq scheduler
Dashboard management for TaskIQ label schedules.
pip install z4j-taskiqschedulerDetails
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.
# 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.