bezhansalleh/filament-exceptions
A Filament plugin that logs Laravel exceptions to your database and adds a searchable admin panel to browse, filter, and inspect them, with stack traces, request context, and user details, so you can debug production issues without digging through log files.
Architecture fit. bezhansalleh/filament-exceptions is a Filament panel plugin, not an observability service. It hooks Laravel's exception handler, persists throwables into an app-owned database table, and renders them as a Filament resource — list page with filters, a detail view with stack trace and request context, a resolve action, and an unresolved-count navigation badge. For a TPM the value is not better error data, it's a shorter path from "something broke" to "someone owns it," delivered inside a surface the team already opens daily. It fits when three conditions hold together: the product is Laravel + Filament v4, the people who triage already live in the panel (support, QA, ops, technical founder), and error volume is modest enough that an unpruned table stays unremarkable. It offers no alerting, no grouping intelligence beyond recurrence counts, no tracing, and no release-health correlation — it is a complement to Sentry/Flare/Bugsnag and cannot be positioned as incident detection without setting up a false expectation the team will discover at the worst moment.
The strategic leverage is workflow plus deferred spend. It converts an existing manual ritual — spreadsheet, Slack thread, "did anyone see this?" — into a filterable, resolvable inbox with a badge that answers "does anyone need to look at this right now?" Secondarily, if we ship Filament panels to clients or as agency handover, a built-in error inbox reads as operational maturity at roughly half a day of engineering. Both are legitimate TPM wins; neither is an APM replacement.
Integration feasibility. Well-bounded. Composer install, register the plugin on the target panel, publish config and migration, define a policy/gate, schedule pruning. No external service, no credentials, no Node build step, no vendor onboarding. Realistic effort is ~0.5 day for a single-panel app plus a compliance pass on what gets stored. The one structural commitment is version coupling: the 4.x line tracks Filament v4, so every Filament major becomes a coordinated two-package upgrade. That is a recurring, predictable calendar cost to communicate upward, not a surprise to absorb mid-sprint.
Technical risk. Ranked by the likelihood of it actually hurting us:
Authorization values routinely carry tokens, emails, and internal paths. Keeping them in the primary database expands our compliance surface — GDPR/DSAR response, backup scope, DB access control — and turns a tooling choice into a data-handling decision the PM owns, not an engineering default. Redaction and retention must be specified before launch, not retrofitted.drop plugin, drop table) makes it a cheap bet, but the thin dependent base and bus-factor-of-one should be logged as accepted risk with a re-evaluation trigger — not waved through.Release 4.2.1 is a pure maintenance patch: Dependabot bumps (fetch-metadata 2.5.0→3.0.0→3.1.0, actions/checkout 6→7), a docs badge-link fix, and one behavioral change where getNavigationBadgeColor() now delegates to the plugin. Only teams that overrode badge color on the resource are affected; no migrations, no deprecations, no config removals, no action. That cadence is a mild positive for "safe to depend on" and should consume zero sprint capacity.
Key questions.
Authorization supported in config, or do we own it via middleware/serializer?Stack fit. Laravel + Filament v4 with MySQL/Postgres and standard package conventions — service provider, publishable config and migrations, panel plugin registration. It slots into an existing panel with no new runtime dependency, no sidecar, no message queue. Outside Filament it delivers nothing, and inside Filament v3 or v5 it will not install cleanly; confirming the panel's Filament major is the first checkbox, not the last.
Migration path. Additive and reversible in both directions. Install, register on the target panel(s), publish config and migration, run one additive migration, define the policy gate, schedule pruning, ship. Rollback is dropping the plugin and then the table — which is why the exceptions table must be treated as app-owned and disposable, never as an audit or compliance record. If a stakeholder starts treating these rows as an incident history of record, that is a scope change requiring its own retention and integrity guarantees.
Compatibility. The version coupling is the real constraint: Filament major bumps become two-package upgrades for us, and the plugin's release timing is not on our schedule. Mitigate by pinning the plugin minor alongside the pinned Filament minor and validating in the upgrade runbook. PHP and Laravel support matrices should be captured at install time so the upgrade calendar has a factual anchor rather than a guess.
Sequencing. Ordered so the risky parts are validated before the visible parts ship:
Authorization, and request bodies; retention window; whether production only. Get sign-off before writing real data.Maintenance. Low ongoing engineering, non-zero PM attention. Two recurring costs: the coupled Filament upgrade (predictable, twice-a-year-ish, needs calendar space) and the data lifecycle we own — pruning, redaction rules that stay current as the app evolves, and periodic review of what secrets end up in request bodies. The 4.2.1 release demonstrates the maintainer is keeping the lights on; it is not evidence of a support contract. Budget no vendor escalation path — the answer to a plugin bug is a fork or a patch.
Support. The inbox is only as useful as the escalation path behind it. A resolved/unresolved toggle with no named owner becomes a graveyard within a quarter, and the badge count becomes noise people learn to ignore. Define the ritual before launch: who checks unresolved daily, what SLA applies to a new exception, and how an exception converts into a ticket or a fix. Support leads and QA gain read/triage access here — that is a staffing and escalation-path decision, and it needs the permission gate to be safe, not just courteous.
Scaling. Two scaling axes, and only one is about traffic. Vertically: the table grows linearly with error count, the list page and badge count query slow with it, and the admin panel pays the tax on every page render. Mitigate with retention, an index review, and — if badge count becomes a problem — disabling the badge. Horizontally: this only ever sees errors from this Laravel application. Failures in workers, queues, cron, other services, or non-PHP components never arrive. Do not let the panel's completeness create the impression that everything is visible.
Failure modes. Enumerated for the runbook:
Ramp-up. Half a day for a Laravel developer familiar with Filament: install, register, migrate, gate, schedule. For the triage audience — support, QA, a technical PM — ramp-up is a short walkthrough of filter, detail, and resolve, plus the one thing they must internalize: this is not monitoring. Position it explicitly as an internal triage convenience layer that defers a monitoring subscription, with a documented trigger for revisiting that spend. Get that framing into the decision log at adoption time; it is the cheapest insurance against the entire adoption being judged a failure the first time an incident goes unalerted.
How can I help you explore Laravel packages today?