Schedule
A job's config/schedule holds a single cron expression. When it's set, novem triggers the job on that schedule, with an optional timezone and inline comments.
AI assisted, human approved — novem uses AI to review and keep our documentation up to date.
A job runs on demand whenever you trigger it. Give it a config/schedule and
it runs on a cron schedule as well. The file holds a single cron expression
with an optional timezone and comments. You write it to
the job's config/schedule path:
0 8 * * *
This runs daily_report every day at 08:00. Scheduled runs go through the same
chain as a manual run; the difference is only
when they start.
The schedule is one standard five-field cron line:
minute hour day month weekday
│ │ │ │ │
│ │ │ │ └── weekday: 0-6 (0 = Sunday), or names (Mon-Sun, Monday-Sunday)
│ │ │ └──────── month: 1-12
│ │ └──────────── day: 1-31
│ └───────────────── hour: 0-23
└──────────────────────── minute: 0-59
Each field accepts the usual cron operators:
| Operator | Meaning | Example |
|---|---|---|
* | Any value | * * * * * — every minute |
, | List of values | 0 9,17 * * * — 09:00 and 17:00 |
- | Range of values | 0 9 * * 1-5 — weekdays at 09:00 |
/ | Step within a range | */15 * * * * — every 15 minutes |
Weekday names are case-insensitive and may be abbreviated (Mon, monday) and
combined with ranges and lists (Mon-Fri, Sat,Sun). Scheduling is
minute-granular: the smallest interval you can express is once per minute.
0 9 * * * # Every day at 09:00
0 * * * * # Every hour, on the hour
*/15 * * * * # Every 15 minutes
0 9 * * Mon-Fri # Weekdays at 09:00
0 3 * * Sat,Sun # Weekends at 03:00
0 0 1 * * # Midnight on the 1st of every month
0 0 1 1,4,7,10 * # Midnight on the first day of each quarter
0 9-17 * * 1-5 # Top of every hour, 09:00–17:00, on weekdays
By default a schedule is evaluated in your account's timezone (falling back to
UTC if you haven't set one). To pin it to a specific zone regardless of your
account setting, add a TZ= line above the cron expression using an
IANA timezone name:
TZ=America/New_York
0 9 * * * # 09:00 Eastern, following daylight-saving changes
The TZ= line must come first, before the cron expression. An unrecognised
timezone name is ignored and the schedule falls back to your account timezone
(then UTC).
Lines beginning with #, and anything after a # on the cron line, are
ignored. Use them to label what a schedule does:
# Nightly sales rollup
TZ=Europe/Oslo
0 2 * * * # 02:00 Oslo time, after the warehouse load
A file that contains only comments (or is empty) defines no active
schedule. The job stays manual-only. This is also how a freshly created
job's placeholder config/schedule behaves until you add a real expression.
Note: Only the first cron expression in the file is used. If you write several schedule lines, the later ones are ignored. A job has at most one schedule.
# set the schedule (pipe the cron expression in on stdin)
echo "0 8 * * *" | novem -j daily_report -w config/schedule
# read the current schedule back
novem -j daily_report -r config/scheduleAn invalid cron expression is rejected when you write it (400), with a message
naming the field that failed, so a bad schedule never silently replaces a
working one.
Scheduled runs respect the job's config/enabled kill switch: while a job is
disabled, novem skips its scheduled triggers (manual runs you start yourself
still work). To stop the schedule entirely, clear config/schedule by writing
an empty file or comments only.
Note: A scheduled run uses an empty input. There's no payload or uploaded
file, so /input contains no input.json. Write jobs you intend to schedule
so they can run without input. See the
jobs overview for what a run receives in /input.
- Jobs overview — env vars, running, and the
/inputcontract. - Chains — the pipeline a scheduled run executes.
- Runs — every scheduled trigger is recorded as a run.