<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/vendor/feed/atom.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
                        <id>https://laravel.com/rss/oss-changelog</id>
                                <link href="https://laravel.com/rss/oss-changelog" rel="self"></link>
                                <title><![CDATA[OSS Changelog]]></title>
                    
                                <subtitle>New updates and improvements to Laravel&#039;s open source products.</subtitle>
                                                    <updated>2025-12-31T23:59:59+00:00</updated>
                        <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Add Ability to Run Callbacks After Building an HTTP Response]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-laravel-framework-12x-12x-add-ability-to-run-callbacks-after-building-an-http-response</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/58088">@cosmastech</a></p>
<p>A new <code>afterResponse</code> method was added to the <a href="https://laravel.com/docs/http-client">HTTP Client</a>, which allows the user to inspect and mutate the response returned from an HTTP call:</p>
<pre><code class="language-php">Http::acceptJson()
    -&gt;withHeader('X-Shopify-Access-Token', $credentials-&gt;token)
    -&gt;baseUrl(&quot;https://{$credentials-&gt;shop_domain}.myshopify.com/admin/api/2025-10/&quot;)
    -&gt;afterResponse(
        // Report any deprecation notices that were in the header
        function (Response $response) use ($credentials) {
            if ($header = $response-&gt;header('X-Shopify-API-Deprecated-Reason')) {
                event(new ShopifyDeprecationNotice($credentials-&gt;shop, $header));
            }
        })
    -&gt;afterResponse(
        // Map the response into our own custom response class
        fn (Response $response) =&gt; new ShopifyResponse($response-&gt;toPsrResponse()),
    )
    -&gt;afterResponse(
        // Report the cost of the query
        static fn (ShopifyResponse $response) =&gt; QueryCostResponse::report(
            $response-&gt;getQueryCost(),
            $credentials-&gt;shop
        ),
    );
</code></pre>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Introduce `FluentPromise` to Allow for Cleaner Chaining in Pool]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-laravel-framework-12x-12x-introduce-fluentpromise-to-allow-for-cleaner-chaining-in-pool</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57967">@cosmastech</a></p>
<p>Userland chaining in <a href="https://laravel.com/docs/http-client#request-pooling"><code>Http::pool</code></a> is now possible with the introduction of <code>FluentPromise</code>. Previously, the chain would return the original response, limiting flexibility. With this change, users can access the underlying array and return whatever they wish:</p>
<pre><code class="language-php">$response = Http::pool(function (Pool $pool) {
    $pool-&gt;as('cosmatech')
        -&gt;get('https://cosmastech.com')
        -&gt;then(
            fn ($response) =&gt; strlen($response-&gt;body())
        );
    $pool-&gt;as('laravel')
        -&gt;get('https://laravel.com')
        -&gt;then(
            fn ($response) =&gt; strlen($response-&gt;body())
        );
});

/*
array:2 [
  &quot;cosmatech&quot; =&gt; 9095
  &quot;laravel&quot; =&gt; 1422023
]
*/
</code></pre>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Introduce `lazy` Object and `proxy` Object Support Helpers]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-laravel-framework-12x-introduce-lazy-object-and-proxy-object-support-helpers</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57831">@timacdonald</a></p>
<p>Two new helpers, <code>lazy</code> and <code>proxy</code>, were added to make PHP's new <a href="https://www.php.net/manual/en/language.oop5.lazy-objects.php">lazy objects</a> more ergonomic to use.</p>
<pre><code class="language-php">&lt;?php

use Illuminate\Support\Facades\Http;
use Vendor\Facades\ResultFactory;
use Vendor\Result;
use function Illuminate\Support\lazy;
use function Illuminate\Support\proxy;

$response = Http::get(...);

$instance = lazy(Result::class, fn () =&gt; [$response-&gt;json()]);
$instance = proxy(Result::class, fn (): Result =&gt; ResultFactory::make($response-&gt;json()));
</code></pre>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Add Reload Command and Allow Services to Register]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-laravel-framework-12x-12x-add-reload-command-and-allow-services-to-register</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57923">@barryvdh</a></p>
<p>A new <code>php artisan reload</code> command was introduced, allowing service providers to add their own commands for reloading. This makes it easier for services to specify one command to include in their deployment steps after the deployment is completed.</p>
<p>The applicable reload commands have already been added to Laravel <a href="https://github.com/laravel/horizon/pull/1671">Horizon</a>, <a href="https://github.com/laravel/pulse/pull/469">Pulse</a>, <a href="https://github.com/laravel/reverb/pull/355">Reverb</a>, and <a href="https://github.com/laravel/octane/pull/1081">Octane</a>.</p>
<pre><code class="language-php">public function boot()
{
    $this-&gt;reloads('reverb:restart');
}
</code></pre>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Wayfinder - Modernize Email Template]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-wayfinder-modernize-email-template</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57987">@taylorotwell</a></p>
<p>The default Laravel email template was cleaned up and modernized, giving it a fresh coat of paint and an elevated, professional appearance.</p>
<p>The next version of <a href="https://github.com/laravel/wayfinder/tree/next">Wayfinder</a> entered public beta.</p>
<p>This version generates <em>far</em> more TypeScript from your Laravel app than the previous version, including routes and controller actions, named routes, form requests, Eloquent models, PHP enums, Inertia.js page props, Inertia shared data, broadcast channels, broadcast events, environment variables, and more.</p>
<p>Two new packages used by Wayfinder were also introduced into public beta:</p>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Wayfinder - Surveyor]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-wayfinder-surveyor</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p><a href="https://github.com/laravel/surveyor">Laravel Surveyor</a> is a powerful (mostly) static analysis tool designed to extract detailed PHP and Laravel-specific information from your code. It parses and analyzes PHP files to extract comprehensive metadata about classes, methods, properties, return types, and more, making this information available in a structured, consumable format for use by other tools and packages.</p>
<pre><code class="language-php">use Laravel\Surveyor\Analyzer\Analyzer;

$analyzer = app(Analyzer::class);

// Analyze a file by path
$result = $analyzer-&gt;analyze('/path/to/your/File.php');

// Access the analyzed scope
$scope = $result-&gt;analyzed();

// Access the class result
$classResult = $result-&gt;result();
</code></pre>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Ranger]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-inertia-ranger</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p><a href="https://github.com/laravel/ranger">Laravel Ranger</a> is a supercharged introspection library for Laravel applications. It walks through your codebase and collects detailed information about your application's components, including routes, models, enums, broadcast events, environment variables, and Inertia.js components.</p>
<p>It uses Surveyor under the hood and extracts the results into detailed data transport objects for straightforward consumption.</p>
<pre><code class="language-php">use Laravel\Ranger\Ranger;
use Laravel\Ranger\Components;
use Illuminate\Support\Collection;

$ranger = app(Ranger::class);

// Register callbacks for individual items
$ranger-&gt;onRoute(function (Components\Route $route) {
    echo $route-&gt;uri();
});

$ranger-&gt;onModel(function (Components\Model $model) {
    foreach ($model-&gt;getAttributes() as $name =&gt; $type) {
        //
    }
});

$ranger-&gt;onEnum(function (Components\Enum $enum) {
    //
});

$ranger-&gt;onBroadcastEvent(function (Components\BroadcastEvent $event) {
    //
});

// Or register callbacks for entire collections
$ranger-&gt;onRoutes(function (Collection $routes) {
    // Called once all of the routes have been discovered and processed
});

$ranger-&gt;onModels(function (Collection $models) {
    // Called once all of the models have been discovered and processed
});

// Walk through the application and trigger all callbacks
$ranger-&gt;walk();
</code></pre>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Support for Flash Data]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-inertia-support-for-flash-data</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2757">@pascalbaljet</a></p>
<p>Unlike regular props, Flash Data isn't persisted in the browser's history state, making it ideal for one-time notifications like toasts. On the frontend, Flash Data is available on <code>page.flash</code>. You can also listen for Flash Data using the global <code>flash</code> event or the <code>onFlash</code> callback.</p>
<pre><code class="language-vue">&lt;template&gt;
    &lt;div v-if=&quot;page.flash.toast&quot; class=&quot;toast&quot;&gt;
        {{ page.flash.toast.message }}
    &lt;/div&gt;
&lt;/template&gt;
</code></pre>
<pre><code class="language-ts">router.on(&quot;flash&quot;, (event) =&gt; {
    if (event.detail.flash.toast) {
        showToast(event.detail.flash.toast);
    }
});

