Why the holiday data is a static file instead of a live lookup

The most accurate library for computing public holidays across 200+ countries is a Node.js package. It has no browser build, and it wouldn't matter if it did, since this site's entire premise is that nothing runs on a server. Rather than drop the feature or hand-roll a worse version of the same rules, the holiday data for every supported country and year gets computed once, offline, and saved as a plain JSON file that ships with the site like any other static asset. The browser's only job at runtime is fetch() and a dictionary lookup by date, no calendar math happens client-side for civil holidays at all. The tradeoff is a fixed year range (2020–2036 here) instead of "any year forever," which is a reasonable one: recomputing the file to extend it is a five-minute job, not a redesign.

Why Islamic dates carry a visible disclaimer and Jewish dates don't

These two calendars look similar from the outside. Both are non-Gregorian, both determine some dates other calendars can't predict by simple arithmetic, but the underlying certainty is genuinely different, and the disclaimer follows that difference rather than applying a blanket "religious dates may vary" caveat to everything. The Hijri calendar traditionally depends on local moon sighting, so the same Islamic date can, in practice, get announced a day apart in different countries: any calculated date is a well-informed astronomical estimate of when that sighting is expected, not a certainty. The Hebrew calendar, by contrast, has been a fixed mathematical calculation since the 4th century CE, no observation involved, the same category of certainty as computing the date of the Christian Easter Sunday. So the disclaimer is scoped tightly: it appears only when Islamic dates are switched on, and only attached to the Islamic dates themselves, never bleeding into a combined view with Christian, Jewish, or Hindu dates also switched on.

Why Christian holidays are computed from Easter's date, not looked up per country

Christmas is a fixed calendar date and shows up directly in most countries' public holiday data. Good Friday, Ash Wednesday, Palm Sunday, and Pentecost are a different story: most countries that observe them at all don't gazette them as public holidays, so hunting for them in any single country's civil calendar quietly returns nothing for four out of eight dates. All four are actually defined the same way in Christian tradition, a fixed number of days before or after Easter Sunday, so once Easter's own date for a given year is known (itself a well-defined, already-solved calculation), the rest is just date arithmetic: Ash Wednesday is 46 days before, Palm Sunday 7 days before, Good Friday 2 days before, Pentecost 49 days after. Epiphany (January 6) and All Saints' Day (November 1) round out the list as two more fixed calendar dates, the same category as Christmas. No civil-calendar lookup needed for any of the five Easter-relative dates.

Why the Jewish calendar leans on a dedicated library instead of the general holiday dataset

The general public-holiday library covers civil calendars well, but it only knows about a handful of Jewish anchor dates and has no concept of a Chol HaMoed day, an Omer count, or converting an arbitrary Gregorian date to its Hebrew equivalent. A dedicated perpetual Hebrew-calendar library fills that gap: it's the same kind of once-offline, baked-to-JSON approach as the civil holidays, just pointed at a purpose-built engine instead. Two files come out of it. One is a plain lookup table mapping every Gregorian day from 2020 through 2036 to its Hebrew day, month, and year, which is what powers the small secondary date shown on every calendar cell and the "Elul 5786 - Tishrei 5787" range under the month header. The other is a full list of every date in scope: Rosh Hashanah through Simchat Torah, Purim, Tu BiShvat, all 49 days of the Omer count, the four minor fasts, Tisha B'Av, and more, each one carrying its own display rule baked in.

Why Hanukkah gets numbered days and nothing else does

Multi-day festivals like Sukkot and Passover repeat their plain name on every day they span. Hanukkah is the one exception, labeled "Day 1" through "Day 8," because that's how the holiday is actually referred to day to day (which candle, which night), unlike Sukkot or Passover where the days aren't individually named in everyday usage. The Omer count gets its own format for the same reason: "Omer, Day 33 (4 weeks and 5 days)" mirrors the traditional formula for counting it aloud, tracked independently for all 49 days even though only Lag BaOmer (day 33) is significant enough to interrupt the plain count with its own name.

Why the day-shading uses five separate colors instead of one generic highlight

A single "this day matters" highlight would flatten a real distinction: a Yom Tov, a minor fast, and Tisha B'Av are not the same category of day, and treating them identically would bury that difference under a uniform color. Five categories keep it readable at a glance: amber for Yom Tov days, Chol HaMoed, Yom Kippur, and every Shabbat; gray for the four minor fasts; blue for Purim, Hanukkah, and Lag BaOmer; black for Tisha B'Av alone, since it's the most severe fast of the year; and pink for Tu B'Av. A day's own holiday color always wins over the generic Friday/Saturday Shabbat shading if both would otherwise apply, so a Hanukkah night that falls on a Friday shows Hanukkah's blue, not Shabbat's amber.

Why the photo-as-background layout darkens every photo by the same fixed amount

A calendar photo could be anything: a bright beach shot or a dim indoor portrait, and day numbers need to stay legible printed on top of either one. Rather than trying to detect each photo's brightness and adjust the overlay dynamically (fragile, and inconsistent print-to-print), the background layout always applies the same flat semi-transparent dark overlay before the day grid is drawn on top. It's a slightly heavier treatment than a bright photo strictly needs, but it guarantees the same reliable contrast on every page regardless of what gets uploaded. Consistency beat cleverness here.

Quick answers

Why can't I generate more than one year in a single PDF? Each download builds one calendar year, one month per page, to keep both the data model and the PDF layout simple for a first version.

What happens if I pick a country that isn't in the list? You can still build a calendar without automatic public holidays and add everything you need through the custom events section. Nothing else about the tool is gated on country selection.

What's actually left for the dedicated Hebrew Calendar Generator, if this page already shows the full Jewish calendar? Two things that need your location: candle-lighting and tzeit hakochavim times computed from real sunset, and the weekly Torah portion. Selecting those options triggers a confirmation, not a silent redirect, since navigating to a page that asks for your location should be a deliberate choice.

Are my uploaded photos or custom events sent anywhere? No. Holiday data lookup, photos, custom events, and PDF generation all happen locally in the browser. Nothing is uploaded to a server.

Build a printable calendar

Orisod's Calendar Generator makes a 12-month PDF calendar with automatic public holidays for 50+ countries, religious dates, your own photos, and custom events, entirely in your browser.

Build a calendar →

The short version: holiday accuracy is a data problem, not a runtime problem, so it gets solved once offline and shipped as a static file; every accuracy disclaimer is scoped to the specific calendar system that actually has uncertainty, not applied broadly; and the Jewish calendar gets a dedicated engine instead of a hand-maintained table, because a fixed mathematical calendar with Omer counts, Chol HaMoed days, and minor fasts deserves a real implementation, not an approximation.