laravel/horizon
46.0
Weak · 19 September 2026
10.8k
lines of production code
PHP
with JavaScript
1
measurement over time
What this system is
This system is Laravel Horizon, a dashboard and monitoring interface for background job processing. It provides a web UI to visualize job metrics, track batch statuses, and manage failed or silenced jobs, while offering granular control over supervisor processes and auto-scaling. The platform supports real-time monitoring through configurable polling, tag-based job tracking, and comprehensive alerting via Slack, SMS, and email.
How it got here
2017 — Horizon 5.x major release and Vue removal
28 changes.
This period marks the Horizon 5.x release, characterized by a complete overhaul of the dashboard interface and the removal of the legacy Vue.js frontend in favor of a new server-rendered UI. The work involved migrating the asset build pipeline to Vite, expanding configuration and API capabilities for job silencing and batch management, and upgrading core dependencies to PHP 8+ and Laravel 9-13.
2018–2026 — Vue 3 frontend migration and UI overhaul
16 changes.
The project migrated its JavaScript frontend from Vue 2 to Vue 3 and switched the build toolchain to Vite, introducing a comprehensive dark mode and modernized design system. This period focused on rebuilding core UI screens for monitoring, metrics, and job management with standardized polling and improved error visibility. Supporting changes included new developer tools, enhanced exception handling, and updated documentation to facilitate the transition.
Features
Add email notifications and update Slack formatting for long wait alerts
Users can now receive Long Wait Detected alerts via email in addition to Slack and SMS, provided the Horizon email configuration is set. The notification content has been updated to include the Horizon application name in Slack and SMS messages for better context. Additionally, Slack notifications now support the newer Block Kit API (introduced in Laravel 11) for improved formatting, while maintaining backward compatibility with older webhook styles.
src/Notifications · high confidence
Added Horizon configuration skill with reference documentation
A new 'configure-horizon' skill has been added to the Boost resources, providing structured guidance for installing, configuring, and troubleshooting Laravel Horizon. The skill covers the full lifecycle including supervisor setup, dashboard authorization, metrics snapshotting, and notification routing, supported by detailed reference files for supervisors, metrics, notifications, and job tagging. This enables users to get accurate, context-aware assistance for Horizon-specific tasks directly within the development environment.
resources/boost · high confidence
Introduce Batches screen with search, pagination, and cancellation visibility
A new Batches screen has been added to the Horizon UI, allowing users to view, search, and paginate through job batches. The list view supports debounced text search and automatic polling for new entries, while the batch preview page displays detailed status information, including a specific timestamp for when a batch was cancelled. Users can also view individual failed jobs within a batch and retry them directly from this interface.
resources/js/screens/batches · high confidence
Introduce dedicated Monitoring screens for tag-based job tracking
The Monitoring section now features a dedicated UI for managing and viewing jobs associated with specific tags. Users can add new tags via a modal, view a list of monitored tags with their job counts, and stop monitoring individual tags. Clicking a tag navigates to a detailed view that displays recent and failed jobs for that tag, including job names, queue information, timestamps, and runtime metrics. The interface supports pagination, periodic polling for new entries, and a 'Load New Entries' button that respects the global auto-load setting.
resources/js/screens/monitoring · high confidence
New Recent Jobs screen with Silenced support and Delayed visibility
The Horizon interface now includes a dedicated Recent Jobs screen that lists Pending, Completed, and Silenced jobs. This view displays job names, queues, tags, and timestamps, with specific columns for completion time and runtime for completed or silenced jobs. A 'Delayed' badge is shown on pending/reserved jobs, calculating the delay duration using the job's timezone. The job detail view provides expanded information including connection, batch ID, and a collapsible data/tags section, while also handling PHP-unserialized command data to display delay details accurately.
resources/js/screens/recentJobs · high confidence
New UI components for alerts, charts, polling, and theme toggling
This change introduces several new Vue components to the frontend interface. The Alert component provides a standardized modal for displaying messages and handling confirmations, replacing previous alert mechanisms. A new LineChart component visualizes metrics using Chart.js, featuring configurable Y-axis ticks (including 'secs' labels) and improved tooltip interaction. The Poll component standardizes data fetching behavior with configurable intervals and visibility-aware polling to reduce unnecessary requests. Additionally, the SchemeToggler component enables users to switch between light, dark, and system color schemes, respecting the OS preference and persisting the choice in localStorage. Finally, the Stacktrace component offers a responsive, expandable view for exception details.
resources/js/components · high confidence
New dashboard screen with standardized polling and base path support
The dashboard screen has been introduced to provide an overview of job metrics, including jobs per minute, recent jobs, failed jobs, and system status. This implementation standardizes data refresh behavior by utilizing a dedicated Poll component for periodic updates and ensures correct API routing by using the Horizon.basePath property for all HTTP requests.
resources/js/screens · high confidence
New job and supervisor events with enhanced memory tracking and notification extensibility
This update introduces new event classes to provide deeper visibility into job and supervisor lifecycle events. A new \JobPending\ event is added to capture jobs before they are pushed to the queue, while \MasterSupervisorOutOfMemory\ and \SupervisorOutOfMemory\ events now expose memory usage details, allowing for better monitoring of resource consumption. The \JobReleased\ event has been updated to include a \delay\ property, reflecting the time before a job becomes available. Additionally, the \LongWaitDetected\ event now supports notification class overrides via the container, enabling users to customize how long-wait alerts are handled.
src/Events · high confidence
Workbench now includes Horizon monitoring setup and default admin user
The workbench environment now supports Laravel Horizon for queue monitoring. A new Horizon service provider has been added that enables access to the Horizon dashboard for all users, and a database seeder has been introduced to automatically create a default 'Laravel Horizon' admin user upon seeding, facilitating immediate local testing and monitoring of background jobs.
workbench · high confidence
Removals
Removal of bundled Moment.js library from public JavaScript
The \public/js/app.js\ file, which previously contained a bundled version of the Moment.js date-handling library, has been deleted. This change removes the client-side dependency on Moment.js from this specific asset bundle, likely as part of a broader migration to a different date-handling approach or a reduction in bundle size. Users relying on this specific bundled script for date formatting or manipulation will no longer have access to Moment.js functions from this file.
public/js · high confidence
Removal of legacy Line chart component
The \Line.js\ component within the \BaseCharts\ directory has been removed from the codebase. This file previously provided a Vue-based wrapper for rendering line charts using Chart.js, including specific default options for Y-axis scaling and X-axis label formatting. Its deletion indicates that this specific chart implementation is no longer used or has been replaced by a different component or approach in the application.
resources/assets/js/components/Charts/BaseCharts · high confidence
Vue.js frontend components removed
The entire Vue.js frontend codebase located in resources/assets/js has been deleted, including the main application entry point, routing configuration, and all UI components (such as Dashboard, Failed Jobs, Monitoring, and Metrics pages). This removes the client-side interface for the Horizon dashboard.
resources/assets/js · high confidence
Behavioural changes
Complete UI theme overhaul with new color system and dark mode
The application's visual appearance has been significantly updated with a fresh design language. A new centralized color palette (defining gray, red, amber, emerald, blue, and violet scales) has been introduced to standardize styling. This supports a new dark mode theme alongside the existing light mode, allowing users to switch between distinct visual themes. The UI components, including the sidebar, cards, tables, and buttons, have been restyled with updated typography (Figtree font), border radii, and spacing to match the new aesthetic.
resources/sass · high confidence
Expanded Horizon configuration with new environment and operational settings
The Horizon configuration file has been significantly expanded to support new operational features. Users can now configure the Horizon instance name, domain, and path via environment variables. A configurable Redis prefix is added to support multiple Horizon installations on the same server. New settings allow for job trimming times, silencing specific jobs or tags from the completed list, and configuring metrics snapshot retention. Additionally, fast termination for deployments, memory limits, and detailed default supervisor settings (including balance strategy, scaling strategy, and process limits) are now exposed in the config.
config · high confidence
Expanded job status tracking and repository contract updates
The Horizon contracts now support tracking additional job states—pending, completed, and silenced—by adding corresponding retrieval and counting methods to the JobRepository interface. New interfaces, LongWaitDetectedNotification and Silenced, have been introduced to support notification overrides and silenced job handling. Repository contracts for supervisors, master supervisors, and metrics have been updated to include expiration flushing (flushExpired) and metrics clearing (clear), while the WorkloadRepository return type is now explicitly defined to improve type safety.
src/Contracts · high confidence
Failed Jobs screen displays retry history, connection details, and exception context
The Failed Jobs interface now provides deeper visibility into job failures and retry attempts. The job detail view includes a dedicated 'Connection' field and displays the number of 'Retries' alongside the original 'Attempts'. For jobs that have been retried, the interface shows the ID of the original job and links to its batch if applicable. Additionally, the view now renders the full exception stack trace and the exception context as formatted JSON, helping users diagnose failures more effectively.
resources/js/screens/failedJobs · high confidence
Horizon 5.x: Signal handling, auto-scaling, and configuration overhaul
This release introduces Horizon 5.x with significant behavioral changes. Process management now uses a new \ListensForSignals\ trait for graceful termination, restart, and pause/resume operations, and supports non-standard PHP binaries via the \PhpBinary\ class. The auto-scaler (\AutoScaler\) has been rewritten to support logarithmic scaling strategies, configurable max-shift limits, and explicit balancing modes that show workload per queue even when balancing is disabled. Configuration is now centralized in a published \horizon.php\ file with support for default environment options, custom route domains/paths, CSP nonces, and Redis cluster support. The event system has been updated to include a \JobPending\ event for pre-push metadata, and jobs can now be silenced via configuration or the \Silenced\ interface. Additionally, the dashboard supports dark mode, and the \horizon:purge\ command has been optimized to prevent excessive process kills.
src · high confidence
Horizon API refactored to return JSON arrays and support batch operations
The Horizon HTTP controllers have been refactored to return structured JSON arrays instead of HTTP responses, enabling a more consistent API for the frontend. This change introduces new controllers for managing job batches (BatchesController) and silenced jobs (SilencedJobsController), while renaming RecentJobsController to CompletedJobsController to better reflect its purpose. The DashboardStatsController now exposes paused master counts and configurable time periods for metrics. Additionally, the MasterSupervisorController has been updated to display inactive supervisors defined in the provisioning plan, and the FailedJobsController now includes exception context and properly sorts retry history.
src/Http/Controllers · high confidence
Horizon console commands refactored and expanded with new management capabilities
The \src/Console\ directory has been significantly updated to modernize command structure and add new operational features. New commands have been introduced: \horizon:install\ for scaffolding, \horizon:listen\ for file-watching auto-restarts, \horizon:clear\ and \horizon:clear-metrics\ for queue and metric management, \horizon:forget\ for deleting failed jobs, and \horizon:status\/\horizon:supervisor-status\ for monitoring. Supervisor control is now granular with \horizon:pause-supervisor\ and \horizon:continue-supervisor\. The \horizon:publish\ command is deprecated in favor of \horizon:install\. Existing commands like \horizon:work\, \horizon:supervisor\, \horizon:purge\, \horizon:terminate\, \horizon:pause\, and \horizon:continue\ have been refactored to use dependency injection, support new options (such as \--backoff\, \--max-jobs\, \--max-time\, \--nice\, \--json\, \--signal\), and provide improved error reporting and output formatting.
src/Console · high confidence
Horizon dashboard receives a major UI overhaul with new navigation and layout
The Horizon dashboard has been completely redesigned with a new layout structure, replacing the previous single-page app wrapper with a dedicated sidebar navigation. This update introduces new navigation items for 'Batches', 'Completed Jobs', and 'Silenced Jobs', alongside the existing Dashboard, Monitoring, Metrics, Pending Jobs, and Failed Jobs. The visual style has been updated to use the Figtree font and Bootstrap 5 utility classes, and the application title now dynamically includes the configured Horizon instance name. A maintenance mode warning banner is also displayed when the application is down for maintenance.
resources/views · high confidence
Listeners refactor: configurable trimming, memory monitoring, and job lifecycle updates
This change updates the listener components in src/Listeners to improve resource management and observability. Trimming for failed, recent, and monitored jobs is now configurable via horizon config (trim.failed, trim.monitored) and uses CarbonImmutable instead of Chronos. Memory monitoring for supervisors and the master supervisor now respects the horizon.memory\_limit config and emits specific OutOfMemory events with usage details. Job lifecycle listeners were updated to handle the new JobPending event, track job silencing status, record job delay, and ensure timers are forgotten on failure or completion. Wait time monitoring now uses a Redis lock to prevent race conditions and respects per-queue wait thresholds. Notifications now support email routes, and docblocks were standardized to use fully qualified class names.
src/Listeners · high confidence
Metrics screens refactored with unified loading states and base path support
The Metrics screens (Jobs, Queues, and Preview) have been restructured to use a consistent loading indicator and a new \Horizon.basePath\ configuration for API requests. The Jobs and Queues views now display a spinner while data loads and show a simple text message when no items are found, replacing the previous custom message component. Additionally, navigation links in these views have been updated to point to the new \metrics-preview\ route, which displays throughput and runtime charts for the selected item.
resources/js/screens/metrics · high confidence
Migrate Horizon frontend to Vue 3 and Vite
The Horizon JavaScript frontend has been upgraded from Vue 2 to Vue 3, utilizing the Composition API via \createApp\ and \vue-router\ for navigation. This change includes a shift in the asset build toolchain to Vite, replacing the previous Laravel Mix setup. The application now uses \axios\ for HTTP requests with CSRF token handling, integrates \vue-json-pretty\ for JSON visualization, and supports dynamic theming via a \SchemeToggler\ component. Routing is now explicitly defined in \routes.js\, supporting dashboard, monitoring, metrics, recent jobs, failed jobs, and batches screens.
resources/js · high confidence
New ForbiddenException for unauthorized access
A new ForbiddenException class has been added to the exceptions namespace, extending Symfony's HttpException to return a 403 status code. This provides a specific exception type for handling unauthorized access scenarios within the application.
src/Exceptions · high confidence
New file-watcher utility with improved wildcard extension handling
A new bin/file-watcher.cjs script has been added to provide file system monitoring capabilities using the chokidar library. This utility now includes improved logic for extracting file extensions from wildcard patterns (e.g., \*.php), ensuring correct filtering behavior. It also detects the installed chokidar version and adapts its configuration accordingly, specifically handling the removal of glob support in chokidar version 4 by manually filtering paths based on the extracted extensions.
bin · high confidence
PHP 8.1+ constructor property promotion and improved job retry timeout handling
Jobs in the src/Jobs directory now use PHP 8.1 promoted properties, removing explicit property declarations and constructors for MonitorTag, RetryFailedJob, and StopMonitoringTag. RetryFailedJob has been updated to use Carbon for calculating retry timeouts, ensuring the retryUntil value is correctly preserved when jobs are retried. Additionally, StopMonitoringTag now uses pagination to delete monitored jobs, improving performance for tags with many associated jobs.
src/Jobs · high confidence
Project configuration and asset build tooling overhaul
This change introduces several foundational configuration files and updates the asset build pipeline. It adds \.editorconfig\ for consistent coding styles, \.gitattributes\ to manage line endings and export-ignores, \.npmrc\ to configure npm behavior, and \.styleci.yml\ for automated style checking. The asset build system has been modernized by switching from the deprecated Gulp/Laravel Elixir setup to Vite, evidenced by the new \vite.config.js\ and the removal of \gulpfile.js\. Additionally, the repository structure is refined with the addition of \LICENSE.md\, \UPGRADE.md\, and a standardized \README.md\, while legacy files like \readme.md\ and the old \phpunit.xml\ are removed in favor of \phpunit.xml.dist\ and \phpstan.neon.dist\ for static analysis.
(repo-wide) · high confidence
Removal of legacy LESS stylesheet system
The entire legacy LESS stylesheet system has been removed from the application. This includes the main entry point (app.less) and all associated component, helper, object, and settings files (such as buttons, modals, panels, typography, and color definitions). As a result, the custom UI styles defined in these files are no longer applied, which will likely cause the interface to revert to default browser styles or rely on stylesheets provided by other systems.
resources/assets/less · high confidence
Removal of legacy public CSS assets
The \public/css/app.css\ stylesheet and its corresponding source map (\app.css.map\) have been deleted from the repository. This change removes the compiled CSS bundle and its debugging metadata from the public-facing assets, indicating a shift in how styles are served or managed in the application.
public/css · high confidence
Reworked API routes with prefixing, naming, and new endpoints
The API routes in web.php have been restructured to use a common 'api' prefix, simplifying URL paths (e.g., '/api/stats' becomes '/stats' within the group). All API endpoints are now assigned explicit named routes (e.g., 'horizon.stats.index'), which improves URL generation and consistency. Additionally, new endpoints have been added to support batch management ('/batches') and viewing specific job statuses like pending, completed, and silenced jobs, while the catch-all route for the frontend view has been updated to be optional and named.
routes · high confidence
Support block\_for and after\_commit queue configuration options
The Redis connector now passes the 'block\_for' and 'after\_commit' configuration parameters to the underlying Redis queue. These options default to null, allowing users to configure blocking behavior and commit handling for Redis-based queues without requiring code changes.
src/Connectors · high confidence
Throws ForbiddenException on unauthorized access
The Authenticate middleware now throws a Laravel\\Horizon\\Exceptions\\ForbiddenException when Horizon::check() returns false, replacing the previous behavior of calling abort(403). This change ensures that unauthorized access attempts are handled via a specific exception rather than a generic HTTP 403 response.
src/Http/Middleware · high confidence
Unified Redis connections and configurable job expiration in repositories
The repository layer now consolidates Redis access to use the default 'horizon' connection instead of separate connections for supervisors, processes, tags, and metrics, simplifying configuration. Additionally, job retention is now configurable via the horizon config file (e.g., horizon.trim.recent, horizon.trim.completed), allowing users to control how long recent, pending, completed, failed, and monitored jobs are stored in Redis. The repositories also introduce support for Redis Cluster by using a cluster-aware pipeline that falls back to transactions when necessary, and switch from Chronos to Carbon for time handling.
src/Repositories · high confidence
Updated Horizon service provider stub with explicit null default for user parameter
The Horizon service provider stub now defines the \viewHorizon\ gate closure with an explicit \$user = null\ default value. This change improves developer experience by ensuring the gate function signature is robust against null inputs, preventing potential errors when the user context is not immediately available during gate evaluation.
stubs · high confidence
Updated frontend distribution assets
The distributed CSS and JavaScript files in the dist folder have been regenerated. The CSS now includes styles for a check controller component (checkboxes and radios) and tree node highlighting, while the JavaScript bundle contains updated library code (including Axios v1.18.0 and Vue 3.5.4) reflecting recent dependency upgrades and feature additions.
dist · high confidence
Fixes
Fixes Symfony Process instantiation and default working directory
The AddSupervisor command now uses Process::fromShellCommandline instead of the direct constructor to create Symfony Process instances, addressing deprecated process calls. Additionally, the default working directory for new supervisors is corrected to base\_path() when the options directory is not explicitly set, ensuring processes start in the expected location.
src/MasterSupervisorCommands · high confidence
Test coverage
Added test fixtures for event listeners, jobs, and supervisors; Added tests for job completion and tag storage listeners; Added unit tests for Redis metrics repository and updated test assertions; Expanded controller test coverage for Horizon API endpoints; Expanded test coverage for Horizon features; Test infrastructure modernization and Redis Cluster support; Updated test fakes for pool scaling and exception handling.
Dependencies
Major dependency upgrade to Laravel 9-13, PHP 8+, and Vite 5
This release upgrades the project's core dependencies, requiring PHP 8.0 or higher and supporting Laravel 9.21 through 13. The asset build system has migrated from Laravel Mix to Vite 5, and the frontend framework has been upgraded from Vue 2 to Vue 3. Additionally, the date/time library has switched from CakePHP Chronos to nesbot/carbon, and several Symfony components have been updated to versions 6, 7, and 8.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Baseline
- First survey — no prior run to compare against. CAI 46.
Lenses
- Code Health 68
- Architecture 75
- Maturity 57
- Readiness 51
- Security 83
- Accessibility 32
Changes since last survey
- 300 commits — 258 feature/other, 42 fixes
By area
- (root) — 114 commits
- resources/js — 27 commits
- src/Console — 26 commits
- dist/app.js — 21 commits
- .github/workflows — 17 commits
- src/Repositories — 9 commits
- tests/Feature — 8 commits
- src/HorizonServiceProvider.php — 7 commits
- src/Horizon.php — 5 commits
- src/Http — 5 commits
- src/RedisQueue.php — 5 commits
- (repo) — 4 commits
- .github/ISSUE_TEMPLATE — 4 commits
- resources/boost — 4 commits
- src/Listeners — 4 commits
- public/app.js — 3 commits
- src/AutoScaler.php — 3 commits
- src/Contracts — 3 commits
- art/.DS_Store — 2 commits
- bin/file-watcher.cjs — 2 commits
Notable commits
- fix: Apply fixes from StyleCI
- fix: Apply fixes from StyleCI
- fix: Apply fixes from StyleCI
- fix: Apply fixes from StyleCI
- fix: Apply fixes from StyleCI
- fix: FIX #1488 : Focused line gets hightlighted [remove .vjs-tree-node:hover] (#1492)
- fix: Fix "Delayed Until" showing the same time as "Pushed" for interval delays (#1819)
- fix: Fix MonitorWaitTimes to respect one-minute monitoring interval (#1574)
- fix: Fix Redis Cluster tests in the CI (#1817)
- fix: Fix dashboard "Max Runtime"/"Max Throughput" picking arbitrary queue (#1791)
- fix: Fix error when loading monitoried tags page(#1478) (#1485)
- fix: Fix metric clearing with PhpRedis scan prefix (#1773)
- fix: Fix null hmget response in baseSnapshotData (#1768)
- fix: Fix null to Str::contains deprecation (#1571)
- fix: Fix passing null (#1412)
- fix: Fix pop() method signature laravel/framework#53063 (#1504)
- fix: Fix setting custom ASSET_URLs and support cache busting without integrity check (#1427)
- fix: Fix the pagination when navigating to the previous and the next page (#1366)
- fix: Fix the pagination when navigating to the previous and the next page (#1630)
- fix: Fix type casting for Carbon 3 compatibility in RedisJobRepository (#1580)
- …and 280 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
laravel/horizon was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 19 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 009177cc3d0829c839c8ab573dd17d158fc0b71e — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-13a154b7f5d1.