eightynine/filament-approvals
Add approval workflows to Filament resources: route records to one or more approvers, track pending, approved, and rejected states with a full history, and gate actions on approval status, all configured in code and managed from the admin panel.
Architecture fit. The package is a Filament plugin for Laravel's TALL stack, so it slots into the layer where our admin/back-office workflows already live. The likely design — an approval record attached polymorphically to any Eloquent model, with Filament actions and table columns rendering state and approver controls — is a good structural match for "a human needs to sign off on this record before it advances." The architectural concern is coupling: approval eligibility, sequencing, and separation-of-duties rules are domain logic, not presentation logic. If the package only exposes Filament actions and UI, the rules end up living in the panel rather than in a service the API, queue workers, and CLI can call. That is the single most important thing to verify before committing.
Integration feasibility. Mechanically straightforward: Composer install, publish config and migrations, register the plugin on the panel provider, add the trait/interface to target models, and attach actions to resources. For a greenfield Filament admin this is days, not weeks. Feasibility drops to medium if approvals must be initiated or resolved outside the panel — public API, mobile approver flow, email/Slack one-click approve, scheduled escalation — because those paths need a headless service layer the package may not provide.
Technical risk. Material, and concentrated in four areas:
composer.json constraints for Filament and Laravel ranges, and whether releases track Filament majors promptly.Key questions.
Stack fit. Assumes PHP 8.1+, Laravel 10–12, Filament 3.x/4.x, MySQL or Postgres. Two compatibility checks matter early: whether migrations use native enums or JSON columns (Postgres JSONB behavior differs), and whether the package is Octane-safe (no request-scoped static state). If we run Horizon and Octane, validate both before the pilot.
Migration path. Two distinct cases:
Compatibility and pinning. Pin to an exact version, not a caret range, and vendor-lock it in composer.lock with a documented upgrade cadence. Check whether the package is pre-1.0 — if so, treat every minor as potentially breaking and review changelogs before bumping. Confirm behavior across Filament panels if we run more than one (admin vs. tenant-facing).
Sequencing.
ApprovalService interface in the domain layer; the package becomes an implementation detail behind it. This is the insurance policy against abandonment or a forced Filament upgrade.Maintenance. Budget for a named internal owner. Expect to fork or vendor-patch within 12 months — not because the package is bad, but because a solo-maintained plugin on a business-critical path always eventually needs a patch the maintainer hasn't shipped. Track upstream releases; a quarterly review is sufficient. Treat Filament major upgrades as projects, not chores.
Support. Community-only, no SLA, issues resolved on the maintainer's schedule. Any production incident in the approval flow is ours to diagnose. That argues for reading the source rather than treating it as a black box, and for keeping the wrapper layer thin enough to debug.
Scaling. Three pressure points: (a) notification fan-out on multi-approver chains — route through the queue, never synchronously in a Livewire request; (b) Filament table performance — the approval relation is likely eager-loaded per row, so watch N+1s on large lists and index the polymorphic (approvable_type, approvable_id) columns; (c) audit table growth — approval history is append-only and never pruned, so plan partitioning or archival from day one if volume is high. Multi-tenant deployments need tenant scoping verified explicitly; a missing global scope here is a data-leak class of bug.
Failure modes to instrument and alert on.
Ramp-up. Low for engineers already fluent in Filament — a day to productive, a week to confident. The real ramp-up is semantic, not technical: defining who may approve what, delegation, conflict-of-interest rules, and what "approved" means downstream. Document those in a runbook alongside the technical integration, and give approvers a short walkthrough — most operational complaints about approval systems are UX and ambiguity complaints, not bugs.
How can I help you explore Laravel packages today?