Filament v5 Is Closer Than You Think
Filament v5 is currently in active development, and the alpha releases reveal a clear architectural direction: deeper schema unification, a leaner JavaScript footprint, and stricter separation between panel configuration and resource logic. If you are running a production Filament v3 or v4 application, the time to audit your codebase is now — not after the stable tag drops.
This article focuses on the concrete changes visible in the alpha, the patterns that will break silently, and the refactors worth doing today.
Schema Unification Goes Further
Filament v4 introduced the unified Schema API for forms and infolists. v5 extends this to table column definitions and action modals, meaning a single Schema object can describe a form, an infolist, a table row detail, and a confirmation modal without switching between different builder APIs.
The practical consequence: any code that calls ->form([...]) directly on a Table action will need to be migrated to the schema-first style:
// v4 style — still works in early v5 alpha but flagged deprecated
Action::make('approve')
->form([
TextInput::make('reason')->required(),
]);
// v5 idiomatic — schema-first
Action::make('approve')
->schema([
TextInput::make('reason')->required(),
]);
The ->form() shorthand is not removed yet, but the deprecation notice is there. Migrate proactively.
Deferred Loading Is Now Opt-Out, Not Opt-In
One of the most impactful runtime changes: table widgets and relation managers defer their first query by default. In v4 you had to explicitly call ->deferLoading(). In v5 the default flips.
This is great for perceived performance on dashboards with many widgets, but it breaks any Pest test that asserts table rows are visible immediately after mounting:
// This will fail in v5 without the eager flag
livewire(ListOrders::class)
->assertCanSeeTableRecords($orders);
// Fix: disable deferred loading in the resource for tests,
// or call the new ->loadTable() helper in the test
livewire(ListOrders::class)
->call('loadTable') // triggers the deferred load
->assertCanSeeTableRecords($orders);
Add a ->deferLoading(false) override in your test base class or create a dedicated InteractsWithFilamentTables trait that calls loadTable automatically.
Panel Configuration Becomes a Dedicated Class
In v5, the inline closure-heavy PanelProvider is being replaced by a first-class PanelConfiguration value object. Instead of chaining dozens of methods inside boot(), you declare a typed class:
class AdminPanelConfiguration extends PanelConfiguration
{
public string $id = 'admin';
public string $path = 'admin';
public array $resources = [
UserResource::class,
OrderResource::class,
];
public function middleware(): array
{
return [Authenticate::class, VerifyTenantAccess::class];
}
}
The PanelProvider still exists as a thin bootstrap shim, but the logic lives in the configuration class. This makes panels unit-testable without booting the full HTTP kernel — a significant win for large teams.
What to Audit Right Now
Before v5 stable, run through these checks:
- Search for
->form([onActionandTableActioninstances — migrate to->schema([. - Find every
assertCanSeeTableRecordsin your Pest suite — wrap with aloadTablecall or disable deferred loading per resource. - Identify inline closures in
PanelProvider::panel()— extract them to named methods or start sketching yourPanelConfigurationclasses. - Check custom render hooks — the hook names for table headers and footers have been namespaced more granularly in v5 alpha.
- Review any
Filament::serving()callbacks — the serving lifecycle has been split intobootingandservingphases with different timing guarantees.
Key Takeaways
- Migrate
->form()on actions to->schema()now; the deprecation is live in alpha. - Deferred table loading flips to opt-out — update your Pest assertions accordingly.
PanelConfigurationclasses replace closure-heavy providers and unlock unit testing of panel setup.- Render hook names are being namespaced; audit custom hooks before upgrading.
- Start the migration incrementally — v5 alpha is stable enough for a staging branch audit today.