Human-readable scheduled jobs for TypeScript developers.
Schedule one-time and recurring HTTP jobs with one clean API. No cron expressions, no queues, no workers. Just runner.schedule() and done.
Schedule anything in 3 lines
Install the SDK, create a Runner instance, and schedule your first job.
import { Runner } from "@maksymdolynchuk/runner"
const runner = new Runner(process.env.RUNNER_API_KEY)
// One-time job
await runner.schedule({
url: "https://myapp.com/api/welcome-email",
runAt: Date.now() + 1000 * 60 * 60,
payload: { userId: "user_123" }
})
// Recurring job — human-readable
await runner.schedule({
url: "https://myapp.com/api/daily-digest",
runEvery: "morning"
})Forget cron. Use words.
Schedule with presets like "midnight", "morning", "endOfMonth" or pass a custom day/time object.
"midnight"
Every day at 00:00
"morning"
Every day at 08:00
"evening"
Every day at 18:00
"startOfMonth"
1st of every month
"endOfMonth"
Last day of every month
{ day: "monday", hour: 9 }
Every Monday at 09:00
Built for real use cases
Welcome emails
Send onboarding emails 30 minutes after signup.
Daily digests
Run digest generation every morning automatically.
Monthly reports
Trigger invoice and report generation at endOfMonth.
Retry workflows
Retry failed webhook deliveries with backoff.
Payment reminders
Schedule payment reminders 3 days before due date.
Cleanup jobs
Purge expired tokens and temp files at midnight.
How it works
Sign up
Create a free account.
Create a project
Get your API key.
Install the SDK
npm install @maksymdolynchuk/runner
Schedule jobs
runner.schedule() from your app.