Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Schedules

A schedule determines when an entry fires or an assertion is checked. Schedules appear inline on entries and assertions, or they can be named and reused.

Named schedules

schedule <name> = <schedule-expression>
schedule semi_monthly   = every month on the 15th, last day
schedule every_two_weeks = every second friday from 2026-01-02

A named schedule is referenced by its identifier wherever a schedule is expected.

Adverbial shortcuts

The simplest schedules are single-word adverbs. Each has a sensible default when no further detail is given.

KeywordFires on
dailyEvery day
weeklyEvery Sunday
monthlyLast day of every month
quarterlyMar 31, Jun 30, Sep 30, Dec 31
yearly / annuallyDec 31

Each adverb accepts an optional on clause to override the default:

weekly on friday                         # every Friday
weekly on monday and wednesday           # Mon and Wed each week
monthly on the 1st                       # first of every month
monthly on the 15th, last day            # 15th and last day
yearly on jan 1st                        # New Year's Day
yearly on may first, jul last            # May 1 and July 31 each year

The every form

The every keyword gives you full control.

every <period> [from <date>]
every <n> <period> from <date>

Periods

day — fires every day (or every n days from a start date):

every day
every 3 days from 2026-01-01

week [on <days>] — fires every week on the given day(s). Without on, defaults to Sunday:

every week
every week on thursday
every week on weekend and friday

<weekday> — shorthand for every week on <weekday>:

every friday
every monday
every weekday

month [on the <occurrences>] — fires every month. Without on the, defaults to the last day of the month:

every month
every month on the 1st
every month on the last day
every month on the 2nd monday
every month on the 3rd thursday, 15th

<month-name> [<ordinal>] — fires once a year in the named month. Without an ordinal, defaults to the last day of that month:

every january
every january 1st
every december last
every aug 15th

quarter — fires at the end of each quarter:

every quarter

year [on <month> <ordinal>, ...] — fires once a year. Without on, defaults to Dec 31:

every year
every year on april 15th
every year on jan 31, jul 31

Skipping occurrences

Prefix the period with a count to fire every nth occurrence. A from date is required to anchor the sequence:

every 2 weeks from 2026-01-05          # biweekly starting Jan 5
every second friday from 2026-01-02    # alternate Fridays
every 3 months from 2026-01-01         # quarterly with custom anchor
every 2 years from 2026-01-01          # biennially

Ordinal words (second, third, fourth, …, tenth) and numeric suffixes (2nd, 3rd, 4th, …) are both accepted.

every <n> weeks on <days> counts calendar weeks (Monday to Sunday) from the week containing the from date, so all the listed days of a week fire together. every <n> <weekday> counts occurrences of that day instead, starting with the first one on or after the from date.

Literal date lists

A comma- or and-separated list of ISO dates fires on exactly those days:

2026-04-15
2026-04-15 and 2026-10-15
2026-01-01, 2026-07-04, 2026-12-25

Default behaviors summary

Without an on clause, every period fires on its last day. Weeks run Monday to Sunday.

FormDefault firing day
weeklySunday
every weekSunday
monthlyLast day of month
every monthLast day of month
quarterlyQuarter-end (Mar 31 / Jun 30 / Sep 30 / Dec 31)
yearly / every yearDec 31
every <month-name>Last day of that month