Building a calendar
Custom calendars in PostRoll are built in Settings → Calendars. The editor is one form with five sub-editors — each as a repeating- row table you can edit in-place.
-
Open Settings → Calendars in the timeline workspace and click + in the top-right.
-
Pick a template as a starting point (Gregorian / Harptos / Four Seasons / Campaign Days / Blank). The template’s months, weekdays, and other fields populate the form.
-
Give it a name and slug. The slug must be unique within the world.
-
Click Create. The new calendar appears in the left sidebar; click to edit.
Top-level fields
Section titled “Top-level fields”| Field | Notes |
|---|---|
| Name | Display name. |
| Year label (short) | Suffix for years — DR, SR, CE, AS, etc. Renders on every date display. |
| Year label | Long form (“Year”). |
| Display format | Token-substituted template — see below. Default {day} {monthName}, {year} {yearLabelShort}. |
| Hours per day | Defaults to 24. Override for non-Earth settings. |
| Minutes per hour | Defaults to 60. |
| Epoch year | The first year recognised by this calendar. Defaults to 1. |
| Epoch ISO | Optional — when set, anchors Year epoch_year Day 1 to this real-world Gregorian date. Required if you want the alt-date chips to read sensibly. |
| Description | Free text, surfaced in the Calendars list. |
Months
Section titled “Months”The Months table lets you reorder, rename, change the length, and recolour each month. New rows append at the bottom; remove via the trash icon.
- id — slug-shaped (kebab-case). Referenced by event
cal_month_idand intercalaryafter_month_id. Don’t change these once you have events authored against the month. - name — display name.
- short_name — abbreviation.
- days — month length. Required.
Calendars can have any number of months, including 1 (campaign-day mode). Empty months arrays are legal too — the calendar becomes a year-counter only.
Weekdays
Section titled “Weekdays”Same row-based editor as Months. The cycle length is whatever you configure — 7-day weeks, Harptos’s 10-day tenday, or empty (seasonless / weekdayless calendars).
The most powerful sub-editor. Each era has:
- id / name / short_name — display.
- start_year — inclusive lower bound. Eras stretch until the start of the next era.
- offset (
display_year_offset) — optional. Subtracted from the canonical year to produce{year_in_era}. Used for regnal calendars. - year_format — optional. Overrides the calendar’s display
format for events in this era — for example,
Year {year_in_era} of the {eraName}produces “Year 12 of the Reign of Mira”.
See Eras and regnal years for the full mental model.
Intercalary days
Section titled “Intercalary days”Intercalary days are days that fall outside the normal week — festivals like Midwinter, Shieldmeet, the Feast of the Moon. Each specifies:
- id / name — display.
- after_month_id — which month it follows.
- after_day — which day-of-month it follows.
- leap_only — if checked, only appears in years matching the leap cycle.
Intercalary days render as full-width amber strips between days on the Calendar tab’s Month grid.
Leap rules
Section titled “Leap rules”Two parts:
- Cycle — three numbers: every-N-years, skip-every (optional),
skip-skip-every (optional). Gregorian is
4 / 100 / 400— every 4 years is leap, except every 100 years isn’t, except every 400 years still is. - Effects — a JSON array (raw editor today) describing what the
leap year actually changes:
{ "kind": "extra_day_in_month", "month_id": "feb", "extra_days": 1 }— adds a day to a specific month.{ "kind": "enable_intercalary", "intercalary_id": "shieldmeet" }— activates aleap_onlyintercalary.
A polish pass will replace the raw-JSON effects editor with a row-based one.
Display format tokens
Section titled “Display format tokens”The default format is {day} {monthName}, {year} {yearLabelShort} →
“12 Brightember, 1247 SR”. Available tokens:
| Token | Replaced with |
|---|---|
{day} |
Day of month |
{monthName} |
Full month name |
{monthShort} |
Month short_name |
{year} |
Calendar year |
{year_in_era} |
Year minus era’s display_year_offset |
{eraName} |
Era full name |
{eraShort} |
Era short_name |
{yearLabel} |
“Year” (or whatever you set) |
{yearLabelShort} |
“DR” / “SR” / “CE” |
{weekdayName} |
Full weekday name |
{hour} / {minute} |
Zero-padded |
Eras can override the calendar-level format with their own
year_format for regnal-style displays.
Related
Section titled “Related”- Calendar cookbook — recipes for Harptos, Exandria, regnal, etc.
- Eras and regnal years — deep dive
- Multiple calendars — alt-date chips, picking primary