Before Docker, my Laravel workflow was simple but repetitive. Every time I wanted to work on a project, I had to open a terminal and run php artisan serve. Then another terminal for npm run dev. It worked, but it was tedious.
Laravel Sail changed that. One sail up -d and everything was running. PHP, the database, the web server, all inside Docker. No more manually starting the dev server every session.
The Curiosity
At some point, I got curious about running PHP natively on macOS, outside of Docker. And honestly, it was confusing at first. I only got my Mac last year, so I was not familiar with the macOS development ecosystem at all. I did not know where to start or what tools were available. My first instinct was just to search for how to run PHP on Mac.
I started searching and quickly fell into a rabbit hole of Homebrew PHP installations, managing multiple versions, configuring Nginx, setting up databases manually. It felt like a lot of moving pieces compared to the single sail up command I was used to.
Discovering DBngin and Laravel Herd
Then I found two tools that changed everything.
DBngin is a free app for Mac that lets you spin up database servers locally: PostgreSQL, MySQL, or Redis. It is not a database manager itself; for that, it integrates with TablePlus (made by the same team). DBngin handles running the server, TablePlus handles browsing and managing your data. Just click Start in DBngin and your database is running on localhost.
Laravel Herd is a native macOS development environment built specifically for Laravel. It handles PHP, Nginx, and DNS automatically. The moment you install it, your Laravel projects are accessible at your-project.test. No configuration, no manual server startup. It even handles SSL.
The Aha Moment
What impressed me most about Herd was the site linking. With Sail, my project lived at localhost. With Herd, it was instantly available at humfurie.test. No editing hosts files, no configuring virtual hosts. It just works.
The developer experience is noticeably faster too. Since PHP runs natively instead of inside a container, there is no Docker filesystem overhead. Pages load quicker, artisan commands run instantly.
What About Laravel Valet?
If you are looking for a free alternative to Herd, there is Laravel Valet. It is actually what Herd is built on: same concept (Nginx, DnsMasq, automatic .test domains), just without the GUI. You install it via Composer and manage everything through the terminal.
Herd is essentially Valet with a polished interface, built-in PHP version management, and extras like automatic SSL. If you do not mind working from the command line, Valet gives you the same core experience for free.
The Gotchas
The transition was not completely seamless. A few things tripped me up.
Database connection: My env file was configured for Docker internal hostname. Outside Docker, I needed to switch to localhost and make sure my database config values all matched what DBngin was actually running.
Node modules: My node_modules were installed inside the Docker container (Linux ARM), so they were missing macOS native binaries. A fresh reinstall of node_modules fixed it.
PHP version differences: Herd was running PHP 8.5, while my Docker setup used PHP 8.4. This surfaced deprecation warnings for certain PDO constants that were renamed in the newer version.
Ad blockers: This one was unexpected. My browser ad blocker was blocking Vite dev server requests. Pages loaded as a blank black screen until I whitelisted the domain.
So Which Is Better?
Both have their place.
Sail is better for team consistency, CI/CD parity, and when you want your dev environment to mirror production exactly. It is also the only option if you are on Linux.
Herd plus DBngin is better for solo macOS development where you want speed and simplicity. The native performance and automatic .test domains make the daily workflow smoother.
I am keeping both. Sail stays in the repo for development as a Docker-based option, and I have a separate production Docker Compose setup for deployments. Herd handles my day-to-day local development. The switch between Sail and Herd is just a matter of which database host my env file points to.