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

Filament Approvals Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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:

  • Bus factor and maturity. 120 stars and zero dependents means essentially no third-party production validation. A single-maintainer plugin sitting on the critical path of a financial or compliance control is a real risk.
  • Version coupling. Filament ships majors quickly with breaking changes to actions, schemas, and table APIs. A plugin that renders UI against those APIs inherits every upgrade as a forced migration. Check the composer.json constraints for Filament and Laravel ranges, and whether releases track Filament majors promptly.
  • State-machine correctness. Approval flows fail in the seams: concurrent approvers on the same record, reject-after-approve, reassignment mid-flight, model deletion leaving orphaned approvals, and timeouts. These need explicit tests, not assumptions.
  • Auditability. If this backs an SOX/ISO-style control, the approval history must be append-only, attributable, and timestamped, with no path to silently mutate state. Immutability is rarely a plugin default.

Key questions.

  1. Does the package expose a domain service/contract usable outside Filament, or is approval logic bound to Livewire actions?
  2. Are approval chains configurable per model (sequential, parallel, quorum, threshold), or is it a single-approver flag?
  3. What is the exact Filament and Laravel version matrix, and how were the last two Filament majors handled?
  4. How is authorization enforced — Laravel policies/gates, or package-internal checks that bypass our role model?
  5. Is the approval history immutable and does it capture actor, timestamp, decision, and comment?
  6. How does it behave under concurrency — row locking, unique constraints, optimistic checks?
  7. Multi-tenancy and multi-panel support: are approval records scoped per tenant and per panel?
  8. What happens on model deletion, soft delete, and restore?
  9. Test suite depth and static analysis level (Pest/PHPUnit coverage, PHPStan baseline)?
  10. Is there a documented escalation/timeout mechanism, or is that ours to build?

Integration Approach

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:

  • Greenfield resource: adopt directly, no data migration.
  • Retrofit onto an existing model that already carries a status field: this is the risky one. Plan a transition where the existing status column stays authoritative, the package runs in shadow mode writing approvals alongside, and we reconcile divergence for a defined window before cutting over. Do not dual-write without an explicit reconciliation job and a rollback switch.

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.

  1. Timeboxed spike (1 week): throwaway branch, one low-risk resource, exercise approve/reject/reassign/concurrent-action paths. Output: a go/no-go with the ten questions above answered.
  2. Wrap, don't scatter: define our own 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.
  3. Pilot: one non-critical, internal-facing resource. Instrument it. Collect approver feedback on the UI, not just correctness.
  4. Harden: add escalation/timeout (likely ours to build), notification delivery guarantees, and the audit export we need for compliance.
  5. Roll out resource by resource, gated on the pilot's defect rate.
  6. Reassess at 6 months: if the upstream repo stalls, we either fork with a named owner or replace the implementation behind the interface. The wrapper makes that a bounded cost.

Operational Impact

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.

  • Stuck approvals: no timeout or escalation means records silently age. Alert on approvals pending beyond SLA.
  • Orphaned records: model deleted or soft-deleted mid-flow leaves dangling approvals. Enforce FK/cascade behavior and a cleanup job.
  • Concurrent decisions: two approvers acting simultaneously produce conflicting terminal states. Needs DB-level constraint, not just UI guards.
  • Silent bypass: any code path that mutates the underlying status column without going through the approval flow creates divergence between the record and its approval history. Enforce via model observers and a nightly reconciliation report.
  • Lost notifications: approvers never learn there's work. Verify delivery and add a digest fallback.
  • Upgrade breakage: Filament major bumps break actions/schemas; pin and test in a branch first.

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.

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.
laravel2580/idehelpers
delatbabel/viewpages
anavel/gettext
muhamadrezaar/highcharts
delatbabel/keylists
frankkessler/salesforce-laravel-oauth2-rest
anavel/foundation
wdmtech/enviricons
eii/laravel-captcha
muka/shape-reader
tdt/json
refinery29/php-cs-fixer-config
hotmeteor/eco-env
mvaliolahi/hydrate
wearede/tbcpay-php
parsnick/steak
thibaud-dauce/mattermost-php
multilinguals/apollo-client
antaresbr/collection
kr0lik/phpstan-rules