Rust · single binary · cron
Metronome is a single-binary cron-style job scheduler. No daemon, no global state, no root-owned crontab. The schedule logic is a pure library function, fully unit tested, that you can embed in your own project.
next fire times, computed live in your browser
Type a five-field cron expression (minute, hour, day-of-month, month, day-of-week) into the box, or click a preset. The list updates live with the next fire times computed in your browser by the same schedule engine the binary uses. Try steps like */15, ranges like 1-5, and lists like 1,3,5.
Ask for the next fire times of any expression, or validate a whole jobs file, without waiting for a single tick.
$ metronome next "*/15 * * * *" --count 5 2026-09-07 09:00:00 Mon 2026-09-07 09:15:00 Mon 2026-09-07 09:30:00 Mon 2026-09-07 09:45:00 Mon 2026-09-07 10:00:00 Mon $ metronome check --file jobs.metro 2 job(s) OK
real CLI output. the browser demo above computes the same fire times with the same engine
A schedule engine you can trust because you can test it directly.
next_after(expr, now) is a plain function with no I/O and no shared state. Test it directly, no clock mocking required.
No daemon to install, no system-wide crontab to edit as root. Point it at a text file and run.
Pull in the metronome crate and call the parser and next_after from your own Rust code and your own tests.
| Field | Range |
|---|---|
| minute | 0-59 |
| hour | 0-23 |
| day-of-month | 1-31 |
| month | 1-12 |
| day-of-week | 0-7 (0 and 7 both mean Sunday) |
Every field accepts the same five operators. They compose, so 1-30/2 is a step over a range and 1,3,5 is a list.
*Any value in the field's full range.
1-5A contiguous range, low to high.
*/15A step over the full range: every 15th value.
1-30/2A step over a range: every 2nd value from 1 to 30.
1,3,5A list of single values or ranges.
When both are restricted, a day fires if it satisfies either, matching standard cron.
Run it as a binary, or embed the engine and test your own schedules in your own tests.
Print the next N fire times for an expression, so you can eyeball a schedule before committing it.
Validate a jobs file without running it, so a bad expression fails in review, not at 3am.
Sleep until each job is due, then run it in-process. No daemon, no root-owned crontab.
Pull in the metronome crate and call CronExpr::parse and next_after directly from your own Rust code.
metronome next "*/15 * * * *" --count 5 metronome check --file jobs.metro metronome run --file jobs.metro