Skyline

Boring Observability  ·  Commercial Horizon fork

Keep your queues on the horizon.

Skyline is a drop-in replacement for Laravel Horizon that turns the dashboard into a real control room — pause a queue, jump a job to the front, drain a backlog, and read metrics that finally tell the truth. Same config, same namespaces, zero code changes.

Built by a team running 100,000+ background jobs a day in production. We built Skyline because Horizon showed us the fire and gave us no way to fight it.

For teams running 100k+ jobs a day — where a stuck queue is an incident, not an inconvenience.

Early access — September 2026 · General availability — January 2027

skyline · /horizon
active
Queues wait · jobs
high
0s 8
default
2s 140
media
9s 420
low
90s 1.4k
Throughput
312/min
RETRYING
4
FAILED · 1h
1
Drop-in

Replaces laravel/horizon — keeps the Laravel\Horizon namespace

/horizon

Same dashboard route, same config/horizon.php, no migration

0 changes

No application code edits required to switch over

Redis

Built on Horizon 5.x for production Redis queues

Guarantee

Kept current with Horizon. Every upstream release is tracked and merged within 14 days, so you never get stranded on an old version.

[ what's on top of Horizon ]

Ten operational upgrades for teams running queues in production.

Horizon shows you what your queues are doing. Skyline lets you do something about it — without SSHing into a box or firing Redis commands by hand.

Manage scheduled & retried jobs

See delayed jobs, when each is due to run, and trigger any of them immediately with a single click — no waiting out the backoff window.

Inspect jobs by queue

Open any queue straight from the dashboard and read the exact jobs waiting inside it, in order.

Clean up with confidence

Delete individual jobs or empty an entire queue from the UI, with confirmation prompts that stop costly mistakes.

Pause & resume processing

Pause every worker or a single queue from the dashboard, then resume the moment you are ready. Jobs simply accumulate until you do.

Clearer wait-time visibility

Understand both the current queue delay and the expected wait time, side by side, with reporting that finally reads true.

Better delayed-job tracking

Delayed jobs are tracked consistently and cleaned up automatically according to your existing retention settings.

Weighted queue processing

Give important queues proportionally more attention without relying on strict priority order — and without starving the rest.

Front-of-queue dispatching

Send an urgent job to the head of the queue so a worker picks it up next — ad-hoc priority without a dedicated high-priority queue.

Job name search

Find jobs by class name across pending, completed, retried, and failed views in seconds.

Reworked metrics dashboard

Read clean aggregate charts instead of fragmented per-job and per-queue tiles.

[ priority, without the plumbing ]

Push the urgent job to the front of the queue.

By default a dispatched job is appended to the tail and processed FIFO. Add the InteractsWithFrontOfQueue trait and call onFront() — Skyline LPUSHes it onto the head of the ready list so a worker picks it up next. No dedicated high-priority queue to stand up.

  • Composes with onQueue(), delay() and the rest of the dispatch chain
  • Still fires JobPending / JobPushed — it shows up on the dashboard like any job
  • Immediate dispatch on the Redis driver; delayed jobs migrate normally first
app/Jobs/ProcessPodcast.php
use Laravel\Horizon\InteractsWithFrontOfQueue;

class ProcessPodcast implements ShouldQueue
{
    use Dispatchable, InteractsWithFrontOfQueue, Queueable;
}

// Jump to the front of the queue:
ProcessPodcast::dispatch($podcast)->onFront();

// Composes with the usual options:
ProcessPodcast::dispatch($podcast)
    ->onFront()
    ->onQueue('media');
config/horizon.php
'supervisor-1' => [
    'connection' => 'redis',
    'queue'      => ['high', 'default', 'low'],
    'balance'    => false,
    'queueWeights' => [
        'high'    => 3,
        'default' => 2,
        // 'low' omitted → default weight of 1
    ],
],

[ proportional, not all-or-nothing ]

Weight your queues instead of starving them.

Strict left-to-right priority drains high completely before it ever looks at low. A queueWeights map softens that into a proportional policy — checked roughly 3 : 2 : 1, so important work is favoured while nothing is left to rot.

high
×3 · 50%
default
×2 · 33%
low
×1 · 17%

Applies only when balance => false. Queues without an entry keep weight 1.

[ Horizon vs Skyline ]

Everything Horizon does, plus the controls it never had.

Capability Horizon Skyline
Drop-in for laravel/horizon (same config & namespaces)
Throughput, runtime & failure metrics
Trigger a delayed or retrying job immediately
Drill into the jobs waiting inside a queue
Delete jobs / empty a queue from the UI
Pause & resume a single queue
Weighted (proportional) queue processing
Front-of-queue dispatching (onFront())
Search jobs by class name everywhere

[ switch in three steps ]

From Horizon to Skyline in minutes.

Because Skyline replaces laravel/horizon, there are no code changes and no migration.

  1. 01

    Authenticate Composer

    Point Composer at the private registry with your Anystack license key.

    composer config --global \
      --auth http-basic.laravel-skyline.composer.sh \
      you@example.com YOUR-LICENSE-KEY
  2. 02

    Require the package

    Add the registry to composer.json, then pull in Skyline. It replaces laravel/horizon.

    composer require \
      boring-o11y/laravel-skyline
  3. 03

    Install & run

    Publish assets and start the dashboard and workers — exactly as before.

    php artisan horizon:install
    php artisan horizon

The dashboard mounts at /horizon and config/horizon.php is identical to upstream — your existing service-provider customizations and gate definitions keep working.

MIT-licensed · Keeps running if your subscription lapses · No runtime license check

[ answers ]

Frequently asked questions

What is Laravel Skyline?

+

Laravel Skyline is a commercial, drop-in replacement for Laravel Horizon, maintained by Boring Observability. It keeps everything Horizon does for monitoring Redis queues and adds production operations tooling — pausing queues, triggering delayed jobs, weighted processing, front-of-queue dispatch, per-queue inspection and cleanup, and a reworked metrics dashboard.

Is Laravel Skyline a drop-in replacement for Laravel Horizon?

+

Yes. Skyline keeps the Laravel\Horizon\ namespace and "replaces" laravel/horizon in Composer, so your existing config/horizon.php, service-provider customizations, gate definitions and Artisan commands all keep working. The dashboard still mounts at /horizon and no code changes or migrations are required.

Will Skyline keep up with Laravel Horizon?

+

Yes. Skyline tracks upstream Horizon and merges every release within 14 days, so you get new Horizon versions, bug fixes and Laravel compatibility updates without being stranded on an old version. The Skyline-only features are built on top of that current base, never instead of it — and because the team runs Skyline against its own production queues every day, keeping current is part of how we operate, not an afterthought.

How is Skyline different from Laravel Nightwatch or an APM?

+

Skyline is queue control, not telemetry. Your queue controls run entirely on your own servers — no agent, no data egress. Pair it with your APM (Nightwatch, Datadog, Sentry): they tell you something is wrong, Skyline is the hands-on layer that lets you do something about it — pause a queue, jump a job to the front, drain a backlog.

How is Laravel Skyline licensed and priced?

+

Skyline is sold as an annual subscription through Anystack. Buying a license gives you a key that authenticates Composer against the private registry at laravel-skyline.composer.sh so you can install and update the package.

What happens if my subscription lapses?

+

Already-installed versions keep running normally — there is no runtime license check that can interrupt job processing. Only future composer update calls against the private registry will fail authentication until you renew.

How do I install Laravel Skyline?

+

Authenticate Composer with your license key, add the laravel-skyline.composer.sh registry to composer.json, then run composer require boring-o11y/laravel-skyline. Finally run php artisan horizon:install and php artisan horizon, exactly as you would with Horizon.

What is front-of-queue dispatching?

+

Add the InteractsWithFrontOfQueue trait to a job and call ->onFront() on dispatch. Skyline then LPUSHes the job onto the head of the Redis ready list so a worker picks it up next, instead of appending it to the tail. It applies to immediate dispatches on the Redis driver only.

What are weighted queues?

+

In a supervisor running with balance => false, a queueWeights map lets higher-priority queues be checked proportionally more often (for example 3:2:1) without ever starving the lower-priority ones. It applies only when balancing is off, and queues without an entry default to a weight of 1.

Does Skyline work with non-Redis queue drivers?

+

Skyline monitors Redis queues, just like Horizon. Features that rely on Redis list semantics — such as front-of-queue dispatching — do not apply to the sync or database drivers.

[ limited early access ]

Be first on the horizon.

Skyline isn't public yet. Leave your email and we'll send your invitation and license key the moment early access opens — ahead of general availability.

Early access

September 2026

Invites roll out to the list first.

General availability

January 2027

Open to everyone, annual subscription.

Early access gets you an early-access license key, a direct line to the makers, and real influence on the roadmap.

We run Skyline against our own queues every day. Get in early and you'll help shape the controls before they're set in stone. — The Boring Observability team

One email to confirm, then only when early access opens. No spam, unsubscribe anytime.