laserstack

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 containerproject URLPHP versionsdatabase and servicescost
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 .test DNS, 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. SUFFIX defaults to localdev.it, a domain where every name — any depth, IPv4 and IPv6 — resolves to 127.0.0.1 and ::1 for anyone. No hosts file, no dnsmasq, no daemon. A suffix of your own needs /etc/hosts, and a change of suffix needs laser up -d before laser 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 git repositories, one docker-compose.yml, no build step, no VM, no system package, no daemon of its own. The app images are rebuilt nightly, and laser update moves 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.