Skip to content

Changelog

  • Out-of-table Hijri months/month and /range with calendar=hijri are now served from the Neo MABIMS computed tier (previously only dates inside the official table were reachable through these two endpoints).
  • Hijri /range day-31 bug/range?calendar=hijri failed with out_of_coverage whenever the range crossed a month boundary (Hijri months have no day 31). It now walks Hijri months month-by-month.
  • 24-question Safar day 30 rejectedYYYY-02-30 is a valid Hijri date (Safar can have 30 days) but was rejected as invalid_date because the Gregorian parser knows no Feb 30. The Hijri parser now separates syntax validation (days 1–30) from data existence; genuinely absent days (e.g. day 30 in a 29-day month) honestly return 404 date_not_found.

  • New Calendar playground (/playground/kalender) — a full Hijri year, two columns, rendered live from /month and /events. Large number = Hijri date, small = Gregorian, Friday marked yellow, event badges, today marker.
  • Calendar playground logic moved to a shared module (src/lib/kalender.core.js) so the ID & EN versions stay identical.
  • /range & /month docs updated: calendar=hijri is now served from the computed tier beyond the official table.

  • Landing page with live JSON preview and latency badge
  • Documentation site (Astro + Starlight)
  • Blog (3 articles: story, tutorial, hilal behind-the-scenes)
  • FAQ page (bilingual)
  • Playground (converter + hilal visualization)
  • Migration guide from Aladhan API
  • Error response examples in all API reference pages
  • Sidebar reorganized: “FAQ”, Changelog

  • GET /events — Islamic observance dates (1 Muharram, Maulid Nabi, Ramadan start, Eid al-Fitr, Eid al-Adha) from the MABIMS table, extended with computed dates beyond table coverage.
  • GET /hilal/info — hilal visibility data: Neo MABIMS criteria (hilal ≥ 3°, elongation ≥ 6.4°), moon position, TERLIHAT / TIDAK TERLIHAT verdict.
  • GET /hilal/viz — PNG sky chart visualization 720×1280: moon position, crescent orientation, criteria table, computed at Sabang.

  • GET /today — Hijri date for “now”, timezone-aware (default Asia/Jakarta). Dynamic edge-cache TTL.
  • GET /today/{date} — immutable variant for specific dates, cache-forever.
  • GET /convert — single date conversion between Gregorian and Hijri (bidirectional). Cache-Control: max-age=86400.
  • GET /range — bulk conversion for date ranges (max 400 days). Each item carries its own source.
  • GET /month — monthly calendar grid, 29–30 items per month.
  • Official MABIMS table — data from Kemenag RI, coverage 2024-01-13 to 2026-12-31.
  • Fallback chain — MABIMS table → Neo MABIMS computed (Sabang).
  • CDN caching — Bunny CDN, dynamic TTL based on timezone, origin sees ~1 request per edge location per day.
  • CORS — flexible, client-side apps on any domain can call directly.
  • Rate limiting — 240 requests per minute per IP, 429 when exceeded.
  • GET /meta — data coverage info, fallback status, data version.
  • GET /healthz — liveness probe for uptime monitoring.
  • CI/CD — GitHub Actions, ruff + mypy, schema contract tests, yearly table regen workflow.