router.post(&quot;/users&quot;, data, {
    onFlash: ({ newUserId }) =&gt; {
        // ...
    },
});
</code></pre>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - First-Party Support for Precognition]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-inertia-first-party-support-for-precognition</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull requests by @pascalbaljet: <a href="https://github.com/inertiajs/inertia/pull/2684">#2684</a>, <a href="https://github.com/inertiajs/inertia/pull/2700">#2700</a></p>
<p><a href="https://laravel.com/docs/precognition">Laravel Precognition</a> is now baked directly into the <code>useForm</code> hook and the <code>Form</code> component; there is no need to install additional libraries. Live validation has never been easier.</p>
<pre><code class="language-vue">&lt;template&gt;
    &lt;Form action=&quot;/users&quot; method=&quot;post&quot; #default=&quot;{ errors, invalid, validate, validating }&quot;&gt;
        &lt;div&gt;
            &lt;input name=&quot;name&quot; @change=&quot;validate('name')&quot; /&gt;
            &lt;p v-if=&quot;invalid('name')&quot;&gt;{{ errors.name }}&lt;/p&gt;
        &lt;/div&gt;

        &lt;div&gt;
            &lt;input name=&quot;email&quot; @change=&quot;validate('email')&quot; /&gt;
            &lt;p v-if=&quot;invalid('email')&quot;&gt;{{ errors.email }}&lt;/p&gt;
        &lt;/div&gt;

        &lt;p v-if=&quot;validating&quot;&gt;Validating...&lt;/p&gt;
    &lt;/Form&gt;
&lt;/template&gt;
</code></pre>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Optimize Page Data Size and Parsing]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-inertia-optimize-page-data-size-and-parsing</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2687">@bram-pkg</a></p>
<p>Opt-in support was added for loading the initial Inertia page data from a <code>&lt;script type=&quot;application/json&quot;&gt;</code> element instead of the <code>body</code> tag. This results in a greatly reduced initial page data size, faster parsing, and makes the initial page data a breeze to inspect with your browser's dev tools.</p>
<p>You can opt in to this behavior as follows:</p>
<pre><code class="language-ts">createInertiaApp({
    // ...
    defaults: {
        future: {
            useScriptElementForInitialPage: true,
        },
    },
});
</code></pre>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Boost - Support for `once()` Props]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-boost-support-for-once-props</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2732">@pascalbaljet</a></p>
<p>Some data rarely changes, is expensive to compute, or is simply large. Rather than including this data in every response, <code>once</code> props are remembered by the client and reused on subsequent pages that include the same prop.</p>
<pre><code class="language-php">return Inertia::render('Billing', [
    'plans' =&gt; Inertia::once(fn () =&gt; Plan::all()),
]);
</code></pre>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Echo - Add Resource and Prompts for Package Guidelines]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-echo-add-resource-and-prompts-for-package-guidelines</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/boost/pull/389">@pushpak1300</a></p>
<p>Previously, all third-party package guidelines needed to be added to the global context, which could grow unbounded as more packages were integrated.</p>
<p>Boost is now reducing global context bloat by adding guidelines for only actively used packages that are loaded, thereby improving token efficiency and leaving room for more application-specific information.</p>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[MCP - Event Payload Type Inference]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-mcp-event-payload-type-inference</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/echo/pull/470">@joetannenbaum</a></p>
<p>Event payloads are now automatically inferred from the <a href="https://laravel.com/docs/broadcasting#defining-broadcast-events">broadcast event</a> if the user provides a module override file, resulting in a cleaner <code>useEcho</code> experience and less type management for the user.</p>
<pre><code class="language-ts">import { App } from &quot;./types&quot;;

declare module &quot;@laravel/echo-react&quot; {
    interface Events {
        &quot;.App.Events.UserCreated&quot;: {
            user: App.Models.User;
        };
        &quot;.App.Events.OrderShipped&quot;: {
            order: App.Models.Order;
            user: App.Models.User;
        };
    }
}
</code></pre>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[MCP - Add Completion Support]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-mcp-add-completion-support</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/mcp/pull/127">@pushpak1300</a></p>
<p>Support was added for the <a href="https://modelcontextprotocol.io/specification/2025-11-25/server/utilities/completion">MCP completion utility</a>, allowing servers to provide IDE-like autocompletion suggestions for prompt arguments and resource template variables.</p>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[MCP - Add Annotation Support on Resources]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-mcp-add-annotation-support-on-resources</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/mcp/pull/111">@pushpak1300</a></p>
<p>Three annotation types are now available for use with Resource classes: <code>audience</code>, <code>priority</code>, and <code>lastModified</code>. This adheres to the <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/resources#annotations">MCP specs</a> and allows the server to provide hints to clients about how to use or display the resource.</p>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Add `structuredContent` and `outputSchema` Support]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-vs-code-extension-add-structuredcontent-and-outputschema-support</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/mcp/pull/83">@macbookandrew</a></p>
<p>Support for output schemas and structured content was added to the MCP package, enabling better integration with ChatGPT Apps and AI clients that need parseable tool results.</p>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Add Scope Parameters to the Repository and Docblock Generator]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-vs-code-extension-add-scope-parameters-to-the-repository-and-docblock-generator</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/vs-code-extension/pull/487">@N1ebieski</a></p>
<p>Model scope parameters now appear in model helper docblocks, making it clear to the user which parameters are required by the query scopes they are using.</p>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Add a Command That Generates Namespace]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-12" />
            <id>https://laravel.com/docs/changelog#item-2025-12-31-vs-code-extension-add-a-command-that-generates-namespace</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/vs-code-extension/pull/463">@N1ebieski</a></p>
<p>A new &quot;Generate Namespace&quot; command was added to the extension, allowing the user to quickly generate the correct namespace for a class.</p>
]]>
            </summary>
                                    <updated>2025-12-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Add `daysOfMonth()` Method to Schedule Tasks on Specific Days]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-laravel-framework-12x-add-daysofmonth-method-to-schedule-tasks-on-specific-days</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57817">@yousefkadah</a></p>
<p>Previously, there wasn't a way to <a href="/docs/scheduling#schedule-frequency-options">schedule tasks</a> on multiple arbitrary days of the month (e.g., 1st, 10th). A <code>daysOfMonth()</code> method was added that allows scheduling tasks to run on multiple specific days of the month with a clean, intuitive API.</p>
<pre><code class="language-php">$schedule-&gt;command('process-payroll')
    -&gt;daysOfMonth(1, 15) // 1st and 15th of each month
    -&gt;timezone('America/New_York');
</code></pre>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Add `encoding` Validation Rule for Uploaded Files]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-laravel-framework-12x-12x-add-encoding-validation-rule-for-uploaded-files</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57823">@ziadoz</a></p>
<p>A new <code>encoding</code> <a href="/docs/validation#available-validation-rules">validation rule</a> was added that checks the contents of a file or string matches a specific encoding using <code>mb_check_encoding()</code>, ensuring that uploaded files are encoded as expected before processing.</p>
<pre><code class="language-php">Validator::validate($input, [
    'attachment' =&gt; [
        'required',
        File::types(['csv'])-&gt;encoding('utf-8'),
    ],
]);
</code></pre>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Interval Helper Functions]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-laravel-framework-12x-interval-helper-functions</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57856">@taylorotwell</a></p>
<p>New <a href="/docs/helpers#interval-functions">interval helper functions</a> were added for fluently getting the current time with adjustments:</p>
<pre><code class="language-php">use Illuminate\Support\{ now, minutes }

Cache::put('name', 'Taylor', minutes(5));

Invitation::create([
    'expires_at' =&gt; now()-&gt;plus(hours: 6),
]);
</code></pre>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Queue Pause/Resume]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-laravel-framework-12x-queue-pauseresume</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57800">@yousefkadah</a></p>
<p>Sometimes you may need to temporarily prevent a queue worker from processing new jobs without stopping the worker entirely. Now you can with <a href="/docs/queues#pausing-and-resuming-queue-workers">newly added artisan commands</a>:</p>
<pre><code class="language-bash">php artisan queue:pause database:default
php artisan queue:continue database:default
</code></pre>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] New `@hasStack` Blade Directive]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-laravel-framework-12x-12x-new-at-hasstack-blade-directive</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57788">@browner12</a></p>
<p>The new <code>@hasStack</code> directive can be used to wrap <code>@stack</code> directives for conditional output depending on if the stack is empty or not. This is useful if you want some markup to wrap the stack only if it is not empty.</p>
<pre><code class="language-blade">@hasStack(&quot;list&quot;)
&lt;ul&gt;
    @stack(&quot;list&quot;)
