Laravel 13 introdujo una forma unificada de arrancar todo lo que necesita un proyecto local: servidor de desarrollo, worker de cola, salida de logs y Vite. Al principio, el skeleton de la aplicación lo lograba con un script dev en composer.json que encadenaba cuatro comandos mediante npx concurrently. Laravel 13.16 reemplazó ese enfoque con un comando propio: php artisan dev. El script composer dev sigue en el skeleton, pero ahora solo delega en él.

De fábrica se ejecutan cuatro procesos: server (php artisan serve --host=localhost), queue (php artisan queue:listen --tries=1 --timeout=0), logs (php artisan pail --timeout=0) y vite (npm run dev). El proceso Pail solo se registra cuando pcntl_fork está disponible, así que los usuarios de Windows obtienen los otros tres. El proceso vite detecta el gestor de paquetes según el lockfile del proyecto y ejecuta pnpm run dev o el equivalente de Yarn/Bun sin configuración. Internamente el comando sigue usando concurrently y, desde la 13.18, pasa --kill-others-on-fail para que un proceso que falla detenga toda la pila.

Los procesos personalizados se registran mediante la clase DevCommands, normalmente en el método boot del AppServiceProvider protegido por una comprobación de entorno local. Hay cuatro métodos: artisan() antepone php artisan, node() usa el comando run del gestor detectado, nodeExec() usa la variante exec (npx y similares), y register() acepta cualquier comando shell en bruto como la CLI de Stripe. El segundo argumento es el nombre del proceso; los nombres son la identidad de un proceso, así que registrar un comando con un nombre existente como queue reemplaza el predeterminado —por ejemplo, cambiar queue:listen por Horizon—. Los registros de la aplicación tienen prioridad sobre los del framework, y estos sobre los de los vendors. Ayudantes de color opcionales como purple() o color('#ff6347') colorean la salida.

Laravel 13.17 añadió php artisan dev:list, que muestra cada proceso registrado con su comando y el archivo y línea donde se registró. DevCommands::only('server', 'vite') y DevCommands::except('queue') filtran la lista en tiempo de ejecución sin eliminar registros. El comando fue contribuido por Joe Tannenbaum (pull request #60412) y está documentado en la documentación de Artisan.