Laravel Open Source Changelog (February 2026)
New updates and improvements to Laravel's open source products.
Laravel Framework 12.x
Add Support for temporaryUploadUrl to the local Filesystem
Pull request by @mnapoli
You can now generate temporary upload URLs even when you're using the local driver, making it much easier to build consistent upload flows across local, staging, and production environments.
use Illuminate\Support\Facades\Storage;
$url = Storage::disk('local')->temporaryUploadUrl(
'uploads/incoming/video.mp4',
now()->addMinutes(10),
['Content-Type' => 'video/mp4']
);[12.x] Add makeMany Method to Factory
Pull request by @jackbayliss
makeMany() gives you a clean, expressive way to generate multiple in-memory model instances without persisting anything. It's ideal for tests, previews, and shaping data before a write.
$users = User::factory()->makeMany(3);
$payload = $users->map->only(['name', 'email']);[12.x] Allow Closures for Values in firstOrCreate and createOrFirst
Pull request by @gcavanunez
You can now lazily compute attribute values only when a record is actually being created. That means fewer unnecessary queries and less wasted work when the model already exists.
$location = Location::firstOrCreate(
['address' => $address],
fn () => ['coordinates' => Geocoder::resolve($address)],
);[12.x] Support afterSending Method on Notification
Pull request by @gdebrauwer
afterSending() lets you hook into the lifecycle after a notification is dispatched, which is perfect for audit logging, metrics, or cleanup work without cluttering your notification channels.
class BookingNotification extends Notification
{
public function __construct(
public Booking $booking;
) {
//
}
public function via()
{
return ['mail'];
}
public function toMail()
{
// ...
}
public function afterSending($notifiable, $channel, $response)
{
$this->booking->update(['notified_at' => now()]);
}
}[12.x] Add whenFails and whenPasses Methods on Validator
Pull request by @gdebrauwer
These helpers are particularly useful when you use the validator to validate data outside the request cycle where the error would not get picked up automatically by the HTTP handler.
Validator::make(
['file' => $file],
['file' => 'required|image|dimensions:min_width=100,min_height=200']
)->whenFails(function () {
throw new InvalidArgumentException('Provided file is invalid');
});[12.x] Add withoutheader Method to Response
Pull request by @miladev95
Removing headers is now straightforward with withoutHeader(), which is handy when you need to strip inherited headers (like caching or debug headers) before returning a response.
return response($content)->withoutHeader('X-Debug');[12.x] Exclude Decorative ASCII Art SVG from Exception Page in Non-Browser Contexts
Pull request by @serhiilabs
Console and non-browser contexts no longer receive the decorative ASCII SVG payload, keeping error output cleaner in logs, CI, agent, and API responses. Furthermore...
[12.x] Use JS to Create the Laravel ASCII SVG Logo on the Fly
Pull request by @markjaquith
The exception page ASCII SVG is now generated on the fly with JavaScript, keeping output leaner and better suited to different rendering contexts.
[12.x] Add Typed Getters on Cache
Pull request by @ahinkle
Typed cache getters reduce repetitive casting and make intent obvious when reading cached values, helping you avoid subtle bugs from unexpected types.
$count = Cache::integer('downloads.count', 0);
$enabled = Cache::boolean('features.new_checkout', false);[12.x] Add InteractsWithData::clamp()
Pull request by @cosmastech
A clamp() method has been added to the InteractsWithData trait, giving you a tidy way to bound numeric input values, which is great for pagination, limits, sliders, and any user-controlled numbers.
// Instead of:
/** @var int<PHP_INT_MIN, PHP_INT_MAX> $perPage */
$perPage = request()->integer('per_page', 50);
// You can now do:
/** @var int<1, 100> $perPage */
$perPage = request()->clamp('per_page', 1, 100, 50);AI SDK
Make Provider Default Models Configurable
Pull request by @pfrug
The default models used for text, images, audio, transcription, and embeddings may are now configurable in your application's config/ai.php file. This gives you granular control over the exact models you'd like to use if you don't want to rely on the package defaults.
return [
'models' => [
'text' => [
'default' => 'claude-sonnet-4-6',
'cheapest' => 'claude-haiku-4-5-20251001',
'smartest' => 'claude-opus-4-6',
],
],
],Add Support for Timeouts in Transcription
Pull request by @NietThijmen
Transcription now supports timeouts, giving you better control in production workloads and preventing long-running requests from tying up workers.
$transcript = Transcription::fromPath('./podcast.mp3')->timeout(240)->generate(Lab::ElevenLabs);New Providers Added
Azure OpenAI
Pull request by @imYashGupta
Mistral AI
Pull request by @jackbayliss
Voyage AI
Pull request by @jackbayliss
DeepSeek
Pull request by @ihxnnxs
Boost
Added Support for Loading Guidelines and Skills Directly from Vendor Packages
Pull request by @pushpak1300
Guidelines and skills can now be loaded directly from vendor packages, ensuring that guidelines always match the package version you are using and will never go stale.
Add Support for Nightwatch MCP
Pull request by @jessarcher
Nightwatch MCP support improves the integration story for observability-driven workflows, so you can connect monitoring context to your tools more seamlessly.
Enhance Database-Schema Tool with Full Column Metadata
Pull request by @alanost
The database schema tool now exposes richer column metadata, which improves the quality of schema-aware tooling and reduces incorrect assumptions (types, defaults, nullability).
This is particularly helpful when generating code, validating migrations, or building assistants that reason about your database structure.
MCP
Change JSON Response Formatting to Compact by Default
Pull request by @pushpak1300
JSON responses are now compact by default, trimming payload size and making tool-to-tool communication faster and less noisy in logs.
Prompts
Add number Prompt
Pull request by @joetannenbaum
A new number prompt makes it easy to collect numeric input with validation baked in, perfect for CLI setup flows and interactive tooling. Features automatic clamping of the min/max values and adjusting the value via the up and down arrows.
$retries = number('How many retries?', default: 3, min: 0, max: 10);Stream
Svelte Package
Pull request by @joetannenbaum
The new @laravel/stream-svelte package makes it trivial to consume streaming output from your server in your Svelte app. If you're shipping real-time UI, this helps you move from prototype to production faster.
Svelte Starter Kit
Pull request by @joetannenbaum
The new Svelte starter kit gets you up and running with Inertia, Svelte, and Laravel conventions quickly, so you can spend time on product code instead of scaffolding.
VS Code Extension
Test Runner Integration
Pull request by @TitasGailius
Integrating with VS Code's built-in test runner makes it easier to run and iterate on your suite from within your IDE, shortening the edit-test loop and helping you stay in flow.

Livewire Props
Pull request by @TitasGailius
New support for hovering over Livewire 3 and 4 props means that you can see the relevant type and docblock information directly from the PHP class, reducing context switching in your Livewire and Blade components.
