What's new in v0.1.0

v0.1.0 May 20, 2026

First tracked release. Early beta. Earlier history not recorded — see git log for changes prior to release-tracker adoption.

Release Tracker — Documentation

Filament Release Tracker

tests

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), timestamps
  • user_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.

Credits

Codenzia.

Powered by Codenzia
✓ Thanks! We read every message.