Filament Release Tracker
Per-app release history tracker for Filament apps. Records releases as deploy-shipped migrations and surfaces them in dashboard widgets and a one-time "What's New" modal.
When you support a customer running one of your apps, log into their admin and the dashboard tells you exactly what version they're on, what plugins are installed, and what shipped in each release — no spreadsheets, no API, no heartbeat service.
Requirements
- PHP 8.3+
- Laravel 11+ / 12+
- Filament 4.x or 5.x
- Livewire 3.x (required by Filament)
Installation
Migrations create two tables:
releases— version (unique), released_at, notes (markdown), timestampsuser_release_seens— tracks which users have seen which release for the "What's New" modal
Register the plugin on your Filament panel:
That's it. The plugin registers the ReleaseResource (under the System
navigation group), one tabbed dashboard widget, and a global "What's New" modal.
Recording a release
When you cut a new version of your app, run the release:add artisan command
in your dev copy:
You can also load notes from a file:
The command generates a timestamped migration at
database/migrations/<ts>_release_v1_4_2.php that updateOrInserts the row.
Commit the migration alongside the code changes for the release. When you deploy
to a customer, php artisan migrate runs the new migration and the release
history is updated automatically — no per-customer manual entry, no API.
Optional flags:
| Flag | Description | Default |
|---|---|---|
--notes |
Release notes (Markdown) | empty |
--notes-file |
Path to a Markdown file containing release notes | — |
--released-at |
Release date YYYY-MM-DD |
today |
Dashboard widget
The plugin registers a single full-width ReleaseDashboardWidget
(columnSpan = 'full', negative sort so it lands at the top) with two tabs.
Tabs keep the dashboard compact — only one panel is tall at a time instead of
two sections stacking vertically.
Current Release tab
Shows the running release: version, date, expandable notes (markdown rendered),
"N previous releases tracked" count, plus a compact dependency grid
(PHP, Laravel, Filament, panel-base versions read from composer.lock).
If no release rows exist yet, the tab prints the release:add command
you should run to start tracking.
Installed Plugins tab
Lists every installed Composer package whose name starts with one of the
configured vendor_prefixes (default: codenzia/). Each entry shows the
installed version. If the package ships a CHANGELOG.md in
Keep a Changelog format
(## [x.y.z] - YYYY-MM-DD headings), the most recent entry is rendered
inline.
To surface non-Codenzia plugins (for example, your own private add-ons), edit the config:
"What's New" banner
After each release:add, the next time an authenticated user lands on any
Filament panel page they see a one-time, non-blocking banner at the top of the
page content listing every release they haven't yet acknowledged. The banner is
collapsed by default ("View" expands the notes inline); it never covers the page
or blocks interaction. Dismissing it writes a row into user_release_seens so it
stays silent until the next release.
Disable globally:
Restrict to specific roles (requires spatie/laravel-permission or any model
that exposes hasAnyRole()):
Skip the modal but keep the widget:
Plugin configuration
Each piece can be turned off independently via fluent methods on the plugin:
Publish the config to override defaults:
Extending the Release model
If you need custom scopes, accessors, or relationships on releases:
Then point the config at your subclass:
The ReleaseResource reads its model from the same config key, so the entire
package follows the swap.
Plugin CHANGELOG convention
For the "Installed Plugins" tab to surface a plugin's changelog inline, the
plugin's CHANGELOG.md should use the Keep a Changelog format with dated
section headers:
The parser matches ^## \[([\d.]+(?:[-+][\w.]+)?)\] - (\d{4}-\d{2}-\d{2})$,
captures the body until the next ## heading as notes, and skips
## [Unreleased] (no date). Cached for 10 minutes per package via Laravel's
cache store.
Testing
Tests cover the changelog parser, the Release model's default ordering and
casts, the release:add migration generator, and the widgets' data shapes.
License
MIT or proprietary, at your option.