&lt;/ul&gt;
@endif
</code></pre>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Add `--middleware` Filter to `route:list`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-laravel-framework-12x-add-middleware-filter-to-routelist</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57797">@jasonmccreary</a></p>
<p>A <code>--middleware</code> option was added to the <code>route:list</code> command to filter output by middleware. This can be a single middleware class name or a middleware group name, allowing you to easily see routes with the specified middleware applied.</p>
<pre><code class="language-bash">php artisan route:list --middleware=api
php artisan route:list --middleware=ThrottleRequests
</code></pre>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Introduce `WithCachedRoutes` Testing Trait]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-laravel-framework-12x-12x-introduce-withcachedroutes-testing-trait</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57623">@cosmastech</a></p>
<p>A new testing trait called <code>WithCachedRoutes</code> was introduced. This testing trait stores the routes as a static property within a <code>Testing\CachedState</code> object during test setup, ensuring subsequent tests do not need to read from disk.</p>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] New `Factory@insert()` Method]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-laravel-framework-12x-12x-new-factory-at-insert-method</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57600">@cosmastech</a></p>
<p>The <code>insert()</code> method was added to Eloquent Factories, allowing you to perform a mass insert of models. This increases performance during testing with numerous of database records.</p>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Boost - [12.x] Add `ucwords` to `Str` and `Stringable`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-boost-12x-add-ucwords-to-str-and-stringable</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57581">@braxey</a></p>
<p>A <code>ucwords</code> method was added to <code>Stringable</code>, allowing fluent uppercasing of the first letter of a string. Note that this differs from <code>title</code> in that the rest of the string remains untouched.</p>
<pre><code class="language-php">// Taylor Otwell, Creator Of Laravel
$name = $this-&gt;string('taylor otwell, creator of laravel')-&gt;ucwords();
</code></pre>
<p>A number of packages were updated to ensure they maintained compatibility with the <a href="https://www.php.net/releases/8.5/en.php">newly released PHP 8.5</a>, including:</p>
<ul>
<li><a href="https://github.com/laravel/framework/pull/57835">Laravel Framework</a></li>
<li><a href="https://github.com/laravel/dusk/pull/1181">Dusk</a></li>
<li><a href="https://github.com/laravel/folio/pull/154">Folio</a></li>
<li><a href="https://github.com/laravel/fortify/pull/621">Fortify</a></li>
<li><a href="https://github.com/laravel/helpers/pull/40">Helpers</a></li>
<li><a href="https://github.com/laravel/horizon/pull/1667">Horizon</a></li>
<li><a href="https://github.com/laravel/installer/pull/449">Installer</a></li>
<li><a href="https://github.com/laravel/jetstream/pull/1588">Jetstream</a></li>
<li><a href="https://github.com/laravel/pail/pull/59">Pail</a></li>
<li><a href="https://github.com/laravel/pennant/pull/155">Pennant</a></li>
<li><a href="https://github.com/laravel/pulse/pull/467">Pulse</a></li>
<li><a href="https://github.com/laravel/reverb/pull/353">Reverb</a></li>
<li><a href="https://github.com/laravel/sanctum/pull/576">Sanctum</a></li>
<li><a href="https://github.com/laravel/scout/pull/954">Scout</a></li>
<li><a href="https://github.com/laravel/socialite/pull/755">Socialite</a></li>
<li><a href="https://github.com/laravel/telescope/pull/1658">Telescope</a></li>
<li><a href="https://github.com/laravel/tinker/pull/192">Tinker</a></li>
</ul>
<p><img src="/images/changelog/2025-11/inertia-refresh.png" alt="Inertia Website Share Image" /></p>
<p>The Inertia <a href="https://inertiajs.com">website</a> and <a href="https://inertiajs.com/docs">docs</a> got a major glow up!</p>
<p>Inertia finally has the website it deserves, showing off all of its power and flexibility as the best way to create a SPA with the backend and frontend of your choice.</p>
<p>Furthermore, <a href="https://inertiajs.com/docs">the docs</a> are now hosted on Mintlify and received a complete refresh that supercharges them with cleaner formatting, an AI chat, and a more comprehensive search. Both users and LLMs should be very satisfied with this update.</p>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Boost - Add Gemini]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-boost-add-gemini</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/boost/pull/360">@iruoy</a></p>
<p>Google's <a href="https://gemini.google.com/">Gemini</a> has been added to Boost. This addition marks the completion of our support for all major code environments, further empowering developers with enhanced Laravel capabilities.</p>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Boost - Put User-Defined Guidelines at the Top]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-boost-put-user-defined-guidelines-at-the-top</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/boost/pull/332">@phpfour</a></p>
<p>User guidelines now take precedence over the Boost presets while maintaining the overrides strategy, giving developers more control over how instructions are interpreted by agents.</p>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Boost - Add Sail Support in Guidelines]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-boost-add-sail-support-in-guidelines</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/boost/pull/329">@pushpak1300</a></p>
<p>Sail now has first-class support across all guidelines. When a project installs Boost with Sail enabled, agent instructions now automatically switch to Sail-specific commands rather than native CLI commands.</p>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Boost - Remove Filament Guidelines]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-boost-remove-filament-guidelines</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/boost/pull/349">@pushpak1300</a></p>
<p>With the new <a href="https://github.com/laravel/boost?tab=readme-ov-file#third-party-package-ai-guidelines">third-party guidelines</a> feature, these guidelines can now live within the Filament package and automatically stay full up to date with any new Filament features introduced.</p>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[MCP - Add OpenCode Support]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-mcp-add-opencode-support</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/boost/pull/88">@calebdw</a></p>
<p>Developers now have seamless integration of <a href="https://opencode.ai/">OpenCode</a> in their workflows, with the ability to take advantage of its power just like any other agent.</p>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[MCP - Add `_meta` Support]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-11" />
            <id>https://laravel.com/docs/changelog#item-2025-11-30-mcp-add-meta-support</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/mcp/pull/106">@pushpak1300</a></p>
<p>The MCP package now fully supports the <code>_meta</code> field as documented in the <a href="https://modelcontextprotocol.io/specification/2025-06-18/basic#meta">MCP specification</a>. Users can now attach metadata at three different levels: on tools/resources/prompts (in listings), on the result envelope (for execution metadata), and on individual content items.</p>
<pre><code class="language-php">public function handle(Request $request): Response
{
    return Response::text('The content generated by the tool.')
        -&gt;withMeta('x', 'y');
}
</code></pre>
]]>
            </summary>
                                    <updated>2025-11-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Ensure HTTP Batch Results Are Returned in the Same Order as Requested]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-laravel-framework-12x-12x-ensure-http-batch-results-are-returned-in-the-same-order-as-requested</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57483">@jessarcher</a></p>
<p>Previously, <code>Http::batch</code> results were sorted in the order that the responses came back, rather than the order that the requests were defined:</p>
<pre><code class="language-php">dump(Http::batch(fn (Batch $batch) =&gt; [
    $batch-&gt;get('https://httpbin.org/delay/3'),
    $batch-&gt;get('https://httpbin.org/delay/2'),
    $batch-&gt;get('https://httpbin.org/delay/1'),
])-&gt;send());

array:3 [
  2 =&gt; Illuminate\Http\Client\Response {#419}
  1 =&gt; Illuminate\Http\Client\Response {#374}
  0 =&gt; Illuminate\Http\Client\Response {#328}
]
</code></pre>
<p>The results are now sorted before they are returned, respecting any requests named with the <code>as</code> method. <a href="https://laravel.com/docs/http-client#request-batching">Learn more about request batching</a>.</p>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Add Support for Additional Editors in `ResolvesDumpSource`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-laravel-framework-12x-add-support-for-additional-editors-in-resolvesdumpsource</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull requests by <a href="https://github.com/laravel/framework/pull/57392">@cseknowledge</a>, <a href="https://github.com/laravel/framework/pull/57298">@miguilimzero</a>, <a href="https://github.com/laravel/framework/pull/57363">@OmarFaruk-0x01</a>, <a href="https://github.com/laravel/framework/pull/57359">@Sajid-al-islam</a>, and <a href="https://github.com/laravel/framework/pull/57377">@Rakib01</a></p>
<p>Several PRs introduced new config values for <code>app.editor</code>, allowing dumps to link correctly for several new IDEs: <code>neovim</code>, <code>zed</code>, <code>kiro</code>, <code>fleet</code>, and <code>windsurf</code>.</p>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Add Clickable File Reference for Thrown Exception]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-laravel-framework-12x-add-clickable-file-reference-for-thrown-exception</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57400">@jasonmccreary</a></p>
<p>The recently introduced new exception page now includes a new file reference and line number that opens the file directly in your IDE of choice.</p>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Add SQS FIFO and Fair Queue `messagegroup()` Method Support]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-laravel-framework-12x-12x-add-sqs-fifo-and-fair-queue-messagegroup-method-support</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57421">@patrickcarlohickman</a></p>
<p>Instead of using the <code>onGroup()</code> method at the time of dispatch, you can now define a <code>messageGroup()</code> directly method on the job class, removing an inconsistency where event listeners supported the <code>messageGroup()</code> method on the class, but all the other job types required calling <code>onGroup()</code>.</p>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Deferred Queue]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-laravel-framework-12x-deferred-queue</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57428">@taylorotwell</a></p>
<p>Using <a href="https://laravel.com/docs/queues#deferred-dispatching">deferred synchronous dispatching</a>, you can dispatch a job to be processed during the current process, but after the HTTP response has been sent to the user. This allows you to process &quot;queued&quot; jobs synchronously without slowing down your user's application experience. To defer the execution of a synchronous job, dispatch the job to the <code>deferred</code> connection:</p>
<pre><code class="language-php">RecordDelivery::dispatch($order)-&gt;onConnection('deferred');
</code></pre>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Failover Cache]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-laravel-framework-12x-failover-cache</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57430">@taylorotwell</a></p>
<p>The <code>failover</code> <a href="https://laravel.com/docs/cache#cache-failover">cache driver</a> provides automatic failover functionality when interacting with the cache. If the primary cache store fails for any reason, Laravel will automatically attempt to use the next configured store in the list. This is particularly useful for ensuring high availability in production environments where cache reliability is critical.</p>
<pre><code class="language-php">'failover' =&gt; [
    'driver' =&gt; 'failover',
    'stores' =&gt; [
        'database',
        'array',
    ],
],
</code></pre>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] PostgreSQL Virtual Columns]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-laravel-framework-12x-12x-postgresql-virtual-columns</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57290">@tpetry</a></p>
<p>PostgreSQL 18 was recently released, along with it support for virtual generated columns. The <code>virtualAs</code> column modifier now has backwards compatible support this new PostgreSQL feature.</p>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Failover Queue]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-laravel-framework-12x-failover-queue</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57341">@taylorotwell</a></p>
<p>The <code>failover</code> <a href="https://laravel.com/docs/queues#deferred-dispatching">queue driver</a> provides automatic failover functionality when pushing jobs to the queue. If the primary queue connection fails for any reason, Laravel will automatically attempt to push the job to the next configured connection in the list. This is particularly useful for ensuring high availability in production environments where queue reliability is critical.</p>
<pre><code class="language-php">'failover' =&gt; [
    'driver' =&gt; 'failover',
    'connections' =&gt; [
        'redis',
        'database',
        'sync',
    ],
],
</code></pre>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - [12.x] Add Defer Method to HTTP Batch]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-inertia-12x-add-defer-method-to-http-batch</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57387">@WendellAdriel</a></p>
<p>When the new <code>defer</code> method is invoked on <code>Http::batch</code>, <a href="https://laravel.com/docs/queues#deferred-dispatching">the batch of requests is not executed immediately</a>. Instead, Laravel will execute the batch after the current application request's HTTP response has been sent to the user, keeping your application feeling fast and responsive:</p>
<pre><code class="language-php">use Illuminate\Http\Client\Batch;
use Illuminate\Support\Facades\Http;

