Laravel upgrades

Laravel package compatibility matrix

Packages are what usually hold an upgrade back. This table shows which Laravel and PHP versions each release line of 53 common packages allows, read from Packagist.

By itmarkerz Technologies. Last checked against Packagist on 30 October 2026.

The table

Each row is the newest stable release in that package’s major version. “Allows Laravel” is our reading of the constraint beside it, which we quote exactly as published. Package names link to the source. Pick a Laravel version below, then tick the box to list only what stands in your way.

Showing 100 of 100 release lines.

Each package’s latest release per major version, with its Laravel and PHP constraints
PackageLatest in lineAllows LaravelLaravel constraintPHP constraintNote
Admin and UI
filament/filamentv5.11.02026-10-2611, 12, 13^11.28|^12.0|^13.0^8.2Needs Livewire 4.4 or later.
filament/filamentv4.16.02026-10-2611, 12, 13^11.28|^12.0|^13.0^8.2Needs Livewire 3.8 or later.
filament/filamentv3.3.572026-10-1210, 11, 12, 13^10.45|^11.0|^12.0|^13.0^8.1Allows Laravel 13, so the framework can move first.
filament/filamentv2.17.592025-11-118, 9, 10^8.6|^9.0|^10.0^8.0Needs Livewire 2. This line blocks any move past Laravel 10.
livewire/livewirev4.4.82026-10-2110, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.1
livewire/livewirev3.8.112026-10-2110, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.1
livewire/livewirev2.12.82024-07-138, 9, 10^7.0|^8.0|^9.0|^10.0^7.2.5|^8.0Stops at Laravel 10.
inertiajs/inertia-laravelv3.5.22026-10-2111, 12, 13^11.35|^12.0|^13.0^8.2.0
inertiajs/inertia-laravelv2.0.282026-09-2510, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.1.0
inertiajs/inertia-laravelv1.3.42025-12-158, 9, 10, 11, 12^8.74|^9.0|^10.0|^11.0|^12.0^7.3|~8.0.0|~8.1.0|~8.2.0|~8.3.0|~8.4.0Stops at Laravel 12. Its PHP constraint also ends at 8.4.
backpack/crud7.1.222026-10-0812, 13^12|^13Not declared
backpack/crud6.8.172026-09-1510, 11, 12^10.0|^11.0|^12Not declaredStops at Laravel 12.
backpack/crud5.6.22026-05-178, 9, 10^10.0|^9.0|^8.69Not declared
orchid/platform14.53.02026-03-2110, 11, 12, 13^10.0 || ^11.0 || ^12.0 || ^13.0Not declared
rappasoft/laravel-livewire-tablesv3.10.02026-10-2010, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.1|^8.2|^8.3|^8.4
rappasoft/laravel-livewire-tablesv2.15.02023-07-158, 9, 10^8.0|^9.0|^10.0^7.4|^8.0|^8.1|^8.2
yajra/laravel-datatables-oraclev13.3.12026-09-1513^13^8.3One major per Laravel major: install the one matching your framework.
yajra/laravel-datatables-oraclev12.7.22026-05-1612^12^8.2Laravel 12 only.
yajra/laravel-datatables-oraclev11.1.62025-01-2111^11^8.2Laravel 11 only.
laravel/nova5.x10, 11, 12, 1310.x, 11.x, 12.x or 13.x (Nova docs)Not declaredPrivate package. Taken from Nova's requirements page, not a Composer constraint. That page names no minimum PHP version.
Auth and API
laravel/sanctumv4.3.32026-06-2311, 12, 13^11.0|^12.0|^13.0^8.2
laravel/sanctumv3.3.32023-12-199, 10^9.21|^10.0^8.0.2
laravel/passportv13.10.02026-10-0811, 12, 13^11.35|^12.0|^13.0^8.2
laravel/passportv12.4.32026-02-199, 10, 11, 12^9.21|^10.0|^11.0|^12.0^8.0Stops at Laravel 12.
laravel/fortifyv1.41.02026-09-2811, 12, 13^11.0|^12.0|^13.0^8.2
laravel/socialitev5.31.02026-08-318, 9, 10, 11, 12, 13^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0^8.1
laravel/jetstreamv5.5.32026-05-1911, 12, 13^11.0|^12.0|^13.0^8.2.0
laravel/jetstreamv4.3.12024-02-2910^10.17^8.1.0
laravel/breezev2.4.22026-05-1411, 12, 13^11.0|^12.0|^13.0^8.2.0
laravel/breezev1.29.12024-03-0410^10.17^8.1.0
tymon/jwt-auth2.3.12026-10-249, 10, 11, 12, 13^9.0|^10.0|^11.0|^12.0|^13.0^8.0
php-open-source-saver/jwt-authv2.9.32026-08-2112, 13^12|^13^8.3
spatie/laravel-permission8.3.22026-10-1912, 13^12.0|^13.0^8.3
spatie/laravel-permission7.4.22026-05-3012, 13^12.0|^13.0^8.3
spatie/laravel-permission6.25.02026-03-178, 9, 10, 11, 12, 13^8.12|^9.0|^10.0|^11.0|^12.0|^13.0^8.0
Billing
laravel/cashierv16.9.02026-10-1310, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.1
laravel/cashierv15.8.02026-03-3010, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.1
laravel/cashierv14.14.02023-11-219, 10^9.21|^10.0^8.0
laravel/cashier-paddlev2.8.12026-04-0110, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.1
laravel/cashier-paddlev1.12.02025-02-258, 9, 10, 11, 12^8.0|^9.0|^10.0|^11.0|^12.0^7.4|^8.0
laravel/spark-stripe, laravel/spark-paddleSee release notes13“Supports Laravel 13” (Spark release notes)Not declaredPrivate package. We confirmed Laravel 13 support only, so older Laravel versions here mean not checked, not excluded.
Queues and operations
laravel/horizonv5.50.12026-10-139, 10, 11, 12, 13^9.21|^10.0|^11.0|^12.0|^13.0^8.0
laravel/telescopev5.26.02026-09-228, 9, 10, 11, 12, 13^8.37|^9.0|^10.0|^11.0|^12.0|^13.0^8.0
laravel/telescopev4.17.62024-02-088, 9, 10^8.37|^9.0|^10.0^8.0
laravel/pulsev1.8.12026-08-2010, 11, 12, 13^10.48.4|^11.0.8|^12.0|^13.0^8.1
laravel/nightwatchv1.30.62026-10-2710, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.2
laravel/octanev2.22.02026-10-1410, 11, 12, 13^10.10.1|^11.0|^12.0|^13.0^8.1.0
laravel/octanev1.5.62023-05-168, 9, 10^8.83.26|^9.38.0|^10.0^8.0
laravel/reverbv1.12.02026-09-2210, 11, 12, 13^10.47|^11.0|^12.0|^13.0^8.2
laravel/scoutv11.9.02026-10-069, 10, 11, 12, 13^9.0|^10.0|^11.0|^12.0|^13.0^8.0
laravel/scoutv10.25.02026-03-109, 10, 11, 12, 13^9.0|^10.0|^11.0|^12.0|^13.0^8.0
laravel/pennantv1.26.02026-08-1310, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.1
sentry/sentry-laravel4.29.02026-10-088, 9, 10, 11, 12, 13^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0 | ^13.0^7.2 | ^8.0
spatie/laravel-backup10.3.32026-09-1412, 13^12.40|^13.0^8.3
spatie/laravel-backup9.4.12026-02-1512^12.40^8.3
spatie/laravel-backup8.8.22024-08-0710, 11^10.10.0|^11.0^8.1
Data and files
maatwebsite/excel4.0.62026-10-2312, 13^12.0 || ^13.0^8.3
maatwebsite/excel3.1.702026-08-138, 9, 10, 11, 12, 135.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0||^12.0||^13.0^7.0||^8.0
barryvdh/laravel-dompdfv3.1.22026-02-219, 10, 11, 12, 13^9|^10|^11|^12|^13.0^8.1
barryvdh/laravel-dompdfv2.2.02024-04-258, 9, 10, 11^6|^7|^8|^9|^10|^11^7.2 || ^8.0
intervention/image-laravel4.1.12026-07-228, 9, 10, 11, 12, 13^8|^9|^10|^11|^12|^13^8.3
intervention/image-laravel1.5.92026-03-248, 9, 10, 11, 12, 13^8|^9|^10|^11|^12|^13^8.1
spatie/laravel-medialibrary11.23.112026-10-2612, 13^12.0|^13.0^8.2
spatie/laravel-medialibrary10.15.02023-11-039, 10^9.18|^10.0^8.0
spatie/laravel-activitylog5.1.32026-10-1912, 13^12.0 || ^13.0^8.4PHP 8.4 floor, which rules out PHP 8.3.
spatie/laravel-activitylog4.12.32026-03-248, 9, 10, 11, 12, 13^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0 || ^13.0^8.1
spatie/laravel-data4.23.12026-10-2610, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.1
spatie/laravel-data3.12.02024-04-249, 10, 11^9.30|^10.0|^11.0^8.1
spatie/laravel-query-builder7.3.72026-10-2612, 13^12.0|^13.0^8.4PHP 8.4 floor, which rules out PHP 8.3.
spatie/laravel-query-builder6.4.42026-03-0810, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.2
spatie/laravel-translatable6.15.02026-10-1912, 13^12.0|^13.0^8.4PHP 8.4 floor, which rules out PHP 8.3.
spatie/laravel-translatable5.2.02022-01-138, 9^8.0|^9.0^8.0
spatie/laravel-sluggable4.0.62026-10-2712, 13^12.0|^13.0^8.3
spatie/laravel-sluggable3.8.12026-03-2310, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.2
owen-it/laravel-auditingv14.0.62026-06-2011, 12, 13^11.0|^12.0|^13.0^8.2
owen-it/laravel-auditingv13.7.52026-06-128, 9, 10, 11^7.0|^8.0|^9.0|^10.0|^11.0^7.3|^8.0
stancl/tenancyv3.10.12026-08-0510, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.0
AI
laravel/aiv1.3.02026-10-1912, 13^12.0|^13.0^8.3
laravel/mcpv1.1.22026-10-2611, 12, 13^11.45.3|^12.41.1|^13.0^8.2
laravel/boostv2.10.42026-10-2911, 12, 13^11.45.3|^12.41.1|^13.0^8.2
laravel/boostv1.8.132026-03-2710, 11, 12^10.49.0|^11.45.3|^12.41.1^8.1Stops at Laravel 12.
prism-php/prismv0.102.02026-10-1612, 13^12.61.1|^13.12.0^8.2
openai-php/laravelv0.21.02026-09-1711, 12, 13^11.29|^12.12|^13.0^8.2.0
CMS
statamic/cmsv6.39.02026-10-2912, 13^12.40.0 || ^13.0Not declared
statamic/cmsv5.74.72026-10-2212^12.40.0Not declaredLaravel 12 only, from 12.40.
statamic/cmsv4.58.32024-09-119, 10^9.50.0 || ^10.0Not declared
Testing and tooling
pestphp/pest-plugin-laravelv5.0.12026-07-2913^13.23.0^8.4Laravel 13.23 or later, and PHP 8.4.
pestphp/pest-plugin-laravelv4.1.02026-02-2111, 12, 13^11.45.2|^12.52.0|^13.0^8.3.0
pestphp/pest-plugin-laravelv3.2.02025-04-2111, 12^11.39.1|^12.9.2^8.2.0
pestphp/pest-plugin-laravelv2.4.02024-04-2710, 11^10.48.9|^11.5.0^8.1.0
larastan/larastanv3.13.22026-10-2311, 12, 13^11.44.2 || ^12.4.1 || ^13^8.2
larastan/larastanv2.11.22025-06-109, 10, 11^9.52.20 || ^10.48.28 || ^11.41.3^8.0.2
barryvdh/laravel-debugbarv4.4.52026-10-2811, 12, 13^11|^12|^13.0^8.2
barryvdh/laravel-debugbarv3.16.52026-01-2310, 11, 12^10|^11|^12^8.1Stops at Laravel 12.
barryvdh/laravel-ide-helperv3.7.02026-03-1711, 12, 13^11.15 || ^12 || ^13.0^8.2
barryvdh/laravel-ide-helperv2.15.12024-02-159, 10^9 || ^10^8.0
laravel/duskv8.7.22026-10-0710, 11, 12, 13^10.0|^11.0|^12.0|^13.0^8.1
laravel/duskv7.13.02024-02-239, 10^9.0|^10.0^8.0
laravel/tinkerv3.0.22026-03-178, 9, 10, 11, 12, 13^8.0|^9.0|^10.0|^11.0|^12.0|^13.0^8.1
laravel/tinkerv2.11.12026-02-068, 9, 10, 11, 12^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0^7.2.5|^8.0

