What Filament v5 Is Actually Changing
Filament v5 is not a cosmetic release. The core team is pushing three structural bets: a unified render pipeline across forms, infolists, and tables; first-class support for deferred/streamed component hydration; and a leaner JavaScript footprint that removes the remaining Alpine coupling from the PHP layer.
If you are running a large Filament v4 panel today, some of these changes will require deliberate refactoring — not just a composer update.
The Unified Render Pipeline
In v4, forms and infolists share the Schema API, but table columns still carry their own rendering contract. In v5, columns, form fields, and infolist entries are all first-class Schema\Component descendants with a single lifecycle:
resolve → configure → render
This means custom columns you built by extending Filament\Tables\Columns\Column will need to be re-expressed as schema components. The old getStateUsing / formatStateUsing hooks still exist but are now implemented as pipeline taps on the shared component base, not column-specific overrides.
Practical impact: Any package or plugin that extends Column directly will break. Start auditing your custom columns now.
// v4 custom column (will break in v5)
class StatusBadgeColumn extends Column
{
protected function setUp(): void
{
$this->formatStateUsing(fn ($state) => Str::upper($state));
}
}
// v5 direction — extend the shared SchemaComponent base
class StatusBadgeColumn extends \Filament\Schemas\Components\Component
{
protected string $view = 'columns.status-badge';
public function setUp(): void
{
$this->tap(fn ($component) => $component->state(
fn ($record) => Str::upper($record->status)
));
}
}
Deferred Hydration and What It Means for State
Filament v5 introduces opt-in deferred hydration for heavy schema sections. You annotate a group as ->deferred() and Filament renders a lightweight skeleton on the initial page load, then streams the real component HTML via a follow-up Livewire request.
Section::make('Analytics')
->deferred()
->schema([
StatsOverviewWidget::make(),
RevenueChart::make(),
])
The catch: deferred sections cannot share reactive state with non-deferred siblings on the same form. If you have $set / $get calls crossing that boundary, they will silently no-op. Audit your inter-field dependencies before enabling this.
Alpine Decoupling
Filament v4 still ships Alpine directives baked into Blade components (x-data, x-show, x-on). In v5 the PHP layer emits only data attributes; a thin Filament JS layer handles DOM behaviour. This makes it possible to swap Alpine for another reactive micro-library, but it also means:
- Any custom field that injects raw
x-datainto its view will need to be rewritten using the newFilamentJs::data()/FilamentJs::on()helpers. - The
@entangledirective is replaced by a first-partywire:filament-bindattribute that the Filament JS layer intercepts.
How to Prepare Your v4 Codebase Today
1. Eliminate direct Alpine in custom views
Replace x-data="{ open: false }" patterns with Livewire-native state where possible. This makes the Alpine decoupling a non-event for you.
2. Audit every class that extends Column
Run a quick grep:
grep -rn 'extends Column' app/ packages/
Document each hit. These are your v5 migration targets.
3. Centralise formatStateUsing logic into plain callables
If your formatting logic lives in a closure passed to formatStateUsing, extract it to an invokable class. The invokable will survive the pipeline refactor unchanged.
// Before
->formatStateUsing(fn ($state) => Number::currency($state, 'GBP'))
// After — survives the v5 migration
->formatStateUsing(new FormatCurrency('GBP'))
4. Pin your Filament packages to ^4.0 now
Do not use * or @dev constraints in production. When v5 tags drop, a loose constraint will pull a breaking release.
Takeaways
- Filament v5 unifies columns, fields, and entries under one
SchemaComponentbase — custom columns will break. - Deferred hydration is powerful but incompatible with cross-boundary reactive state.
- Alpine is being decoupled from the PHP layer; raw
x-datain custom views must be migrated. - Audit
extends Columnusages and extract formatting logic to invokables today. - Pin Filament to
^4.0incomposer.jsonuntil you have a tested upgrade path.