Jobs

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:

POST/v1/code/jobs/daily_report/config/schedule
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:

OperatorMeaningExample
*Any value* * * * * — every minute
,List of values0 9,17 * * * — 09:00 and 17:00
-Range of values0 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/schedule

An 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 /input contract.
  • Chains — the pipeline a scheduled run executes.
  • Runs — every scheduled trigger is recorded as a run.