andreia/filament-recurrence
Filament Recurrence adds a user-friendly recurring schedule field to Filament forms. Configure frequencies, intervals, weekdays, and end dates, then save recurrence rules with your models for easy reuse and display. Ideal for events, appointments, and reminders.
Architecture fit. This is a Filament panel plugin, which means it is a presentation-layer component, not a scheduling engine. The real architectural dependency is whatever RFC 5545 (RRULE) library sits underneath it — that library, not this package, determines correctness of recurrence expansion, DST behavior, and EXDATE/RDATE handling. Fit is strong when the application is already a Filament v3/v4 panel and the requirement is user-authored recurrence (an admin building a schedule through a form). Fit is weak when recurrence is machine-generated, when the UI is a custom frontend, or when the product only needs to read and expand rules — in that case the plugin's value (the UI) is unused and you are paying for a transitive dependency you don't need.
Integration feasibility. Mechanically low-friction: Composer install, register the plugin in the PanelProvider, publish config/assets, and persist the emitted rule string or JSON in a column you control. The package does not appear to dictate a schema, which is good for adoption and bad for portability — the storage contract is yours to define and yours to maintain. The realistic effort is not in wiring the plugin up; it is in deciding the persistence format, the timezone semantics, and whether occurrences are expanded at read time or materialized into rows.
Technical risk. Ranked:
| Risk | Severity | Note |
|---|---|---|
| Filament major-version coupling | High | Filament v3 → v4 involved meaningful API and asset-pipeline changes. A plugin pinned to one major blocks your panel upgrade. Verify the supported matrix before committing. |
| Bus factor / project maturity | High | 21 stars and a single maintainer (Andreia) is a small surface. A recent release date is a positive signal of activity but not of durability. |
| RRULE correctness edge cases | Medium | DST transitions, BYSETPOS, COUNT vs UNTIL, and unbounded rules are where recurrence implementations fail in production, usually months after launch. |
| Storage-format lock-in | Medium | If the plugin's serialized output becomes your schema de facto, swapping engines later means a data migration. |
| Asset publishing in deploy | Low | Standard Filament plugin concern; fails visibly and early. |
Key questions for the vendor/spike.
rlanvin/php-rrule or simshaun/recurr directly.31st of month, February).Verdict. Reasonable adoption for a Filament-native product with moderate, UI-driven recurrence needs, provided the expansion engine is abstracted behind our own interface and the package is pinned. Not appropriate as the system of record for scheduling logic in a calendar-centric product without that abstraction.
Stack fit. Laravel (10/11/12) + Filament + Livewire + Alpine + Tailwind, PHP 8.1+. This is the standard TALL-stack admin surface; assuming the product already runs Filament, there is no new runtime, no new build system, and no new hosting concern. If the product does not run Filament, the correct move is to evaluate the underlying recurrence library directly and skip this package entirely — do not introduce a panel framework to obtain a form field.
Migration path.
UNTIL) and expand them across a DST boundary.recurrence_rule (string, nullable) plus timezone (string) and, if needed, recurrence_ends_at. Store the raw rule, not a plugin-specific blob, so the persistence layer survives a package swap.Compatibility. Confirm three version pins explicitly: Filament major, Livewire major, and PHP minor. Filament plugins commonly break on Livewire majors as much as on Filament majors. Check that the package's published assets are compatible with the panel's Tailwind strategy (Filament v3 ships compiled CSS; v4 moved toward Tailwind v4 conventions) — a mismatch shows up as an unstyled widget rather than an error, which is easy to miss in review.
Sequencing recommendation. Abstraction layer → read/expansion path → schema → UI → rollout. The temptation is to reverse the first two because the UI is the visible deliverable; resist it, because the UI is the cheap part and the expansion logic is where the defects live.
Maintenance. Single-maintainer, 21-star, MIT-licensed project. Recent release activity is encouraging but does not offset concentration risk. The defensible posture is: pin the exact version, wrap the component and the expansion call behind an internal interface, and budget a fork if upstream goes quiet. MIT makes a fork legally trivial; the cost is the maintenance burden, not the license.
Support. Community-only. There is no SLA, no commercial backstop, and issue response times are unpredictable at this scale. Any production dependency on it should have an identified internal owner who can read the underlying RRULE library's source when something breaks.
Scaling. Two distinct profiles:
(entity_id, occurs_at).Also scope any query that counts or lists "upcoming" items — a naive WHERE on a rule string is not queryable and will force full-table expansion.
Failure modes to design against.
COUNT nor UNTIL will expand indefinitely. Enforce a horizon at the expansion boundary, not in the UI.31st rules silently skip short months depending on library behavior. Confirm and document the expected behavior with stakeholders — this is a product decision, not a bug.Ramp-up. Low for any developer already fluent in Filament — the component is conventional and the API surface is small. The genuine learning cost is domain knowledge: RFC 5545 semantics, timezone rules, and exception handling. Plan for that as a product competency (shared with whoever owns scheduling UX), not a package-specific one; it transfers if the package is later replaced. Expect roughly a day for a Filament-fluent engineer to be productive with the component, and considerably longer to be confident in the expansion behavior.
How can I help you explore Laravel packages today?