Cron is a time-based job scheduler that originated in Version 7 Unix in 1979 and has become the de-facto standard for declaring 'run this at this time' rules. A cron expression is a five-field string - minute, hour, day-of-month, month, day-of-week - that the daemon evaluates once per minute, firing the job whenever the current wall-clock time matches every field.
Generating expressions is the easy part; reading someone else's expression six months later is what bites you. This tool pairs a field-by-field builder with cronstrue, the canonical JavaScript library for translating cron expressions back into English. Type 0 9 * * 1-5 and cronstrue prints 'At 09:00 AM, Monday through Friday' in real time. The library is the same one used by Hangfire, Azure Logic Apps, and several major schedulers' admin UIs, so its English matches what you'll see elsewhere.
The next-runs panel is computed locally with a small minute-by-minute matcher you can read in the source above. It walks forward from now, checking each five-tuple against your expression, and stops at the fifth match. The matcher supports * (any), N (literal), N-M (range), N,M (list), and */N (step) - the standard Vixie cron syntax used by Linux crontab and most cloud schedulers.
One subtle behaviour to know: when both day-of-month and day-of-week are restricted (neither is *), classic Unix cron uses OR semantics - the job runs if either matches. This is unintuitive and a frequent source of bugs. Our preview matcher uses AND semantics for clarity, which matches the behaviour of Quartz-style schedulers (Spring, Java, AWS EventBridge, GitHub Actions). If you're writing into a crontab on a Linux box, double-check the OR rule before relying on a complex day-of-week schedule.
Time-zone handling is another foot-gun. The next-runs preview here uses your browser's local time zone, but most production cron daemons run in UTC unless explicitly configured otherwise. GitHub Actions schedules, AWS EventBridge, and Kubernetes CronJobs all default to UTC. Always document the time zone alongside the expression, or you'll discover at 3 AM that '0 9 * * *' meant something different on the server.
Cron has hard limits. The smallest interval is one minute - you cannot schedule a job every 30 seconds with standard 5-field syntax. The smallest practical interval on shared cloud schedulers is often higher: GitHub Actions guarantees only that schedules fire within 15 minutes of the requested time, and AWS EventBridge has a 1-minute floor for rate expressions. For sub-minute scheduling, use a long-running daemon or systemd timers with OnUnitActiveSec.
There's also a 6-field variant (Quartz, used by Spring and Hangfire) that adds a leading seconds field, and a 7-field variant that adds a year. This tool emits standard 5-field Unix syntax, which works in crontab, GitHub Actions, GitLab CI, Vercel Cron Jobs, Cloudflare Workers cron, Kubernetes CronJob, and most other schedulers. Drop the result into your YAML or crontab as-is.