What the data says today

Every package we track has a release line that allows Laravel 13. If Composer refuses, the likely reason is that you’re on an older line of a package, or a plugin is holding it back. It’s rarely that the package has no route forward.

11 release lines stop at Laravel 12. These are the ones that block the step to 13 until you change major version of the package itself:

  • inertiajs/inertia-laravel v1.3.4: move to v2.0.28 (PHP ^8.1.0)
  • backpack/crud 6.8.17: move to 7.1.22
  • yajra/laravel-datatables-oracle v12.7.2: move to v13.3.1 (PHP ^8.3)
  • laravel/passport v12.4.3: move to v13.10.0 (PHP ^8.2)
  • laravel/cashier-paddle v1.12.0: move to v2.8.1 (PHP ^8.1)
  • spatie/laravel-backup 9.4.1: move to 10.3.3 (PHP ^8.3)
  • laravel/boost v1.8.13: move to v2.10.4 (PHP ^8.2)
  • statamic/cms v5.74.7: move to v6.39.0
  • pestphp/pest-plugin-laravel v3.2.0: move to v4.1.0 (PHP ^8.3.0)
  • barryvdh/laravel-debugbar v3.16.5: move to v4.4.5 (PHP ^8.2)
  • laravel/tinker v2.11.1: move to v3.0.2 (PHP ^8.1)

