kregel/nova-failed-jobs-tool
A Laravel Nova tool for viewing and managing failed queue jobs directly from your admin panel, with retry and delete actions so you can resolve failures without leaving Nova.
Architecture fit. The package is a Laravel Nova tool — a self-contained UI extension that mounts into the Nova admin panel and surfaces the contents of Laravel's failed_jobs table: exception traces, serialized payloads, connection/queue metadata, plus retry and delete actions. Architecturally it is a thin presentation layer over Laravel's built-in FailedJobProvider and queue:retry / queue:forget semantics, which is a good fit: it adds no runtime surface to the request path, no middleware, no schema changes, and no background workers. For teams already running Nova, it occupies the "operator tooling" niche and is trivially removable. For teams not running Nova, it is a non-starter — Nova is a paid, closed-source first-party product, so this package inherits a hard commercial dependency (roughly $199–$299/site depending on tier) that dwarfs the value of a 14-star add-on.
Integration feasibility. Mechanically simple: a Composer require, optional config publish, and one registration line in NovaServiceProvider::tools() (Nova 3) or NovaApplicationServiceProvider::tools() (Nova 4+). No migrations, no env vars, no queue driver coupling beyond the caveat that failed-job records must be persisted to the database (failed.driver = database), which excludes DynamoDB-backed setups and any team relying purely on Horizon/Redis introspection. Real feasibility risk sits in version drift: the last tagged release is August 2021, i.e., the Laravel 8 / Nova 3.3 era. Nova 4 shipped in 2022 with changes to tool bootstrapping, menu registration, and front-end asset conventions; Laravel 9–11 revised the failed_jobs schema (uuid column, batch metadata inside the payload, exception truncation behavior). None of this is guaranteed broken, but none of it is tested either.
Technical risk. High for a package this small, because the risk is entirely concentrated in abandonment rather than complexity. Signals: 14 stars, zero dependents, single maintainer, no release in roughly four years. That is a hobby-grade artifact, not a maintained dependency. Specific hazards: (1) Nova major-version breakage with no upstream fix path other than a fork; (2) payload deserialization — the tool must unserialize() job payloads and render exceptions, and jobs referencing classes that no longer exist (renamed/removed job classes after a refactor) will throw during rendering, which is precisely the scenario where you need the tool; (3) authorization — failed job payloads routinely contain customer data, API tokens, and PII, so the tool's exposure is only as safe as the Nova gate guarding it; (4) large failed_jobs tables producing slow pagination queries absent an index on failed_at; (5) retry actions that re-enqueue against a queue/connection that no longer exists.
Key questions. Which Nova and Laravel versions are actually supported and tested? Does it handle the uuid primary key and batched-job payloads? Does it honor Laravel's failed.driver abstraction or read the table directly? What authorization boundary does it enforce beyond "can access Nova"? Are retry/forget actions audited, and do they respect --queue/--connection overrides? Is the front-end asset build reproducible from source? What is the fallback if the maintainer archives the repo — is the code small enough to vendor and own?
Stack fit. Best fit is a mid-size Laravel monolith on Nova 3.x/4.x, database-backed queue with the default database failed-job provider, and a platform team that already treats Nova as the internal ops console. Poor fit for Redis/Horizon-centric shops (Horizon's failed-job UI is superior and maintained), for DynamoDB failed-job drivers, and for anyone on Nova 5 or planning to upgrade soon.
Migration path. There is no migration — this is greenfield tooling, not a replacement. The realistic path is: fork to an internal namespace, pin the upstream commit, add a composer.json constraint against your Laravel/Nova versions, and treat the fork as first-party code. Budget roughly 2–5 engineer-days for a spike plus compatibility fixes (Nova registration API, uuid column handling, payload rendering guards), plus ongoing ownership of perhaps a few hours per Nova major upgrade.
Compatibility. Verify against your exact matrix before committing: PHP version, Laravel minor, Nova major, and failed_jobs schema. The decisive test is not "does it install" but "does it render a payload from a job class that has since been renamed" — that is the failure mode you will hit in production. Also confirm the front-end compiled assets are present in the release tarball; if the tool requires a Node build from 2021-era mix/vite config, add a day.
Sequencing. (1) Confirm Nova license and current version; if not on Nova, stop — close the evaluation. (2) Spike in staging against a seeded failed_jobs table with realistic, large, and stale payloads. (3) Security review of payload exposure and Nova gate scoping. (4) Decide build-vs-fork-vs-buy: alternatives are Horizon (Redis), Laravel Telescope, Sentry/Bugsnag for exception triage, a 100-line custom Nova resource over failed_jobs, or simply php artisan queue:failed. A custom Nova resource is genuinely competitive here given the package's size — it is a resource, a detail view, and two actions.
Maintenance. The dominant cost. Zero releases since 2021 and no dependents means no downstream pressure to keep it working; you are the maintainer the moment you install it. MIT licensing makes forking clean, which is the only responsible posture. Treat the dependency as vendored source, not a versioned package, and record it in your third-party risk register as unmaintained.
Support. No SLA, no security response channel, no issue-triage cadence. A vulnerability in how payloads are rendered or authorized would surface to you, not to the maintainer. Weigh this against the low blast radius: the tool is read-mostly, admin-only, and removable in one commit.
Scaling. Pagination over failed_jobs degrades as the table grows; teams that never prune accumulate millions of rows. Ensure an index on failed_at, set a retention policy (queue:prune-failed), and cap page size. Rendering large serialized payloads is memory-hungry — a single multi-megabyte payload can exhaust a PHP worker. This is an operator-console workload, so concurrency is low; the risk is per-request latency and memory, not throughput.
Failure modes. Nova major upgrade breaks tool registration or menus; Laravel schema drift breaks the detail view; stale job classes throw during payload rendering, making the tool unusable exactly when debugging is needed; oversized payloads cause timeouts or OOM; retry actions silently fail against decommissioned queues/connections; overly broad Nova access leaks secrets embedded in payloads to users who should not see them; the upstream repo is archived and your fork drifts permanently.
Ramp-up. Low technical ramp — any Laravel developer reads the source in an afternoon, and operators need only minutes to learn the UI. The organizational ramp is the real cost: securing Nova licenses for on-call engineers, documenting the tool in runbooks, and training responders to prefer it over raw SQL or queue:failed. Expect half a day of enablement and a named owner for the fork.
Verdict. Score 3.7/10 with opportunity at 34 reflects reality: a useful, narrowly scoped convenience that is four years stale, unvalidated by any dependent, and gated behind a paid platform. Recommended only as a forked, internally owned convenience for teams already deep in Nova with database-backed failed jobs — and even then, a purpose-built Nova resource over failed_jobs plus Horizon or Sentry for triage is the lower-risk default. Do not adopt as an external dependency.
How can I help you explore Laravel packages today?