$responses = Http::batch(fn (Batch $batch) =&gt; [
    $batch-&gt;get('http://localhost/first'),
    $batch-&gt;get('http://localhost/second'),
    $batch-&gt;get('http://localhost/third'),
])-&gt;then(function (Batch $batch, array $results) {
    // All requests completed successfully...
})-&gt;defer();
</code></pre>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Configure Global Defaults and Update During Runtime]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-inertia-configure-global-defaults-and-update-during-runtime</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2655">@pascalbaljet</a></p>
<p>Inertia now supports setting <a href="https://inertiajs.com/client-side-setup#configuring-defaults">app-wide defaults</a>, with the ability to update values at runtime. You can pass a default config object to the <code>createInertiaApp()</code> method:</p>
<pre><code class="language-ts">createInertiaApp({
    // resolve, setup, etc.
    defaults: {
        form: {
            recentlySuccessfulDuration: 5_000,
        },
        prefetch: {
            cacheFor: 60_000,
        },
        visitOptions: (href: string, options: VisitOptions) =&gt; {
            return { headers: { ...options.headers, &quot;X-Foo&quot;: &quot;Bar&quot; } };
        },
    },
});
</code></pre>
<p>Each adapter now also exports a <code>config</code> instance to update any values at runtime:</p>
<pre><code class="language-ts">import { config } from &quot;@inertiajs/vue3&quot;;

config.set(&quot;form.recentlySuccessfulDuration&quot;, 1000);
</code></pre>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Boost - Support for Type-Hinting Shared Page Props]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-boost-support-for-type-hinting-shared-page-props</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2636">@pascalbaljet</a></p>
<p><code>usePage()</code> now supports a global type definition file, allowing you to type-hint shared page props:</p>
<pre><code class="language-ts">// resources/js/types/globals.d.ts

declare module &quot;@inertiajs/core&quot; {
    export interface InertiaConfig {
        sharedPageProps: {
            auth: { user: { id: number; name: string } | null };
            flash: { success?: string; error?: string };
        };
    }
}
</code></pre>
<p>Shared page props are now automatically type-hinted throughout the app when you use <code>usePage()</code>:</p>
<pre><code class="language-js">const page = usePage();
const successMessage = page.props.flash.success;
</code></pre>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Boost - Dynamic NPM Package Runner]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-boost-dynamic-npm-package-runner</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/boost/pull/145">@imliam</a></p>
<p>Boost now detects which NPM package manager should be used to run any given script (<code>npm</code>, <code>pnpm</code>, <code>yarn</code> and <code>bun</code>). This assists the AI in using the correct CLI tools when running <code>npm</code> commands based on the project's existing dependencies.</p>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Fortify - Add Support for Custom Code Environments]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-fortify-add-support-for-custom-code-environments</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/boost/pull/280">@pushpak1300</a></p>
<p>You can now create custom code environments (IDEs and AI agents) for Boost. Previously, Boost only supported a hardcoded list of environments, which made it difficult to add support for new IDEs or agents directly within the official Boost repository.</p>
<pre><code class="language-php">use Laravel\Boost\Contracts\Agent;
use Laravel\Boost\Contracts\McpClient;
use Laravel\Boost\Install\CodeEnvironment\CodeEnvironment;

class MyCustomIDE extends CodeEnvironment implements Agent, McpClient
{
    // Implementation
}
</code></pre>
<p>Registering your custom code environment:</p>
<pre><code class="language-php">use Laravel\Boost\Boost;

Boost::registerCodeEnvironment('myide', MyCustomIDE::class);
</code></pre>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Horizon - Add Laravel Fortify Guidelines for Boost]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-horizon-add-laravel-fortify-guidelines-for-boost</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/fortify/pull/614">@pushpak1300</a></p>
<p>AI guidelines were added which can be used by Laravel Boost's <a href="https://github.com/laravel/boost?tab=readme-ov-file#keeping-guidelines-up-to-date">Third-Party Package AI Guidelines</a>. This is completely opt-in for each user, they can choose if they want additional intelligence around Fortify's usage with their Laravel application.</p>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Installer - Allow Naming of Horizon Instances]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-installer-allow-naming-of-horizon-instances</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/horizon/pull/1621">@timacdonald</a></p>
<p>When you have several <a href="https://laravel.com/docs/horizon#running-horizon">Horizon</a> instances running in different regions, all within a single application, it can be difficult to determine with instance of Horizon a notification is originating from. You can now specify a name for each instance, making identification straightforward.</p>
<p>Before:</p>
<pre><code class="language-txt">Long Wait Detected
[Nightwatch] The &quot;{queue}&quot; queue on the &quot;{connection}&quot; connection has a wait time of {seconds} seconds.
</code></pre>
<p>After:</p>
<pre><code class="language-txt">Long Wait Detected
[eu-central-1] The &quot;{queue}&quot; queue on the &quot;{connection}&quot; connection has a wait time of {seconds} seconds.
</code></pre>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Starter Kits - Pass Flags for Alternative Node Package Managers]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-starter-kits-pass-flags-for-alternative-node-package-managers</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/installer/pull/442">@joetannenbaum</a></p>
<p>When running <code>laravel new</code>, there are now additional flags you can pass to specify which Node package manager you'd like to use: <code>--npm</code>, <code>--pnpm</code>, <code>--bun</code>, or <code>--yarn</code>. Passing one of these flags will also update any <code>composer</code> script that references a Node command to reflect the correct command specific to the selected package manager.</p>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Scout - Integration of Additional Fortify Features]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-scout-integration-of-additional-fortify-features</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull requests by <a href="https://github.com/pushpak1300">@pushpak1300</a></p>
<p>All starter kits now use Fortify for login, registration, password reset, and email verification. Fortify is a battle-tested solution, removing code from your codebase that is rarely changed, keeping your application code streamlined and maintainable.</p>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Scout - Full-Text Improvements]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-10" />
            <id>https://laravel.com/docs/changelog#item-2025-10-31-scout-full-text-improvements</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/scout/pull/947">@taylorotwell</a></p>
<p>Several improvements to full-text support were added when using the <code>database</code> engine. First up, you can now pass multiple columns to <code>orWhereFullText</code> in a single call. Secondly, when using Postgres and no other developer-provided ordering has been defined, Scout automatically adds relevance-based ordering by default to match MySQL's built-in ordering behavior.</p>
]]>
            </summary>
                                    <updated>2025-10-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Introduce `after` Rate Limiting]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-laravel-framework-12x-12x-introduce-after-rate-limiting</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57125">@timacdonald</a></p>
<pre><code class="language-php">use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Symfony\Component\HttpFoundation\Response;

/*
 * Ensure a user can only hit ten 404 responses in a minute before they are
 * rate limited to ensure user's cannot enumerate resource IDs.
 */
