Skip to content
22 Jul 2026

A new Horizon UI

I built a new frontend for Laravel Horizon with Inertia, React 19 and shadcn/ui, starting from a two-year-old Figma design. It's now installable through Composer.

Two years ago I designed a new interface for Laravel Horizon in Figma. I liked it, but rebuilding Horizon's entire frontend around it was more work than I could justify next to everything else. So it stayed a picture.

This week that design became a real package. Horizon New Dawn is a new frontend for Laravel Horizon, built with Inertia, React 19 and shadcn/ui. It only replaces the shell: Horizon itself stays in charge of authorization, repositories, metrics and the queue workers. The engine is still great. I just wanted a shell built with today's frontend tooling.

Horizon New Dawn dashboard showing queue health, workload, and Horizon instances
The new dashboard: queue health, workload and Horizon instances.

Morphing the old screens

The design work happened in Claude Design. I started by running /design-sync in Claude Code to import all the screens from the original Horizon interface into Claude Design, so the starting point was exactly what Horizon ships today. Then I added the Figma design from two years ago and prompted from there: take the original screens and morph them into this design.

Claude Design showing the Horizon New Dawn dashboard design used for the design handoff to ChatGPT
The original design in Claude Design, the one that went into the design handoff to ChatGPT.

Because Claude Design produces responsive, clickable React screens, every adjustment was something I could judge as a real interface instead of a static mockup. I kept prompting and adjusting until a couple of screens looked like they belonged together.

The handoff

With a few screens ready, I exported the project from Claude Design into a new Laravel package. Then I did the design handoff in the ChatGPT app, formerly Codex, with one goal: implement all the screens and features.

Most of the refining happened there too. I had a lot of sessions running, sometimes five or seven at once, and I used the annotation tool constantly to point out what should change. That sped things up a lot, and it meant I could keep working on other projects while the sessions ran.

Laravel Boost helped a lot here, together with a few standard skills I use to stay on top of the latest features and best practices for Laravel, Inertia and React. All the tools this new UI is built with.

I shared the first screen on Monday and it was well received, enough to keep going. Yesterday I spent another full day on it, and today went into polishing and getting the biggest bugs out so it would be ready for an initial release.

Not just a reskin

Along the way the interface grew features the original doesn't have: filtering jobs by class, queue, tag or status, pausing and clearing queues, bulk retrying and cancelling jobs, and controls for supervisors and individual Horizon instances.

I shared progress along the way, and people came with feature requests, so I added more functionality.

Queue actions menu on the queues overview with pause and clear queue options
Queue actions on the queues overview.
Pause queue modal with a choice between pausing indefinitely or for a set time
Pausing a queue, indefinitely or for a set time.
Filter jobs modal with job class, queue, connection, tag and state filters
Filtering jobs by class, queue, connection, tag and state.

Try it

Horizon New Dawn is available today. Install Horizon first, then:

composer require nckrtl/horizon-new-dawn
php artisan horizon-new-dawn:install

It takes over the existing /horizon path and uses Horizon's own authorization. Fair warning: it's a young project and not ready for production yet. Try it in a development or testing environment first, because the interface includes actions that mutate real queue state.

What happens next

This release is the experiment. If people end up using it, I'll keep developing it. I'm really curious what you think.

Update: there is now a live demo at horizon.nckrtl.com — a real Horizon instance processing demo jobs, embedded straight into the page. Click around, filter jobs, clear queues, even terminate the instance. It restarts itself.