What's New in Laravel 13.25
Laravel 13.25.0 was released on August 11, 2026, bringing a handful of quality-of-life improvements for queue management, local development, and image handling, alongside a set of targeted bug fixes.
Pause Every Queue on Every Connection
Previously, pausing queues during a deployment meant issuing a separate command for every connection/queue pair. Laravel 13.25 adds an --all flag to both queue:pause and queue:resume:
php artisan queue:pause --all
php artisan queue:resume --all
The same capability is available on the facade:
use Illuminate\Support\Facades\Queue;
Queue::pauseAll();
Queue::resumeAll();
The global switch uses a single cache key that workers check alongside per-queue keys. Crucially, resumeAll() clears only the global flag — queues you paused individually stay paused, so a deploy script cannot accidentally restart a queue that was parked on purpose. Two new events, QueuesPaused and QueuesResumed, fire alongside the existing per-queue events.
artisan dev Gets a Tabbed Terminal UI
The artisan dev command previously used concurrently, which interleaved all process output into a single scrolling feed. It now runs through @laravel/multiplex, giving each process its own tab with search, per-process restart, and log clearing.
Three output modes are available:
- tabs (default) — each process in its own tab
- stream — one interleaved feed you can scroll and search
- inline — plain output, used automatically when there is no TTY
php artisan dev --stream
php artisan dev --timestamps --no-restart
You can set project-level defaults in a service provider:
use Illuminate\Foundation\DevCommands;
DevCommands::stream();
DevCommands::withTimestamps();
DevCommands::disableAutoRestart();
DevCommands::bufferSize(5000);
When the command exits, buffered logs are printed to the terminal so nothing is lost. Windows falls back to concurrently; the new path requires Node v22.13+ and runs on macOS and Linux.
Images as HTTP Responses
Image now implements Responsable, so you can return an image instance directly from a route:
use Illuminate\Support\Facades\Image;
Route::get('/avatars/{user}', function (User $user) {
return Image::fromStorage($user->avatar_path)
->cover(200, 200)
->toWebp()
->quality(80);
});
Two additional helpers ship alongside this:
Image::fromStream()— builds an instance from a stream resource (e.g.,Storage::disk('s3')->readStream($path))toFormat()is now public — converts a user-supplied format string to the correct output method, throwing anImageExceptionfor unsupported formats
Queue Observability Additions
UniqueJobSkippedevent — fires when aShouldBeUniquejob is dropped because the lock is already held, making it easy to distinguish a working constraint from a stuck lock.$timeoutonJobTimedOut— the event now carries the number of seconds that was exceeded.#[FailOnTimeout]for notifications —SendQueuedNotificationsrespects a$failOnTimeoutproperty or#[FailOnTimeout]attribute on the notification class.QueueFakeassigns UUIDs — faked jobs now match the shape of real driver jobs, making$job->uuidtestable.
Other Notable Changes
withoutCookies(array)— expire multiple cookies in one call instead of chainingwithoutCookie()repeatedly.foreignUlidFor()schema helper — completes the trio alongsideforeignIdFor()andforeignUuidFor(), producing achar(26)column with the correct foreign key constraint.Request::all()prefers input over files — when an input field and a file field share the same key, the input value wins;file()is unaffected.
Key Takeaways
queue:pause --all/queue:resume --allandQueue::pauseAll()/Queue::resumeAll()simplify zero-downtime deployments.artisan devnow uses@laravel/multiplexfor a tabbed terminal UI on macOS/Linux (Node v22.13+ required).ImageimplementsResponsableand gainsfromStream()and a publictoFormat().UniqueJobSkipped, an expandedJobTimedOut, and#[FailOnTimeout]for notifications improve queue observability.foreignUlidFor()completes the schema helper trio for ULID-based foreign keys.
Source: Laravel News — Laravel 13.25.0