Changelog
For programmatic access to data changes, hit GET /v1/changelog. This page is a human-friendly summary of releases and schema changes.
v0.1.0 — Initial release
- REST API with 14 endpoints
- TypeScript SDK (
@catlabtech/mycal-sdk) - MCP Server (
@catlabtech/mycal-mcp-server) with 12 tools - iCal subscription feeds per state
- Landing page, interactive demo, and developer docs site
- Data: 2024, 2025, 2026 public holidays; 2026 school calendar
Data update policy
Holiday data is considered authoritative from the JPM gazette. When a new annual gazette is published (typically Aug–Oct of the preceding year):
- Gazette PDF parsed into
data/holidays/<year>.json - Zod schema + cross-source validation run
- PR opened, reviewed, merged to main
- CF Workers + KV redeployed automatically
Cuti peristiwa (ad-hoc holidays):
- Announcement captured from official channels
- Record added with
status: "announced" - Upgraded to
"confirmed"once gazette PDF appears - iCal feeds reflect the update within 6 hours
Islamic holidays:
- Published with
status: "tentative"at the start of each year from JAKIM Takwim. - Manually flipped to
"confirmed"1–2 days before each holiday once JAKIM announces rukyah results.
Schema versioning
API responses are under /v1/. Breaking changes will go to /v2/. Additive changes (new fields, new endpoints) happen under /v1/ without notice.
Current stable fields on Holiday:
id, date, endDate, name{ms,en,zh}, type, status,states, isPublicHoliday, gazetteLevel, gazetteRef,hijriDate, isReplacementFor, source, createdAt, updatedAtRecent data events
See GET /v1/changelog for the live list. Sample entries:
[ { "timestamp": "2025-12-15T02:30:00Z", "event": "holiday-added", "holidayId": "2026-nuzul-al-quran", "description": "Added state Nuzul Al-Quran for Selangor" }, { "timestamp": "2025-12-01T00:00:00Z", "event": "data-ingested", "description": "Ingested JPM gazette GN-33499 for calendar year 2026" }]