How it compares
One stack for all projects,
or one per project?
That is the axis that decides what local development costs you. Two stacks that serve the same project can differ by an order of magnitude in memory, because one amortises its containers over every project you own and the other does not. Everything below is checked against the documentation of each project on 2026-11-05, with the links, so you can check it again.
The axis
| application container | project URL | PHP versions | database and services | cost | |
|---|---|---|---|---|---|
| Laser Stack | one stack for every project (nginx + PHP-FPM in one container) | projecta.localdev.it by default, no hosts file and no DNS server for anyone; https from a wildcard certificate every browser already trusts, for every project at once |
one per stack, chosen by variable: 7.4–8.6 | one per engine, chosen by variable: mysql, mariadb, postgres, redis, memcached, elasticsearch | free, BSD-3-Clause, macOS · Linux · WSL2 |
| Laravel Valet | none: nginx runs on the host, roughly 7 MB of RAM | projecta.test through dnsmasq; http by default, valet secure per site, signed by its own CA |
one at a time on the machine; per site with valet isolate |
none shipped: the host, or DBngin for MySQL/Postgres/Redis | free, MIT, first-party, macOS only |
| Laravel Herd | none: a native shared stack of PHP, nginx, dnsmasq and Node | projecta.test, automatic on macOS and Windows; http by default, herd secure per site, signed by a root CA it creates |
one global, per site with herd isolate |
versioned services matrix, on the paid tier | free tier; Pro $99/year; macOS 14.6+ Apple Silicon and Windows; its documentation lists no Linux |
| Laravel Sail | one per project | http://localhost, no automatic name and no automatic TLS |
one per project, 8.0–8.5, default 8.5 | one per project, in compose.yaml |
free, MIT, first-party, macOS · Linux · WSL2 |
| DDEV | one per project, behind a shared Traefik router | projecta.ddev.site, DNS and HTTPS out of the box |
one per project, in .ddev/config.yaml |
one per project | free, Apache-2.0, macOS 14+ · Linux · WSL2 · Codespaces |
| Lando | one per project, behind a proxy | projecta.lndo.site; https through its proxy, signed by a CA you trust on the host yourself |
one per project, in the Landofile | one per project, in the Landofile | free, MIT, macOS 12+ · Windows 10 21H2+ · Linux; their requirements start at 4 GB of RAM |
| Laradock | one per project by default; the documentation also describes one stack shared by several projects | http://localhost, Traefik optional |
one per stack, PHP_VERSION in .env |
one per stack, 100+ service definitions | free, MIT, Linux · macOS · Windows |
| lerd | one shared stack on rootless Podman: one nginx, one PHP-FPM container per version | projecta.test through its own DNS server; https for every site from its own CA, registered by lerd install |
one container per version, pinned per project with lerd isolate |
about 40 presets, shared by every site | free, MIT, Linux · macOS · WSL2; one sudo at install for the resolver |
On https the difference is not whether it can be done but what it costs you: Valet, Herd, Lando and lerd secure one site at a time and create a certificate authority of their own that the machine has to trust, while DDEV puts https in its site setup. Laser Stack has no per-site step for the default suffix and nothing to trust: the wildcard certificate it serves is already trusted by every browser, on macOS, Linux and the Windows browser of a WSL user.
Valet, Herd and lerd put their stack on the host or in one shared container set; Sail, DDEV and Lando give every project its own application containers. Laradock does both. Laser Stack is a third shape: one container set, in docker, serving every project of a directory — 17 Laravel projects in two containers, measured on the numbers page.
In short
- Valet is the lightest option that can work: no containers, no VM, sites resolved by dnsmasq. Its own documentation is clear that it "only serves one PHP version at a time", its database is whatever the host provides, and it is macOS only.
- Herd is Valet's polished successor and the fastest thing on Apple Silicon: one native stack, a GUI, one-click PHP versions, and a service matrix on the paid tier. macOS on Apple Silicon and Windows, with no Linux in its documentation, and the services you would want locally (MySQL, Postgres, Redis, Meilisearch) are behind the $99/year licence.
- Sail ships with every new Laravel application and gives each project its own container set. It is the least surprising choice for a single project; it is also the one whose memory grows linearly with the number of projects you keep around.
- DDEV is the most complete third-party option: per-project containers, a shared router, DNS and HTTPS, config committed with the project, and a long list of PHP and database versions to choose per project. It is heavier, and changing the database version means exporting and re-importing the data.
- Lando offers the widest set of recipes and puts its config in the repository, at the price of resource use: their own requirements start at 4 GB of RAM and 2 cores, recommended 16 GB and 8.
- Laradock is per-project by default but documents one stack shared by several projects as well, with 100+ service definitions and the version chosen in
.env. A per-project copy carries the whole folder. - lerd is the closest in shape to Laser Stack and the one to look at on Linux: a shared stack, one PHP-FPM container per version, shared service presets, automatic
.testDNS, on rootless Podman instead of Docker.
When to choose something else
- You want to install no container runtime at all: Valet on macOS, or Herd if you also want the GUI and the version matrix.
- You work on Windows without WSL2: Herd.
- You want one project fully isolated, with Laravel's own defaults: Sail. It is already in the project.
- Each project needs a different PHP or database version: DDEV (or Lando, or a stack per project). Laser Stack runs one PHP version per stack today; per-project versions are the next item on the roadmap.
- You are on Linux and would rather not run Docker: lerd, on Podman.
- You need a GUI, a mail catcher and a database browser in one window: Herd Studio or DDEV's add-ons, not this.
Where Laser Stack differs, and what that costs
- One stack, not one per project. All projects of the projects directory are served by the same nginx and PHP-FPM container, next to one database container. That is where the 607 MB and the ~113 MiB idle come from, whatever the number of projects.
- The price of sharing: one PHP version per stack. The version is a variable, and the same is true for every database engine, but it is a property of the stack, not of a project.
- Names that need no setup.
SUFFIXdefaults tolocaldev.it, a domain where every name — any depth, IPv4 and IPv6 — resolves to127.0.0.1and::1for anyone. No hosts file, no dnsmasq, no daemon. A suffix of your own needs/etc/hosts, and a change of suffix needslaser up -dbeforelaser scan. - Config in the repository, per version.
config/<engine>/<version>/holds the settings of each supported version, so a version is a variable and a directory, not an edit of the compose file. - Reproducible by design: two
gitrepositories, onedocker-compose.yml, no build step, no VM, no system package, no daemon of its own. The app images are rebuilt nightly, andlaser updatemoves a running stack to the newest patch. - What it does not have: a GUI, Windows without WSL2, per-project PHP versions (planned). Each database version keeps its own data volume, so changing a version keeps the data of the others and loses nothing.
Try it
curl -fsSL https://localdev.it/laserstack/install | bash
# then, in the checkout:
laser up -d
laser scan
# http://projecta.localdev.it and http://projectb.localdev.it answer
Three commands, two containers, and the numbers page has the method behind every figure. If something on this page is out of date, the links above are the source of truth and an issue is welcome.