Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Ics Parser Laravel Package

johngrogg/ics-parser

A PHP library for parsing iCalendar (.ics) files into associative arrays of calendars and events, with DateTime support, time zone handling, and resolved property arrays. Install via Composer as johngrogg/ics-parser.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • Plain PHP library with zero framework coupling: no service provider, facade, config file, or migrations. In Laravel it lands as a Composer dependency consumed by an application-owned adapter, not something controllers or models touch directly.
  • Correct fit is the read path only: fetch a .ics from a URL or storage disk, parse to arrays, map to Eloquent models. It does no HTTP, persistence, auth, or queue work — all of that is application responsibility.
  • Not a fit for outbound generation or CalDAV two-way sync. Pair with spatie/icalendar-generator / eluceo/ical for publishing, and treat bidirectional sync as out of scope for this package.
  • Recommended seam: CalendarParserInterface + DTOs (CalendarEvent, EventUid, RecurrenceSpec), with the vendor class confined to a single adapter. This is the difference between a two-day swap and a two-week migration later.

Integration feasibility

  • Install is trivial: composer require johngrogg/ics-parser:^3. Note the vendor is johngrogg, not the GitHub org u01jmg3 — a predictable copy/paste failure worth capturing in onboarding docs.
  • Public surface is small (instantiate with path/string, iterate events). A competent Laravel developer wires it in an afternoon; the real cost is domain mapping, not integration.
  • No Laravel version constraints, so framework-upgrade risk is near zero.

Technical risk

  • Compliance depth is the headline risk. RFC 5545 recurrence (RRULE/EXDATE/RECURRENCE-ID), VTIMEZONE resolution, and DST boundaries are where calendar parsers break. The library's behavior here must be verified empirically, not assumed.
  • Single-maintainer bus factor. Actively released with a broad PHP 5.6–8+ matrix, but continuity rests on one person. Mitigate via pinning plus the interface seam.
  • Thin adoption signal. 482 stars and a reported zero dependents is weak evidence of production hardening at volume. Treat as "unproven at our scale," not "safe."
  • Untrusted input surface. Feeds are externally controlled: oversized files, pathological line folding, non-UTF-8 encodings, malformed datetimes. Parsing is in-process, so memory is the denial-of-service vector.
  • Metadata anomaly: the release is dated 2026-09-30 — validate release cadence against Packagist directly rather than trusting this signal.

Key questions

  • Does it expand RRULE into discrete instances, and does it honor EXDATE and RECURRENCE-ID overrides? What is the cost profile for an unbounded FREQ=DAILY rule?
  • How are VTIMEZONE blocks and IANA identifiers resolved — to UTC, to DateTimeZone, or left as naive local strings? What happens with Windows timezone names?
  • Memory ceiling and runtime on a 5 MB / 10k-event feed: is there streaming, or is the entire file loaded?
  • Which PHP versions in the 5.6→8+ matrix are actually CI-tested, and what is the stated deprecation policy?
  • How are all-day (VALUE=DATE) versus timed and floating times represented in the returned array?

Integration Approach

Stack fit

  • Composer-native, PSR-4, no global state. Place at app/Services/Calendar/ with IcsParserAdapter implements CalendarParserInterface, bound in a service provider.
  • Normalize at the boundary into DTOs immediately. Raw parser arrays must never reach the domain layer or the database schema.

Migration path

  • Greenfield: add dependency, build adapter, write fixture-driven contract tests (Google, Outlook, property/booking feeds, DST-transition cases, malformed inputs).
  • Existing ad-hoc date/string parsing: introduce the adapter alongside, run both paths in shadow mode against real feeds, diff outputs per source, then cut over source by source.
  • Exit ramp: sabre/vobject offers broader RFC coverage and CalDAV/vCard support behind the same interface. Budget this as a realistic eventuality, not a hedge.

Compatibility

  • Requires PHP ≥ 5.6.40 with PHP 8 supported on v3; safe on modern Laravel runtimes. Confirm your target PHP minor is in the tested matrix, not merely "supported."
  • No framework constraints and no heavy transitive dependencies — low composer update blast radius.
  • Timezone correctness depends on current tzdata/ICU; pin and monitor updates if converted times are persisted.

Sequencing

  1. Spike gate: parse three real feeds from actual sources, measure memory/time, and answer the recurrence and timezone questions above. Go/no-go decision point.
  2. Define the interface and DTO contract; build the fixture corpus.
  3. Build adapter and mapping; persist with UID + SEQUENCE for idempotent re-import and RECURRENCE-ID for override handling.
  4. Wrap ingestion in queued jobs with per-source rate limits, retries, and dead-letter handling.
  5. Only then expose UI/API surfaces and scheduling.

Operational Impact

Maintenance

  • Small footprint, MIT license, no legal friction. Low churn from rare releases means bump work is infrequent but also under-exercised — schedule a quarterly upstream review.
  • A stalled maintainer is the fork-or-migrate trigger. Keeping the fork path warm requires the discipline of never importing vendor classes outside the adapter.
  • tzdata/CLDR currency is a silent one-hour-off bug generator; assign it an owner.

Support

  • Community-only: GitHub issues, no SLA, no vendor. Name an internal DRI and an escalation path for feed-parsing incidents before launch.
  • Expect self-diagnosis. Budget for reading RFC 5545 §3.3.10 (RRULE) and §3.6.5 (VTIMEZONE); library docs will not cover semantics.

Scaling

  • CPU-bound and in-process: scale with queue workers, not web requests. Set memory_limit and job timeouts per feed size class, and enforce a pre-parse file-size ceiling.
  • Cost scales linearly with feed volume × event count; recurrence expansion is the nonlinear term — cap the expansion horizon rather than trusting FREQ bounds.
  • Cache by ETag/Last-Modified. Most feeds change rarely, so avoiding re-parse is the cheapest optimization available.

Failure modes

  • Unparseable feed → exception mid-parse; isolate per source so one bad feed cannot fail a batch.
  • Encoding / line-folding defects → silently dropped or garbled events; detect with post-parse count sanity checks against prior runs.
  • Timezone and DST errors → events shifted by an hour. Highest severity, lowest visibility. Assert on DST-transition fixtures.
  • Recurrence mishandling → duplicated or missing instances on re-import; mitigate with UID + SEQUENCE upserts and explicit exception deletion.
  • Oversized file / OOM → worker kills; alert on worker restarts and cap input size.
  • Upstream format drift (providers changing feeds) → silent data loss; track per-source parse success rate as an SLI.

Ramp-up

  • Days, not weeks, for a PHP developer to become productive — the API is small. The multi-week investment is domain learning: recurrence semantics, timezone resolution, all-day and floating-time edge cases.
  • Ramp-up risk concentrates in fixture quality. A team without a corpus of real, gnarly feeds will ship an integration that looks correct and fails on the first DST weekend.

Recommendation: Adopt conditionally — read-only ingestion of well-understood feeds, behind an internal interface, gated on the spike. Not a foundation for bidirectional calendar sync or strict RFC 5545 compliance.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk