NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #4429 most downloaded on Packagist
Background Jobs monitoring like Horizon for all drivers for FilamentPHP
Last release 3 days ago
04 Oct 2026
Release timing varies
gaps range from 1 weeks to 6 months
Some releases are documented
notes for 26 of 45 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
45 releases · first in 2023
Batches and chains become first-class ( #133 ). Everything here is additive and opt-in: a package left as is behaves exactly like 5.0.
Batches and chains become first-class (#133). Everything here is additive and opt-in: a package
left as is behaves exactly like 5.0.
batch_id and chain_id to queue_monitors. batch_id is read from the payload Laravel writes for every job dispatched inside Bus::batch(), and QueueMonitor::batch() / ::chain() expose the batch and the steps of a chain. The schema check is memoized, so a package whose migration has not been run behaves exactly as before. (#134, #182)->enableBatchesPage(): name, status, progress, failed and pending counts, started and finished, a status filter, and row actions to view the batch's monitored jobs, retry it (queue:retry-batch) or cancel it — each behind the matching ability. A header action prunes finished batches. The page reads job_batches instead of duplicating its state, and only registers when batches are stored in the database. (#135, #183)->enableChainsTracking(): every step of a chain gets the same chain_id. Laravel has none, and it cannot be derived afterwards, so the id is written into the payload when the chain starts and carried forward — the worker remembers the running job's id and the class its next step must have, and that expectation is consumed on the first match, so a job dispatched from inside a chained job does not join the chain. (#181, #184)Full Changelog: v5.0.0...v5.1.0
One column per quarter.
Community health files refreshed: private vulnerability reporting, a Code of Conduct, a pull request template and a CONTRIBUTING guide matching the ac…
v5 targets Filament 5 only, puts every destructive action behind an ability, and fills the two
blind spots of the dashboard: the Details modal, and how long jobs take. See UPGRADE.md for the
v4 → v5 steps; 4.x keeps receiving fixes on its own branch.
^4.0, maintained on the 4.x branch. Laravel 10 was advertised in 4.x but could never be installed: every Filament 4 and 5 release requires Laravel 11.28+. (#170)->subNavigationPosition(SubNavigationPosition::Start) restores the side column. These three pages are wide tables. (#174)queues config key defaults to null, which discovers the queues instead of listing them. An explicit array keeps working exactly as before, so a published config is unaffected. (#178)authorize*() methods, a policy on the QueueMonitor model, a gate of the same name, then the authorization.fallback config key. Denied actions are hidden rather than failing on click, and a denied view closes the routes instead of only hiding the navigation entry. fallback is true by default, so nothing changes until the abilities are granted and it is set to false. (#141, #173, #175)attempt and finished_at columns hidden by default, a searchable job name, a queue filter and a started_at range filter. (#138, #177)queue_monitors, the jobs and failed_jobs tables, the configured connections and Horizon's supervisors, cached for queue_discovery.cache_ttl. Observed queues are what makes Redis and SQS usable here, since neither can enumerate its queues. (#140, #178)anomaly_multiplier × its class median (once the class has min_samples runs), with a badge and tooltip on the duration column, a Slow filter option, a Top slow jobs widget (runs, median, p95, trend) and a JobMonitorSlow event. Medians and percentiles are computed in PHP from a single query. (#142, #179)->subNavigationPosition() on the plugin, and the config key now accepts the enum or its string value. (#143, #174)resources.polling_interval. (#163, #166)composer analyse; models document their columns. composer test and composer lint scripts added. (#158).text-primary-600 compiles to color:var(--primary-600) instead of a hardcoded amber, in light and dark mode. (#152, #171)npm run build no longer fetches Filament's stylesheet from GitHub at build time, and a CI job fails if the committed build is out of date. (#168, #169)prefer-lowest job, behind a single tests status check. Every GitHub Action is pinned to a commit SHA, and Dependabot covers npm with an update cooldown. (#150, #157, #167, #170)resources.enabled is honoured again for the navigation: a strict comparison made the config fallback unreachable, so the key was ignored. (#159)SubNavigationPosition::Sidebar was referenced in the config comment, the README and UPGRADE.md; it does not exist in Filament 5 (the cases are Start, End and Top), so following that comment threw. (#174)vendor:publish tags are covered by a test, and the dead QueueMonitor facade alias was removed. (#162, #165)plural_model_label key, and the Job History sub-navigation no longer falls back to the class name. (@saythe0 — #149)Full Changelog: v4.6.3...v5.0.0
Filament panels lost their spacing since 4.6.0 : the stylesheet wrapped in @layer components for #145 is printed by @filamentStyles , before the panel
@layer components for #145 is printed by @filamentStyles, before the panel theme, so it was the first to name a layer and ranked components below base. Tailwind's preflight (* { margin: 0; padding: 0 }) then won over every fi-* component: topbar, sidebar, tables and forms lost their padding and gaps on every page of the panel. The build now prepends Tailwind's layer order (@layer properties,theme,base,components,utilities;), and a test checks it against the order of Filament's own theme. (#164)Full Changelog: v4.6.2...v4.6.3
Community health files : vulnerabilities are now reported through GitHub private vulnerability reporting (see SECURITY.md ), plus a Code of Conduct, a…
resources.enabled is honoured again for the navigation: shouldRegisterNavigation() compared with === true before a ?? fallback that could therefore never be reached, and the navigation flag defaulted to true, so the config key was ignored. When enableNavigation() is not called, the config key now decides (default true); the fluent method still takes precedence. Upgrade note: apps that published the config with 'enabled' => false without calling enableNavigation() will now see the navigation item hidden, as that key intended. (#159)illuminate/contracts is now ^11.28|^12.0|^13.0. Laravel 10 was listed but could never be installed, since every Filament 4 and 5 release requires Laravel 11.28+. The CI now runs every Laravel 11/12/13 × Filament 4/5 pair, with prefer-lowest jobs, instead of Laravel 12 + Filament 5 only. (#157)@property, and a PHPStan workflow runs on every push and PR. composer analyse and composer test scripts added. (#158)SECURITY.md), plus a Code of Conduct, a pull request template, a feature request issue template, and an updated CONTRIBUTING guide. (#160)Full Changelog: v4.6.1...v4.6.2
Localised "Job History" sub-navigation label : the first entry of the Jobs / Pending / Failures sub-navigation had no label of its own, so Filament de
ListQueueMonitors now uses the existing queued_jobs key, like its two siblings. (@saythe0 — #149)plural_model_label key: resources.plural_label now defaults to filament-jobs-monitor::translations.plural_model_label instead of reusing navigation_label, and the key exists in all 15 locales. Published configs still pointing at navigation_label keep working unchanged. (@saythe0 — #149)package-lock.json), and both ecosystems get an update cooldown. CI configuration only, no source change. (#150)Full Changelog: v4.6.0...v4.6.1
Russian translations : a complete ru locale, in full parity with en . ( @saythe0 — #146 )
ru locale, in full parity with en. (@saythe0 — #146)clear_logs, clear_logs_heading, clear_logs_description, clear_logs_confirm and logs_cleared. Closes #139. (@saythe0 — #146)label, plural_label and navigation_group now default to translation keys instead of hardcoded English, so they follow the panel locale. (@saythe0 — #146)pl are now translated, bringing pl to full parity with en. (@webard — #131)TranslationParityTest asserts that every locale matches en key for key, keeps the same :count / :minutes / :delta placeholders, and keeps every pluralised string pluralised. Locales still behind — ar, cs, de, es, fa, he, it, nl, pt_BR, sk — are listed in an INCOMPLETE_LOCALES constant and reported as skipped; the test fails both when a covered locale drifts and when a listed one becomes complete, so the list has to shrink. (#144)navigation_group keeps its Settings wording: the key is now actually rendered (it previously existed in the locale files but was never read — the config shipped a hardcoded 'Settings'). Its en value moved from System to Settings, and every locale was realigned on the local wording for Settings, so panels that never published the config keep the navigation group they have always shown, and now get it localised.label, plural_label and navigation_group are only resolved through __() when they can address a translation file. A plain string such as 'Jobs' carries neither a :: namespace nor a . group, so Laravel would look it up in the application's resources/lang/{locale}.json and an unrelated entry there could silently rewrite a label configured by the user; such values are now used verbatim. (@saythe0 — #146)@layer components. It previously shipped bare utilities (.block, .flex, .hidden, .w-full, …) outside any cascade layer, and unlayered CSS outranks rules inside @layer utilities — the most visible symptom was hidden md:block staying hidden at every viewport. (@gmagnenat — #145, #147)Full Changelog: v4.5.0...v4.6.0
pl (failure groups, stack-trace viewer, failure stats widgets) are now translated, bringing pl to full parity with en. (@webard — #131)TranslationParityTest asserts that every locale matches en key for key, keeps the same :count / :minutes / :delta placeholders, and keeps every pluralised string pluralised — in either of Laravel's notations, the explicit {1} …|[2,*] … intervals or the implicit one|few|many positional forms. How many forms a locale declares stays language-specific and is not asserted. Locales still behind — ar, cs, de, es, fa, he, it, nl, pt_BR, sk — are listed in an INCOMPLETE_LOCALES constant and reported as skipped; the test fails both when a covered locale drifts and when a listed one becomes complete, so the list has to shrink.ru locale, in full parity with en. (@saythe0 — #146)clear_logs, clear_logs_heading, clear_logs_description, clear_logs_confirm and logs_cleared. Closes #139. (@saythe0 — #146)label, plural_label and navigation_group now default to translation keys instead of hardcoded English, so they follow the panel locale. (@saythe0 — #146)model_label and the five clear_logs / logs_cleared ones), keeping fr and pl in full parity with en.navigation_group keeps its Settings wording: the key is now actually rendered (it previously existed in the locale files but was never read — the config shipped a hardcoded 'Settings'). Its en value moved from System to Settings, and every locale was realigned on the local wording for Settings, so panels that never published the config keep the navigation group they have always shown, and now get it localised.label, plural_label and navigation_group are only resolved through __() when they can address a translation file. A plain string such as 'Jobs' carries neither a :: namespace nor a . group, so Laravel would look it up in the application's resources/lang/{locale}.json and an unrelated entry there could silently rewrite a label configured by the user; such values are now used verbatim.resources/dist/filament-jobs-monitor.css is registered globally through FilamentAsset, so it loads on every page of every panel. It shipped bare utilities (.block, .flex, .hidden, .w-full, …) outside any cascade layer, and unlayered CSS outranks rules inside @layer utilities regardless of source order — which is where Filament emits the app's own utilities. The most visible symptom was hidden md:block staying hidden at every viewport. The build output is now wrapped in @layer components, so the app's utilities win again. (@gmagnenat — #145)Sentry-style Failures page — failed jobs grouped by signature (exception + job + normalised message), with a stats overview, per-group 7-day sparkline
php artisan filament-jobs-monitor:prune — a dedicated command to prune QueueMonitor records directly, since Laravel's model:prune only auto-discovers models under app/Models. (@luiseduardobraschi — #120)tenancy.payload_key. (@zerdotre — #115)0 on SQLite. (@mokhosh — #55)prunable() no longer crashes when pruning is disabled. (#120)sub_navigation_position config key. (@DanielFatkic — #118)Full changelog: v4.4.1...v4.5.0
Thanks to everyone who reported issues and contributed to this release! 🙏
add_failures_to_filament-jobs-monitor_table migration; if it isn't run the plugin keeps working and simply skips grouping. (#119)php artisan filament-jobs-monitor:prune: prunes the package's QueueMonitor records directly, since Laravel's model:prune only auto-discovers models under app/Models. (@luiseduardobraschi — #120)CallQueuedListener, with a configurable tenancy.payload_key (default tenant_id). (@zerdotre — #115)strftime on SQLite, UNIX_TIMESTAMP on MySQL/MariaDB, EXTRACT(EPOCH …) on PostgreSQL) instead of a raw datetime subtraction that returned 0 on SQLite. (@mokhosh — #55)prunable() crash when pruning is disabled: it returned false, which broke pruneAll() (Call to a member function when() on false); it now returns a query that matches nothing (safe no-op). (#120)sub_navigation_position entry. (@DanielFatkic — #118)run-tests workflow running Pest on PHP 8.4 and 8.5. (#125)actions/checkout from 6 to 7. (#122)Details action modal crash : Fixed Attempt to read property "exception_message" on null when clicking the "Details" action on QueueMonitorResource . T
Attempt to read property "exception_message" on null when clicking the "Details" action on QueueMonitorResource. The closure parameter was renamed from $queueMonitor to $record to match Filament 5 conventions. (@danielebarbaro — #111)dependabot/fetch-metadata from 3.0.0 to 3.1.0 (#112)--auto --merge with --squashFull Changelog: v4.4.0...v4.4.1
Attempt to read property "exception_message" on null error when clicking the "Details" action on QueueMonitorResource. The closure parameter was renamed from $queueMonitor to $record to match Filament 5 conventions. (@danielebarbaro — #111)dependabot/fetch-metadata from 3.0.0 to 3.1.0 (#112)--auto --merge with --squash to work without the auto-merge repository settingint|string tenant ID support — scopeForTenant() now accepts both integer and string tenant IDs, enabling compatibility with packages like tenancyforla
int|string tenant ID support — scopeForTenant() now accepts both integer and string tenant IDs, enabling compatibility with packages like tenancyforlaravel that use string-based UUIDs. The PHP payload serialization query has been updated from i:123; format to s:3:"123"; format. (@zerdotre — #106)tenant_id column is now visible in the table when multi-tenancy is enabled in the config.tenant_id column type changed from unsignedBigInteger to string (with index). This only affects new installations.If you were using integer-based tenant IDs, the serialization format in scopeForTenant() has changed:
| Before | After |
|---|---|
i:123; (PHP int) |
s:3:"123"; (PHP string) |
New jobs dispatched after upgrading will use the string format. Existing records in queue_monitors are not modified. If you need to query historical records, create a data migration or keep your $tenantId typed as int.
A big thank you to @zerdotre for contributing both features in this release! 🙌
Full Changelog: https://github.com/ultraviolettes/filament-jobs-monitor/blob/main/CHANGELOG.md
int|string tenant ID support: scopeForTenant() now accepts both integer and string tenant IDs, enabling compatibility with packages like tenancyforlaravel that use string-based UUIDs as tenant identifiers. The PHP payload serialization query has been updated accordingly. (@zerdotre — #106)tenant_id column is now visible in the table when multi-tenancy is enabled in the config.tenant_id column type changed from unsignedBigInteger to string (with index). This only affects new installations — existing users who need this change should create a new migration to alter the column type.Note for existing multi-tenant users: If you were using integer-based tenant IDs, the serialization format used in
scopeForTenant()has changed from PHP integer format (i:123;) to PHP string format (s:3:"123";). Existing records in thequeue_monitorstable are not affected, but new jobs dispatched with string-typed$tenantIdwill be stored and queried using the string format.
Fix: getModel() should return class-string, not class instance ( #107 by @webard )
getModel() should return class-string, not class instance (#107 by @webard)
Class "[]" not found error after upgrading from v4.2 to v4.3resolve(QueueMonitor::class) returned an object instance instead of a class name stringresolve(QueueMonitor::class)::class to correctly return the FQCNcomposer update croustibat/filament-jobs-monitorResolvable Model — The QueueMonitor model can now be replaced with a custom implementation via Laravel's container. Simply bind your own model in a Se
QueueMonitor model can now be replaced with a custom implementation via Laravel's container. Simply bind your own model in a ServiceProvider. (thanks @webard — #102)dependabot/fetch-metadata from 2.5.0 to 3.0.0. (#103)| Version | FilamentPHP | PHP |
|---|---|---|
| 1.* | 2.* | 8.1 |
| 2.* | 3.* | >= 8.1 |
| 3.* | 4.* | >= 8.1 |
| 4.* | 5.* | >= 8.2 |
This release brings all community contributions from v3.3.0 to the Filament v5 branch.
This release brings all community contributions from v3.3.0 to the Filament v5 branch.
config('filament-jobs-monitor.connection'). Supports both explicit queries and implicit model queries. (inspired by @zerdotre — #95)illuminate/contracts: ^13.0 support. (thanks @laravel-shift — #98)UnitEnum can now be used for the navigation group, aligning with Filament's native PHP 8.1 enum support. (thanks @blackshadev — #96)| Version | FilamentPHP | PHP |
|---|---|---|
| 1.* | 2.* | 8.1 |
| 2.* | 3.* | >= 8.1 |
| 3.* | 4.* | >= 8.1 |
| 4.* | 5.* | >= 8.2 |
Updated README screenshots for Filament v5 dark theme
Full Changelog: v4.1.1...v4.1.2
Fix Action class imports for Filament v4/v5 compatibility
Filament\Tables\Actions to Filament\Actions namespaceFull Changelog: v4.1.0...v4.1.1
Bulk Retry : Select multiple failed jobs and retry them all at once
All features include English and French translations.
Full Changelog: v4.0.0...v4.1.0
Nothing published for this version
🌍 German Translation Update (PR #97 )
UnitEnum support for navigation group (PHP 8.1+)NavigationGroup^13.0 to illuminate/contracts constraintconnection config key in filament-jobs-monitor.phpnull)tenancy config section (enabled, model, column)QueueMonitor, FailedJob, and QueueJob modelsFilament::getTenant() usage)tenant_id columnFull Changelog: 3.2.0...v3.3.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
This release adds support for Filament v4, which includes several breaking changes from Filament v3. Please see UPGRADE.md for a complete migration gu…
This release adds support for Filament v4, which includes several breaking changes from Filament v3. Please see UPGRADE.md for a complete migration guide.
^3.0 to ^4.0form(Form $form) method signature to form(Schema $schema) following Filament v4 conventionsFilament\Tables\Actions to Filament\Actions namespacegetActions() to getHeaderActions() in ListRecords pages (visibility changed from public to protected)getCards() to getStats() in StatsOverviewWidget classesHasNavigation trait to resources for better navigation handlingsub_navigation_position configuration option to customize sub-navigation placement (Top or Sidebar)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
https://github.com/croustibat/filament-jobs-monitor/releases/tag/2.3.0
https://github.com/croustibat/filament-jobs-monitor/releases/tag/2.3.0
https://github.com/croustibat/filament-jobs-monitor/releases/tag/2.2.0
https://github.com/croustibat/filament-jobs-monitor/releases/tag/2.2.0
https://github.com/croustibat/filament-jobs-monitor/releases/tag/2.1.0
https://github.com/croustibat/filament-jobs-monitor/releases/tag/2.1.0
Implement a configurable panel plugin class
Fix : apply sortable to Table (not Forms)
Nothing published for this version
Jobs are sorted by started date from the most recent to the oldest
https://github.com/croustibat/filament-jobs-monitor/releases/tag/1.3.0 Thanks to the contributors <3
https://github.com/croustibat/filament-jobs-monitor/releases/tag/1.2.0 Thanks to the contributors <3
https://github.com/croustibat/filament-jobs-monitor/releases/tag/1.2.0 Thanks to the contributors <3
Thanks to @cntabana there's now a config file to enable/disable the navigation menu
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Initial release : this FilamentPHP plugin contains files to monitor queue jobs. It is compatible with all drivers.
Your coding agent can read these notes before it upgrades. Set up the MCP server →