amvisor/filament-failed-jobs
Filament plugin for inspecting and managing failed queue jobs. Browse failed jobs in a searchable table, review exception details and payloads, then retry or delete entries without leaving your admin panel. Requires a Laravel app using queues and Filament.
Architecture fit. The package is a thin Filament panel plugin that surfaces rows from Laravel's failed_jobs table as an admin UI. It does not introduce new infrastructure, queue drivers, or persistence — it reads what the framework already writes. That makes it architecturally low-risk: it slots into the existing Filament admin panel alongside other resources, and its blast radius is limited to the panel's authorization surface. It is a convenience layer over php artisan queue:failed, not a queue management system.
Integration feasibility. Integration is the standard Filament plugin pattern: composer require amvisor/filament-failed-jobs, then register the plugin in the relevant PanelProvider (->plugin(...)). No migrations are expected beyond the framework's own failed_jobs table (php artisan queue:failed-table / queue:failed migration). Feasibility is high if the Filament major version matches; that is the single gating check.
Technical risk.
failed_jobs is keyed by queue connection. Apps using multiple connections (e.g., redis for default, sqs for integrations) will see only one connection's failures unless the package exposes a connection selector.queue:retry semantics. Verify before promising ops a self-service tool.Key questions.
composer.json?failed_jobs directly via Eloquent, or shell out to queue:failed? (Affects connection handling and testability.)queue.failed config and per-connection UUIDs?payload column rendered?Stack fit. Assumes Laravel 9/10/11 + Filament v3 (verify) + a queue whose failures are recorded to the database (database, redis, sqs, beanstalkd all support this when failed_jobs is configured). Apps on Horizon already have a failed-job UI for Redis queues — this package only adds value where Horizon is absent, or where non-Redis connections are in play.
Migration path. Effectively none: no schema changes beyond failed_jobs, no data backfill, no queue restart required. Rollback is composer remove plus deleting the plugin registration line. This is the package's strongest TPM argument — it is a reversible, hours-scale experiment.
Compatibility. Pin the package version explicitly and add a Composer constraint on the Filament major. Test against the exact Laravel/Filament/PHP matrix in CI before merging. If composer resolution fails on the current Filament version, do not force it with --ignore-platform-reqs; fork instead.
Sequencing.
failed_jobs table.Maintenance. The realistic posture is "adopt-and-own." Budget for a fork or a vendored copy; expect to patch Filament compatibility yourself at each major upgrade. Do not add it to a critical path. If the team cannot accept owning ~a few hundred lines of Blade/Livewire, the correct alternative is a first-party Filament Resource over a FailedJob model — roughly a day of work, full control, same outcome.
Support. No vendor support, no SLA, no issue-triage expectation. Internal ownership must be assigned (typically the platform/backend team that owns the queue). Document the fork point and the upgrade procedure in the runbook.
Scaling. Negligible runtime cost — it is a paginated read against an indexed table, hit by a handful of admins. The real scaling concern is table growth: failed_jobs is unbounded by default. Pair this with a retention policy (queue:prune-failed --hours=168 on a schedule) regardless of whether the package is adopted. Large payload columns plus a full-table count can slow the listing page in the tens-of-thousands of rows; confirm the package paginates rather than loading all.
Failure modes.
default → verify or extend.failed_jobs table not created in a given environment → page errors instead of rendering empty; check migration state per environment.Ramp-up. Very low for a Filament-fluent engineer (under an hour to evaluate). Low for on-call: it changes where failed jobs are inspected, not how they are remediated — queue:retry, queue:forget, and queue:flush remain the source of truth. Critically, this package is a viewer, not monitoring: it does not alert on failure, does not surface failure-rate trends, and does nothing for you until someone opens the page. Keep existing failed-job alerting (Sentry, Horizon wait-time/failure notifications, or a scheduled queue:failed check) in place and position this as an ergonomics improvement for humans, not a reliability control.
How can I help you explore Laravel packages today?