Skip to content

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.

  1. Open Settings → Calendars in the timeline workspace and click + in the top-right.

  2. 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.

  3. Give it a name and slug. The slug must be unique within the world.

  4. Click Create. The new calendar appears in the left sidebar; click to edit.

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.

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_id and intercalary after_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.

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 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.

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 a leap_only intercalary.

A polish pass will replace the raw-JSON effects editor with a row-based one.

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.