azuyalabs/yasumi
Yasumi is a PHP library for retrieving holiday dates and names across many countries and regions. Calculation- and rule-driven, it needs no database and offers a simple API to query, list, and check holidays for any year.
Architecture fit
Yasumi is a pure-PHP, calculation-driven holiday library with no database, no external API, and no runtime service dependency. That makes it a low-ceremony fit for a Laravel monolith or modular monolith: it is a library you call in-process, not an integration you operate. For teams that already need business-calendar logic — SLA clocks, payroll cutoffs, billing cycles, shipping dispatch, scheduling, accruals, "next business day" — this replaces brittle hand-maintained holiday tables and ad-hoc if ($month === 12) logic with a maintained, tested rule engine.
The provider model (one class per country/region) is the right abstraction for multi-tenant and multi-geography products. Holiday type filters (Official, Observed, Bank, Seasonal, Other) are the most strategically useful feature: most products conflate "is it a public holiday" with "is the office closed" and "does the bank settle," and those are genuinely different questions. Time zone awareness and global translations mean the library can serve localized UX without a separate i18n pipeline for holiday names.
Integration feasibility
High. composer require azuyalabs/yasumi on PHP 8.2+, PSR-4 autoloading, PSR-12, MIT license, semver 2.x line. No Laravel service provider is shipped, which is fine — the correct pattern is a thin internal adapter (a singleton service plus a config file for default country/locale) rather than calling Yasumi::create() from controllers and jobs. Expect roughly one to three days of engineering for the adapter, caching, and test fixtures; the library itself is not the cost.
Technical risk
Queen's Birthday → Monarch's Birthday, adds HolidayNotFoundException for unknown keys, and adds key validation to removeHoliday. If you persist or expose holiday keys, treat them as internal and map them to your own stable identifiers.Dependents: 0 figure conflicts with 1,106 stars and an active multi-year changelog; likely a Packagist metric artifact, but verify real-world adoption before treating the package as strategic. The 2026-09-30 last-release date is also a data-quality flag worth confirming against the actual releases page.Key questions
Stack fit
Native Laravel/Lumen fit at the Composer layer; no framework coupling to fight. The library uses DateTime/DateTimeImmutable and implements ArrayIterator, so it composes cleanly with Laravel's scheduler, queue payloads, and Carbon-based domain code — with the caveat that you should normalize at the adapter boundary rather than mixing Carbon and raw DateTime deep in domain logic.
Migration path
isHoliday-style helpers, holiday database tables, and inline date math. Most Laravel codebases have two or three divergent implementations; consolidating them is usually the largest source of value.BusinessCalendar service with methods like holidaysFor(string $region, int $year), isHoliday(Carbon $date, string $region), nextBusinessDay(), and addBusinessDays(). Keep the vendor type out of your public surface so the library remains replaceable.Compatibility
Straightforward Composer resolution. Pin with a caret constraint on the 2.x line and treat minor bumps as reviewable changes, not auto-merge — the changelog demonstrates that minor releases ship behavioral corrections. Register Dependabot/Renovate with a dedicated reviewer for this package. Ship a config/business-calendar.php for default provider, locale, timezone, and allowed holiday types per tenant, and resolve per-tenant overrides through config or a settings table rather than code.
Sequencing
Adapter and caching layer → golden dataset and test harness → low-stakes consumer cutover → shadow-run on business-day math → financially sensitive consumers → remove legacy holiday tables. Do not start with payroll or billing; the adapter's API will still be moving.
Caching
Holiday computation is cheap but not free, and results are immutable once calculated for a given provider + year + locale. Use Cache::remember keyed on provider:region:year:locale:types, warm the current and next year via a scheduled command, and avoid per-request instantiation inside hot loops. Cardinality is tenants × regions × years × locales — modest, but size it explicitly for multi-tenant deployments.
Maintenance
No infrastructure, no database, no service to page on. The recurring cost is dependency hygiene plus the human judgment required to validate holiday rules. Budget a named owner for the holiday data domain; without one, version bumps become a coin flip on whether a legal correction silently shifts a customer's billing date. Version bumps should be paired with the golden-dataset diff, which reduces the review to "what changed and is the change correct" rather than a code read.
Support
Support load shifts from "why is this date wrong" engineering tickets to product/legal clarification tickets, which is a better allocation. Two exceptions deserve runbooks: tenants reporting a missing regional holiday (usually a coverage question, sometimes a genuine rule gap that should be filed upstream), and tenants reporting an unexpected observed/substitute holiday (usually a type-filter misconfiguration). Provide a support-facing view of "which holidays are active for this tenant" to cut diagnosis time.
Scaling
Effectively free. In-process computation, small memory footprint, no I/O, no rate limits, no third-party availability dependency. It scales linearly with request volume without a new bottleneck. The only scaling consideration is cache cardinality and cold-start cost on cache flush — a scheduled warm job handles both. Contrast this favorably against holiday SaaS APIs, which introduce a network hop, a rate limit, an availability SLA, and a per-request cost into what is fundamentally a deterministic calculation.
Failure modes
HolidayNotFoundException after the recent change. Wrap key lookups; never let a vendor exception surface as a 500.Ramp-up
Very low for engineers — the README example is genuinely quick-start, documentation is hosted, and the API surface is small. The real ramp-up is domain education: teaching the team the difference between official, observed, and bank holidays, and why "is it a holiday" is not a boolean question. That is a half-day of context for the team and a much longer tail for whoever owns the golden dataset. Overall this is a low-risk, high-leverage adoption — the decision hinges less on the library's engineering quality, which is visibly solid, and more on whether we have the discipline to own holiday-rule correctness as a product concern.
How can I help you explore Laravel packages today?