interwal-net/filament-visual-cron-builder
A Filament plugin that adds a visual cron expression builder for Laravel scheduling, letting you create and preview cron schedules through an intuitive UI instead of writing expressions by hand.
Architecture fit. The package respects Filament's field extension model rather than fighting it: CronBuilder is a form field that owns a single string state path, so it substitutes 1:1 for a TextInput bound to a cron column. That means zero schema change, zero data migration, and a trivially reversible swap. The more strategically useful artifact is CronExpressionBuilder (compose/parse/humanReadable) plus the ValidCronExpression rule — these are framework-level utilities usable outside the form layer, e.g. validating stored schedules in a console command, an API payload, or a seeder, and for backfilling human-readable labels into read-only tables. Treat the field as the UX layer and the builder/rule as the durable contract.
Integration feasibility. High for greenfield Filament v4 panels; effectively zero for Filament v3 estates, since no backport or compatibility shim is advertised. The dependency surface appears small (a cron parsing library and Filament itself), and if it leans on the cron-expression parser already transitively present via illuminate/console, the added weight is near nil. The "drop-in for TextInput" claim is the single most important line in the notes and should be verified by diffing the field's state/validation behaviour against the incumbent before rollout.
Technical risk.
config('app.timezone'), administrators will trust a wrong preview — the highest-severity failure mode here, and a silent one.L, W, #, ?, Quartz 6/7-field, AWS EventBridge) handling is unspecified.parse() → compose() preserves the operator form the user chose (*/5 vs 0,5,10,…) affects diff noise and user trust in the editor.Key questions.
dragonmantank/cron-expression (or equivalent), or hand-roll it?parse()/compose() lossless for operator-style expressions, and what happens on unparseable legacy values already in the column?humanReadable() localized, or English-only?Stack fit. Laravel 11/12 + Livewire 3 + Filament v4 panels. Any application still on Filament v3, or planning a v3→v4 migration beyond the current quarter, should defer adoption until the panel upgrade lands — do not let a cosmetic field become the reason a panel migration is sequenced early.
Migration path. Low-risk and reversible: replace the TextInput::make('cron') (or equivalent) with CronBuilder::make('cron'), keeping the same name, label, and any existing ->rules([...]); add ValidCronExpression to the rule set if the incumbent lacked server-side validation. No database change. Rollback is a single class swap. Pre-existing column values must be smoke-tested — hand-written or legacy expressions are the realistic source of parse failures.
Compatibility. Pin the exact version ("vendor/package": "1.0.0"), not a caret range, while the package is pre-1.x-stable in practice. Audit composer.lock for duplicate or conflicting cron-expression parsers before and after install. Confirm the published assets are versioned and included in your deployment build step — Filament asset publishing is a common silent-breakage point in CI pipelines that cache public/.
Sequencing.
TextInput shippable behind a feature flag.ValidCronExpression and parses cleanly.Maintenance. The dominant cost is ownership risk, not code. A v1.0.0 with an unstated support model will need an internal owner who can read the field's JS and patch it, or an accepted plan to fork. Filament's major-version cadence is the forcing function: assume a v5 field-API break and budget a maintenance window for it. Track upstream releases on a schedule rather than reactively.
Support. No commercial support or SLA is implied. Escalation is GitHub issues against a bus-factor-1 project; plan for self-resolution and keep the internal wrapper as the isolation boundary so a stalled upstream doesn't strand the panel.
Scaling. Negligible runtime impact — the field only exists on admin form renders, and the utilities are cheap. The one thing to watch is preview recomputation: if the human-readable/next-run preview round-trips to the server on every keystroke via Livewire, form interaction becomes chatty for admins on high-latency links. Confirm whether preview is client-side or server-debounced; if server-side, ensure it is debounced and does not fire on every option toggle.
Failure modes.
*/5 normalized to an enumerated list) — produces confusing diffs and makes admins distrust the saved value.Ramp-up. Low for anyone already fluent in Filament fields: the API is idiomatic and the mental model (one string state path, one validation rule) is familiar, so integration is roughly half a day plus the correctness gate. The real ramp-up cost sits with whoever on the team must own cron semantics — timezone, DST, dialect edge cases — because that person, not the package, is the actual guarantor that the schedules administrators build will fire when they expect. Budget a short internal note documenting the supported dialect and timezone contract alongside the integration.
How can I help you explore Laravel packages today?