Tools
What shipped
New opt-in APIs from the release articles published here, from Laravel 13.35 (October 6, 2026) to Laravel 13.37 and Wayfinder 0.1.23 (October 16). On Inertia, install 3.9.1. QUERY also matches existing Route::any() and Route::redirect() routes. The articles also list bug fixes.
New opt-in APIs from the release articles published here, from Laravel 13.35 (October 6, 2026) to Laravel 13.37 and Wayfinder 0.1.23 (October 16). On Inertia, install 3.9.1. QUERY also matches existing Route::any() and Route::redirect() routes. The articles also list bug fixes.
| Release | Change | Use | Watch |
|---|---|---|---|
| Laravel 13.35 | QUERY routes | Route::query() registers the HTTP QUERY method. It is safe like GET and can carry a JSON body. Call it from Vue with fetch method QUERY. Tests use queryJson. | Web routes CSRF-check QUERY the same way they check POST. Send the X-XSRF-TOKEN header, or use an api route. HTML forms cannot send QUERY. Route::any() and Route::redirect() match QUERY too. Source |
| Laravel 13.35 | Markdown responses | response()->markdown() answers with Content-Type text/markdown. Use it when wantsMarkdown() is true, and return the Inertia page otherwise. | The content type stays text/markdown even if you pass a different header. Source |
| Laravel 13.35 | One server | Schedule::alwaysOnOneServer() in AppServiceProvider boot makes every scheduled task run on one server. | It needs a shared cache: Redis, Memcached, database, or DynamoDB. A closure without a name is skipped. Source |
| Laravel 13.35 | Worker memory | php artisan queue:work --memory=75% restarts the worker from a percentage of PHP memory_limit. | This is for workers you run yourself. Laravel Cloud managed queues do not take custom worker options. Source |
| Laravel 13.35 | Fake assertions | Queue, Bus, Event, and Notification fakes accept an array of properties. Models are compared with is(). | A closure still works when the check is more than property equality. Source |
| Laravel 13.35 | Model defaults | Add the HasDefaultAttributes trait and a defaults() method when a default comes from an enum or from config. | Values passed to the constructor or create() win. Defaults do not mark the model dirty. Models without the trait stay as they are. Source |
| Inertia 3.9 | Poll while hidden | usePoll and router.poll take background throttle (the default, every 10th interval while the tab is hidden), background pause (stop until the tab is visible), or background continue (full speed). | keepAlive true is deprecated. Replace it with background continue. Use pause for a dashboard, a list, or an admin screen. Use continue for a session keepalive or a long job. A poll started while the tab is already hidden follows that choice from the start. Return the polled prop as a closure so a partial reload skips the rest. Source |
| Inertia 3.9 | How the user arrived | The navigate event detail.type is initial on the first load and on a reload, visit on a link, router.visit, or a form, and history when back or forward restores the page. | History props are the ones saved when the user left. Register one listener in resources/js/app.ts and reload only the props that page needs. Coming back from a non-Inertia page is also history. Source |
| Inertia 3.9 | 3.9.1 hardening | Install @inertiajs/vue3 3.9.1. The X-XSRF-TOKEN header is added only for your own origin. Add it yourself in an http.onRequest handler when a useHttp call to another domain needs it. encryptHistory uses a new IV for every history entry. | No Laravel change is required. inertiajs/inertia-laravel 3.5 works with @inertiajs/vue3 3.9.1. Nothing in 3.9 is a breaking change. Older encrypted history entries are loaded from the server again. On Inertia 2, version 2.3.29 from the same day has the history IV fix and the prefetch cache flush. Source |
| Laravel 13.36 | Rule builders | Rule::requiredWith(), Rule::confirmed(), Rule::ip(), Rule::regex(), Rule::missingIf() and about 50 more replace rule strings like required_with:phone,email, so the IDE autocompletes them. | Plain strings keep working and both styles mix in one array. The helper is Rule::ip(), not Rule::ipAddress(). Values that contain commas are safe in the builder form. Source |
| Laravel 13.36 | Sticky queue workers | Worker::$flushStickyConnections = true sends queue workers back to the read replica after each job. DB::olap(fn () => ...) runs a query in Vitess OLAP mode. | Both are opt-in. DB::olap() does nothing on plain MySQL. Queued mailables now respect DeleteWhenMissingModels and FailOnTimeout. Source |
| Wayfinder 0.1.22 | QUERY from Vue | Wayfinder 0.1.22 generates search.query() and search.form.query() for Route::query() routes. Precognition 2.1.1 adds client.query(url, data) with the data in the body. | HTML forms only send GET and POST, so the form helper sends POST with _method=QUERY. CSRF still applies to QUERY on web routes. It needs Laravel 13.35 or later. Source |
| Laravel 13.37 | Strict numbers | Rule::numeric(strict: true) accepts int and float values and rejects numeric strings, so a JSON API can insist on 42 instead of "42". | Plain numeric still accepts "42". Form posts send strings, so use strict only for JSON input. Source |
| Laravel 13.37 | Failed job commands | php artisan queue:failed --queue=emails lists the failed jobs of one queue. php artisan queue:forget 1 2 3 deletes several failed jobs at once. | queue:forget still takes job IDs, not a queue name. List first, then forget. Source |
| Wayfinder 0.1.23 | Types without a database | php artisan wayfinder:generate --skip-database builds route model binding types from the models' @property docblocks, so CI never opens a database connection. The Vite plugin option is skipDatabase: true. | Types are only as good as the docblocks. Keep @property up to date on models that are bound in routes. Source |
Laravel 13.35Inertia 3.9Laravel 13.36Wayfinder 0.1.22 + Precognition 2.1.1Laravel 13.37Wayfinder 0.1.23 (weekly roundup)Markdown for assistants