jscheduler

Durable scheduled event delivery

The clock calls.Your endpoint answers.

Create a one-time, interval, or cron schedule. jscheduler holds the state, fires on the minute, and keeps delivering your HTTP webhook until it has a real answer.

No SDK requiredUTC · minute precisionIdempotency keys included
Dispatch tracelive
MON / 13 JULUTC
invoice.reminderqueued
invoice.reminderclaimed · worker-03
POST /hooks/billing202 · 184ms
trial.expiringnext dispatch
occurrenceevt_8f2:2026-07-13T09:00Z
ONE-TIME01INTERVAL02CRON03HTTP OUTBOX04AUTOMATIC RETRY05MANUAL REDRIVE

Small control plane.
Serious delivery path.

Scheduling and sending are separate jobs. PostgreSQL leases make workers safe to scale horizontally; a durable outbox keeps a slow or failing receiver from blocking the clock.

  1. 01

    Define

    Send JSON with a name, payload, and schedule. The API validates minute precision before storing it.

  2. 02

    Claim

    A worker atomically leases due work with SKIP LOCKED, so more workers add capacity without double-claiming.

  3. 03

    Dispatch

    The occurrence enters an HTTP outbox, then routes to your default or tag-specific endpoint.

  4. 04

    Prove

    Inspect attempts and errors, rely on the occurrence id for deduplication, and redrive uncertain delivery.

Three commands.
Then watch your server.

Access gives you an organization and an API key. The same key works in the CLI and plain HTTP—there is no proprietary runtime to install.

Open the complete quickstart →
FIRST-RUN.SHzsh
01
$curl -fsSL https://cli.jscheduler.com/install.sh | bash
02
$jscheduler auth login --api-key jsk_••••••
03
$jscheduler endpoints create --url https://example.com/hooks
04
$jscheduler events create --name wake-up --kind ONE_TIME \\
--fire-at 2030-07-13T09:00:00Z --payload '{"ready":true}'
Event created · next fire 2030-07-13 09:00 UTC

Built to keep the appointment.

The hot path is database-backed and lease-coordinated. Every delivery gets history, attempt state, and an idempotency key—useful evidence when a receiver has a bad day.

3default HTTP attemptsexponential backoff
native CLI targetsmacOS + Linux · arm64 + x64
A

Receiver-idempotent

Automatic retries favor delivery. Deduplicate on the supplied Idempotency-Key.

B

No-duplicate-sends

Ambiguous network outcomes stop as UNCERTAIN and wait for your explicit redrive.

01 / ONE_TIME

At one exact minute.

2030-07-13T09:00:00Z

Reminders, trial endings, delayed workflows.

02 / INTERVAL

Every N minutes.

intervalMinutes: 15

Polling, refreshes, recurring maintenance.

03 / CRON

On a UTC calendar.

0 9 * * MON-FRI

Reports, billing cycles, business routines.

READY
TO
DISPATCH

Give the clock
somewhere to send.