transformstudios/events
A Laravel package for managing events and calendars. It provides event models, recurring occurrences, scheduling helpers, and iCal feed support so you can build event listings and detail pages quickly.
composer require transformstudios/events. Statamic auto-discovers the service provider; no manual registration needed on Statamic 3/4/5.php artisan vendor:publish --provider="TransformStudios\Events\ServiceProvider" and check for config/events.php and any publishable views/fieldsets. Read that config first — it usually tells you which collection handle and field handles the addon expects.events collection (or whatever handle the config points to) and attach the addon's blueprint/fieldset. This is where the recurring/multi-day semantics live — the fieldset defines start date/time, end date/time, all-day flag, and recurrence (RRULE-style) options.Before writing templates, skim src/ — with a small addon like this, the tag/facade names and the recurrence expander are the source of truth, and they're quicker to read than to search for docs.
Mar 4–6) rather than start and end independently, and decide explicitly whether the end date is inclusive in your display logic — don't infer it from the stored timestamps.Entry::query()->where('collection', 'events') plus the addon's scopes/traits) when you need pagination, JSON output, or a calendar feed.events.ics or /events.json route that reuses the same window query. Recurring events map cleanly to iCal if the addon already stores RRULE data — reuse it rather than re-deriving rules.EntrySaved/EntryDeleted for the events collection.UNTIL and COUNT interact with an event's end date. A rule that "never ends" plus an unbounded query is a hang waiting to happen — always cap the query window.published or entry date, or your "upcoming" list will slowly fill with expired events.00:00.now will be stale under Statamic's static cache. Either exclude event listing pages from static caching or add explicit invalidation.composer.json, and run the three entry shapes above as a smoke test after every upgrade.php artisan tinker plus Entry::query()->where('collection', 'events')->get() for raw data, then call the addon's occurrence/expansion methods directly in tinker to see exactly where a rule diverges from what you expect — faster than round-tripping through templates.How can I help you explore Laravel packages today?