Calendar Icon

Calendar

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_date field in the exclusions grid links a cancelled date to the date it moved to. The replacement occurrence exposes replaces_date pointing back (#11)
  • include_excluded opt-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_date and replaces_date

What's fixed

  • Statamic 6: allowlist the calendar entry classes for cache unserialization — unregistered cached Stache entries came back as __PHP_Incomplete_Class and crashed every request (#27)
  • Flatten Arrayable occurrence 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.0 and Pest ^5.0 alongside the existing majors (#28)

Upgrading

  • Run php artisan occurrences:rebuild (or clear the occurrence cache) so excluded dates land in the store — include_excluded returns nothing against a cache built by an older version.
  • Using the example blueprint? Add the new replacement_date field to your exclusions grid — see resources/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 (default true) (#25)
  • Past occurrence pages without a successor (ended series, single past events) keep rendering for archival value (#25)
  • Expose occurrence_canonical_url in 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.timezone config option — the timezone events are authored and displayed in. Defaults to statamic.system.display_timezone, then app.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_page parameters and api.max_per_page limits (#7)
  • Add Statamic-style pagination to {{ calendar }} and {{ calendar:for_organizer }}, including paginate, page_name, and as support (#7)

What's changed

  • Align calendar tag output with Statamic's OutputsItems conventions and default paginated key occurrences
  • 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 expose occurrence_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:month tag — render a monthly grid view in your Antlers templates
  • current_occurrence tag — 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)