taskferry-scheduler
Portable "when to fire" triggering. Ships alongside Taskferry, the portable execution layer. Plain Python, no Django required.
A Schedule decides when; it never runs business logic itself. It triggers another capability — a Task, a Job, or an Event — by composition.
pip install taskferry-scheduler # in-process scheduler
pip install taskferry-scheduler[gcp] # + Google Cloud Scheduler
Usage
from taskferry_scheduler import Schedule, CronTrigger, HttpTarget, schedulers
schedulers.configure(
{
"default": {
"factory": "taskferry_scheduler.adapters.gcp:make_cloud_scheduler",
"project": "my-proj",
"location": "us-central1",
},
}
)
schedulers["default"].create(
Schedule(
name="nightly-report",
trigger=CronTrigger("0 2 * * *", timezone="Europe/Madrid"),
# Fire a Task by hitting your Django task webhook (composition):
target=HttpTarget("https://my-service.run.app/_taskferry/execute"),
)
)
Local development / testing (in-process, deterministic):
from taskferry_scheduler import LocalScheduler, Schedule, IntervalTrigger, CallableTarget
from datetime import datetime, timedelta, UTC
s = LocalScheduler()
s.create(Schedule("beat", IntervalTrigger(seconds=60), CallableTarget(lambda: print("tick"))))
s.run_pending(datetime.now(UTC) + timedelta(minutes=2)) # deterministic firing
# or s.start() # background thread for real-time firing
Triggers, targets, capabilities
- Triggers:
CronTrigger,IntervalTrigger,OneShotTrigger. - Targets:
HttpTarget(fire a Task/service),PubSubTarget(fire an Event),CallableTarget(in-process, local only).
Schedulers differ, and the capability set says so honestly:
| Adapter | Provider | Capabilities |
|---|---|---|
LocalScheduler |
local | one_shot, interval, pause, resume, update, delete |
CloudSchedulerScheduler |
gcp | cron, timezone, pause, resume, update, delete |
EventBridgeScheduler |
aws | cron, interval, one_shot, timezone, pause, resume, update, delete |
KubernetesCronJobScheduler |
kubernetes | cron, timezone, pause, resume, update, delete |
LocalScheduler rejects a CronTrigger and Cloud Scheduler / CronJob reject an
IntervalTrigger with UnsupportedCapabilityError — no silent misbehavior.
Roadmap: Azure scheduling (no single equivalent — Logic Apps / Functions timer).
Composition, not orchestration
A schedule fires one capability. Taskferry does not provide DAG workflows or state machines — that is out of scope (see the family composition docs).
License
Apache-2.0.
Release files for taskferry-scheduler 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| taskferry_scheduler-0.2.0.tar.gz | 16.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| taskferry_scheduler-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 40.0 kB
Release files / taskferry_scheduler-0.2.0.tar.gz
| Download URL | taskferry_scheduler-0.2.0.tar.gz |
|---|---|
| Size | 16.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0d79d00ca89676b957f94f598ac5daa25c855a6082a944afbac1b06fd1877976
|
|
BLAKE2b-256 checksum How to use checksums |
cc8c7f5e876f8195b611754ec59b6c2789e3af3641b157edd01991d0654863f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.
Transparency logRelease files / taskferry_scheduler-0.2.0-py3-none-any.whl
| Download URL | taskferry_scheduler-0.2.0-py3-none-any.whl |
|---|---|
| Size | 23.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6942470f97024921a6a0ab3d578e66e2b1691ab6fcc02df4db8983cf71a3a718
|
|
BLAKE2b-256 checksum How to use checksums |
3277f08a695637b54ed47a3d5c3edd531200ecc317c07d63748be75177d19cb9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.
Transparency log