The screenshots doing the rounds this week all show the same thing: php artisan dev with pretty tabs. Fair enough, it looks great. But my vote for the change actually worth writing home about in Laravel 13.25 goes to a command whose entire purpose is to make processes do nothing for a while. queue:pause --all attacks a deploy hazard most of us learned to shrug at years ago, and it does it with more care than any bash script I have ever written for the same problem.
The hazard, in case you have been lucky enough never to hit it: your pipeline swaps the code on disk, but a long-running worker still has the old classes loaded in memory, and the jobs sitting in Redis were serialized against yesterday's shape of your codebase. Rename a constructor parameter on the job that renders monthly invoices, push at 14:03, and a payload queued at 14:02 lands on a class that no longer matches it. You find out via a growing failed_jobs table while the pipeline is still cheerfully green. Until now you had two blunt instruments. Maintenance mode also turns away paying visitors, which is a lot of collateral damage for a background-job problem. And queue:restart never interrupts anything, because a worker only checks for that signal once its current job is done, so the timing stays out of your hands.
Laravel 13.25 gives you the scalpel: run queue:pause --all before the release goes out, let workers come back up on the new code, then queue:resume --all. A job already mid-execution gets to finish, and dispatching keeps working throughout, so the backlog simply drains once you resume. The detail that convinced me someone thought this through: resumeAll() will not touch a queue that was paused individually. Picture the on-call colleague who paused the imports queue at 3 a.m. because a poison job kept crashing it. When your 9 a.m. deploy script calls Queue::resumeAll(), that queue stays down, exactly as intended. There is also a QueuesPaused event, so wiring a Slack alert for "someone froze production queues" takes about four lines.
Now to the flashy part, and I want to be fair to it. Since 13.16, php artisan dev boots the whole local stack from one terminal: the HTTP server, queue:listen --tries=1 --timeout=0, Pail where pcntl_fork exists, and your frontend build, whether that runs on npm, pnpm, Yarn or Bun. What 13.25 adds is @laravel/multiplex underneath it. Every process lives in its own tab, you can bounce Vite without taking the queue listener with it, the stream mode is finally scrollable and searchable, and when there is no TTY, say in a container, it falls back to plain inline output on its own. A crashed process restarts automatically unless you pass --no-restart. The catch: macOS and Linux only for now, Windows keeps the old concurrently-based behavior.
Here is the objection I take seriously: a web framework shipping its own terminal multiplexer smells like scope creep. tmux exists. A compose file exists. Every extra moving part inside the framework is something the core team now has to keep working across operating systems and terminal emulators forever. I have made that argument myself about other features. What changed my mind here is onboarding. "Just copy my tmux config" has a success rate of roughly zero, and after six months every laptop on the team runs a slightly different local stack. A DevCommands::artisan('horizon', 'queue') call in AppServiceProvider, committed to the repo and replacing the default worker outright, means your local setup goes through code review like everything else, and dev:list shows a new hire exactly what will run before anything starts. That is worth some framework weight.
Rounding out the batch, Installer v5.31.0 learned laravel package. It pulls the official laravel/package-skeleton, deletes the skeleton's git history, installs dependencies and then interviews you about what the package needs, or skips the interview entirely if you pass flags like --config, --facade and --vendor-namespace. It even detects when an AI agent is driving it and stays non-interactive instead of hanging on a prompt. My take is short: the tedious first hour of extracting shared code into a proper package just became cheap enough that "we should really package this" might stop being a sentence we only say in retros.
Step back and notice what none of these releases touch: routing, Eloquent, validation, the framework's actual core. Laravel is spending its energy on the minutes around your code, on booting the stack, shipping it safely, splitting it up. I think that is the right bet in 2026, and queue:pause --all is the proof, because it closes a gap we all knew about and nobody prioritized. So tell me: are you going to put pause and resume into your deploy pipeline, or is the old-payload-meets-new-code window a risk your job classes are stable enough to live with?
Comments
No comments yet — be the first.
Open the discussion
No account or password needed — just enter your e-mail and we’ll send you a one-time sign-in link. First time here? You’re set up automatically.
Your rating will be applied automatically after you sign in.
Check your inbox
We’ve sent a sign-in link to …. Open it on this device — this tab will sign you in automatically.
Nothing arrived? Check your spam folder — and mark the mail as "Not spam" so it lands in your inbox next time.