RateLimiter::for('resource-not-found', function (Request $request) {
    return Limit::perMinute(10)
        -&gt;by(&quot;user:{$request-&gt;user()-&gt;id}&quot;)

        // The new `after` hook...
        -&gt;after(function (Response $response) {
            return $response-&gt;getStatusCode() === 404;
        });
});
</code></pre>
<p>The new <code>RateLimiter::after</code> hook lets you apply rate limiting based on the response as well as the request.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Add `Http::batch`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-laravel-framework-12x-12x-add-httpbatch</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56946">@WendellAdriel</a></p>
<pre><code class="language-php">$responses = Http::batch(fn (Batch $batch) =&gt; [
    $batch-&gt;get('http://localhost/first'),
    $batch-&gt;get('http://localhost/second'),
    $batch-&gt;get('http://localhost/third'),
])-&gt;before(function (Batch $batch) {
    // This runs before the first HTTP request is executed.
})-&gt;progress(function (Batch $batch, int|string $key, Response $response) {
    // This runs after each successful HTTP request from the Batch.
})-&gt;catch(function (Batch $batch, int|string $key, Response|RequestException $response) {
    // This runs after each failed HTTP request from the Batch.
})-&gt;then(function (Batch $batch, array $results) {
    // This runs ONLY IF all the HTTP requests from the Batch are successful and the batch is not cancelled.
})-&gt;finally(function (Batch $batch, array $results) {
    // This runs after all the HTTP requests from the Batch finish and the batch is not cancelled.
})-&gt;send();
</code></pre>
<p>The new <code>Http::batch</code> method allows you to hook into the lifecycle of each HTTP call when making multiple requests in parallel.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Adds `Macroable` Trait to `Illuminate/Support/Benchmark`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-laravel-framework-12x-12x-adds-macroable-trait-to-illuminatesupportbenchmark</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57107">@1tim22</a></p>
<pre><code class="language-php">use Closure;
use Illuminate\Support\Benchmark;
use Illuminate\Support\Facades\Log;

Benchmark::macro('log', fn (Closure $callback) =&gt;
    Log::debug(Benchmark::measure($callback))
);

Benchmark::log(fn () =&gt; sleep(1));
</code></pre>
<p><code>Benchmark</code> is now updated with the <code>Macroable</code> trait to allow arbitrary macro registration.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Add `--whisper` Option to `schedule:work` Command]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-laravel-framework-12x-12x-add-whisper-option-to-schedulework-command</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56969">@thojo0</a></p>
<p>You can now pass a <code>--whisper</code> option to the <code>schedule:work</code> command. The option is passed through to the <code>schedule:run</code> command, which hides the &quot;No scheduled commands are ready to run&quot; message from the output, producing cleaner logs and terminal output and reducing noise for monitoring tools.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x]: Cache Session Driver]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-laravel-framework-12x-12x-cache-session-driver</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56887">@joaopalopes24</a></p>
<pre><code class="language-php">$discount = $request-&gt;session()-&gt;cache()-&gt;get('discount');

$request-&gt;session()-&gt;cache()-&gt;put(
    'discount', 10, now()-&gt;addMinutes(5)
);
</code></pre>
<p>The new session cache provides a convenient way to cache data that is scoped to an individual user session. Unlike the global application cache, session cache data is automatically isolated per session and is cleaned up when the session expires or is destroyed.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Add Support for #[UseResource(...)] and #[UseResourceCollection(...)] Attributes on Models]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-laravel-framework-12x-12x-add-support-for-useresource-and-useresourcecollection-attributes-on-models</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56966">@Lukasss93</a></p>
<pre><code class="language-php">use App\Http\Resources\MyCustomNameResource;
use App\Http\Resources\MyCustomNameCollectionResource;

#[UseResource(MyCustomNameResource::class)]
#[UseResourceCollection(MyCustomNameCollectionResource::class)]
class MyModel extends Model {
    //
}

// Now you can call:
$model-&gt;toResource();
$collection-&gt;toResourceCollection();
</code></pre>
<p>You can now define resources classes directly on your Eloquent models using PHP attributes.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Add `--json` Option to `schedule:list`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-laravel-framework-12x-12x-add-json-option-to-schedulelist</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57006">@dxnter</a></p>
<pre><code class="language-json">[
    {
        &quot;expression&quot;: &quot;0 0 15 * *&quot;,
        &quot;repeat_seconds&quot;: null,
        &quot;command&quot;: &quot;php artisan backup:run&quot;,
        &quot;description&quot;: &quot;Run daily backup process&quot;,
        &quot;next_due_date&quot;: &quot;2025-09-15 00:00:00 +00:00&quot;,
        &quot;next_due_date_human&quot;: &quot;5 days from now&quot;,
        &quot;timezone&quot;: &quot;UTC&quot;,
        &quot;has_mutex&quot;: false
    }
]
</code></pre>
<p>The <code>schedule:list</code> command now accepts a <code>--json</code> flag to allow programmatic consumption of scheduled task data for monitoring and integration purposes.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Add Prepend Option for `Str::plural()`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-laravel-framework-12x-12x-add-prepend-option-for-strplural</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56802">@caseydwyer</a></p>
<pre><code class="language-blade">{{-- Instead of: --}}
We had {{ number_format($attendees-&gt;count()) . ' ' . Str::plural('attendee', $attendees-&gt;count()) }} at Laracon 2025.

{{-- Now we can: --}}
We had {{ Str::plural('attendee', $attendees-&gt;count(), prependCount: true) }} at Laracon 2025.
</code></pre>
<p>The <code>Str::plural</code> helper now accepts a new argument, <code>prependCount</code>, that will prepend the count to the string automatically.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - [12.x] Add Support for SQS Fair Queue]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-laravel-framework-12x-12x-add-support-for-sqs-fair-queue</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56763">@crynobone</a></p>
<p><a href="https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-fair-queues.html">SQS fair queues</a> are now supported.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - [12.x] Update Local Exception Page]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-inertia-12x-update-local-exception-page</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/57036">@avosalmon</a></p>
<p><img src="/images/changelog/2025-09/new-exception-page.jpeg" alt="New local exception page" /></p>
<p>The exception page was given a refresh, making local errors clearer and more actionable.</p>
<p>This month, we switched all of our NPM packages over to <a href="https://docs.npmjs.com/trusted-publishers">Trusted Publishing</a>. Now you'll know where the latest release originated and you can verify that it came from us.</p>
<p><img src="/images/changelog/2025-09/trusted-publishing.png" alt="NPM provenance statement" /></p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Introduction of the `<InfiniteScroll>` Component]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-inertia-introduction-of-the-infinitescroll-component</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2580">@pascalbaljet</a></p>
<pre><code class="language-vue">&lt;template&gt;
    &lt;InfiniteScroll data=&quot;users&quot;&gt;
        &lt;div v-for=&quot;user in users.data&quot; :key=&quot;user.id&quot;&gt;{{ user.name }}&lt;/div&gt;
    &lt;/InfiniteScroll&gt;
&lt;/template&gt;
</code></pre>
<p>A new <code>&lt;InfiniteScroll&gt;</code> component was introduced for React, Vue, and Svelte that allows you to easily create infinite scroll interfaces by wrapping your items in the new component.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Support for Merging Nested Prop Paths]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-inertia-support-for-merging-nested-prop-paths</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2561">@pascalbaljet</a></p>
<p>A new middle ground was added between <code>Inertia::merge()</code> and <code>Inertia::deepMerge()</code> so you can have fine-grained control over what should be merged.</p>
<p>The front-end will replace the entire object, except the <code>data</code> array. The new items will be appended to the existing items:</p>
<pre><code class="language-php">Inertia::merge(User::paginate())-&gt;append('data');
</code></pre>
<p>There's also <code>prepend()</code>, and you can also combine multiple calls:</p>
<pre><code class="language-php">Inertia::merge($complexObject)
    -&gt;append('users', matchOn: 'username')
    -&gt;prepend('messages.data');
</code></pre>
<p>Then there's a new <code>Inertia::scroll()</code> function which you can pass paginated resources:</p>
<pre><code class="language-php">Inertia::scroll(User::paginate());
</code></pre>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Boost - Progress Indicator API]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-boost-progress-indicator-api</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2581">@pascalbaljet</a></p>
<pre><code class="language-ts">import { progress } from &quot;@inertiajs/vue3&quot;;

progress.start(); // Begin progress animation
progress.set(0.25); // Set to 25% complete
progress.finish(); // Complete and fade out
progress.reset(); // Reset to start
progress.remove(); // Complete and remove from DOM
progress.hide(); // Hide progress bar
progress.reveal(); // Show progress bar

progress.isStarted(); // Returns boolean
progress.getStatus(); // Returns current percentage or null
</code></pre>
<p>The internal methods used to drive the <a href="https://inertiajs.com/progress-indicators">Progress indicator</a> are now exposed publicly, giving developers control over the progress bar.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Boost - [1.x] Adds `boost:update` + Allows Package Authors to Publish Guidelines]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-boost-1x-adds-boostupdate-allows-package-authors-to-publish-guidelines</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/boost/pull/277">@nunomaduro</a></p>
<p>Boost can now self-update with the new <code>boost:update</code> command. In addition, third-party packages can now auto-register their own guidelines by including a <code>resources/boost/guidelines/core.blade.php</code> file in their package.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Echo - Allow Guideline Overriding]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-echo-allow-guideline-overriding</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/boost/pull/219">@ashleyhindle</a></p>
<p>Users can now override guideline files, specifying that Boost should use their guidelines in specific instances instead of the default guidelines that come with Boost.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Fortify - Add `stopListeningForNotification`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-fortify-add-stoplisteningfornotification</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/echo/pull/459">@thoresuenert</a></p>
<pre><code class="language-ts">const callback = (notification) =&gt; {
    console.log(notification.type);
};

