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.

ReleaseChangeUseWatch
Laravel 13.35QUERY routesRoute::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.35Markdown responsesresponse()->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.35One serverSchedule::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.35Worker memoryphp 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.35Fake assertionsQueue, 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.35Model defaultsAdd 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.9Poll while hiddenusePoll 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.9How the user arrivedThe 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.93.9.1 hardeningInstall @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.36Rule buildersRule::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.36Sticky queue workersWorker::$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.22QUERY from VueWayfinder 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.37Strict numbersRule::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.37Failed job commandsphp 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.23Types without a databasephp 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