One installer now takes a bare Windows machine to a working lerd, with .test answering in Windows browsers and sites that survive a reboot. lerd also takes plugins, from a catalog that approves each one at a commit and can revoke it, and the Sail import is the first thing to move out into one. Around those, lerd issues its own certificates now that mkcert is unmaintained, AI agents get lerd's PHP language server, uncommitted changes open in a diff editor that stages and commits, and an idle lerd-ui writes almost nothing to disk.
Install-Lerd.exe takes a bare Windows machine to a working install. From there lerd works in a Windows terminal, .test resolves in Windows browsers, wildcards included, and sites stay up after the last WSL window closes and come back after a reboot. #2017
Enables the Windows features, resumes after the reboot they need, and installs WSL from Microsoft's MSI rather than the Store.
Ubuntu 24.04 with your Linux user, then lerd's usual install.sh inside it with the domain and Node.js choices you made.
wsl:setup trusts the CA, puts lerd.exe on the PATH with php.exe, composer.exe and node.exe beside it for a Windows IDE, and starts the desktop app.
.test for Windows #2017An agent from the same binary keeps the distro up and answers .test for Windows behind a DNS rule, so worktree wildcards resolve too, and a firewall rule lets LAN shares through.
lerd install sets up systemd-resolved on a distro that ships without it, such as Debian's, and turns systemd on where a distro runs without it.
mcp:enable-global and wsl:setup register lerd with the AI assistants installed on Windows, through lerd.exe, and lerd uninstall takes them back out. The language server stays on the Linux side.
A plugin is a folder with a plugin.yaml and the scripts it names, in shell, Python or Node. It can add CLI and site commands, hooks on ten events, MCP tools, API endpoints, dashboard pages and tabs, and services and frameworks of its own. #2214 #2286 #2290
The Plugins page installs, updates and removes them and browses the catalog published from lerd-env/plugins, where each listing is approved at one commit. A card shows what it adds and its failures.
On its next catalog check lerd stops an installed plugin a revocation covers, shows the reason and raises a banner until it is removed or kept on purpose with lerd plugin keep.
A plugin that declares notifications: true is asked about once, and only a yes lets its messages through, titled with its name so they never pass for lerd's own. Each plugin has its own switch to turn them off again.
It is the first part of lerd to become a plugin: lerd-env/plugin-sail brings a Sail project's database and files across with lerd sail:import, snapshotting the site's database first. lerd s3:import stays in lerd and copies a bucket from any S3 server into lerd's own.
mkcert has had no release since 2022, and its Go 1.18 build carries standard library advisories no pin can clear. lerd now creates the CA and signs site certificates itself. #2337
| What an existing install keeps | before | after |
|---|---|---|
| CA folder and file names | mkcert's | the same |
| CA your browsers trust | signed by mkcert | the same CA, nothing to trust again |
| uninstall | mkcert -uninstall | lerd removes it from the stores and the keychain |
Alpine's certificates can trail the host in dropping a compromised root, so each root the host distrusts is carried into the image on the next lerd php:rebuild.
On PHP 8.1 and newer, falling back to pecl and then the release tarball, so a pecl.php.net outage no longer leaves an image without pcov or xdebug.
.test sites #2358It read the macOS root store, which lacks lerd's CA. lerd now writes a bundle of the system roots plus its CA for curl and openssl.
lerd lsp runs the phpantom server tinker already uses, on stdio in the current folder, so an assistant gets exact definitions and callers, Laravel's facades, Eloquent statics, scopes and relations included. mcp:enable-global installs it into Claude Code as the lerd-php plugin. #2328 #2390
The instructions lerd's MCP server sends on connect tell assistants to use the LSP tool for definitions, callers and types, keeping grep for strings, config and non-PHP files and macros. The lerd skill says the same.
The HTTP lens saw only Laravel's and Symfony's clients. On PHP 8.2 and newer it now sees Stripe's SDK, the AWS SDK, plain Guzzle, raw curl and file_get_contents, with the app line that made it.
A site with no secret key in its .env can name a project from stripe login, from the CLI, the Stripe modal or the MCP stripe_config tool, and the listener runs against the host's Stripe CLI config.
A site with uncommitted work gets a button beside Fetch, Pull and Push that opens its staged, unstaged and untracked files side by side in Monaco's diff editor, with unchanged stretches folded. #2216
The dialog stages a file or a single block from the diff's gutter, commits with amend or commit and push, and Pull and Switch branch offer to stash uncommitted work first.
Push and Switch branch show the same Behind, Ahead and Files changed cards as Pull, and their files open in the diff editor too, with upstream changes left out.
An idle lerd-ui rewrote its kept debug events to disk on a 15 second loop. The kept requests live in their own table now, and lerd-ui follows new requests instead of rereading the week. #2345
| An idle lerd-ui | before | after |
|---|---|---|
| disk writes | about 5.6 MB a second | about 8 KB a second |
| CPU | noticeable | near 1% |
| dashboard polling with its window unfocused | full rate | once a minute |
The devtools extension and the PHP collector opened a socket per event, which on macOS crossed the Podman Machine over TCP and dropped events under load. Each keeps one open for the request now. The dashboard also catches up the moment its window takes focus again. #2346
The Services page splits into Installed and Discover. Installed is one compact grid led by the services waiting on an update, and Discover puts a search box and category chips over the presets. #2365 #2394
A pinned site or service carries a cup where a sleeping one carries the moon, and so does a service that a pinned site keeps awake, with its tooltip naming the sites.
When a site's env suggests postgres, mysql or redis, the add button lists the presets that fill the role and their versions, so pgvector, mariadb or valkey are one click away.
When a database has snapshots, the drop dialog offers to delete them too, unticked by default, since a snapshot is the only way back once the database is gone.
On macOS lerd reads the VM's console log for out-of-memory kills and offers to restart it with 2 GB more, never past half the Mac's memory.
Written for readers in Taiwan, the dashboard's fifteenth language, and the dashboard follows the Noctalia palette on niri and Hyprland.
With the native runtime PHP-FPM runs on the host, so each running lerd launchd job and FPM master now has a row, measured over its whole process tree.
The fixed list covers bugs that shipped in 1.37 or earlier. Regressions introduced and fixed inside this cycle never reached anyone, so they are left out. Several only showed under load or after a long run: a lost write, a stalled bridge, a browser that never closed.
A Pest browser test stopped with Ctrl+C kept its Chromium running for hours, and its pages kept waking the site from idle-suspend. lerd now stops what a cut-short run left behind.
The CLI, lerd-ui and the watcher each save sites.yaml whole, and the lock only ordered writes inside one process. Writes now hold a file lock and read the file fresh.
A .env written while it started made Vite restart before its first listen, leaving a process alive that served nothing.
On NetworkManager hosts the dispatcher hook routed domains to lerd-dns even when nothing listened, so resolved failed over to it once the upstream dropped a query.
Before netavark 1.9 the bridge took the lowest MAC among its ports, so a container coming or going moved the gateway. lerd pins it on those versions.
Following the accent colour watched the whole preferences folder. It asked again after each update. lerd now reads only the file that holds the accent.