Search

Filament v4 to v5 Upgrade Guide: What Actually Changes

Filament v4 to v5 Upgrade Guide: What Actually Changes

Key takeaways  

✓ Filament v5 is Filament v4 plus Livewire 4 support. The team says there are no other functional changes, and new features still ship to both versions.  

✓ The upgrade script ( filament/upgrade:^5.0 then  vendor/bin/filament-v5 ) handles the Filament side. The guide lists no manual Filament steps.  

✓ Your real risk is custom Livewire code:  wire:model.blur , unclosed  <livewire:...> tags,  wire:transition modifiers, the renamed config keys and the new  /livewire-{hash}/ endpoint URLs.  

✓ Budget an afternoon for a typical panel. Budget longer only if you have many custom Livewire components or plugins that haven’t released a v5-compatible version.  

 

If you have ever done a major framework upgrade, “v4 to v5” probably sounds like a week of broken forms and red test output. With Filament, it isn’t. This upgrade is much smaller than most major-version bumps in the Laravel world, but it still has a few sharp edges. This guide covers what changes, what doesn’t, and the exact order to do things in so your panel keeps working.

Why Filament v5 exists at all

Filament v5 shipped on 16 January 2026, the same week as Livewire 4. In the official announcement , Dan Harrin explains that the team bumped the major version “so that projects not requiring  livewire/livewire directly won’t have custom Livewire code broken unexpectedly.” Put simply: Livewire 4 has breaking changes, and Filament depends on Livewire. Adding Livewire 4 support in a v4 minor release would have broken apps during a routine  composer update .

So Filament v5 contains:

Area

Change from v4 to v5  

Resources, forms, tables, actions, infolists, widgets

No API changes

Livewire

v3 → v4 (the real upgrade)

Minimum PHP / Laravel

Unchanged: PHP 8.2+, Laravel 11.28+

Tailwind CSS (custom themes)

v4.0+ (you already needed this in Filament v4)

New features

Released to both v4 and v5 in parallel

 

The v5 upgrade guide is short and lists no manual Filament steps. Everything interesting happens in the Livewire 4 upgrade guide .

Before you start: a 10-minute pre-flight check

Do these first, on a fresh branch:

git checkout  -b upgrade/filament-v5    
# What's installed right now?  
composer show filament/filament livewire/livewire    
# Which packages would block Filament 5?  
composer why-not filament/filament 5.0  

composer why-not is the most useful command in this whole process. It lists every package whose constraints refuse Filament 5, which in practice means your plugins. For each one, check its page on the Filament plugin directory or Packagist for a release that allows  ^5.0 . Most popular plugins now support v4 and v5 from a single release line. Shield, Breezy, Filament Excel, Curator and Apex Charts all accept  ^4.0|^5.0 , for example.

Then take an inventory of your own Livewire code. These searches find the Livewire 4 breaking changes quickly:

# wire:model modifiers whose meaning changed in Livewire 4  
grep    -rnE    "wire:model\.(blur|change)" resources/views app    
 

# wire:transition modifiers (removed in Livewire 4)  
grep    -rn    "wire:transition\." resources/views    
# Livewire tags that are not self-closed  
grep    -rnE    "<livewire:[a-zA-Z0-9.:_-]+[^/]*>$" resources/views    
# Advanced APIs whose signatures changed  
grep    -rnE    "setUpdateRoute|->stream\(|Livewire.hook\('(commit|request)'" app resources routes  

If all four searches come back empty and every plugin has a v5 release, you are looking at a 30-minute upgrade.

Step 1: Run the automated upgrade script

The official process from the upgrade guide :

composer require filament/upgrade: "^5.0"    -W    --dev  
vendor/bin/filament-v5    
# Run the commands output by the upgrade script, they are unique to your app  
composer require filament/filament: "^5.0"    -W    --no-update  
composer update  

On Windows PowerShell, use  ~5.0 instead of  ^5.0 , because PowerShell drops the caret.

The script checks your code for compatibility issues and prints a set of Composer commands specific to your app. Don’t skip that output. It usually includes version bumps for Filament’s first-party packages (such as the Spatie Media Library plugin) and for  livewire/livewire if you require it directly.

When you’re done, remove the helper:

composer remove filament/upgrade  --dev

If you require Livewire directly in  composer.json (common if you have Livewire pages outside the panel), make sure its constraint allows v4. Current Filament 5 releases require  livewire/livewire:^4.1 :

{  
     "require" :    {  
         "filament/filament" :    "^5.0" ,  
         "livewire/livewire" :    "^4.1"  
     }  
}

 

Step 2: Fix the Livewire 4 changes that bite Filament apps

The standard parts of a Filament panel (resource forms, tables, actions, notifications) are Filament’s own Blade. Filament has already updated that Blade for Livewire 4. Your code is what needs checking: custom field views, custom pages, widgets with their own views, render hooks and standalone Livewire components.

Renamed config keys

If you published  config/livewire.php , update it. The key renames that matter most:

// Before (Livewire 3) 
'layout' =>  'components.layouts.app' , 
'lazy_placeholder' =>  'livewire.placeholder' , 
// After (Livewire 4) 
'component_layout' =>  'layouts::app' , 
'component_placeholder' =>  'livewire.placeholder' ,

smart_wire_keys now defaults to  true . You still need  wire:key inside loops, though.

wire:model.blur and  .change now delay client-side state

This one catches people inside custom Filament field views. In Livewire 3,  .blur only delayed the network request . In Livewire 4 (behaviour finalised in 4.1), it also delays syncing to  $wire . To keep the old behaviour, add  .live :

{{-- Livewire 3 --}}    
<input wire:model.blur="title">    
{{-- Livewire 4 equivalent --}}    
<input wire:model.live.blur="title">  

