L lerd lerd-env/lerd
v1.37.0…v1.38.0 ↗
ENGINEERING DIGEST · 2026-10-19 → 2026-11-02

v1.38.0

Lerd on Windows, and plugins of your own

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.

413
commits
125
merged PRs
1,085
files
+52,954
insertions
−12,142
deletions
7
contributors
tests 34% web UI 22% cli 9% docs 8% plugins 4% rest 23%
01

Windows

FEAT

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

ONE INSTALLERa rerun picks up where a failed one stopped
1
Turn on WSL

Enables the Windows features, resumes after the reboot they need, and installs WSL from Microsoft's MSI rather than the Store.

2
Add a distro and a user

Ubuntu 24.04 with your Linux user, then lerd's usual install.sh inside it with the domain and Node.js choices you made.

3
Join it to Windows

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.

FEAT

.test for Windows #2017

An 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.

FEAT

Distros without systemd-resolved #2316 #2322

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.

FEAT

Assistants on the Windows side #2315

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.

02

Plugins

FEATUI

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

FEATUI

A catalog approved at one commit #2214

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.

SEC

The catalog can revoke one #2309

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.

FEAT

Notifications only with consent #2305

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.

REF

The Sail import moved out #2287

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.

03

Certificates

REFSEC

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 keepsbeforeafter
CA folder and file namesmkcert'sthe same
CA your browsers trustsigned by mkcertthe same CA, nothing to trust again
uninstallmkcert -uninstalllerd removes it from the stores and the keychain
SEC

Distrusted roots stay distrusted #2308

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.

REF

PECL extensions through PIE #2271 #2272

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.

FIX

Native PHP reaches other .test sites #2358

It 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.

04

Agents

FEAT

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

FEAT

Language server before grep #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.

FEAT

Outgoing HTTP from any client #2361

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.

FEAT

Stripe through a saved CLI login #2369

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.

05

Git

FEATUI

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

FEATUI

Stage, commit and stash #2339

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.

FEATUI

Push and switch show their files #2383

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.

FEATUI

A folder tree that remembers #2343 #2347

Files show as a folder tree, and full screen, the unified view and hidden whitespace stay as you left them for the next diff.

06

Lighter

REF

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-uibeforeafter
disk writesabout 5.6 MB a secondabout 8 KB a second
CPUnoticeablenear 1%
dashboard polling with its window unfocusedfull rateonce a minute
REF

One connection per request #2342

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

07

Dashboard

FEATUI

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

FEATUI

A coffee cup for what stays awake #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.

FEATUI

Variants of a suggested service #2277

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.

FEATUI

Drop a database with its snapshots #2396

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.

FEAT

The Podman Machine says it ran out of memory #2249

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.

FEATUI

Traditional Chinese and Noctalia #2282 #2280

Written for readers in Taiwan, the dashboard's fifteenth language, and the dashboard follows the Noctalia palette on niri and Hyprland.

FEATUI

lerd's jobs in macOS Resources #2367

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.

08

Fixes

FIX

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.

FIX

A command cut short kept running #2389

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.

FIX

A pin could come back undone #2380

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.

FIX

A Vite server could hang after waking #2391

A .env written while it started made Vite restart before its first listen, leaving a process alive that served nothing.

FIX

A stopped lerd-dns took the internet down #2279

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.

FIX

A 502 on Ubuntu 24.04 after a service change #2276

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.

FIX

macOS asked for Apple Music access #2265

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.