// Start listening...
Echo.private(`App.Models.User.${userId}`).notification(callback);

// Stop listening (callback must be the same)...
Echo.private(`App.Models.User.${userId}`).stopListeningForNotification(
    callback
);
</code></pre>
<p>A new <code>stopListeningForNotification</code> method was added to stop listening for notifications without leaving the channel.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Installer - Regenerate Session on Register]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-installer-regenerate-session-on-register</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/fortify/pull/610">@valorin</a></p>
<p>The session and session and CSRF token are now regenerated on user registration.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Installer - Check for New Version of Installer on `new`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-installer-check-for-new-version-of-installer-on-new</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/installer/pull/438">@joetannenbaum</a></p>
<p>The installer now checks if there are updates available on Packagist to ensure you are using the latest version when running <code>laravel new</code>.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Installer - Support PNPM and Yarn Package Managers]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-installer-support-pnpm-and-yarn-package-managers</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/installer/pull/433">@adrum</a></p>
<p>The installer now detects lock files for the PNPM and Yarn package managers, falling back to NPM if neither are found.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[MCP - Add the Ability to Use a Git Repo as Custom Kit]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-mcp-add-the-ability-to-use-a-git-repo-as-custom-kit</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/installer/pull/432">@adrum</a></p>
<pre><code class="language-bash">laravel new --using https://gitub.com/user/project
</code></pre>
<p>You can specify a git repo as a custom starter kit when running <code>laravel new</code>.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Prompts - First Official "Beta" Release of Laravel MCP Package]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-prompts-first-official-beta-release-of-laravel-mcp-package</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p><a href="https://github.com/laravel/mcp">https://github.com/laravel/mcp</a></p>
<p>Laravel MCP allows you to rapidly build MCP servers for your Laravel applications. MCP servers allow AI clients to interact with your Laravel application through the <a href="https://modelcontextprotocol.io/docs/getting-started/intro">Model Context Protocol</a>.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Reverb - Improve Display of Progress Bars With High Step Counts]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-reverb-improve-display-of-progress-bars-with-high-step-counts</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/prompts/pull/204">@jessarcher</a></p>
<p><img src="/images/changelog/2025-09/progress-after.png" alt="New progress display" /></p>
<p>The display of the progress bar when using a large number of steps is improved by adding thousands separators and extra spacing.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - [1.x] Adds Optional Application Level Connection Limits]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-vs-code-extension-1x-adds-optional-application-level-connection-limits</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/reverb/pull/347">@joedixon</a></p>
<p>You can specify connection limits for those users who wish to limit the number of active connections to a given application as <a href="https://pusher.com/docs/channels/library_auth_reference/pusher-websockets-protocol/#4000-4099">supported by the Pusher protocol</a>.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Add Commands That Refactor Class Attributes in Blade Files]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-vs-code-extension-add-commands-that-refactor-class-attributes-in-blade-files</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/vs-code-extension/pull/432">@N1ebieski</a></p>
<p><img src="/images/changelog/2025-09/vs-code-refactor-class-attributes.gif" alt="Refactor class attributes" /></p>
<p>Commands are now available that refactor the selected or all class attributes to the <code>@class</code> directive.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Add a Command That Wraps Selected Text With a Helper]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-vs-code-extension-add-a-command-that-wraps-selected-text-with-a-helper</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/vs-code-extension/pull/431">@N1ebieski</a></p>
<p><img src="/images/changelog/2025-09/vs-code-wrap-with-helper.gif" alt="Wrap with helper" /></p>
<p>Commands are now available that wrap the selected text with a helper, such as <code>dd</code>, <code>collect</code>, <code>dump</code>, and <code>str</code>.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Pint Commands + Run Pint on Save]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-09" />
            <id>https://laravel.com/docs/changelog#item-2025-09-30-vs-code-extension-pint-commands-run-pint-on-save</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/vs-code-extension/pull/448">@joetannenbaum</a></p>
<p>Commands are now available to &quot;Run Pint&quot;, &quot;Run Pint on Dirty Files&quot;, and &quot;Run Pint on Current File&quot;. There is also now an optiont to run Pint on save for the current file.</p>
]]>
            </summary>
                                    <updated>2025-09-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Add `withHeartbeat` Method to `LazyCollection`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-laravel-framework-12x-add-withheartbeat-method-to-lazycollection</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56477">@JosephSilber</a></p>
<pre><code class="language-php">$collection
    -&gt;withHeartbeat(CarbonInterval::minutes(5), function () {
        // ...
    })
    -&gt;each(function ($item) {
        // ...
    });
</code></pre>
<p>The new <code>withHeartbeart</code> method allows you to run a callback at regular time intervals while the collection is being lazily enumerated, particularly useful for long-running processes.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Add `toPrettyJson` Method]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-laravel-framework-12x-add-toprettyjson-method</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56697">@WendellAdriel</a></p>
<pre><code class="language-php">$collection = collect([1,2,3]);

// Instead of this:
$collection-&gt;toJson(JSON_PRETTY_PRINT);

// You can now do this:
$collection-&gt;toPrettyJson();
</code></pre>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Add `allowedUrls` Through `preventStrayRequests`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-laravel-framework-12x-add-allowedurls-through-preventstrayrequests</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56645">@rabrowne85</a></p>
<pre><code class="language-php">Http::allowStrayRequests([
    'http://127.0.0.1:13714/*',
]);
</code></pre>
<p>The <code>Http::allowStrayRequests</code> method now accepts an argument that allows you to specify URLs that tests are allowed to send requests to when using <code>Http::preventStrayRequests</code>.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Add "Copy as Markdown" Button to Error Page]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-laravel-framework-12x-add-copy-as-markdown-button-to-error-page</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56657">@mpociot</a></p>
<p>There is now a &quot;Copy as Markdown&quot; button on the Laravel exception page. When clicking this button, a markdown representation of the exception is copied to the users clipboard, which can then be used for AI agents/LLMs.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Add New `mergeVisible`, `mergeHidden` and `mergeAppends` Methods]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-laravel-framework-12x-add-new-mergevisible-mergehidden-and-mergeappends-methods</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56678">@jonerickson</a></p>
<pre><code class="language-php">protected function initializeTwoFactorAuthentication(): void
{
    $this-&gt;mergeHidden([
        'app_authentication_secret',
        'app_authentication_recovery_codes',
    ]);

    $this-&gt;mergeCasts([
        'app_authentication_secret' =&gt; 'encrypted',
        'app_authentication_recovery_codes' =&gt; 'encrypted:array',
    ]);
}
</code></pre>
<p>Additional attribute helper methods added to Eloquent models for merging visibility-related arrays, bringing them in line with existing helpers like <code>mergeCasts</code>, <code>mergeFillable</code>, and <code>mergeGuarded</code>.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Add `Arr::push()`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-inertia-add-arrpush</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56632">@inxilpro</a></p>
<pre><code class="language-php">if ($this-&gt;hasChanges($data)) {
    Arr::push($result, 'pending.changes', $data);
}
</code></pre>
<p>A new <code>Arr</code> method that allows you to push something to an array if the array exists, or initialize it to an empty array and then push to it if it doesn't.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Introduction of the `Form` Component]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-inertia-introduction-of-the-form-component</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2474">@pascalbaljet</a></p>
<pre><code class="language-vue">&lt;script setup&gt;
import { Form } from &quot;@inertiajs/vue3&quot;;
&lt;/script&gt;

&lt;template&gt;
    &lt;Form action=&quot;/users&quot; method=&quot;post&quot;&gt;
        &lt;input type=&quot;text&quot; name=&quot;name&quot; /&gt;
        &lt;input type=&quot;email&quot; name=&quot;email&quot; /&gt;
        &lt;button type=&quot;submit&quot;&gt;Create User&lt;/button&gt;
    &lt;/Form&gt;
&lt;/template&gt;
</code></pre>
<p>A new <code>&lt;Form&gt;</code> component that behaves much like a classic HTML form and simply allows Inertia to intercept the network call on form submission. This new component greatly reduces the boilerplate needed to create a form with Inertia.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Support for Passing Wayfinder Objects to Router Methods]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-inertia-support-for-passing-wayfinder-objects-to-router-methods</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2497">@pascalbaljet</a></p>
<pre><code class="language-js">import UserController from &quot;@/actions/App/Http/Controllers/UserController&quot;;

// Regular visits
router.visit(UserController.store());

