digital-creative/nova-mega-filter
Digital Creative's Nova Mega Filter adds powerful, customizable filter panels to your Laravel Nova resources, with date, range, and custom filters in a clean UI so you can build advanced search forms and quickly narrow down long resource lists.
What this is, in product terms. A configuration-layer add-on for Laravel Nova resource index screens. It replaces stock Nova filter classes with a combinable condition panel so internal users (support, ops, finance) can slice large datasets without filing engineering requests. It is admin-surface tooling only — it does not touch the customer-facing product, pricing, or anything carrying an external SLA. That containment is the most important fact about the package: the cost of being wrong is a revert, not an incident.
Architecture fit. Fits cleanly if we are a Laravel + Nova shop. It plugs into Nova's existing filter extension point — no new service, no queue, no storage beyond whatever saved presets use. It does not introduce a new runtime, a sidecar, or a data path. For an internal tooling stack, that is close to the ideal shape of a dependency: bolt-on, resource-scoped, reversible per resource.
The fit weakens in three places:
whereHas) are both the selling point and the primary performance hazard. On high-cardinality or unindexed tables, an index page becomes a sequential scan.Integration feasibility. Feasible in hours-to-days, not weeks. The engineering learning curve is the Nova filter API itself, not this package; a Laravel-fluent engineer ramps in roughly half a day. The real cost is not installation — it's the per-resource governance: whitelisting columns, verifying indexes, testing authorization, and maintaining a preset inventory.
The blocking unknowns. Two items must be resolved before any roadmap commitment, and both are cheap to check:
^5.0 only, adopting this release is a silent platform bump that raises our PHP/Laravel floor even if we never use a Nova 5 feature. That is the single most expensive mistake available here, and it is caught by reading one file.Secondary unknowns: the package identity is ambiguous (repo at dcasia/nova-mega-filter, listed as digital-creative/nova-mega-filter) — confirm the Packagist name before anyone types composer require. The recorded last-release date (2026-09-19) is anomalous and should be reconciled against the actual tag list before it anchors any planning date.
Technical risk summary. Low-to-moderate, well-bounded, with three named risks: (a) upstream abandonment — 85 stars, zero dependents, effectively single-maintainer, one first-time contributor behind the only substantive release; (b) Nova-major upgrade fragility — no matching release means a broken admin UI; (c) silent correctness failure — a filter that stops applying while the UI still renders and results still look plausible. Risk (c) is the dangerous one because it produces trusted wrong data, e.g. an export of "unpaid invoices" that includes paid ones. None of these are reasons to reject; all of them are reasons to adopt deliberately with a rollback pin.
Key questions for the team.
require constraint at v1.1.0, and does it preserve Nova 4 support?Stack fit and gating decision. This is a pure Nova-layer dependency. Two gates determine whether it enters the roadmap at all:
Build vs. configure. The honest comparison is adopt a community package against hand-write and own custom Nova filter classes. Configured adoption costs hours; hand-rolling equivalent nested-filter UI across multiple resources costs days per resource and then lives on our maintenance ledger permanently. Adopting moves a capability off our roadmap and onto a third party's release cadence. That is the correct trade for admin-surface functionality with no SLA and no differentiation value — and the wrong trade anywhere filtering logic becomes a product differentiator. It isn't one here.
Migration path — additive, not a rip-out. Do not remove existing Nova filter classes on day one. Register the new panel alongside native filters on a pilot resource, have a power user run the same query through both, and diff the result sets. That diff is a free correctness test. Consolidate only once results match.
Pilot selection. One low-traffic, non-sensitive resource — internal Tickets or Users. Not Orders, nothing finance reconciles against. Register the filter, load the index, and immediately compare the filtered result set against the equivalent manual query (->where(...)->whereHas(...)->count(), plus a toSql() dump). We are validating that the filter applies before validating that it's pleasant. Do this in staging at realistic data volume: a panel that looks correct on 500 seeded rows and silently no-ops on 500k production rows is precisely the failure mode we're buying insurance against.
Compatibility sequencing.
composer.json at the tag (answers Gate 2).digital-creative/nova-mega-filter:1.1.0 — not a caret range, with a rollback pin to v1.0.5 held open until dual-support is verified.config/ and resources/ before committing.Sequencing against the Nova upgrade. If Nova 5 is on the roadmap, install and validate this package before the Nova major lands, on the current version, so the Nova upgrade has one fewer unknown. If a Nova major ships without a matching package release, reserve one to two days of fork capacity and add the package to the Nova-major-upgrade checklist.
Scope discipline at integration time. Whitelist, don't auto-expose. Start with three to five columns per resource — the ones that actually appear in support tickets — and add only in response to a real request. Cap relationship depth at one level, deliberately. A three-level nested whereHas on a large pivot table is the single most expensive thing an internal user can do to the admin panel, and they will do it accidentally.
Maintenance. Ongoing cost is low but non-zero, and it is tracking cost rather than engineering cost. The package needs a line in the Nova-major upgrade checklist, a small fork/patch reserve each cycle, and — critically — a documented escalation path written down and executable before pressure: upstream issue → in-house patch/fork → hand-rolled Nova filter classes. Under MIT, forking is available; confirm the org's fork policy now, while nothing is on fire. This should never appear on a critical-path runbook without that path documented.
Ownership. Name one engineer as the ongoing owner for upgrade tracking. Ownership concentration in the upstream project is the defining risk here — 85 stars, zero dependents, effectively single-maintainer, with the only substantive recent release contributed by a first-time contributor. That needs a matching owner on our side, or the dependency quietly rots.
Support. Community only. No SLA, no security-response commitment, no contractual recourse. Acceptable strictly because the blast radius is the admin surface and the remedy is a revert. It must stay out of any conversation involving an external SLA or customer-facing commitments.
Configuration as an operational asset — the preset problem. Saved presets are the feature that makes this package worth adopting: reusable slices owned by ops users instead of one-off engineering requests. But presets are persisted state and they rot. A preset referencing a removed or renamed column becomes a confusing empty result, not an error. Operationally this requires: a documented preset inventory per resource in the repo (or a seed file for standardised defaults), re-verification whenever a resource's columns change, and an up-front decision on whether presets are per-user or shared — because that determines whether one bad preset is one user's problem or the whole team's.
Scaling. Two distinct scaling axes:
EXPLAIN on the largest filtered table with the filter active, not on the bare query, and treat an unexplained sequential scan as a blocker for that column rather than a nice-to-have. If a relationship filter is genuinely needed on a high-cardinality table, whether the resource owner should be allowed to configure it at all is a policy decision, not a code decision.Failure modes. Three, in descending order of severity:
Debugging posture. Isolate, don't inspect the UI. Start from generated SQL (toSql() / getBindings()), then remove filters one at a time from the resource's filters() array to find the responsible definition. Nova's own request/query logging or Telescope is more reliable here than the panel's serialized state.
Ramp-up. Roughly half a day for a Laravel-fluent engineer, and the learning curve is the Nova filter API rather than this package. The expensive ramp-up is organisational, not individual: establishing index-verification habits, the preset inventory, the authorization test, and the upgrade checklist.
Adoption signal to hold ourselves to. Before adopting, count the recurring requests for filter combinations native Nova filters can't express — data pulls, ad-hoc exports, "can we slice orders by X and Y." That count is the justification and, more importantly, the metric to re-check afterward. If it doesn't fall, we've relocated the requests rather than reduced them, and the dependency isn't earning its tracking overhead.
Verdict for planning. Treat as a conditional, low-priority adoption — contingent on resolving the two blocking unknowns (actual capability, Nova 4/5 constraint) and on Nova 5 being on the roadmap. Do not adopt for parity with filters we already have, not on Nova 4 with no Nova 5 plan, and not where the largest filterable tables are high-cardinality and unindexed. If it clears those gates, scope it as a small upgrade-gate line item with a named owner, a pinned version, and a written rollback — not as a standalone feature on the roadmap.
How can I help you explore Laravel packages today?