New updates and improvements to Laravel's open source products.
temporaryUploadUrl to the local FilesystemPull 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.
1use Illuminate\Support\Facades\Storage;2 3$url = Storage::disk('local')->temporaryUploadUrl(4 'uploads/incoming/video.mp4',5 now()->addMinutes(10),6 ['Content-Type' => 'video/mp4']7);
makeMany Method to FactoryPull 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.
1$users = User::factory()->makeMany(3);2 3$payload = $users->map->only(['name', 'email']);
firstOrCreate and createOrFirstPull 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.
1$location = Location::firstOrCreate(2 ['address' => $address],3 fn () => ['coordinates' => Geocoder::resolve($address)],4);
afterSending Method on NotificationPull 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.
1class BookingNotification extends Notification 2{ 3 public function __construct( 4 public Booking $booking; 5 ) { 6 // 7 } 8 9 public function via()10 {11 return ['mail'];12 }13 14 public function toMail()15 {16 // ...17 }18 19 public function afterSending($notifiable, $channel, $response)20 {21 $this->booking->update(['notified_at' => now()]);22 }23}
whenFails and whenPasses Methods on ValidatorPull 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.
1Validator::make(2 ['file' => $file],3 ['file' => 'required|image|dimensions:min_width=100,min_height=200']4)->whenFails(function () {5 throw new InvalidArgumentException('Provided file is invalid');6});
withoutheader Method to ResponsePull 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.
1return response($content)->withoutHeader('X-Debug');
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...
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.
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.
1$count = Cache::integer('downloads.count', 0);2$enabled = Cache::boolean('features.new_checkout', false);
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.
1// Instead of:2/** @var int<PHP_INT_MIN, PHP_INT_MAX> $perPage */3$perPage = request()->integer('per_page', 50);4 5// You can now do:6/** @var int<1, 100> $perPage */7$perPage = request()->clamp('per_page', 1, 100, 50);
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.
1return [2 'models' => [3 'text' => [4 'default' => 'claude-sonnet-4-6',5 'cheapest' => 'claude-haiku-4-5-20251001',6 'smartest' => 'claude-opus-4-6',7 ],8 ],9],
Pull request by @NietThijmen
Transcription now supports timeouts, giving you better control in production workloads and preventing long-running requests from tying up workers.
1$transcript = Transcription::fromPath('./podcast.mp3')->timeout(240)->generate(Lab::ElevenLabs);
Pull request by @imYashGupta
Pull request by @jackbayliss
Pull request by @jackbayliss
Pull request by @ihxnnxs
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.
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.
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.
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.
number PromptPull 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.
1$retries = number('How many retries?', default: 3, min: 0, max: 10);
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.
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.
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.
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.