PHP 8.4 floors have started to appear. Laravel 13 supports PHP 8.3–8.5, but these lines won’t install on PHP 8.3: spatie/laravel-activitylog 5.1.3, spatie/laravel-query-builder 7.3.7, spatie/laravel-translatable 6.15.0, pestphp/pest-plugin-laravel v5.0.1. An older line of each still works on 8.3, so this limits how far you can update, not whether you can run the package. It’s still a reason to prefer PHP 8.4 when you next move.

Some packages now follow the framework one for one. The newest lines of yajra/laravel-datatables-oracle each allow a single Laravel major, so that package has to move in the same pull request as the framework. For most others you can update the package first and release it separately, which makes any fault easier to trace.

The packages people ask about most

Filament

Filament 3 installs on Laravel 13, which surprises people who assume they must move to Filament 5 first. You can upgrade the framework, release, and then take Filament’s own majors separately. Filament 2 can’t do this, as it stops at Laravel 10. Our Filament upgrade path covers the order.

Livewire

Livewire 3 and 4 both allow Laravel 10 to 13 and PHP 8.1 or later. Livewire 2 stops at Laravel 10. Filament ties you to a line: Filament 4 requires Livewire 3, and Filament 5 requires Livewire 4.

Inertia

The server adapter inertiajs/inertia-laravel version 1 stops at Laravel 12, and its PHP constraint ends at 8.4, so it’s out of the question on PHP 8.5. Version 2 reaches Laravel 13 from Laravel 10. Version 3 needs Laravel 11.35 and PHP 8.2. Remember the client adapter moves with it, so budget for front-end changes too.