// Prefetching
router.prefetch(UserController.index());
router.getPrefetching(UserController.index());
router.getCached(UserController.index());
router.flush(UserController.index());
</code></pre>
<p>Adds support for passing Wayfinder-like objects into router methods instead of specifying the URL and method manually.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Tag-Based Cache Invalidation for Prefetch Requests]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-inertia-tag-based-cache-invalidation-for-prefetch-requests</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2484">@pascalbaljet</a></p>
<pre><code class="language-jsx">// Specify cache tags via the Link component
&lt;Link href=&quot;/users/1&quot; prefetch=&quot;hover&quot; :tags=&quot;['user', 'profile']&quot;&gt;
    View Profile
&lt;/Link&gt;

// Or via prefetch method on the route
router.prefetch(
  '/users',
  { method: 'get', data: { page: 2 } },
  { cacheFor: '1m', tags: ['users'] }
)

// Flushes all cache entries tagged with 'user'
router.flushByTags(['user'])

// Flushes entries tagged with 'user' OR 'product'
router.flushByTags(['user', 'product'])

// Flush via visit
router.visit('/users', {
  invalidate: ['user']
})

// Flush via useForm helper
form.post('/users', { invalidate: ['users'] })
</code></pre>
<p>Introduces tag-based cache invalidation for prefetch requests. This enables better control over the prefetch cache without having to flush everything.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Boost - Support for Passing Custom Component to `as` Prop of `Link` Component]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-boost-support-for-passing-custom-component-to-as-prop-of-link-component</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2443">@pascalbaljet</a></p>
<pre><code class="language-jsx">&lt;Link as={CustomButton} method=&quot;post&quot; href=&quot;/user&quot; data={{ test: &quot;data&quot; }}&gt;
    Custom Component with Data
&lt;/Link&gt;
</code></pre>
<p>The Inertia <code>Link</code> component now supports custom components instead of just HTML tags such as <code>a</code> or <code>button</code>.</p>
<p><a href="https://github.com/laravel/boost">Laravel Boost</a> was released this month! Not only was it just released, it is already aware and up-to-date with the just-released Pest 4 and Filament 4.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Boost - Add `enabled` Option to Config]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-boost-add-enabled-option-to-config</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/boost/pull/143">@xiCO2k</a></p>
<p>Adds a <code>config('boost.enabled')</code> option to allows users to specifically enable/disable Boost in certain scenarios outside of environment constraints.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[React + Vue Starter Kits - Update Pint Guideline to Use `--dirty` Flag]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-react-vue-starter-kits-update-pint-guideline-to-use-dirty-flag</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/boost/pull/43">@yitzwillroth</a></p>
<p>Updates Boost guidelines to prefer the usage of Pint with the <code>--dirty</code> flag for cleaner diffs and PRs.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[React + Vue Starter Kits - Migrate `useForm` to New Inertia `Form` Component]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-react-vue-starter-kits-migrate-useform-to-new-inertia-form-component</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/react-starter-kit/pull/149">@joetannenbaum</a></p>
<pre><code class="language-tsx">import { Form } from &quot;@inertiajs/react&quot;;

export default function Login() {
    return (
        &lt;Form action=&quot;/login&quot; method=&quot;post&quot;&gt;
            {/* Form fields */}
        &lt;/Form&gt;
    );
}
</code></pre>
<p>Reduces the boilerplate for all forms in the <a href="https://laravel.com/starter-kits">starter kits</a> by replacing <code>useForm</code> with the new Inertia <code>Form</code> component.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[React + Vue Starter Kits - Replace Ziggy With Wayfinder]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-react-vue-starter-kits-replace-ziggy-with-wayfinder</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/react-starter-kit/pull/151">@joetannenbaum</a></p>
<pre><code class="language-tsx">import AuthenticatedSessionController from &quot;@/actions/App/Http/Controllers/Auth/AuthenticatedSessionController&quot;;
import { Form } from &quot;@inertiajs/react&quot;;

export default function Login() {
    return (
        &lt;Form {...AuthenticatedSessionController.store.form()}&gt;
            {/* Form fields */}
        &lt;/Form&gt;
    );
}
</code></pre>
<p>Removes Ziggy from the starter kits and replaces it with the current version of Laravel Wayfinder, bringing end-to-end type safety to your routes.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Sail - 100% Baseline Test Coverage]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-sail-100-baseline-test-coverage</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/react-starter-kit/pull/152">@JaavierR</a></p>
<p>Adds the missing feature tests so that fresh projects start with 100% test coverage.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Allow Sail to Run Pest 4 Browser Tests]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-vs-code-extension-allow-sail-to-run-pest-4-browser-tests</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/sail/pull/812">@rogerio-pereira</a></p>
<p>Docker configuration updates to allow you to run Pest 4 browser tests in Sail.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Add DDEV Support]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-vs-code-extension-add-ddev-support</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/vs-code-extension/pull/398">@damms005</a></p>
<p>Adds proper support for DDEV, Docker-based PHP environments.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Add Support for Custom View Extensions]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-vs-code-extension-add-support-for-custom-view-extensions</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/vs-code-extension/pull/429">@ryangjchandler</a></p>
<p>The extension now recognizes custom registered view extensions such as <code>.blade.sh</code> or <code>.blade.ts</code> and will now autocomplete and link correctly to these files.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Support for Configs in Subfolders]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-vs-code-extension-support-for-configs-in-subfolders</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/vs-code-extension/pull/427">@N1ebieski</a></p>
<p>The extension now supports configs in nested subfolders (e.g. <code>config/foo/bar/baz.php</code>), providing better autocomplete and linking.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Link Directly to Problem Files]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-vs-code-extension-link-directly-to-problem-files</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/vs-code-extension/pull/415">@N1ebieski</a></p>
<p>Now, when the extension warns you about an invalid value, such as a config key, the warning will directly link you to the file where you can fix the issue.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Wayfinder - Autocompletion for `Route::is` and `routeIs` Methods]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-wayfinder-autocompletion-for-routeis-and-routeis-methods</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/vs-code-extension/pull/411">@N1ebieski</a></p>
<p>Full autocomplete and linking support for the <code>Route::is</code> and <code>routeIs</code> methods.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Wayfinder - Introduce Route Utility Types for Improved DX]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-wayfinder-introduce-route-utility-types-for-improved-dx</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/wayfinder/pull/68">@istiak-tridip</a></p>
<pre><code class="language-ts">import type { RouteDefinition } from &quot;@/wayfinder&quot;;

const sendRequest = (route: RouteDefinition&lt;&quot;post&quot;&gt;) =&gt; {
    //
};

sendRequest(StorePostController());
</code></pre>
<p>Utility types are now exported, making them easier to consume if your app requires them.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Wayfinder - Support for Providing Default URL Parameters via the Frontend]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-08" />
            <id>https://laravel.com/docs/changelog#item-2025-08-31-wayfinder-support-for-providing-default-url-parameters-via-the-frontend</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/wayfinder/pull/75">@owenconti</a></p>
<pre><code class="language-ts">  setup({ el, App, props }) {
    const root = createRoot(el);

    setUrlDefaults({
      workspace: props.initialPage.props.workspace.slug
    });

    root.render(&lt;App {...props} /&gt;);
  },
</code></pre>
<p>In instances where Wayfinder is unable to determine the proper default URL params as defined by the server, you can now specify them on the client side using <code>setUrlDefaults</code>.</p>
]]>
            </summary>
                                    <updated>2025-08-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Added Verbose Output for `queue:work`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-07" />
            <id>https://laravel.com/docs/changelog#item-2025-07-31-laravel-framework-12x-added-verbose-output-for-queuework</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull requests by <a href="https://github.com/laravel/framework/pull/56086">@seriquynh</a> &amp; <a href="https://github.com/laravel/framework/pull/56095">@amirhshokri</a></p>
<pre><code class="language-bash">php artisan queue:work --verbose
// App\Jobs\UrgentAction 85 high
// App\Jobs\NormalAction 84 default
</code></pre>
<p>With <code>--verbose</code>, you’ll now see queue names alongside each job and job ID, making multi-queue debugging straightforward and saving you time when tracing issues.</p>
]]>
            </summary>
                                    <updated>2025-07-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - `Uri` Implements `JsonSerializable`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-07" />
            <id>https://laravel.com/docs/changelog#item-2025-07-31-laravel-framework-12x-uri-implements-jsonserializable</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56097">@devajmeireles</a></p>
<pre><code class="language-php">echo json_encode(new Uri('/path?x=1'));
// &quot;http://localhost:8000/path?x=1&quot;
</code></pre>
<p>This release fixes a serialization bug, properly converting the URI to a string when serializing a larger JSON object that contains the URI as a value.</p>
]]>
            </summary>
                                    <updated>2025-07-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Added `doesntStartWith()` & `doesntEndWith()`  `Str` Methods]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-07" />
            <id>https://laravel.com/docs/changelog#item-2025-07-31-laravel-framework-12x-added-doesntstartwith-doesntendwith-str-methods</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56168">@balboacodes</a></p>
<pre><code class="language-php">str('apple')-&gt;doesntStartWith('b'); // true
str('apple')-&gt;doesntEndWith('e'); // false
</code></pre>
<p>The inverse of <code>startsWith</code>/<code>endsWith</code>, these new methods allow you to fluently test for starting and ending characters in your string.</p>
]]>
            </summary>
                                    <updated>2025-07-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Pint - Closure Support in `pluck()`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-07" />
            <id>https://laravel.com/docs/changelog#item-2025-07-31-pint-closure-support-in-pluck</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/56188">@ralphjsmit</a></p>
