Cron jobs,
finally under control

A lightweight, self-hosted job scheduler with a modern web UI. Create schedules visually, monitor runs, and get notified when things go wrong.

Get Started View on GitHub
Tests Docker

In action

Everything you need at a glance

Job overview - list of configured cron jobs with run history
Job Overview: manage all your scheduled tasks in one place
Job editor - visual schedule builder with presets
Visual Builder: craft schedules without memorising cron syntax

Features

Built for self-hosters

Visual Schedule Builder

Pick presets like "Every hour" or use the granular builder. Switch to raw cron expression input at any time.

Full Run History

Every execution is logged with stdout, stderr, exit code, and duration. Know exactly what happened and when.

Push Notifications

Integrate with ntfy to get notified on failures, on every run, or both. Self-hosted or the public instance.

Manual Triggers

Fire any job on demand with one click. No need to wait for the next scheduled run.

Zero External Dependencies

Backed by SQLite: no Postgres, no Redis, no cloud services. One container, one volume, done.

Mobile-Friendly UI

The interface adapts to any screen size so you can check on your jobs from your phone.


Installation

Up in 30 seconds with Docker

docker run -d \
  --name cronpilot \
  -p 3001:3001 \
  -v $(pwd)/db:/data \
  ghcr.io/orangecoding/cronpilot:latest

Or with Docker Compose: copy docker-compose.yml from the repo and run:

docker compose up -d

Open http://localhost:3001 in your browser. Configure via a .env file:

Variable Default Description
PORT 3001 HTTP server port
DB_PATH ./cronpilot.db SQLite database path
EXEC_TIMEOUT_MS 1800000 Max job runtime (30 min)
KEEP_MAX_FOR_HISTORY 5 Run history entries per job
LOG_LEVEL info error · warn · info · debug