jsvrcek/ics-bundle
A Symfony bundle for generating iCalendar (.ics) files, letting you build events, calendars, and reminders from your application's data and export them for import into Outlook, Google Calendar, and other calendaring tools.
.ics is a single-developer-day feature; a webcal:// subscription feed requires stable resource URLs, revocable per-user tokens, caching headers, and a story for how updates propagate when an event changes. This decision drives most of the engineering cost and the support burden.UID stability, DTSTAMP/SEQUENCE for updates, TZID + VTIMEZONE for timezone correctness, RRULE/EXDATE for recurrence, ORGANIZER/ATTENDEE + METHOD:REQUEST for invitations, VALARM for reminders. Each rung up this ladder is a distinct roadmap item with a distinct risk profile — attendee invitations, in particular, are where naive generators produce invites that Outlook silently drops.composer require the underlying jsvrcek/ics library and register it in a service provider. This is a "look elsewhere on fit grounds alone" signal rather than a quality judgment.Consider it only in a narrow case:
VEVENT generation with zero recurrence, zero attendees, and zero timezone complexity.Look elsewhere when any of the following is true — which, for most contemporary PHP products, is all of them:
composer.json before promising anything to stakeholders.VTIMEZONE doesn't throw, it just puts the event at the wrong hour in the user's calendar.spatie/icalendar-generator (Laravel-native, actively maintained), eluceo/ical, or sabre/vobject (the RFC-strict option, battle-tested by CalDAV servers) instead. For parsing, sabre/vobject is the default answer.The honest summary: the wrapper is not the asset — the library underneath it is, and that library is old. Treat this package as a "no" and spend the decision on the generator + delivery design.
To executives: Calendar interoperability is a retention and adoption feature, not a differentiator — users who can subscribe to our events in Outlook or Google Calendar stop manually re-entering data, and stop churning when we change a booking. The estimate for a read-only .ics export is roughly 1–2 engineering days; a proper subscription feed with per-user revocable tokens and cache-friendly updates is closer to a week including cross-client QA against Google, Outlook/M365, and Apple Calendar. I recommend against adopting this specific package: it is an 11-star, zero-dependent Symfony wrapper around an aging library, with no maintenance or security-response story. I recommend we adopt a maintained generator and own the delivery layer ourselves. The dominant risk here is not cost — it's silent breakage, where a malformed timezone or UID produces calendars that look fine to us and wrong to the customer.
To engineering: This is a Symfony DI bundle, so it does not fit our stack; skipping it costs us nothing. Proposal: pick a maintained RFC 5545 writer (Laravel-friendly if we're on Laravel, sabre/vobject if we need strictness or parsing), and treat the following as our own workstream, not the library's: stable UIDs derived from our domain IDs, SEQUENCE/DTSTAMP bumps on update, UTC storage with TZID rendering for display, 75-octet line folding, Content-Type: text/calendar; charset=utf-8; method=PUBLISH, signed/revocable subscription URLs, ETag/Last-Modified, and a QA matrix against Google, Outlook, and Apple. If anyone argues for the bundle on Symfony grounds later, the fallback is to write the equivalent service definition ourselves — that's the entire package.
Recommendation: Do not adopt. Re-run the build-vs-buy decision against maintained alternatives before committing roadmap space.
How can I help you explore Laravel packages today?