<pre><code class="language-php">$users-&gt;pluck(fn($u) =&gt; $u-&gt;email, fn($u) =&gt; strtoupper($u-&gt;name));

</code></pre>
<p>You can now dynamically generate keys and values via callbacks. Instead of mapping then plucking, you get a single, flexible method that reduces steps and keeps intent clear.</p>
]]>
            </summary>
                                    <updated>2025-07-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Telescope - Added `--parallel` Option]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-07" />
            <id>https://laravel.com/docs/changelog#item-2025-07-31-telescope-added-parallel-option</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/pint/pull/376">@nunomaduro</a></p>
<pre><code class="language-bash">./vendor/bin/pint --parallel

</code></pre>
<p>By leveraging PHP CS Fixer’s parallel runner, <a href="https://laravel.com/docs/12.x/pint">Pint</a> now formats files concurrently. On large codebases that once took minutes, you’ll see results in seconds, speeding up both local workflows and CI pipelines for a clear quality of life win.</p>
]]>
            </summary>
                                    <updated>2025-07-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Octane - Migrated to Vite]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-07" />
            <id>https://laravel.com/docs/changelog#item-2025-07-31-octane-migrated-to-vite</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/telescope/pull/1598">@nckrtl</a></p>
<p>Telescope’s frontend now uses <a href="https://laravel.com/docs/12.x/vite">Vite</a> instead of Mix. Asset builds finish faster, hot-reloads are more reliable, and you benefit from a modern toolchain without changing your workflow.</p>
]]>
            </summary>
                                    <updated>2025-07-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - FrankenPHP’s File Watcher]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-07" />
            <id>https://laravel.com/docs/changelog#item-2025-07-31-inertia-frankenphps-file-watcher</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/octane/pull/971">@kohenkatz</a></p>
<p><a href="https://laravel.com/docs/12.x/octane">Octane</a> now relies on <a href="https://frankenphp.dev">FrankenPHP</a>’s native file watcher for reloading the server on file changes. This removes the NodeJS dependency and eases the local development process significantly.</p>
]]>
            </summary>
                                    <updated>2025-07-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Reset Form State and Clear Errors with a Single Method]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-07" />
            <id>https://laravel.com/docs/changelog#item-2025-07-31-inertia-reset-form-state-and-clear-errors-with-a-single-method</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2414">@pascalbaljet</a></p>
<pre><code class="language-jsx">const form = useForm({ name: &quot;&quot;, email: &quot;&quot; });

// Instead of:
form.reset();
form.clearErrors();

// You can now:
form.resetAndClearErrors();
</code></pre>
<p>You can now concisely reset all fields and errors in one go, bringing your form back to square one.</p>
]]>
            </summary>
                                    <updated>2025-07-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Prevent Minifying JavaScript Builds and Test Apps]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-07" />
            <id>https://laravel.com/docs/changelog#item-2025-07-31-inertia-prevent-minifying-javascript-builds-and-test-apps</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2424">@pascalbaljet</a></p>
<p>Inertia no longer distributes minified builds, aligning it with the strategy of other popular libraries. This makes debugging more straightforward and allows for local patching if the need arises.</p>
]]>
            </summary>
                                    <updated>2025-07-31T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Added `encrypt()` and `decrypt()` String Helper Methods]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-06" />
            <id>https://laravel.com/docs/changelog#item-2025-06-30-laravel-framework-12x-added-encrypt-and-decrypt-string-helper-methods</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/55931">@KIKOmanasijev</a></p>
<p>You can now chain <code>encrypt()</code> and <code>decrypt()</code> directly on a <code>Str</code> instance, so instead of piping your string through separate encryption calls, you can write:</p>
<pre><code class="language-php">$value = Str::of('secret')-&gt;encrypt()-&gt;prepend('Encrypted: ');
$original = Str::of($value)-&gt;decrypt();
</code></pre>
<p>This keeps your string-manipulation chains concise (no need to write separate, extra code to handle encryption) and you don’t have to manually wrap a value in encryption calls each time.</p>
<p>Learn more about <a href="https://laravel.com/docs/12.x/helpers#method-encrypt"><code>encrypt</code></a> and <a href="https://laravel.com/docs/12.x/helpers#method-decrypt"><code>decrypt</code></a></p>
]]>
            </summary>
                                    <updated>2025-06-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Framework 12.x - Added `broadcast_if()` and `broadcast_unless()` Utilities]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-06" />
            <id>https://laravel.com/docs/changelog#item-2025-06-30-laravel-framework-12x-added-broadcast-if-and-broadcast-unless-utilities</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/55967">@taylorotwell</a></p>
<p>You now have two methods for conditional broadcasting in a single call:</p>
<pre><code class="language-php">broadcast_if($order-&gt;isPaid(), new OrderShipped($order));
broadcast_unless($user-&gt;isActive(), new InactiveUserAlert($user));
</code></pre>
<p>This replaces multi-line conditionals around <code>broadcast()</code> and makes your event logic more readable, improving the overall developer experience.</p>
<p>Read the docs about <a href="https://laravel.com/docs/12.x/broadcasting">event broadcasting in Laravel</a></p>
]]>
            </summary>
                                    <updated>2025-06-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Added `--batched` Flag to `make:job`]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-06" />
            <id>https://laravel.com/docs/changelog#item-2025-06-30-vs-code-extension-added-batched-flag-to-makejob</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/framework/pull/55929">@hafezdivandari</a></p>
<p>The <code>php artisan make:job</code> command now accepts a <code>--batched</code> option:</p>
<pre><code class="language-bash">php artisan make:job ProcessPodcast --batched
</code></pre>
<p>This command scaffolds the job with the <code>Batchable</code> trait already applied, so you don’t have to add it manually. It saves you a manual step and ensures consistency.</p>
<p>Learn more about <a href="https://laravel.com/docs/12.x/queues#defining-batchable-jobs">defining batchable jobs</a></p>
<p><img src="/images/changelog/2025-06/vs-code-performance-improvements.png" alt="VS Code Performance Improvements" /></p>
]]>
            </summary>
                                    <updated>2025-06-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[VS Code Extension - Memory Improvements]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-06" />
            <id>https://laravel.com/docs/changelog#item-2025-06-30-vs-code-extension-memory-improvements</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/vs-code-extension/pull/402">@joetannenbaum</a></p>
<p>We fixed a memory-leak issue in the extension’s background processes, reducing its long-term footprint and preventing slowdowns during extended coding sessions.</p>
]]>
            </summary>
                                    <updated>2025-06-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Improved Startup Time]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-06" />
            <id>https://laravel.com/docs/changelog#item-2025-06-30-inertia-improved-startup-time</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/laravel/vs-code-extension/pull/404">@joetannenbaum</a></p>
<p>Initialization with the VS Code extension now completes in under one second (down from 5–7 seconds) by deferring heavy setup until it’s actually needed. You’ll notice the extension loads almost instantly so you can start building faster.</p>
<p>Get started with the <a href="https://github.com/laravel/vs-code-extension">Laravel VS Code extension</a></p>
]]>
            </summary>
                                    <updated>2025-06-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Allow `deepMerge` on Custom Properties]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-06" />
            <id>https://laravel.com/docs/changelog#item-2025-06-30-inertia-allow-deepmerge-on-custom-properties</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2344">@mpociot</a></p>
<p>When implementing infinite scrolling with Inertia or other paginated data merges, you can now specify a key (<code>matchOn</code>) to do a deep merge, matching items by ID and replacing or appending as appropriate. This provides greater flexibility, prevents duplicated entries, and keeps your client-side data consistent.</p>
<pre><code class="language-php">Inertia::render('Users/Index', [
    'users' =&gt; Inertia::deepMerge($users)-&gt;matchOn('data.id'),
]);
</code></pre>
<p><a href="https://inertiajs.com/merging-props#server-side">Learn more in the Inertia docs</a></p>
]]>
            </summary>
                                    <updated>2025-06-30T23:59:59+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Inertia - Prevent Duplicate Render in React]]></title>
            <link rel="alternate" href="https://laravel.com/docs/changelog#log-2025-06" />
            <id>https://laravel.com/docs/changelog#item-2025-06-30-inertia-prevent-duplicate-render-in-react</id>
            <author>
                <name><![CDATA[Taylor Otwell]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Pull request by <a href="https://github.com/inertiajs/inertia/pull/2377">@pascalbaljet</a></p>
<p>We fixed a React-specific issue in <code>&lt;StrictMode&gt;</code> where the initial Inertia page would render twice. Now you get a single, clean first render without flicker, improving perceived performance.</p>
<p>Get started with the <a href="https://www.youtube.com/watch?v=_sw61Ew1FHQ">Laravel + React Starter Kit</a></p>
]]>
            </summary>
                                    <updated>2025-06-30T23:59:59+00:00</updated>
        </entry>
    </feed>