Nova and Spark

Both are private packages, so Packagist has no public record of them. Nova’s installation page lists Laravel 10.x to 13.x for Nova 5. Spark’s release notes have entries reading “Supports Laravel 13”. That’s all we could confirm from public sources. For the exact constraint, check the composer.lock of a licensed install.

Passport and Sanctum

Passport 12 stops at Laravel 12, so the move to Passport 13 is part of reaching Laravel 13, and it needs Laravel 11.35 and PHP 8.2. Sanctum 4 allows Laravel 11 to 13. Check Passport’s own upgrade guide before you plan this step, because token and grant behaviour is what API clients notice first.

Spatie packages

Several Spatie packages have recently dropped older Laravel versions in their newest majors. For example, spatie/laravel-permission 7 and 8 need Laravel 12 and PHP 8.3, while version 6 still reaches back to Laravel 8 and forward to 13. On Laravel 13 you can stay on the older line while you plan the major update.

Testing tools

These get forgotten until the framework step fails. pestphp/pest-plugin-laravel 5 allows Laravel 13.23 or later only, with PHP 8.4. Version 4 is the line to use on PHP 8.3. Move your test tooling in the same branch as the framework, or you lose the safety net when you need it most.

How to read a constraint

Composer constraints look cryptic, but only a few forms appear in this table.

  • ^12.0 means any 12.x release from 12.0 up, and not 13. The caret stops at the next major version, which is why a package has to declare each new Laravel major before Composer will accept it.
  • ^10.45|^11.0 means either range is fine. The double form, ||, means the same thing.
  • ^12.40.0 has a minor floor. It allows Laravel 12, but only from 12.40. If you’re on an earlier 12.x, run composer update laravel/framework first. This is a cheap fix, and it’s easy to mistake it for a real block.
  • ~8.4.0 means 8.4.x only. In the PHP column, a list ending in that form is a true ceiling, and it’s the only way a package here says it won’t run on a newer PHP.

