Laravel 13.25: Pause All Queues at Once and a New artisan dev Terminal UI
Laravel #Laravel 13 #Queue Management #artisan dev #Image API #Laravel Releases

Laravel 13.25: Pause All Queues at Once and a New artisan dev Terminal UI

4 min read Mohamed Said Mohamed Said

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 an ImageException for unsupported formats

Queue Observability Additions

  • UniqueJobSkipped event — fires when a ShouldBeUnique job is dropped because the lock is already held, making it easy to distinguish a working constraint from a stuck lock.
  • $timeout on JobTimedOut — the event now carries the number of seconds that was exceeded.
  • #[FailOnTimeout] for notificationsSendQueuedNotifications respects a $failOnTimeout property or #[FailOnTimeout] attribute on the notification class.
  • QueueFake assigns UUIDs — faked jobs now match the shape of real driver jobs, making $job->uuid testable.

Other Notable Changes

  • withoutCookies(array) — expire multiple cookies in one call instead of chaining withoutCookie() repeatedly.
  • foreignUlidFor() schema helper — completes the trio alongside foreignIdFor() and foreignUuidFor(), producing a char(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 --all and Queue::pauseAll() / Queue::resumeAll() simplify zero-downtime deployments.
  • artisan dev now uses @laravel/multiplex for a tabbed terminal UI on macOS/Linux (Node v22.13+ required).
  • Image implements Responsable and gains fromStream() and a public toFormat().
  • UniqueJobSkipped, an expanded JobTimedOut, 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

Found this useful?

Frequently Asked Questions

3 questions
Q01 Does queue:resume --all also resume queues that were paused individually before the global pause?
No. `resumeAll()` clears only the global pause flag. Any queue you paused individually with `queue:pause {connection} {queue}` remains paused, so a deployment script cannot accidentally restart a queue that was intentionally parked.
Q02 What are the requirements for the new artisan dev terminal UI in Laravel 13.25?
The new `@laravel/multiplex`-based UI requires Node.js v22.13 or higher and runs on macOS and Linux. On Windows, the command automatically falls back to the previous `concurrently`-based runner.
Q03 How does Image::toFormat() differ from calling toWebp() or toAvif() directly?
`toFormat()` accepts a user-supplied format string and resolves it to the correct conversion method internally. It throws an `ImageException` for unsupported formats rather than silently falling through, making it safe to use with untrusted input such as a request parameter.

Continue reading

More Articles

View all