0.5.1
July 28th, 2026
What's fixed
- Statamic 6 flat-file sites lost calendar URLs entirely: event entries kept the stock Entry class, so occurrence URLs came back empty and the Control Panel showed neither Visit URL nor Live Preview. The entry class is now registered in a way that survives the Stache rebuilding collections from its cache (#29)
Only flat-file Statamic 6 was affected. Eloquent Driver sites keep the collection instance, and Statamic 5 has no per-collection entry class, so both already worked.
0.5.0
July 28th, 2026
What's new
- Exclusions are now first-class occurrences instead of silently dropped dates. The resolver keeps them in the iteration and tags them with
is_excluded, so cancelled and rescheduled dates can be rendered rather than vanishing (#11) - New
replacement_datefield in the exclusions grid links a cancelled date to the date it moved to. The replacement occurrence exposesreplaces_datepointing back (#11) include_excludedopt-in across the read surfaces —{{ calendar:index }},{{ calendar:month }},{{ calendar:occurrences }}and the REST API (?include_excluded=1). Off by default, so existing templates keep seeing only live occurrences (#11)- Occurrence payloads (tags, API, cache) gained
is_excluded,replacement_dateandreplaces_date
What's fixed
- Statamic 6: allowlist the calendar entry classes for cache unserialization — unregistered cached Stache entries came back as
__PHP_Incomplete_Classand crashed every request (#27) - Flatten
Arrayableoccurrence extras before caching (#27)
What's changed
- Excluded occurrences are always written to the cache and filtered at read time, so the store stays the source of truth
Occurrence::url()returns an empty string for excluded occurrences — they are not routable- Dev toolchain: allow
orchestra/testbench^11.0and Pest^5.0alongside the existing majors (#28)
Upgrading
- Run
php artisan occurrences:rebuild(or clear the occurrence cache) so excluded dates land in the store —include_excludedreturns nothing against a cache built by an older version. - Using the example blueprint? Add the new
replacement_datefield to your exclusions grid — seeresources/examples/blueprints/collections/events/event.yaml.
0.4.0
July 13th, 2026
What's new
- Redirect expired date-segment occurrence URLs to the next upcoming occurrence with a 301, configurable via
url.redirect_expired(defaulttrue) (#25) - Past occurrence pages without a successor (ended series, single past events) keep rendering for archival value (#25)
- Expose
occurrence_canonical_urlin occurrence show view data — an absolute self-canonical URL for composing canonical tags and site-owned Event JSON-LD (#25)
What's changed
- Document an Antlers example for canonical + Event JSON-LD markup built from occurrence variables and site blueprint fields
0.3.0
July 11th, 2026
What's new
- Add Control Panel Visit URL and Live Preview support for event entries using both URL strategies (#22)
- Resolve preview URLs from unsaved title and date values, selecting the next occurrence or falling back to the most recent one (#22)
- Support route-free date-segment collections and existing custom Entry classes (#22)
What's changed
- Require patched Statamic releases: 5.74+ or 6.20.3+
- Update Prettier to 3.9.4
0.2.2
June 30th, 2026
What's fixed
- Resolve event dates in the configured timezone for Statamic 6. Statamic 6 stores date fields as the UTC instant of the editor's selected day, so the resolver built an invalid recurrence
DTSTART— crashing the occurrence-cache rebuild on every entry save — and read dates one day early in timezones ahead of UTC. Recurrence (DTSTART/UNTIL/EXDATE/RDATE) is now expanded in the event timezone, so wall-clock times and DST are handled correctly (#20) - Harden recurrence resolution: a missing start date, missing frequency, or malformed time no longer aborts the whole cache rebuild (#20)
What's new
statamic-calendar.timezoneconfig option — the timezone events are authored and displayed in. Defaults tostatamic.system.display_timezone, thenapp.timezone, then UTC (#20)
What's changed
- Support Statamic 6 in the test harness (extends Statamic's
AddonTestCase); CI now runs the suite against both Statamic 5 and 6 (#21)
0.2.1
June 7th, 2026
What's fixed
- Exclude unpublished event entries from occurrence cache rebuilds, live calendar tag resolution, and direct occurrence routes (#19)
- Return 404 for direct occurrence URLs belonging to unpublished entries (#19)
What's changed
- Harden npm installs in CI with
--ignore-scripts,--no-audit, and package manager guardrails (#18)
0.2.0
May 1st, 2026
What's new
- Add
OccurrenceBuilding, a cache-build event for enriching materialized occurrences with custom fields (#15) - Persist custom occurrence fields through cached
OccurrenceData, JSON API responses, and{{ calendar }}tag output - Expose both the source entry and resolved occurrence to listeners, so extras can depend on occurrence-specific data like start/end dates
- Add pagination to the REST API with
page/per_pageparameters andapi.max_per_pagelimits (#7) - Add Statamic-style pagination to
{{ calendar }}and{{ calendar:for_organizer }}, includingpaginate,page_name, andassupport (#7)
What's changed
- Align calendar tag output with Statamic's
OutputsItemsconventions and default paginated keyoccurrences - Keep core occurrence fields authoritative when custom extras use reserved keys
- Document custom occurrence fields and pagination options in README, config comments, and event class docblock
0.1.2
April 20th, 2026
What's fixed
- Fix
{{ calendar:ics_download_url }}inside{{ calendar }}loops — loop items now exposeoccurrence_id(composed{entry_id}-{Y-m-d-His}), so .ics download links resolve correctly instead of 404-ing (#10)
0.1.1
April 20th, 2026
What's fixed
- Fix eloquent driver compatibility: normalize numeric organizer IDs and tag-level entry IDs to strings (#9)
0.1.0
February 8th, 2026
🎉 Initial Release
Recurring events and cached occurrences for Statamic v5/v6.
Features
- Recurring events — define recurrence rules (RRULE) on entries; occurrences are expanded and cached automatically
calendar:monthtag — render a monthly grid view in your Antlers templatescurrent_occurrencetag — resolve the current or next upcoming occurrence for an entry- iCalendar (.ics) export — full calendar feed and per-event download
- "Add to calendar" links — generate links for Google Calendar, Outlook, etc.
- JSON REST API — query occurrences programmatically via
/!/calendar/occurrences - Auto-registered routes — index and date-segment routes configured from
config/calendar.php - Default templates — ships with ready-to-use index, show, and month-grid views (Tailwind CDN)