Changelog
What changed, when it went live, and why it mattered. If you subscribed to a calendar and are wondering whether a correction has reached you, this is the place to check — subscriptions refresh on their own schedule, not instantly.
- New coverage 349 schools, 8 cities
Individual school calendars added — 349 schools
Added a school-level layer covering 349 schools across 8 cities (Dubai, Singapore, Hong Kong, Bangkok, Tokyo, Kuala Lumpur, Shanghai, Shenzhen). Each school has its own page, its own subscription feed, and a comparison showing how its dates differ from the other schools in the same city. Regional calendars answer "when is the state off"; these answer "when is my child's school off", which is frequently a different week.
- Trust 349 pages
Event structured data added to school pages
School pages now emit schema.org Event markup for each closure, so a holiday date range can surface directly in search results. The site previously carried WebSite, Organization, FAQPage, Dataset and BreadcrumbList markup but no Event — meaning no page could show a date in a rich result.
- Calendars 698 new feeds
Per-school calendar subscriptions
Every school now has a permanent, self-updating feed at /feeds/schools/{id}.ics alongside a single-year download. Feeds use the same identifier contract as the regional ones, so a corrected date updates the event a subscriber already has rather than adding a second one.
- Correction 1 record
Duplicate school record removed
"The Japanese School Singapore" was recorded twice for 2026-2027, once as an empty stub and once with dates. Both produced pages with an identical title, which makes them compete for the same query. The empty record was removed; the dated one is kept.
- Correction all school feeds
Calendar feed identifiers could collide
School feed event identifiers are built from the school, the category and the event label, with a numeric suffix when a label repeats. A school with both "End of Term" (twice) and "End of Term 2" produced two identical identifiers, silently merging two closures into one. The suffix separator was changed to a character no label can contain.
- Trust 85 pages
Governance panel no longer contradicts itself
The data panel showed "Source document: Not yet recorded" directly above a differently labelled section naming the source organisation — the same label used for two different things. The organisation now has its own label, so the panel reads consistently. Affected 85 of 87 regional pages.
- Data 16 states, 95 periods
German Länder dates verified against the KMK table
All 16 German states were checked line by line against the Kultusministerkonferenz published holiday table for 2026/2027: 95 holiday periods, all matching. The check now runs on every build, so a future edit that breaks a date is caught before it ships.
- Correction 9 terms
Nine impossible term-day counts removed
Nine terms declared more school days than the term contained weekdays, which is impossible regardless of how a source counts. The correct figures need the official source for each term, so the unverifiable values were removed rather than replaced with a computed guess.
- Correction 5 languages
Localisation coverage raised from 68.8% to 81.5%
Holiday-name translations covered 68.8% of events, weighted by how often each name appears. Added 49 dictionary entries and 12 cross-language aliases (so "Navidad" resolves to the existing "Christmas Day" translations), and fixed a lookup that could not match names pairing an English base with a non-English gloss.
- Correction 372 link targets
372 dead internal links removed
Breadcrumbs linked the region level to region root pages that were never built, so every region page offered a 404. The header and footer also prefixed English-only pages with a language code, making /de/universities/ a 404 from every German page. Both fixed; internal link integrity is now checked on every build.
- Correction contact form
Feedback reports were being discarded
The contact form's endpoint ran without its storage binding, so every submitted report reached only the worker log and the reporter was told to email instead. The binding now resolves and reports are retained for 180 days.
- Correction 4 pages
Two identical-page pairs untangled
New York State and New York City rendered the same title in Spanish and French, making two distinct regions compete for one query. The city now reads "Ciudad de Nueva York" in Spanish and the state carries an "(État)" qualifier in French, where the bare name means the city.
For how the data is sourced and verified, see the methodology. To report an error, use the contact form.