# Laravel Skyline vs Laravel Horizon

> Feature by feature: what the fork adds, what is identical, and when switching is worth it.

Source: https://boring-observability.dev/skyline/docs/skyline-vs-horizon
Section: Getting started — Laravel Skyline documentation
Updated: 2026-07-13

---

Laravel Skyline is a commercial fork of Laravel Horizon that keeps every part of Horizon intact and adds an operations layer on top of it. Horizon shows you what your Redis queues are doing; Skyline shows you the same thing and gives you the buttons to act on it — pause a queue, run a delayed job now, drain a backlog, jump a job to the front. Everything below is additive: there is no Horizon feature Skyline removes, renames or changes.

## At a glance

| Capability | Horizon | Skyline |
| --- | --- | --- |
| Drop-in for `laravel/horizon` (same config, same namespaces) | — | Yes |
| Throughput, runtime & failure metrics | Yes | Yes |
| Supervisors, balancing strategies, autoscaling, tags, notifications | Yes | Yes — unchanged |
| Trigger a delayed or retrying job immediately | No | [Perform Now](https://boring-observability.dev/skyline/docs/dashboard-operations) |
| Drill into the jobs waiting inside a queue | No | [Per-queue drill-down](https://boring-observability.dev/skyline/docs/dashboard-operations) |
| Delete a job, or empty a queue, from the UI | No | [Yes, with guards](https://boring-observability.dev/skyline/docs/dashboard-operations) |
| Pause & resume a single queue | No — all-or-nothing | [Per queue](https://boring-observability.dev/skyline/docs/pausing-queues) |
| Proportional queue priority without starvation | No — strict priority only | [Weighted queues](https://boring-observability.dev/skyline/docs/weighted-queues) |
| Ad-hoc front-of-queue dispatch | No | [`onFront()`](https://boring-observability.dev/skyline/docs/front-of-queue-dispatching) |
| Search jobs by class name | No | Across pending, completed, retried and failed |
| Scheduled and retrying jobs told apart | No — one delayed list | Separate tabs, split on attempt count |
| Structured job lifecycle logging | No | [Every transition, incl. silent drops](https://boring-observability.dev/skyline/docs/job-lifecycle-logging) |
| `ShouldBeUnique` lock released on out-of-band removal | No — lock wedges | [Released](https://boring-observability.dev/skyline/docs/unique-job-locks) |
| Price | Free, MIT | Annual subscription |

## What is identical

Skyline is a *rebased* fork rather than a divergent one: its `main` is a recent upstream Horizon tag with the Skyline commits replayed on top, and upstream releases are merged within 14 days. The practical consequence is that the parts of Horizon you already rely on are not reimplementations that might behave subtly differently — they are the same code.

- The `Laravel\Horizon\` namespace, and every class in it.
- `config/horizon.php`, including supervisors, balancing, autoscaling and `trim`.
- Every `php artisan horizon:*` command.
- The dashboard's mount point, `/horizon`, and the `viewHorizon` gate that protects it.
- Metrics snapshots, tags, long-wait notifications.

The [official Horizon documentation](https://laravel.com/docs/horizon) therefore applies to Skyline in full, and this site documents only the differences.

## When switching is worth it

Horizon is free, official, and genuinely good at what it does. If watching your queues is all you need, keep it — Skyline changes nothing about that job, so paying for it would buy you nothing.

The case for switching is a specific one, and it shows up as a recurring frustration rather than a missing feature:

- **You have SSH'd into a worker box during an incident** to stop one queue, because the dashboard's only pause button stops all of them.
- **You have waited out a backoff window** after deploying a fix, watching a retrying job sit there because there is no way to say "run it now".
- **You have written a one-off Artisan command** to inspect or drain a queue, because the dashboard can count the backlog but not show you what is in it.
- **You have a queue that starves** under strict priority, and turning balancing on to fix it costs you a floor of idle workers you do not need.

Each of those is a place where Horizon tells you something is wrong and then hands you a terminal. Skyline is the layer that closes that loop.

## Skyline is not an APM

A recurring question, so it is worth stating plainly: Skyline is **queue control, not telemetry**. It runs entirely on your own servers — no agent, no data egress, nothing shipped to a vendor. Tools like Laravel Nightwatch, Datadog or Sentry tell you that something is wrong across your whole application. Skyline is the hands-on layer for the queue specifically: pause it, drain it, jump a job to the front. They pair; they do not compete.

## The cost of switching, and of switching back

Because Skyline declares `replace: laravel/horizon` and keeps the namespace, adopting it is a Composer change and a redeploy — no code changes, no migrations. Rolling back is the same operation in reverse, and it loses nothing but the Skyline-only views: there is no schema to unwind, and your queues and jobs are untouched. See [Migrating from Laravel Horizon](https://boring-observability.dev/skyline/docs/migrating-from-horizon).

That symmetry is deliberate. A fork of a package this central to an application should not be a one-way door, and a trial that you cannot reverse is not a trial.


## Common questions

### Should I use Laravel Horizon or Laravel Skyline?

Use Horizon if monitoring is all you need — it is free, official, and Skyline changes none of it. Choose Skyline when you find yourself needing to act on what the dashboard shows: pausing one misbehaving queue during an incident, running a retrying job immediately after deploying the fix, draining a backlog, or giving one queue priority without starving the others.

### Will Laravel Skyline keep up with Laravel Horizon releases?

Skyline is a rebased fork rather than a divergent one: its main branch is a recent upstream Horizon tag with the Skyline commits replayed on top, and upstream releases are merged within 14 days. New Horizon versions, bug fixes and Laravel compatibility updates land on a current base rather than instead of one.

### How is Skyline different from Laravel Nightwatch or an APM?

Skyline is queue control, not telemetry. It runs entirely on your own servers — no agent, no data egress. An APM tells you something is wrong; Skyline is the hands-on layer that lets you do something about it. They pair rather than compete.
