guava/calendar
Guava Calendar is a Laravel package for building calendars and managing events with recurring schedules, customizable views, and Blade-friendly integration. Add event scheduling and calendar UIs to your app quickly and cleanly.
Architecture fit. The package is a Filament plugin that renders @event-calendar/core (vkurko) as a Livewire widget, configured entirely in PHP: view types, event sources, context-menu actions — one widget class per calendar surface. It is strictly a presentation layer. Everything that makes scheduling hard — recurrence expansion with exceptions, availability rules, conflict detection, timezone-correct booking, write-side concurrency — stays in our codebase. Fit is therefore binary: high if the target surface is an internal admin panel already on Filament, near-zero otherwise (the Filament integration is the product; without it you would wrap the JS library directly). The workbench/ Filament panel added in 3.2.2 is the reference implementation, and it is more trustworthy than the README.
Integration feasibility. Small public surface: plugin registration, widget class, view-type enum, event-source method, action list. First render is roughly half a day for a Laravel developer; a production read-only month view with authorization is 1–2 days; the interactive pattern (drag/resize persistence + context-menu actions) is about a week including tests. The one hard prerequisite is a working asset pipeline — the calendar JS is bundled from npm as of 3.2.2 and must flow through npm run build and our CSP. That is infrastructure work, not package work, and it should be proven in a spike before any estimate is committed.
Technical risk.
^ constraint that silently crosses a Filament major is a credible outage.Key questions to put to engineering, security, and product before committing budget.
Stack fit. Laravel + Filament + Livewire + Blade, events as Carbon instances, no JS framework commitment. Ideal when the team has more PHP capacity than front-end capacity and prefers configuration over a bespoke build. Directly supports resource scheduling, shift planning, appointment lists, and team-calendar views as admin views.
Migration path. Greenfield — no data migration, no API contract. composer require → register the plugin in the panel provider → rebuild assets → add a widget class → map one Eloquent model to events. Existing bespoke FullCalendar pages, if any, can be retired surface-by-surface: stand the new widget up beside the old page, validate, then cut over. Each calendar surface is independently shippable, which keeps blast radius small.
Compatibility checklist (gate before merge).
^ resolve across majors.wire:ignore workarounds exist from prior calendar attempts — they reintroduce the duplicate-mount leak that 3.2.2 fixed.Sequencing.
canView() authorization falls out for free. Resist context menus until this is solid — a bad event source and a broken context menu look identical from the browser.Extension guardrail. Extension order is custom event arrays → custom actions → Blade wrappers → custom view types → stop. If requirements need grid rendering beyond what @event-calendar/core exposes, that is a signal to reconsider the dependency, not to fork the JS.
Maintenance. The package itself is small; our real recurring burden is three things: Filament upgrades, the asset pipeline, and the scheduling logic we own. Budget a compatibility review at every Filament major and a read of release notes at every bump — 3.2.2 proves patch releases can carry operational impact. 3.2.x overall is additive and stabilizing (3.2.2 is five targeted fixes plus two chores, no breaking changes), which means roadmap estimates for time-based features do not need a rewrite-risk buffer.
Support. MIT, community only, no vendor SLA, no paid support. Acceptable for internal admin surfaces; think hard before making it the foundation of a customer-facing revenue flow. Mitigations: name an internal owner, track upstream releases deliberately (no blind autobump), and keep a fork-ready posture — the public surface is small enough that a soft fork is a contained cost if upstream stalls. Watch release cadence over a couple of months before committing the roadmap to it.
Scaling. Cost is per-page and per-widget. Event sources must be range-bounded or month views over large tables will degrade — inline the query into the widget and you re-derive range logic on every new view or source. Watch for N+1 in the event source. Multiple calendars on one page multiply queries and Livewire round trips; keep action lists short and action-resolution fast, because 3.2.2 only opens the context menu after actions resolve — slow resolution presents to the user as a broken right-click. This is not a real-time system: no websockets, no collaborative editing, no presence. Drag/resize persistence is effectively last-write-wins unless we add version checks or optimistic locking server-side.
Failure modes and the detection order that works.
wire:ignore.storage/logs before the browser.Cheap instrumentation worth building once: a staging log of event-source output per range, plus a smoke test asserting the calendar asset is served and exactly one widget container mounts. Those two tests cover both silent failure modes.
Ramp-up. Low. The public surface is small and the workbench panel is effectively the documentation. Expect half a day to first render, 1–2 days to a production read-only view with authorization, about a week to the interactive pattern with tests. Two organizational notes: keep a short internal note documenting our wiring so it isn't relearned at every Filament upgrade, and ensure a second reviewer understands the pattern — single-owner knowledge concentration on a single-maintainer dependency is a compounding risk.
How can I help you explore Laravel packages today?