The artisan dev command runs four development processes in a single terminal: the HTTP server, queue worker, log viewer (Pail), and Vite bundler. Until Laravel 13.25, all output streamed to the same feed, causing readability issues when processes logged simultaneously—for example, a Vite rebuild overlaying a stack trace from Pail.
Laravel 13.25 replaces the concurrently process manager with @laravel/multiplex, a new terminal UI that keeps each process output separate and requires no installation or configuration. The multiplex integration was contributed by Joe Tannenbaum (PR #61100).
Three Display Modes
Tabs mode (default) assigns each process its own tab. Users switch between tabs to read one stream at a time. Individual processes can be restarted or have logs cleared independently, and a crashed process automatically restarts without stopping the entire stack.
Stream mode reproduces the old behavior but with scrolling and search capabilities, displaying all output in a single interleaved feed.
Inline mode outputs plain text with no UI, selected automatically when there is no TTY (in containers, CI, or under process supervisors).
Run-time flags select a mode: `php artisan dev --tabs`, `php artisan dev --stream`, or `php artisan dev --inline` (short forms: -t, -s, -i). Users can toggle between tabs and stream mode while the UI runs.
Configuration Methods
Seven DevCommands methods configure behavior project-wide in a service provider boot method: - `DevCommands::tabs()` – tab mode (default) - `DevCommands::stream()` – interleaved feed - `DevCommands::inline()` – plain output - `DevCommands::withTimestamps()` – prefix each line with a timestamp - `DevCommands::disableAutoRestart()` – leave crashed processes stopped - `DevCommands::bufferSize(lines)` – ring buffer size per process in tabs mode (default varies) - `DevCommands::streamBufferSize(lines)` – total lines retained in stream mode
Command-line flags override provider settings. In tabs mode, each process maintains its own ring buffer, preventing a verbose process (like Vite) from pushing other output out of view.
Auto-Restart Behavior
Crashed processes restart automatically by default, replacing the previous --kill-others-on-fail behavior where any failure stopped the entire stack. This suits common scenarios: a queue worker dying on a fatal error while editing a job class, or Vite failing on a bad import. The process recovers when the file is fixed, without requiring a manual restart. Use `--no-restart` to disable this per run or call `DevCommands::disableAutoRestart()` permanently.
Platform Support and Requirements
Multiplex runs natively on macOS and Linux. Windows continues using concurrently; mode and buffer methods are no-ops there, though `--timestamps` and `--no-restart` translate to equivalent concurrently flags.
Node.js v22.13 or later is required. Laravel pins @laravel/multiplex to a specific minor version and runs it via the project's package manager (pnpm dlx for pnpm projects, npx for npm) without adding a dependency to package.json.
Additional Features
Search functionality works in both tabs and stream modes. The `--json` flag emits newline-delimited JSON events instead of formatted output, enabling integration with editor extensions or dashboards consuming structured process data.
SERVER_HOST Fix
A related fix in the same release corrects an issue where explicit command-line arguments to the serve process overrode environment-based defaults. The server was registered as `serve --host=localhost`, which ignored the SERVER_HOST environment variable. The default is now plain `serve`, restoring the ability to expose the dev server to other network devices: `SERVER_HOST=0.0.0.0 php artisan dev`. Users who registered custom server processes to work around this can remove them.
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.