There’s one more thing to watch for when a row looks fine but Composer still refuses. A package can require illuminate/* components at a version that your other packages disagree with, or need a dependency such as Livewire at a higher major than you have. So read Composer’s full explanation, not only its last line. The real cause is often two levels down from the package it first names.

An order of work this table suggests

We’d use this table to split a large upgrade into smaller releases. Each stage below can go live on its own, which means any fault points to one change.

  1. Update what allows both versions. Find the rows that allow your current Laravel and your target. Move to those lines first, while the framework stays where it is. Horizon, Telescope, Socialite and Scout usually belong here, because a single line covers several Laravel majors.
  2. Sort out PHP. Pick a version your target Laravel and all your target package lines accept, and release it alone. Use the PHP column above, then our guide to choosing a PHP version.
  3. Move what must change with the framework. Packages with no shared line, such as yajra/laravel-datatables-oracle, go in the same pull request as Laravel. Keep this list as short as you can, as it’s where failures are hardest to untangle.
  4. Take the big package majors afterwards. If a line such as Filament 3 still allows your target, leave its major upgrade for a later project. Your deadline is usually about framework support, not about being on the newest admin panel.

Check your own application

A table can’t see your lock file, and these commands can. Run them on a branch.

  • composer why-not laravel/framework ^13.0 names each package blocking Laravel 13.
  • composer why-not php 8.4 does the same for a PHP version.
  • composer outdated --direct shows how far behind your own requirements are.
  • composer audit lists known security advisories against what you have installed.

Private and in-house packages won’t appear here, and they’re often the real blocker. Include them in your own list. A paid package may also need a licence renewal before you can reach a newer major, so check that early. Our upgrade checklist places these checks in the full sequence.

How we built this

A script reads each package’s public metadata from Packagist’s repository API, skips development, alpha, beta and release-candidate versions, and keeps the newest release in each major. It then records the release’s PHP requirement and its requirement on laravel/framework or, where the package doesn’t require the framework directly, on illuminate/support, illuminate/contracts or a similar component. For Filament, the constraint sits on filament/support, so we read it from there at the matching version.

We wrote the short notes by hand. The package list is our own choice of widely used packages and doesn’t claim to be complete or a popularity ranking. “Not declared” means the release has no direct PHP requirement of its own, so it inherits one from its dependencies.

What this table can’t tell you

  • Whether it works. Maintainers can allow a Laravel version before every feature has been exercised on it, and a constraint can’t describe how your code uses the package. We haven’t tested every combination here.
  • Upper limits on PHP. Most packages use open-ended PHP constraints such as ^8.2, which Composer will accept on PHP 8.5 whether or not the maintainer has tried it. Read a deprecation log before you trust a new PHP version. See what PHP 8.5 changes for Laravel.
  • Minor floors. “Allows Laravel” shows majors. A row can need a recent minor, such as 11.28 or 12.40, so read the constraint beside it if you’re not on a recent release.
  • Support. A line that allows your Laravel version may no longer get fixes. The release date under each version gives a rough idea of activity, and Packagist’s abandoned flag shows in the notes when a package carries it. None of the lines above does as of the last check.

Where this fits in an upgrade

For which PHP goes with which framework version, use our Laravel and PHP compatibility matrix. For release and support dates, see Laravel versions. If the blockers above look like more work than your team has room for, our Laravel upgrade service begins with a free assessment of your code. Published prices run $799–$2,999+ in USD, invoiced in USD, GBP, EUR or INR.

Upgrades we have delivered

Questions

Does Filament work with Laravel 13?

Filament 3, 4 and 5 all declare Laravel 13 in their constraints on Packagist. Filament 2 stops at Laravel 10. Filament 4 and 5 need Laravel 11.28 or later and PHP 8.2 or later.

Does Laravel Nova 5 support Laravel 13?

Yes. Nova’s installation page lists Laravel 10.x, 11.x, 12.x and 13.x. Nova is a private package, so this row comes from its documentation rather than a public Composer constraint.

Does Laravel Horizon support Laravel 13?

Yes. Horizon 5 allows Laravel 9.21 through 13, with a PHP floor of 8.0.

Does allowed mean tested?

No. A constraint says Composer will install the package alongside that Laravel version. It says nothing about whether your use of the package behaves correctly, and we have not tested every combination in this table.

How often is this page updated?

The table is regenerated from Packagist by a script, and the date at the top shows the last run. Packages release often, so treat any row as a starting point and confirm with Composer against your own lock file.

Not sure what’s blocking your upgrade?

Send us your composer.json and composer.lock. We’ll tell you which packages stand in the way and give you a fixed price to clear them.

We reply within one business day (IST).