Deck - Know when your background jobs fail before your customers do

by
Background jobs fail silently. Horizon shows you what's running right now, but the history disappears with Redis. Deck remembers everything — every execution, searchable, with controls to cancel runaway jobs and block broken classes during incidents. Free open source package, hosted Cloud dashboard available.

Add a comment

Replies

Best
Hey Product Hunt 👋 I built Deck because I kept running into the same problem at work: a Laravel job would silently stop running, and I'd find out from a customer instead of a dashboard. Horizon showed me what was happening right now, but the history disappeared with Redis. I started building this about two months ago, ran it in production quietly for a few weeks first to make sure it actually held up, then open sourced the package and launched Deck Cloud alongside it. It's been in production for about 7 weeks now, just crossed 2 million executions processed, and last week I had to fix a real scaling issue live after a feature I shipped put too much load on the database. Building this has been equal parts satisfying and humbling. Deck adds a durable, searchable execution log on top of Horizon, plus a few things I always wanted during an incident: cancel a runaway job cleanly, block a broken job class without redeploying, get alerted when something that should run hourly just... doesn't. The package is open source and free forever: composer require deck/deck. Deck Cloud is the hosted version if you want one dashboard across multiple apps and environments, 7-day free trial, no credit card required to start. Happy to answer anything, architecture, why I built it this way, what's next on the roadmap. Would genuinely love to hear if you've hit the same "job silently died and nobody knew" problem.

Does Deck integrate with existing Horizon dashboards or does it fully replace them, and what happens to historical data when you first install it?

Great question! Deck doesn’t replace Horizon at all, it runs alongside it. You keep php artisan horizon running exactly as before, Deck just adds a separate dashboard at /deck that tracks things Horizon doesn’t: durable execution history, per-class last-run status, cooperative cancellation, stale-job alerts. On historical data: Deck only starts recording from the moment you install it, it doesn’t backfill from Horizon’s Redis history since that’s typically already expired or very short-lived by the time you’d install something like this. So no historical import, but going forward everything’s captured and kept for 90 days by default (self-hosted) or based on your retention settings on Cloud. Basically: Horizon for real-time worker supervision, Deck for the memory Horizon doesn’t have.

How does Deck handle retention if Redis itself is the bottleneck causing the failures in the first place, and does the cloud version have any storage limits on the job history?

How does Deck handle the storage growth over time as execution history piles up, is there any built-in pruning or do I need to manage retention myself?

Curious how the cancel and block controls actually work under the hood — does Deck need to wrap job dispatching, or can it intercept runs that were already dispatched before Deck was added?

Finally someone fixed the "what ran last Tuesday at 3am" mystery. The search through old job executions already saved me from digging through logs during an incident.