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.