release: v1.33.0 - #1486
Merged
Merged
Conversation
The second design law says no feature may know the name Laravel, and this release is what happened when a Drupal site was linked and every surface was asked about it in turn. The databases card read DB_HOST and DB_DATABASE out of a .env that a Drupal or WordPress project does not have. The doctor offered migrations against a 0-byte file the application never opens, took its migrate button from the literal word Laravel spells that command with, and called a site healthy while it picked mysql and served every request off SQLite. lerd env reported success and appended constants to a settings.php sitting next to the $databases array Drupal actually reads. Each of those is answered from the framework's own declaration now: which file, in which format, at which keys, with which command. The dashboard stopped being somewhere you watch lerd and became somewhere work starts. The + in Sites was a directory browser that streamed a link and stopped there, and it is a wizard now that creates a project from the catalogue the store publishes or links one that exists, asks the questions lerd init asks, and runs the setup steps with their output streaming into the modal. Those questions and that step list are the same plan the terminal renders, which is what setup --list-steps and --step exist for. The documentation moved to the copy already embedded in the binary, searchable and rendered offline. Sites, services and workers are drawn the same way wherever you meet them, and both stores learned to carry the mark and brand colour each thing is drawn with. More of what lerd does is a line of YAML than it was a release ago, and that is only safe because a definition reaches every install within a day whatever binary it runs. Writing an env format a binary had never heard of used to fall through to the dotenv writer, which appends key=value lines into a PHP file and takes the site down with a parse error on a machine whose owner did nothing but leave lerd running. It refuses now, says so, and leaves the project exactly as it was, and every key added to either schema since is either ignorable by an older binary or paired with one that is. The README picks up the env contract, the dashboard wizard, the offline docs, the nine frameworks the store publishes and the pre-wipe snapshot. The MCP reference gains the same env contract, sqlite as a wiring rather than a service, and the doctor fixes that run on the host rather than in the container. The demo fixtures move to 1.33.0 and carry the marks the stores publish, so the landing page demo draws every service and framework as itself, and the social preview and a featured variant are recaptured from it. The dev digest and its card are new with the banner pointing at them. Refs #1432
…ed page The entry describing the container normaliser spelled a VitePress marker inline, and the offline docs renderer asserts none survives into the HTML it serves, code spans included. It names the markers instead of printing one.
A store preset that changes what a unit renders to could not reach a container that was already running. File mounts and the dashboard proxy env are read from the preset when the quadlet is written and are never stored on the service, while the reconcile re-rendered a unit only when the unit was missing or the saved YAML had changed, so the preset that moves phpMyAdmin behind the lerd-ui proxy landed on disk with the container still on a unit that had no mount for it and the dashboard answered 404 at the path the UI had already switched to. The quadlet is rendered every pass now and its content decides, which in a steady state costs a comparison. A container that started before its unit file was last written counts as stale too, since the install rewrites service quadlets long before it reaches the reconcile and leaves an already running container alone, leaving that pass nothing to notice. The install refreshes the store presets and reconciles after it starts services, so the pass that carries a store change into a container has the last word over the family discovery that rewrites consumer units behind it. A default PHP version above a framework's ceiling resolved to the framework's floor. When nothing installed satisfies the range the fallback always answered the minimum, so scaffolding CakePHP on a machine whose only PHP is 8.5 asked for 8.1 rather than 8.4 and stopped there, which left CakePHP and CodeIgniter unscaffoldable on a stock install. It falls back to the bound the version actually missed. php:rebuild is what the doctor, isolate and the shims all name when a PHP version is missing, and it only ever built the image. On a version this machine had never installed the build landed on nothing: php:list omitted it, the shims still called it uninstalled, and the run ended by failing to restart a unit that did not exist. It writes the unit first now, the way the ensure path does, so a failed build still leaves the version registered. isolate says when a pin names a version with no image instead of reporting a bare success, and the not installed error stops naming lerd install, which takes no version and could never have added the one being asked for. Stopping a unit systemd has never loaded is the goal already met, not a failure. The stop set is built partly from the workers a site declares rather than from the units on disk, so a machine that never installed a declared worker named units systemd does not know and a clean shutdown printed a red line for each one. The launchd side has always treated its equivalent as success. Closes #1487
fix: address the defects found testing v1.33.0 across distro guests
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The stable that closes the 1.32.0 line.
The second design law says no feature may know the name Laravel, and most of this release is what happened when a real Drupal site was linked and every surface was asked about it in turn. The databases card read DB_HOST and DB_DATABASE out of a .env that a Drupal or WordPress project does not have, so neither was ever shown as owning the database it runs on. The doctor reported an empty database and offered migrations against a 0-byte file the application never opens, took its migrate button from the literal word Laravel spells that command with so Symfony and Drupal got a finding naming a remedy the user then had to go and find, and called a site healthy while it picked mysql in .lerd.yaml and served every request off SQLite. lerd env reported success and appended constants to a settings.php sitting next to the $databases array Drupal actually reads. mail() could not deliver anywhere in any container while Mailpit ran the whole time. These were never separate bugs so much as one assumption made in a dozen places, and each of them is answered from the framework's own declaration now: which file, in which format, at which keys, with which command. Writing one is the harder half, since a settings file is mostly guidance a user may have edited, so only the statements whose values change are rewritten and a read-only file is unhardened for the write and restored after.
The dashboard stopped being somewhere you watch lerd and became somewhere work starts. The + in Sites was a directory browser that streamed a link and stopped there, so a site linked from the dashboard took the defaults for PHP version, HTTPS and services with the user finding out later, and nothing ran the setup steps, which is where composer install, the JS build and the workers actually happen. It is a wizard now that either creates a project from the catalogue the store publishes or links one that exists, asks the questions lerd init asks, and runs the setup steps with their output streaming into the modal. Those questions and that step list are not a copy of the terminal's, they are the same plan, which is what lerd setup --list-steps and --step exist for. Everything reaching the host goes through one run endpoint that builds every argv itself from a named kind, and a run lives in lerd-ui rather than in the request that started it, so the modal can be closed mid-composer and picked back up. The documentation moved to the copy already embedded in the binary, searchable and rendered offline, which is the one moment a developer most needs it.
More of what lerd does is a line of YAML than it was a release ago: how long an engine gets to shut down, which of its complaints are structural noise on a restore, the command that clears a framework's cache, the one that runs its migrations, whether a setup step belongs only on a project nobody has bootstrapped yet, and the mark and colour it wears. That is only safe because a definition reaches every install within a day whatever binary it runs, with no version gate in the index or the schema, and this cycle is when that stopped being a hope. Writing an env format a binary had never heard of used to fall through to the dotenv writer, which appends key=value lines into a PHP file and takes the site down with a parse error on a machine whose owner did nothing but leave lerd running. It refuses now, says so, and leaves the project exactly as it was, and every key added to either schema since is either ignorable by an older binary or paired with one that is.
The long tail is mostly things that had been wrong for a while. A Homebrew upgrade retired the keg every service unit and every shim had recorded, so the whole install stopped at once on a machine where the developer changed nothing, behind a guard written for exactly that which could never fire on Linux because the executable path is already resolved there. Deleting a project directory left its certificates, its per-site container, its worktree vhosts and its open shares behind, and removing a site's certificates turned out to be dead code on every path including unlink. phpMyAdmin opened on whichever engine happened to sort first rather than the one its preset declares, so a user's mysql databases looked like they had vanished, and every POST it made came back as a connection error because the overlay put its session cookie in third-party territory. service remove --purge renamed the data dir aside and called that recoverable when only the image that wrote it could ever open it again. And the resources widget reported lerd-ui holding almost two gigabytes while the process held fifty megabytes, measured by a podman stats stream whose entire cost was charged to the process doing the measuring.
What is listed under Fixed is what a 1.32.0 install actually runs into. Two reviews of everything merged since the release sit behind this one, and what they found in this cycle's own new work is described inside the feature it belongs to rather than listed as a fix, since no released version ever had it.
The README picks up the env contract, the dashboard wizard, the offline docs, the nine frameworks the store publishes with their marks, the doctor's new fixes and the pre-wipe snapshot. The MCP reference gains the same env contract, sqlite as a wiring rather than a service, and the three doctor fixes that run on the host rather than in the container. The demo was answering every mark endpoint with an empty object, so the landing page showed none of the artwork this release is largely about; it carries the store's marks now and the social preview is recaptured from it, with a 2200x1100 featured variant alongside. The dev digest and its card are new with the banner pointing at them.
Refs #1432