Repository navigation
Lerd 1.38.0
Thanks to @millancore for helping us ship the Windows version.
Lerd gives every PHP project on your machine what it would have on a server:
its own .test domain over HTTPS, its own PHP version, its own databases,
cache and mail catcher. Nginx, PHP-FPM and every service run as rootless
Podman containers, so nothing is installed system-wide and nothing keeps
running once you stop it. There is a dashboard, a terminal UI, a CLI and an
MCP server over the same environment.
Install
One line on Linux and macOS alike:
curl -fsSL https://lerd.sh/install.sh | bashIt installs what is missing, puts the binary in ~/.local/bin, and runs
lerd install to set the environment up. Setup asks for sudo once, at the
start, and nothing after that.
On Windows, download and run Install-Lerd.exe from the Lerd desktop
app's latest release.
It installs WSL, an Ubuntu distro and lerd inside it, then wires lerd into
Windows.
Already installed:
lerd updateAlso available through apt (PPA), dnf (COPR), a NixOS flake, and Homebrew
(brew install lerd-env/lerd/lerd && lerd install, then brew upgrade lerd
to update), see the
installation docs.
Changelog
Features
- 1da89ad feat(certs): issue local certificates without mkcert
- 3a2c85e feat(mcp): tell assistants to ask the PHP language server before grep (#2390)
- 7332785 feat(php): list the packages a rebuild changed
- 2db7004 feat(stats): show lerd's launchd jobs in the macOS Resources widget
- 2208258 feat(stripe): sign the listener in with a saved Stripe CLI login
- 1de649e feat(ui): fold the plugin pages' invitation into a card
- 4aea315 feat(ui): offer to delete a database's snapshots when dropping it (#2396)
- 28f4db1 feat(ui): open the update dialog from the update count
- 49b4851 feat(ui): remember the diff dialog's size and add a unified view
- c008f0b feat(ui): send the add plugin tile straight to the catalog (#2402)
- e658cd2 feat(ui): show behind, ahead and changed files on push, and open the files from push and switch (#2383)
- 6e03f84 feat(ui): show the diff modal's changed files as a folder tree
- 1c1651d feat(ui): split the Services page into Installed and Discover
- d650ad9 feat(ui): stage a single change block from the diff
- 5916b92 feat(ui): stage files and commit from the changes dialog
- b3c9515 feat(ui): stash local changes before a pull or branch switch
- 5de8f60 feat: add Traditional Chinese to the dashboard
- 7c79e55 feat: add a plugin system with a catalog of approved plugins
- 2066580 feat: add the WSL and Windows side to the bug report
- 3b4cd6d feat: ask before a plugin may send notifications, with a switch per plugin
- 7ad9056 feat: capture every outgoing HTTP request in the HTTP lens
- 7e29c67 feat: carry a service's display name and domain in the API
- a404cb5 feat: catch plugin failures and offer to report them to the author
- 81a7fbb feat: catch the WSL setups where containers cannot start in doctor
- fc255fc feat: check what a plugin needs before it runs
- 67d2ebc feat: compact services grid and a coffee cup for kept-awake sites and services (#2394)
- 6b74a30 feat: compare uncommitted changes side by side in the diff editor
- 50160a5 feat: confirm each Windows tray action with a toast, and show the error when it fails
- 2adf47e feat: dress the dashboard like Windows
- 08273d8 feat: fetch the plugin catalog fresh when Browse opens
- c000cd7 feat: follow the Noctalia palette in the dashboard
- 893831d feat: give AI agents lerd's PHP language server
- 672a3fc feat: give Plugins a page of its own, reached from the rail
- 60cd519 feat: give every plugin surface a time limit
- 68b0974 feat: give every shipped preset a label
- c925521 feat: grow Tinker and the debug lens into full screen
- 9ad44b7 feat: hand native notifications to the desktop app while it listens
- f9952b0 feat: install lerd on Windows from PowerShell
- e010046 feat: install lerd on a bare Windows machine with lerd-setup.exe
- 90c060c feat: keep the debug bridge and profiler switches with the site list hidden
- 852170a feat: keep the plugin illustration and cards at the foot of a full list
- bb68d8e feat: let LERD_PLUGIN_CATALOG point lerd at another plugin index
- 899b490 feat: let a plugin name the oldest lerd it runs on
- 2c10307 feat: let a plugin put a card on a site's Overview
- 09a3ff7 feat: let a plugin say which platforms it runs on
- 5c303ce feat: let a plugin take charge of worktree databases
- a3af0d8 feat: let an assistant build a plugin through the MCP plugin tool
- 6dbbefd feat: let plugins send notifications
- 962033d feat: let plugins ship their own services and frameworks
- 9453a48 feat: let the site wizard remember where to start browsing
- 852c708 feat: list the commits a pull or push moves and open each one's diff
- 197ed27 feat: mark new notifications in the bell's list
- 7d38873 feat: mark the services a plugin installs, and remove them with it
- 90dee4e feat: move the Sail import into a plugin and add lerd s3:import
- a7777d0 feat: name and link a plugin's author in its card
- f8669c0 feat: offer the Lerd desktop app from the Windows installer
- 760fc35 feat: open a site's snapshots from its database service card
- 3e4dd45 feat: open a timeline row in its own lens
- 05d5dee feat: open dashboards that take a session token already logged in
- a086993 feat: pick the variant and version when adding a suggested service
- e4366b3 feat: pin the sites folder in Explorer on WSL
- 735a8f5 feat: plugin docs, screenshots, failure logs and lerd's look for plugin pages
- f586d35 feat: raise Windows toasts for native notifications inside WSL
- 76199be feat: register lerd with the AI clients on the Windows side of WSL
- 8eeed1c feat: remember hide whitespace in the diff dialog
- 187042c feat: remove lerd's Windows side on uninstall
- 69ac446 feat: save the .env editor with Ctrl+S or Cmd+S
- 144164c feat: serve the tray menu from the dashboard API for trays lerd does not draw
- 6e6d2d0 feat: set up the Windows side of a WSL install from wsl:setup
- 49e8ac7 feat: show a checkout's uncommitted changes from the dashboard
- e4c6d30 feat: show each HTTP call's request and response in the lens
- 421f04c feat: show each catalog plugin's version in Browse
- a3b1f90 feat: show notifications in the plugin boilerplate
- e72add7 feat: show plugin updates in the dashboard
- d2c7962 feat: show plugins as cards, with a detail for each and the catalog a page at a time
- 4875606 feat: show the lerd tray natively on Windows for WSL installs
- 11c4a73 feat: show the plugin views as icons at the end of the header
- 6988126 feat: show what plugins add when none is installed or listed
- 426283e feat: stop a plugin the catalog revoked, and ask the user what to do
- 2364860 feat: tell the user when the Podman Machine runs out of memory and offer more
- 562b0fe feat: warn when a WSL project lives on a Windows drive
Bug Fixes
- 6922b54 fix(certs): restore browser trust a store lost, and honour CAROOT in the docs
- 13063cd fix(certs): trust the lerd CA in the macOS keychain through sudo (#2407)
- 7601212 fix(ci): keep scanning when one base image fails and cover every tool build
- 760d5dc fix(cli): make dump clear and dump status work on macOS (#2404)
- e168104 fix(install): drop the old mkcert before any download can fail
- 1c95c1e fix(install.ps1): keep the setup choices until they are applied
- 95a437d fix(install.ps1): quote Windows paths for the Linux shell
- db65380 fix(installer): stop naming mkcert in the installer
- 78f8747 fix(nginx): stop warning about a reload while nginx is stopped (#2409)
- 4c11aad fix(php): say so when the rebuilt image's packages cannot be read
- b335df5 fix(stats): read podman once on macOS and keep comment blocks short
- 08d5235 fix(stripe): keep the project name in step across saves and worktrees
- 53db3cd fix(stripe): log each listener line once on Linux
- e97ac54 fix(tui): rebuild the palette's list when new data arrives (#2400)
- 5399a0e fix(ui): close only the open dropdown on Escape inside a dialog
- 21c800f fix(ui): harden staging, commit and stash in the git dialogs
- 1d4e00a fix(ui): keep Discover reachable and update failures visible
- 4165c93 fix(ui): keep the plugin invitation cards where they are needed
- d133f31 fix(ui): keep the stage button on the file list's visible edge
- fb5bb85 fix(ui): keep the worktree tab's shadow from being cut off
- 8711e29 fix(ui): line up sleeping services' names with the rest
- cebf3e4 fix(ui): offer site grouping on host-proxy sites (#2403)
- 8552fd9 fix(ui): read the staged mode literally and lock per checkout
- def7e2f fix(wsl): fail setup when the Windows side fails, and start a closed desktop app
- 67b1f20 fix(wsl): give each terminal launch its own shortcut
- 2d71e93 fix(wsl): keep WSL's search domains when resolved takes over resolv.conf
- 5e3772f fix(wsl): let Windows open a LAN share at its own IP
- f2f49fb fix(wsl): pass relative Windows paths to lerd with forward slashes
- 901469b fix: answer a command's running checks from one podman ps on macOS
- 7503cc3 fix: ask GitHub when the tray's update check finds nothing cached
- 5fa9e38 fix: ask for systemd when the WSL distro has none to turn on
- bae77f6 fix: ask for the Linux user's password again when a resumed install never set it
- 269c163 fix: bare docs links, .htm pages and light theme colours for plugins
- eadcd78 fix: bind a config restore to its file before reading the backup
- bd71e6e fix: boot the distro again from the agent when a site is looked up while it is down
- c4f702e fix: bound diff reads and tell unreadable files apart
- 4f1e5da fix: bound the machine stop wait and keep the confirmed size on retry
- 177cd33 fix: bring Overview card switches to an Overview already open
- 1d719b1 fix: bring up the default PHP version on start under the native runtime
- 53a65c6 fix: build PECL extensions from the tarball when pecl cannot read the CDN
- 2e49d8b fix: call lerd's DNS server lerd-dns, not dnsmasq
- 195cd6e fix: catch up at once when the dashboard takes focus again
- 6f80fb1 fix: clear a custom container worker's url file on stop
- a94a0a6 fix: clear a stopped dev server's hot file and make its 502 readable
- 01c1542 fix: clear delivered popups and the app badge when the dashboard is in front
- 9dfab38 fix: clear the url file when a worker is stopped by site name alone
- 5714866 fix: count a diff's added and removed lines the way git does
- 9176a88 fix: count the real disk an unused PHP image frees in cleanup
- 3a0e7e4 fix: create the database a dependent service expects
- 9c6616d fix: detect an installed WSL on Windows in any language
- 0adb671 fix: download what install.ps1 elevates inside the elevated step
- 2ceca63 fix: draw the empty plugin views' illustrations as the dashboard
- fc10c41 fix: drop the doubled gap before the site Doctor button
- e80c450 fix: expect the Windows theme among the system themes in the palette store
- 73057bb fix: fade the rail's rules at their ends
- 9647db0 fix: fail the comment check on a base it cannot compare against
- b4e3a1a fix: find the Windows claude a script policy can run, and its profile folder
- b0691a2 fix: follow a service's port again once lerd env has started it
- e291621 fix: follow block comments to their end, and check renamed and quoted paths
- c95da15 fix: follow the snapshots route while the service stays open
- 29861e0 fix: free the streaming toggle once its mode is confirmed
- 68d7503 fix: give FrankenPHP and custom container sites a dev server location
- f11fe8a fix: give PHP plugin scripts their context inside the container
- 60a754b fix: give each catalog refresh its own temporary file
- add6ada fix: give each native CA bundle writer its own temp file
- e1b2d91 fix: give each untagged plugin message a tag of its own
- 9996e8d fix: give phpMyAdmin its servers back after an idle wake
- 1aeef4c fix: give the Env tab's editor mock the save command
- 846e09a fix: give the Installed toggle its own icon
- df96317 fix: give the container a terminal only when stdout is one too
- 6281d5d fix: give the demo bar the demo's text colour and the browser bar the page's theme
- 810dbec fix: give the route Debug jump its own icon (#2377)
- 27b55f4 fix: guard the memory restart and say when it fails
- 3dc6e42 fix: hand the agent over without failing on a fresh install
- 40add2f fix: hold a Vite restart until the dev server first listens (#2391)
- 7b65f35 fix: hold the picked variant while the download prompt is up
- 2d5f8f5 fix: install PECL extensions with PIE so a pecl.php.net outage cannot strip them
- e466941 fix: install lerd.exe only on WSL
- 4b847b6 fix: keep CA roots the host distrusts out of the PHP images
- 5035044 fix: keep Symfony HTTP capture on PHP 8.0 and 8.1 and mask split secrets
- 5957176 fix: keep a clashing stash cleanly after a pull and offer to undo it
- 383a516 fix: keep a config editor's late actions on the file they were opened for
- f2e62ab fix: keep a hand-written service's label over a preset of the same name
- 91057ce fix: keep a loading button as tall as a labelled one
- af27470 fix: keep a missing provided env out of error_get_last()
- 0c4dc7d fix: keep a plugin switch made while the menu's read is still on its way
- d626e26 fix: keep a plugin's mark on its multi-version services across a start
- 61eafd2 fix: keep a stopped lerd-dns off the uplink in the NetworkManager hook
- 44a8bb3 fix: keep an https endpoint and read a named bucket without listing
- 02b9d81 fix: keep catalog updates off plugins installed from elsewhere
- 3c82de1 fix: keep each site's remembered Node version apart
- cdf17b3 fix: keep every plugin failure and a broken plugin's log
- e26c954 fix: keep every revoked plugin answer when two land at once
- 5b2c8fd fix: keep following requests after rowid reuse or a failed watch
- c4ddc2c fix: keep newer work and the snapshot offer when undoing a pull
- 856ecc4 fix: keep pinging the watcher while a request waits for a sleeping site
- 860a9f8 fix: keep plugin comments and the guide to what the review asked
- 5b30fc3 fix: keep plugin consent safe to change while it is read, and say when saving it fails
- b96f135 fix: keep retrying the agent's DNS listener while port 53 is taken
- a9214ea fix: keep the Initialize git button steady while git status refreshes
- 9570c88 fix: keep the Windows side in step with lerd and reachable from any folder
- 358cc36 fix: keep the hot file cleanup inside the checkout and on every stop path
- 2e26b15 fix: keep the init git button's padding when the list is hidden
- 73f025a fix: keep the landing hero copy clear of the dashboard art
- b78d63b fix: keep the native CA bundle in place for running pools
- 613a35c fix: keep the query string through a dashboard token login
- f995eb8 fix: keep the service managers out of the plugins package
- f9bc9c5 fix: keep the stdout check for container ptys to WSL
- d0e879b fix: keep the tray off on WSL instead of claiming to mask it
- da088a1 fix: keep track of a worktree database until it is really gone
- 70d544d fix: keep untagged and cross-plugin messages apart
- 53fe279 fix: keep wsl.conf when it cannot be read
- 2f20197 fix: keep wsl:setup's .wslconfig edits tidy and stop the distro idling out
- 7774d54 fix: leave WSL DNS alone when it is opted out or the user's own
- 82821bc fix: leave WSL's resolver alone while systemd is off
- 14a5535 fix: leave a base that keeps another tag out of the freed total
- b8d5d87 fix: leave services and workers asleep for php -v and other info flags
- dee0181 fix: leave the WSL restart to an installer that does it itself
- 72947cf fix: leave the Windows agent to the desktop app so Defender lets it be
- f93459f fix: let a dependent start when another created its database first
- 13ac26a fix: let a native install with no PHP versions get one from the dashboard
- 0bef301 fix: let a site's subdomains fetch from its dev server
- fe448e7 fix: let dev builds install plugins that need the next release
- e39d9ef fix: let injected dashboard scripts run under a nonce-less policy
- 83e28d8 fix: let lerd stop an agent it is not allowed to kill
- e76320f fix: let only one plugin install place at a time
- d3b43f9 fix: let plugins named like a staging folder install and update
- 5b554c0 fix: let the local network reach lerd's LAN shares under WSL
- d38f817 fix: list a database in Adminer and pgAdmin when a site's link starts it (#2388)
- 9bc5fe1 fix: load lerd's ini files in native runtime workers
- 1308c3a fix: lock sites.yaml across processes (#2380)
- 6517401 fix: mark notifications read when the bell's panel closes
- cf28659 fix: migrate to the official phpmyadmin docker image
- 30aa628 fix: note a fresh run's id before its readiness probe, and document the check
- 5443cae fix: offer the approved commit to a revoked plugin
- 17100cd fix: offer the palette's plugin shortcuts only where plugins can be installed
- 175ee38 fix: only count a lerd-dns listener that 127.0.0.1 can reach
- 51fd38e fix: only follow Noctalia while it is running
- 1185c12 fix: only point a container URL at a service's domain on the port it serves
- f0100d0 fix: open Windows Terminal in front, on the distro, from the dashboard
- 7964171 fix: open a timeline row the lens has not read yet
- bf71bd4 fix: open a token-login dashboard on its own login when lerd lacks a credential
- e36179c fix: open sites, folders, terminals and editors on the Windows desktop from WSL
- 5851a65 fix: open the dashboard on Windows from the WSL tray, as an app when installed
- 8849964 fix: open the site wizard at home when the remembered folder is gone
- abc7b03 fix: pin the lerd bridge MAC on netavark older than 1.9
- 4b24efb fix: point a moved service's localhost URLs at its published port
- 3a18f3c fix: post no page popup until the notification sink is known
- 1025e2f fix: probe a running service's readiness once per run, not on every command
- 15e9411 fix: publish the plugin secret only once it is written
- 531377c fix: re-check the Initialize git answer while the header stays open
- f34a38f fix: re-read the pins when a download fails its checksum
- 702b05a fix: read PowerShell answers without its progress records
- d9ea6cf fix: read milliseconds portably in the vm lane's request linking checks
- 8bafa09 fix: record a debug event at most once when its write is retried
- 4b123aa fix: record the PHP patch a checksum retry actually fetched
- 830dacf fix: redo a WSL resolver handover that stopped before its restart
- 45e640d fix: redraw a service's name when its label loads
- 651e3c1 fix: refresh admin UIs after a wake under the idle service lock
- 9ff7768 fix: refresh plugin updates in an open dashboard
- 74d1243 fix: refresh plugin updates in an open dashboard with notifications off
- 3d5a089 fix: refuse PHP plugin scripts instead of running them in a container
- 180fcad fix: refuse a plugin file linked outside its ui folder
- a31ff8f fix: refuse the DNS teardown while the watcher still runs
- 9782d52 fix: remove the skill of a plugin that is no longer installed
- f38c48e fix: rename every mention of the skeleton in a new plugin
- 64b244d fix: replace a plugin's failure log in one step
- 9481d3a fix: report a bridge lookup that could not run
- ef4650d fix: resolve .test inside WSL by handing resolv.conf to systemd-resolved
- ba16f8e fix: resolve .test inside a WSL distro that has no systemd-resolved
- e1d52cd fix: resolve tenant subdomains in Pest browser tests and wait for the watcher to exit on restart (#2379)
- 40280ed fix: retire popups on a dashboard that opens in front, and the page's own fallbacks
- 493d960 fix: rewrite a moved service's declared port onto its domain
- c005df9 fix: run a worktree page's plugin calls in that worktree
- 123664e fix: run dashboard terminal actions as lerd's own Linux user
- c99f8c7 fix: run every domain change through one shared operation
- 77f2300 fix: run lerd from Windows as the Linux user who set it up
- 5825559 fix: run one admin UI refresh at a time after wakes, and document it
- 020fdf2 fix: run php, composer and lerd's other shims from Windows with the paths the distro sees
- ac88900 fix: run the build log edge to edge in modals that only show it
- 0e1a608 fix: run the site's Node inside the PHP container, not Alpine's
- 7301790 fix: say when the VM memory check could not run, and bound its machine lookup
- e020886 fix: say when the lerd-php plugin could not be removed
- bf2be3f fix: say why keeping a revoked plugin failed
- dbd0026 fix: show a spinner while the streaming toggle waits for the sites
- 81f0d7c fix: show the plugin header's tooltips below its buttons
- f53e89f fix: show the tray's submenu status dots in colour on Windows
- c5c53a0 fix: show why turning on systemd in wsl.conf failed
- c384e43 fix: silence the site wizard's state_referenced_locally warning
- 8159a73 fix: size the site services grid by its pane, not the window
- 1a2d45b fix: skip backtick strings and close a block only at its own marker
- e5b6aef fix: skip the tray on WSL without a note
- 50a031d fix: stop asking macOS for Apple Music access to follow the accent
- 21a4c9e fix: stop counting code lines that start with an asterisk
- 05e9e7d fix: stop doctor flagging the macOS provided-env mount as missing
- 155830d fix: stop everything a plugin script started when its time runs out
- f64e088 fix: stop lerd install early on WSL without systemd
- 8080b79 fix: stop offering the Flatpak desktop app inside WSL
- 197f098 fix: stop pinning mkcert and bump every pinned host tool daily (#2385)
- 999364c fix: stop the Overview refetching plugin cards on every live update
- 2938bd4 fix: stop the watcher before uninstall tears DNS down
- 924e831 fix: stop trying to start a service the user removed on every command
- b66ec5f fix: stop what a lerd command started in its container when the command is cut short (#2389)
- d7b622a fix: take MCP db snapshots from the site's own database service
- d9617d0 fix: take lerd's Windows DNS rule back when its DNS is turned off
- d75cedf fix: take the desktop app's registration back on lerd uninstall
- a2073c9 fix: translate the suggested service picker prompt in Traditional Chinese
- 91982a0 fix: treat --ri=json as an info flag too
- ee8bff6 fix: trust lerd's CA from native PHP
- ddc2f1d fix: trust lerd's CA on Windows from wsl:setup
- 53e7a9d fix: trust only a confirmed stopped watcher before the DNS teardown
- cca6970 fix: turn systemd on and restart WSL from lerd install
- a791571 fix: use the Node build lerd shell fetched, from a folder the container sees
- cad94ce fix: use the canonical image reference for the official phpmyadmin image
- 60fd902 fix: wait for the Podman Machine to stop before resizing it
- 2642db3 fix: wake a sleeping engine before listing its snapshots
- b4fc727 fix: warn in doctor when WSL has not restarted since lerd took over resolv.conf
- eedf408 fix: watch the Noctalia render from the moment the template is registered
- 4f3d1d8 fix: write the xdebug ini for a version the native runtime fetches
Other
- 6fbfbb1 Merge remote-tracking branch 'origin/docs/landing-refresh' into docs/landing-refresh
- 99cc437 Merge remote-tracking branch 'origin/fix/wsl-dns-without-resolved' into fix/wsl-dns-without-resolved
- d45dc3d Merge remote-tracking branch 'origin/fix/wsl-install-restarts-for-systemd' into fix/wsl-install-restarts-for-systemd
- c66831a Merge remote-tracking branch 'origin/main' into chore/comment-length-hook
- 55e008e Merge remote-tracking branch 'origin/main' into feat/plugin-docs-logs-and-look
- 4579d81 Merge remote-tracking branch 'origin/main' into feat/plugin-notifications
- f7937fa Merge remote-tracking branch 'origin/main' into feat/plugin-system
- 3cab843 Merge remote-tracking branch 'origin/main' into feat/umami-autologin
- ceb6bd9 Merge remote-tracking branch 'origin/main' into feat/wsl-windows-integration
- 0dc668e Merge remote-tracking branch 'origin/main' into feat/wsl-windows-integration
- 2700c6d Merge remote-tracking branch 'origin/main' into fix/dev-server-subdomain-cors
- 809d799 Merge remote-tracking branch 'origin/main' into fix/native-ca-bundle
- 578d671 Merge remote-tracking branch 'origin/main' into fix/uninstall-stops-watcher-first
- 18865d1 Merge remote-tracking branch 'origin/main' into release/v1.38.0-beta.1
- 1ff69c7 build: install lerd.exe with make install
- c5fbaf0 build: move to Go 1.26.10 for the crypto/x509 fix
- c038d16 chore: add a pre-commit hook that keeps comment blocks to three lines
- 9c17f32 chore: add make dupes for a copy-paste report
- b9ef1bf chore: bump pinned host tool versions (#2381)
- 4d3f807 chore: bump pinned host tool versions (#2392)
- 8cef67d chore: bump pinned host tool versions (#2397)
- 25d8c19 chore: bump vite and vitest past their open security advisories
- 1ff051f chore: drop the container unit hook nothing calls
- 54cb881 chore: keep the consent prompt's comment to three lines
- 9fcd7f2 chore: keep the host distrust comment to two lines
- b03d16e chore: regenerate third-party licenses
- da38f95 chore: remove code that only its own tests still reach
- fce9e1f chore: remove functions nothing calls anymore
- c52b7a1 chore: retrigger CI
- 305a958 chore: retrigger CI
- 9ecaf14 chore: shorten the Windows side's comments
- 09b5a58 chore: shorten the git diff handler comment
- 6d7056e chore: shorten the musl Node lookup comments
- dd390ea chore: shorten the refreshAdminUIs comment
- c0f09c1 chore: split the popup retirement comment
- 1d46158 perf: follow the request store instead of rereading it every 15 seconds
- 1bb8a90 perf: keep the kept-request set apart from the debug events
- f7a4de5 perf: send a request's debug events over one connection
- 4d3a84f perf: slow the dashboard's polls while its window is unfocused
- fb8a7a2 refactor: drop lerd.exe's setup mode in favour of Install-Lerd.exe
- fc7a8bd refactor: fold repeated Go code into shared helpers
- a2ba83b refactor: fold the next layer of repeated code into shared helpers
- 36bbeaf refactor: keep the desktop app's tray and notification feed to WSL
- 5b31972 refactor: leave the Windows tray to the desktop app and keep the agent headless
- 8296edf refactor: move code shared by the macOS and Linux files into unix ones
- c513d44 refactor: pull the web UI's repeated helpers into shared pieces
- 4207b07 refactor: read the tray's state through one reader
- 2c7f07a refactor: render the dev server locations from one shared template
- 4ff4e1e refactor: share one shell across the config editors and their confirmations
- 2008e50 refactor: tell WSL apart once, in platform.Current
- abf8812 release: say where Claude Code gets the language server
- 8a9d369 release: update README and changelog for v1.38.0-beta.1
- d0942d6 release: update README and changelog for v1.38.0-beta.2
- 1bec3a4 release: v1.37.1 (#2254)
- 42002a8 release: v1.38.0 (#2401)
- 742e7af release: v1.38.0-beta.1
- 9891171 release: v1.38.0-beta.3 (#2373)
- 915fd21 test(vm): steady the lane's dashboard, NativePHP and no-answer checks
Full Changelog: v1.37.1...v1.38.0