composer run dev

Running the Application with composer run dev

The quickest look is PHP's built-in web server, wrapped by Artisan, which routes every request through public/index.php as the Apache rules of Front-Controller Routing do:

Serving the application, then checking it from a second terminalShell
php artisan serve --port=8301
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8301/up
Output
   INFO  Server running on [http://127.0.0.1:8301].
...
200

/up is the health route for load balancers: 200 when the application boots, 500 when it does not. The page at / is resources/views/welcome.blade.php; here is its returned HTML, cut to the text column, with Tailwind 5,202 's browser build replacing the compiled CSS:

The welcome page's markup (icons, dark-mode classes and logo panel removed)HTMLLive
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
<body class="bg-[#FDFDFC] text-[#1b1b18] flex p-6 items-center min-h-screen flex-col">
  <div class="text-[13px] leading-[20px] max-w-[335px] w-full p-6 bg-white rounded-lg
    shadow-[inset_0px_0px_0px_1px_rgba(26,26,0,0.16)]">
    <h1 class="mb-1 font-medium">Let's get started</h1>
    <p class="mb-2 text-[#706f6c]">With so many options available to you,<br /> we suggest
      you start with the following:</p>
    <p class="py-2">Read the
      <a class="font-medium underline text-[#f53003]">Documentation</a></p>
    <p class="py-2 mb-4">Watch video tutorials at
      <a class="font-medium underline text-[#f53003]">Laracasts</a></p>
    <a class="px-5 py-1.5 bg-[#1b1b18] rounded-sm text-white text-sm">Deploy now</a>
    <p class="mt-6 text-[#706f6c]">v13.33.0</p>
  </div>
</body>
Browser output of Listing 5.7
Browser output of 7

composer run dev adds a queue worker, a log viewer and the Vite 25,978 dev server. Since Laravel 13.16 2,157 (June 2026) the script only calls php artisan dev, whose process list you control from PHP; registering an existing name replaces that default, which is how the bookshop changes ports:

app/Providers/AppServiceProvider.php: moving the dev ports, then composer run devPHP
public function boot(): void
{
    \Illuminate\Foundation\DevCommands::artisan('serve --port=8301', 'server');
    \Illuminate\Foundation\DevCommands::node('dev -- --port=5301 --strictPort', 'vite');
}
Output
> @php artisan dev
 queue │    INFO  Processing jobs from the [default] queue.
  logs │    INFO  Tailing application logs.               Press Ctrl+C to exit
server │    INFO  Server running on [http://127.0.0.1:8301].
...
  vite │   ➜  Local:   http://localhost:5301/
...
  logs │ │ Order 1001 placed                                                   │

In a terminal the four appear as tabs (@laravel/multiplex; Windows uses concurrently); piped to a file, they interleave. logs is Laravel Pail 926 , which caught a logger() call made from Tinker. While Vite runs, its address sits in public/hot; if the processes are killed rather than stopped with Ctrl+C, that file survives and pages load CSS from a dead server. Delete it.