eightynine/filament-reports
Filament Reports brings report-building to Filament admin panels. Define report classes with query-based data, columns, filters, and actions, then give teams a dedicated page to view and export business data without building custom dashboards from scratch.
Architecture fit. eightynine/filament-reports is a Filament panel plugin, which means it slots into the standard Laravel package contract: a service provider, a Plugin class registered on a PanelProvider, publishable config/views/migrations, and report definitions expressed as PHP classes rendered as Filament pages or widgets. For a team already running Filament as its admin surface, this is the lowest-friction shape a reporting add-on can take — no separate frontend, no second auth system, and report screens inherit the panel's existing navigation, policies, and tenancy scoping. The architectural question is not "does it fit Laravel" (it does, by construction) but whether the package's report abstraction is a definition layer over your models (good — thin, portable, testable) or a parallel query DSL (riskier — logic lives in vendor-shaped classes and is harder to unit test or move off later). Confirm which before committing. Release 4.0.0 does not touch this question — it is a compatibility release, not a redesign — so the answer must still come from reading the source in a spike.
Integration feasibility. Composer install, ->plugin(FilamentReportsPlugin::make()) on the panel, publish config, optionally publish migrations if report definitions or saved filters are persisted. Realistic effort for a first working report is hours, not days. The binding constraints are version compatibility (Filament major, Laravel major, PHP minor, Livewire) and asset publishing — Filament v3+ ships its own compiled CSS, so a plugin whose views assume a different Tailwind/Filament build can render subtly broken until assets are published and rebuilt. Both are verified in a spike, not from the README. 4.0.0 changes the compatibility arithmetic: the package now versions in lockstep with Filament majors (3.x ↔ Filament v3, 4.x ↔ Filament v4), so "which version do I install" is now a function of the host panel's Filament major, not a free choice. Confirm the target panel's Filament version before anything else, and confirm whether the 3.x line continues to receive fixes for teams not yet on Filament v4.
Technical risk.
selectRaw, aggregate expressions, and date truncation. That is an injection-adjacent surface if any user-supplied filter or column name reaches raw SQL, and a correctness surface across MySQL/Postgres/SQLite (date functions, GROUP BY strictness, timezone handling) even when it doesn't.Key questions.
^4.0; Filament v3 remains on the 3.x line. Still open: exact Laravel/PHP/Livewire matrix, and the maintainer's stated policy for future Filament majors.Stack fit. Only relevant if the target application is Laravel + Filament on a supported PHP version. If the team is on Nova, Backpack, or a bespoke admin, this package is a non-starter and the "opportunity" score is irrelevant. Confirm the Filament version of the target panel first; that single fact now gates both whether you can use the package and which major you install:
Migration path. Adopt behind an internal seam. Register the plugin, but define reports as application classes under app/Reports/ implementing the package's contract, with a thin internal base class or interface in front of it. That way an upstream break, a 3.x→4.x jump, or a decision to swap to a hand-rolled Filament page is a change in one directory rather than a rewrite of every report. Pin the exact version in composer.json (no caret on a low-star plugin with a single maintainer), commit the lockfile, and record the adopted commit SHA. Pin the pair — record the plugin major alongside the Filament major it was validated against, because that mapping is now the compatibility contract. If any publishable migrations exist, review the schema and own it — published migrations are yours forever regardless of what upstream does next, and a 4.0.0 migration diff needs reading even if the version note doesn't mention one.
Compatibility. Verify explicitly: composer why-not against the target Filament/Laravel/PHP versions; the Livewire major (v3 vs v4 changes component lifecycle, and Filament v4 drags it along); database driver(s) actually in use, with at least one report exercised against each; and asset rendering in the real panel (dark mode, RTL if relevant, Filament theme customizations). Check whether the plugin's views are precompiled or need npm run build in the host app — a Filament-major-aligned release is exactly when compiled assets and Tailwind class names get rebuilt and drift. For 4.0.0 specifically, diff 3.1.0...4.0.0 before installing; a one-line release note is not a migration guide.
Sequencing.
Maintenance. Plan for ownership, not consumption. The realistic steady state is: minor version bumps are safe, Filament majors require a fork patch that you write and upstream (best case) or carry (likely). The good news from 4.0.0 is that the maintainer did the work this cycle, on time, for a current Filament major — that is the single most encouraging maintenance signal the project has produced, and it lowers (but does not eliminate) the expected cost of the next one. The bad news is the corresponding obligation: this package now moves when Filament moves, so plugin upgrades land in the same window as your own Filament upgrade, exactly when the team is already busy. Assign a named owner in the Laravel team, add the package to the dependency-review list, and keep a short internal changelog noting every upstream diff you adopt. Budget the upgrade as part of the Filament upgrade project, not as a separate line item.
Support. Community-only, no SLA, no vendor to escalate to. Response time on issues is a function of one person's availability. For an internal admin reporting tool this is usually acceptable; it becomes unacceptable if reports are customer-facing or tied to billing/compliance outputs. Decide which of those this is before adoption, because it changes the answer. Note also that reporting a v4 bug now puts you in a small pool of early users, which is good for getting attention and bad for the maturity of the code you're running.
Scaling. The scaling axis is query cost, not request volume — a handful of users can each trigger a table scan. Watch for: unindexed filter columns, GROUP BY over large fact tables, per-row relationship access in report renderers (N+1), and exports buffered in memory. Mitigations are ordinary Laravel ones — composite indexes matched to default filters, materialized/rollup tables or nightly aggregates for the heavy reports, queued exports with signed download links, caching of expensive aggregates with explicit invalidation. None require the package to cooperate, which is reassuring: the escape hatch is a plain Filament page with the same query. Treat the escape hatch as the scaling plan's foundation — it is also the migration plan if upstream stalls.
Failure modes.
max_execution_time, presenting to users as a silent failure or a 504.Ramp-up. Low for anyone already fluent in Filament — the mental model (panel, page, widget, form schema for filters) transfers directly, and a developer should be productive in half a day to two days. If the team is simultaneously learning Filament v4, add that on top; the plugin does not teach you the new panel APIs. The non-obvious ramp-up cost is domain-side, not package-side: whoever writes reports needs to understand the underlying data model well enough to know which joins fan out and which aggregates double-count. Budget that separately; it dwarfs the framework learning curve and is the actual determinant of whether the reports are trusted.
How can I help you explore Laravel packages today?