Making calendars
Where calendar files go, and the calendar types: streak, monthly and dated.
Calendars are JSON files, so server owners and pack makers can change every reward, add their own calendars and switch the built-in ones off. This page covers where the files go and the calendar’s own settings; Rewards and themes covers what goes behind the doors.
Where the files go
- Server owners:
config/dailycalendar/calendars/<name>.json. The id isdailycalendar:<name>, unless the file has its own"id": "myserver:winter". A file named like a built-in one (daily.json,halloween.json,advent.json) replaces it, and{"enabled": false}switches it off.config/dailycalendar/examples/holds copies of the built-in calendars to start from (refreshed every start, never loaded). - Modpacks and datapacks:
data/<namespace>/dailycalendar/calendars/<name>.json, id<namespace>:<name>. A config file with the same id wins over a datapack one. - Or list ids to switch off in
disabledCalendarsinconfig/dailycalendar/server.toml.
Run /calendar admin reload (or /reload) after editing. Anything wrong (a typo, an item from a mod that isn’t installed, a bad colour) is listed in chat and the server log; a broken reward is left out rather than losing the whole calendar. /calendar admin preview <calendar> shows it with every reward visible, and /calendar admin test <calendar> <door> gives you a door’s rewards without saving anything.
A calendar
{
"name": "Daily Rewards",
"description": "A door a day. Come back tomorrow for the next one!",
"type": "streak",
"length": 28,
"on_miss": "skip",
"grace_days": 1,
"on_complete": "restart",
"reveal": "all",
"sort": 0,
"milestone_every": 7,
"theme": { "door": "#8B5E3C", "accent": "#FFD866", "particles": "sparkles" },
"default": [ { "item": "minecraft:bread", "count": 4 } ],
"days": {
"1": [ { "item": "minecraft:bread", "count": 6 } ],
"7": { "milestone": true, "label": "Week one!", "rewards": [ { "item": "minecraft:diamond", "count": 2 }, { "levels": 3 } ] }
}
}
| Field | Default | Meaning |
|---|---|---|
name |
the file name | Shown as the title and tab. A string, or a text component ({"text": "...", "color": "gold"}, {"translate": "..."}). |
description |
none | A line under the doors. |
type |
streak |
streak, monthly or dated (see below). |
reveal |
all |
What players can see behind doors they haven’t opened: all, milestones (only milestone doors) or none (all surprises). |
sort |
0 | Tab order, lowest first. The calendar key opens the first one with a door waiting. |
days |
Door number (from 1) to what’s behind it. See Days. | |
default |
nothing | What’s behind doors not listed in days. |
milestone_every |
0 (off) | Make every Nth door a milestone (7 = 7, 14, 21…). |
streak_rewards |
none | Bonuses for days in a row. See Streak rewards. |
requires |
everyone | Who can use the calendar. See Who can use a calendar. |
theme |
warm wood | Colours and effects, see Themes. |
enabled |
true | false switches the calendar off. |
id |
from the file | Config folder files only: the calendar’s id. |
Types
streak: a door per day the player shows up. Door 1 on their first day, door 2 the next day they play, and so on. It’s personal: everyone starts at door 1.
| Field | Default | Meaning |
|---|---|---|
length |
28 | Number of doors (1-366). |
on_miss |
skip |
What missing a day does. reset: back to door 1. skip: the missed days’ doors stay shut forever, the player carries on where they’d have been (they keep what they opened). pause: nothing is lost, they carry on at the next door. |
grace_days |
0 | Days a player can miss in a row without it counting as a miss (their streak carries on too). |
on_complete |
restart |
After the last door: restart (a new round the next day) or stop (done for good). |
dated: a door per date, the same for everyone, like a real advent calendar.
| Field | Default | Meaning |
|---|---|---|
start, end |
"12-01" and "12-25" for every year, or "2026-12-01" and "2026-12-25" for that year only. Can wrap the new year ("12-30" to "01-02"). Dates can also be counted from Easter Sunday, which moves every year: "easter", "easter-13", "easter+1" (Western Easter). Door 1 is the start date. |
|
grace_days |
0 | How many days late a missed door can still be opened. The calendar stays up that long after it ends, too. |
preview_days |
0 | Show the calendar (all doors shut, “Opens in N days”) this many days before it starts. |
Doors are laid out under weekday headings, like a wall calendar.
monthly: a dated calendar that’s always on: the current month’s days, 28 to 31 doors, starting fresh on the 1st. grace_days works as for dated (within the month). Door N is the Nth of the month, so days keys 1-31.