Well-written custom fields use Filament’s  $applyStateBindingModifiers() helper rather than hard-coding modifiers, so they may not need changes. Check any view that hard-codes them.

wire:model on a container ignores child events

Livewire 4’s  wire:model only listens to events on the element itself. If you bound  wire:model to a wrapping  <div> to catch events from inputs inside it, add  .deep :

<div wire:model.deep="value">    
    <input type=text>    
</div>  

Livewire component tags must be closed

Livewire 4 supports slots, so an unclosed tag is now read as “the rest of this file is slot content”, and the component doesn’t render at all:

{{-- Breaks in Livewire 4 --}}    
<livewire:order-timeline :order="$record">    
{{-- Correct --}}    
<livewire:order-timeline :order="$record" />  

This appears most often in custom infolist entries and Blade views loaded through  ViewField or  View schema components.

wire:transition lost its modifiers

wire:transition now uses the browser’s View Transitions API. Plain  wire:transition still works.  .opacity ,  .scale ,  .duration.500ms and similar modifiers are gone. Delete them, or move the animation into Alpine’s  x-transition .

New endpoint URLs

Livewire 4 URLs now include a hash derived from your  APP_KEY :  /livewire/update becomes  /livewire-{hash}/update . This is the change most likely to break production and not your local machine. Check:

  • WAF or firewall allow-lists (Cloudflare rules, AWS WAF) that mention  /livewire/  

  • CDN cache-bypass rules

  • Custom middleware that matches  livewire/*   

// Livewire 4  
L ivewire::setUpdateRoute( function ( $handle ,    $path ) {     
     return    R oute::post( $path ,    $handle )->middleware([ 'web' ,    'tenant' ]) ;  
}) ;

JavaScript hooks

The commit and request JavaScript hooks are deprecated in favour of Livewire.interceptMessage() and Livewire.interceptRequest(). They still work in v4, so this doesn’t block the upgrade. Plan to migrate them anyway.

Step 3: Rebuild assets and clear caches

php artisan filament:upgrade    # republishes Filament's assets
npm run build                   # rebuild any custom theme
php artisan optimize:clear      # clear config, route and view caches

Filament’s installer normally adds @php artisan filament:upgrade to your post-autoload-dump Composer scripts, so the first command may already have run. Running it twice is harmless.

In production, keep php artisan filament:optimize in your deploy script. It caches Filament components and Blade icons.

Step 4: Test the paths that matter

If you have a Pest suite (see our guide to testing Filament panels with Pest), run it now. Livewire regressions show up in component tests quickly.

Then smoke-test by hand, in this order:

  1. Log in, log out, and switch tenants (if you use multi-tenancy).
  2. Open a resource list page. Search, sort, filter and paginate.
  3. Create and edit a record using your most complex form (repeaters, file uploads, dependent selects).
  4. Run a modal action and a bulk action.
  5. Open any page that uses your own Blade or Livewire components.
  6. Check the browser console and network tab for 404s on /livewire-… URLs.

What if a plugin isn’t v5-ready yet?

The Filament docs give four options, and they’re all reasonable:

  • Temporarily remove the plugin until it’s upgraded.
  • Replace it with a v5-compatible alternative (see our 25 best Filament plugins list).
  • Wait. There’s no deadline pressure, since v4 is still supported (see below).
  • Open a pull request. For most plugins the change is a one-line constraint bump plus a Livewire 4 check.

Is there a deadline?

Not an urgent one. According to Filament’s version support policy, v4 gets bug fixes until 15 January 2027 and security fixes until 15 January 2028. Features are still being released to both lines. For help deciding whether to move now, read Filament v5 vs v4: should you upgrade yet?

What you get for your trouble

Filament v5 brings no new Filament features, but Livewire 4 brings plenty that you can use in custom pages and widgets:

  • Islands: isolated regions that re-render on their own. See Livewire 4 islands in Filament.
  • Non-blocking polling and parallel wire:model.live requests, which you get without changing any code.
  • Async actions (wire:click.async, #[Async]) for fire-and-forget calls such as tracking.
  • Deferred components (<livewire:revenue defer />) and bundled lazy loading.
  • wire:sort for drag-and-drop sorting without a JavaScript library.

Rollback plan

Because Filament’s own API didn’t change, rolling back is just a Composer revert: restore composer.json and composer.lock from your main branch, run composer install, and rebuild assets. Keep any Livewire 4 fixes (like closed component tags) in a separate commit so you can keep the harmless ones if you roll back.

FAQ

Does Filament v5 have new features compared to v4?

No. According to the Filament team, v5’s only change is Livewire 4 support, and new features are released to both v4 and v5.

How long does a Filament v4 to v5 upgrade take?

For a panel that uses only Filament components and v5-compatible plugins, usually under an hour including tests. Most of the time goes on custom Livewire components and plugins that haven’t released v5 support.

Do I need to change my resources, forms or tables?

No. Resource, schema, table and action APIs are identical in v4 and v5. The upgrade script checks for compatibility issues anyway.

Can I stay on Livewire 3 with Filament v5?

No. Filament v5 requires Livewire 4. If you need to stay on Livewire 3, stay on Filament v4, which is supported until January 2027 for bug fixes.

Why do I get 404 errors for Livewire requests after upgrading?

Livewire 4 moved its endpoints from /livewire/... to /livewire-{hash}/.... Update firewall, CDN and middleware rules that match the old prefix. If you override the update route, pass through the new $path argument.

Sources and further reading


Related on The Web Tier: Filament v3 to v5 upgrade · Filament panels on Laravel 13

TWT Staff

TWT Staff

Writes about Programming, tech news, discuss programming topics for web developers (and Web designers), and talks about SEO tools and techniques

Your experience on this site will be improved by allowing cookies Cookie Policy