Laravel 13 introduced a unified way to start everything a local project needs — development server, queue worker, log output and Vite. Initially the application skeleton achieved this with a dev script in composer.json that piped four commands through npx concurrently. Laravel 13.16 replaced that approach with a first-party command: php artisan dev. The composer dev script remains in the skeleton but now only delegates to it.
Out of the box, four processes run: server (php artisan serve --host=localhost), queue (php artisan queue:listen --tries=1 --timeout=0), logs (php artisan pail --timeout=0) and vite (npm run dev). The Pail process is only registered when pcntl_fork is available, so Windows users get the other three. The vite process detects the package manager from the project's lockfile, running pnpm run dev or the Yarn/Bun equivalent without configuration. The command still shells out to concurrently internally, and since 13.18 it passes --kill-others-on-fail so one crashing process stops the whole stack.
Custom processes are registered via the DevCommands class, typically in the boot method of AppServiceProvider guarded by a local-environment check. Four methods exist: artisan() prefixes with php artisan, node() uses the detected package manager's run command, nodeExec() uses the exec variant (npx and friends), and register() accepts any raw shell command such as the Stripe CLI. The second argument is the process name; names are a process's identity, so registering a command under an existing name like queue replaces the default — for example swapping queue:listen for Horizon. Application registrations outrank framework defaults, which outrank vendor registrations. Optional color helpers like purple() or color('#ff6347') style each process's output.
Laravel 13.17 added php artisan dev:list, which shows every registered process with its command and the file and line where it was registered. DevCommands::only('server', 'vite') and DevCommands::except('queue') filter the run-time list without removing registrations. The command was contributed by Joe Tannenbaum in pull request #60412 and is documented in the Artisan docs.
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.