Open-source · FastAPI + Next.js

Every job needs a spark.

Flint is a background job scheduler built for developers who care about correctness. Schedule emails, webhooks, and log pipelines, powered by swappable priority algorithms, live status streams, and a clean UI.

3job handlers
2algorithms
retry backoff
SSElive stream
flint — job scheduler

$ POST /api/v1/jobs

{

"type": "webhook_delivery",

"priority": 1,

"interval": "5m"

}

201 Created · job_id: a3f9d2c1

Live queue

4 active workers · 18 queued

retry #2webhookdue 5m

Job handlers

Three handler types.
One unified queue.

Email dispatch

type: "send_email"

Queue and deliver transactional emails with full payload control. Retries on failure, deduplication on key.

{

"to": "user@example.com"

"subject": "Your order is confirmed"

"body": "Hi Alice, your order #4821…"

}

Webhook delivery

type: "webhook_delivery"

POST signed payloads to any endpoint. Configurable method, headers, and body — with automatic retry logic.

{

"url": "https://api.yourapp.com/hooks"

"method": "POST"

"body": "{"event":"payment.success"}"

}

Log processing

type: "log_processing"

Ingest and process structured log lines from any source. Batch jobs, stream ingestion, or one-off pipeline runs.

{

"source": "nginx-prod-01"

"log_lines": [

"2024-01-15 ERROR timeout…",

"2024-01-15 WARN retry scheduled…"

]

}

algorithms

Switch on the fly

Two algorithms.
Zero restarts.

Flint ships with two scheduling strategies. Toggle between them at runtime through the dashboard or the settings API; the queue drains under the current algorithm and the next job is picked up under the new one.

O(log n) insert · O(log n) popBest for: Mixed-priority workloads

Jobs are stored in a binary min-heap keyed by effective priority. The scheduler always pops the highest-priority job next — ideal when you need to guarantee that critical jobs like payment webhooks always run before lower-priority batch work.

Min-heap
Priority-first scheduling

Queue by priority

P1
P1
P2
P2
P3
P3
P3
worker-arunning
worker-bidle
worker-cretrying
O(log n)Insert
O(log n)Pop
O(1)Peek

Built-in

Everything a job scheduler
should ship with.

Live status via SSE

Job state changes stream directly to the dashboard over Server-Sent Events. No polling, no stale UI — every transition is instant.

Interval scheduling

Define recurring jobs with human-readable intervals — 30s, 5m, 1h, 1d. Flint re-queues them automatically after each run.

Dependency chains

Declare upstream job IDs and Flint holds a job until all dependencies reach a completed state. DAG visualised in the job detail view.

Structured logs

Every job event — creation, retries, completion, failure — is written to an append-only log you can query and filter in the Logs view.

Benchmark suite

Run head-to-head algorithm benchmarks at 1 k, 10 k, or 100 k jobs from inside the dashboard. Visualise insert/pop times side-by-side.

Dead letter queue

Jobs that exhaust all retries are moved to the DLQ. Inspect the last error, view the full payload, and re-queue with one click.

Priority levels

Three priority tiers — High, Medium, Low — determine queue position under the min-heap strategy. High-priority jobs always run first.

Worker management

Monitor active workers, view last-seen times, and gracefully stop or restart individual workers from the dashboard or Settings page.