๐ฅ Explore this must-read post from Hacker News ๐
๐ **Category**:
๐ก **What Youโll Learn**:
Open-source Herd-like local PHP development environment for Linux and macOS,
with Windows supported via WSL2 (beta). Podman-native, rootless, with a
built-in Web UI.

Lerd runs Nginx, PHP-FPM, and your services as rootless Podman containers,
designed for PHP developers on Linux and macOS, and on Windows through WSL2 (beta).
No Docker. No sudo. No system pollution. Just lerd link and your project
is live at project.test with HTTPS.
Built for Linux PHP developers
Lerd is built for PHP developers on Linux who want frictionless local development: automatic .test domains, per-project PHP versions, one-click HTTPS, zero Docker. Works with Laravel, Symfony, WordPress, Drupal, Magento, CakePHP, Statamic, and any custom PHP framework.
-
๐ Automatic
.testdomains. One command gives a project a hostname and TLS that reissues before it expires, with no dnsmasq, no system resolver tweak and no sudo for the DNS bits. You can opt out of lerd-managed DNS for*.localhost, or toggle it later withdns:enable/dns:disable/dns:repair. -
๐ Site groups. Group related sites so a main site owns a base domain and the rest occupy its subdomains, with a shared or separate database per secondary.
-
๐งฑ Host-proxy sites. Run a Node, Python, Go or any non-PHP dev server on the host and have nginx serve it at a
.testdomain with HTTPS, git worktrees included. A wedged dev server can be bounced from the site header without reaching for a terminal. -
๐ณ First-class git worktrees. Auto-detected branch domains, per-worktree PHP and Node versions, optional database isolation, wildcard cert SANs for
*.branch.site.test, and a per-branch Vite worker on the host. Add and remove them from a dashboard modal without touching the CLI. -
๐ Share a site. On your LAN with a stable port and a QR code, or publicly through ngrok, cloudflared, Expose, serveo or localhost.run, from the CLI or the dashboard’s share menu. Set a Cloudflare base domain once and every share is served on
, so a webhook or OAuth callback keeps its URL between runs, and ngrok runs from its published image on a machine that never installed it.. -
๐จ Dev servers on the site’s own domain. A running Vite serves its assets and its hot-reload socket under the site’s
.testhostname instead of advertisinglocalhost:5173, so a shared, LAN-opened or worktree page arrives styled. Nothing in the project is edited and nothing is declared per framework.
-
๐ Per-project PHP version. 8.1 to 8.5, plus a frozen 7.4 / 8.0 legacy tier for projects hosted on the old stack, switched with one click. Custom PHP extensions and Alpine packages are declared once and applied to every image lerd builds, so changing a site’s version never silently drops what you asked for.
-
โก FrankenPHP runtime. Per site, as an alternative to shared PHP-FPM, with Laravel Octane and Symfony Runtime worker mode.
-
๐ฆ Node.js isolation. Node 22 or 24 per project, through the bundled fnm or an nvm you already have, switchable from the dashboard. Or bun as the JS runtime on the host and, opt-in, inside the container.
-
๐ช No per-framework setup. Workers, env values and the nginx vhost are all configured for you when you link a project.
-
๐งฉ Framework store. Community definitions for Laravel, Symfony, WordPress, Drupal, Magento, CakePHP and Statamic with versioned auto-detection, back to the majors that still run on PHP 7.4.
-
๐๏ธ One-click services. MySQL, PostgreSQL, Redis, Meilisearch, RustFS, Mailpit, Reverb, OpenSearch and more, the default stack built in and every add-on fetched from a store that updates without a new lerd release. Browse, create and drop an engine’s databases from its service page, with snapshots, export and import.
-
๐งท IDE database wiring for JetBrains. A project gets one data source pointed at its own lerd database on the host port it actually answers on, written on link and refreshed as the project’s database changes, leaving every data source lerd doesn’t own untouched.
Debugging and performance
-
๐ฐ๏ธ Debug window. Intercepts every
dump()/dd()and streams it to the dashboard, TUI, MCP andlerd dump tail, scoped per site and per worktree branch. The same window captures SQL with N+1 and slow-query detection, plus mail, views, events, queued jobs and outgoing HTTP, on Laravel and Symfony. -
๐ฅ SPX profiler with one-click on/off. Every PHP-FPM request becomes a flame graph viewable in a same-origin Profiler view in the dashboard, with no FPM restart and no code changes, and
lerd profile runprofiles a one-shot artisan or CLI command. -
๐ Request timing analytics. A durable per-site view of typical and p95 response times, throughput, error rate, and the slowest routes ranked by recent p95 with one-click profiling. Agents get the same signal over MCP with
route_timingandoptimize_route. -
๐งช Tinker tab. An in-browser PHP REPL per site with project-aware autocomplete, hover and diagnostics powered by phpantom_lsp, so your models and Builder chains resolve alongside composer helpers. Works on Laravel, Symfony, and any composer project.
-
๐ฅ๏ธ Built-in Web UI. Sites and services dashboards, live widgets, a global Cmd+K command palette, and install/remove of PHP and Node versions from the System page. Available in fourteen languages.
-
๐ป Terminal dashboard (
lerd tui). A btop-style TUI with live status, site detail pane, inline domain and version editing, shell drop-in, log tailing, and filter/sort, the same operations surface as the web UI, for tmux and SSH workflows. -
โ๏ธ Edit config in the browser. Per-site and global nginx,
php.iniwith the version’s own file and the shared scope side by side,.envfiles, and database/service runtime tuning, each validated (nginx -twhere it applies), with timestamped backups and one-click restore. -
๐ Live logs for PHP-FPM, Queue, Schedule and Reverb, per site, rendered in the colour the tool actually emits (artisan, composer, vite, pest) and with a button that hands any log to a real terminal so a long tail survives closing the tab.
-
๐ Notifications for the things worth interrupting you, delivered to open dashboards, to subscribed browsers over Web Push, or to your desktop’s native notification daemon. Every one also lands in the dashboard’s sidebar bell, which keeps the last 50 with an unread count across reloads.
-
๐ค MCP server. Let AI assistants (Claude Code, Cursor, JetBrains Junie, Codex CLI, Gemini CLI, GitHub Copilot, Google Antigravity, Windsurf) manage your environment directly.
-
๐งฐ Environment doctor (
lerd doctor). Checks the host lerd itself depends on and repairs what it safely can with--fix: missing directories, linger, a missing PHP image, the DNS wiring. Anything needing sudo is printed as a command and never run for you, and--dry-runshows it first. -
๐ฉบ Site doctor. Health checks that apply to any project (env drift, application key, composer and node install state, security audits, database presence, PHP version range) plus extra checks for your framework, with one-click fixes. From the web UI, the TUI,
lerd site:doctorand MCP. -
โ๏ธ Worker self-heal. Failed queue, schedule, horizon, reverb and stripe workers are surfaced everywhere (CLI, dashboard banner, TUI, MCP) and recovered with one click or
lerd worker heal. -
๐ค Idle-suspend. Activity-driven suspension of a site’s workers (queue, schedule, horizon, reverb, stripe, Vite) after a configurable idle timeout, resumed on the next request, CLI command, MCP call or file save, with per-site pinning.
-
๐ Pinned host tools. Composer, fnm and mkcert are pinned behind a published manifest rather than whatever
releases/latestserved that day, so an upstream release cannot break a fresh install overnight, and the System page reports each against its pin and applies the update on the card that flagged it. -
๐ Rootless and daemonless. Podman-native, no Docker required, dual-stack IPv4 + IPv6.
Lerd ships a built-in Model Context Protocol server. Connect it to Claude Code, Cursor, JetBrains Junie, Codex CLI, Gemini CLI, GitHub Copilot, Google Antigravity, Windsurf, or any MCP-compatible AI assistant and manage your dev environment without leaving the chat.
lerd mcp:enable-global # register once, works in every project
Then just ask:
You: set up the project I just cloned
AI: โ site(action: "link")
โ exec(action: "composer", args: ["install"])
โ env(action: "setup") # detects MySQL + Redis, starts them, creates DB, generates APP_KEY
โ framework(action: "setup") # storage:link + migrate for Laravel, doctrine:migrations:migrate for Symfony
โ myapp โ https://myapp.test ready
Twelve grouped tools, each driven by an action: site, service, db, env, runtime, worker, exec, framework, diag, logs, workspace, and worktree. Scaffold projects, run migrations, manage services, toggle workers, tail and search logs, enable Xdebug, manage databases and PHP extensions, park directories, switch runtimes between PHP-FPM and FrankenPHP, and more, all from your AI assistant.
๐ MCP documentation
| Lerd | DDEV | Lando | Laravel Herd | Laragon | |
|---|---|---|---|---|---|
| Podman-native | โ | ๐ก | โ | โ | โ |
| Rootless | โ | โ | โ | โ | โ |
| Web UI | โ | โ | โ | โ | โ |
| Terminal dashboard | โ | โ | โ | โ | โ |
| Linux | โ | โ | โ | โ | โ |
| macOS | โ | โ | โ | โ | โ |
| Windows | ๐งช | โ | โ | โ | โ |
| MCP server | โ | โ | โ | โ | โ |
๐ก DDEV runs on Docker by default and can also use Podman as an alternative runtime; Lerd is built exclusively for rootless Podman.
๐งช Lerd’s Windows support runs inside WSL2 and is currently beta, see the Windows (WSL2) guide. Laragon runs natively on Windows and has no Linux or macOS build, see Laragon for Linux if that is what brought you here.
curl -fsSL https://lerd.sh/install.sh | bash
Update later with:
Install via apt instead (Ubuntu/Debian)
sudo add-apt-repository ppa:lerd/lerd
sudo apt update
sudo apt install lerd
The package finishes setup with no prompt: its maintainer script applies the root-level steps and runs the per-user install, so .test DNS and HTTPS come up on their own. Update with sudo apt upgrade; a packaged lerd lives under /usr, so lerd update defers to your package manager instead of fighting it.
curl -fsSL https://lerd.sh/install.sh | bash
Update later with:
The installer needs the podman CLI; it will offer to brew install podman if it’s missing.
Install via Homebrew instead
brew install lerd-env/lerd/lerd
lerd install
Recent Homebrew versions block third-party taps until trusted, so you may need to run brew trust lerd-env/lerd first. Update later with brew upgrade lerd && lerd install.
NixOS has its own flake, since its declarative model doesn’t fit the one-line installer’s imperative DNS and self-install steps.
nix run github:lerd-env/lerd-nixos -- --help
The lerd-nixos flake packages the binary and ships the configuration.nix blocks the stack needs. See the NixOS guide for the full runbook.
Prefer a dedicated window to a browser tab? Lerd Desktop wraps the dashboard in a native app with native desktop notifications for captured mail, worker failures, and finished operations, no browser needed. Linux, shipped as a Flatpak:
flatpak install --user https://lerd.sh/lerd.flatpakref
Once it’s installed, lerd dashboard opens the app instead of the browser.
cd my-laravel-project
lerd link
# โ https://my-laravel-project.test
lerd install already starts everything for you on first run, so you can lerd link immediately. Day-to-day:
lerd start # boot DNS, nginx, PHP-FPM, services, workers, UI
lerd stop # stop containers and workers (UI and watcher stay up)
lerd quit # full shutdown including UI, watcher, and tray
lerd autostart enable # boot lerd on every login
lerd status # health snapshot
See Start, Stop & Autostart for the full lifecycle reference.
Install community framework definitions from lerd-env/frameworks:
lerd framework search # list all available
lerd framework install symfony # auto-detects version from composer.lock
lerd framework install drupal@11 # explicit version
lerd framework list --check # compare local vs store
Frameworks auto-detect when you lerd link a project, and its workers, env values, nginx proxy and setup commands are configured from there.
Services work the same way. Lerd ships the default stack, and every add-on lives in lerd-env/services, so a new service reaches you without updating lerd:
lerd service search # browse the store
lerd service preset pgadmin # install a store-only preset
๐ lerd.sh
Lerd stands on a set of excellent open-source projects it bundles or fetches to power the experience:
- phpantom_lsp – the PHP language server behind tinker autocomplete, diagnostics and semantic highlighting
- Monaco – the editor engine for every in-browser editing surface
- php-spx – the profiler behind the SPX flame graphs
- mkcert – the local CA that backs
.testHTTPS - fnm – the per-project Node version manager
- Composer – fetched on the host for dependency operations
- Starship – the prompt in the container shell drop-in
MIT
๐ฅ **Whatโs your take?**
Share your thoughts in the comments below!
#๏ธโฃ **#lerdenvlerd #Opensource #Herdlike #local #PHP #development #environment #Linux #macOS #Automatic #.test #domains #perproject #PHPNode #isolation #onecommand #TLS #Podmannative #rootless #GitHub**
๐ **Posted on**: 1785530937
๐ **Want more?** Click here for more info! ๐
