feat: FrankenPHP runtime for Laravel and Symfony sites#229
Merged
Conversation
Reconcile with #232 (slim MCP manifest): drop the per-site and per-service tool variants (site_pause/unpause/restart/rebuild, service_pin/unpin) in favor of main's site_control / service_control / stripe action dispatchers. Keep site_runtime as a new standalone tool and add its row to docs/features/mcp.md.
geodro
added a commit
that referenced
this pull request
Apr 22, 2026
…, install/uninstall polish (#241) - Bump internal/version to 1.18.0-beta.1. - CHANGELOG entry covering all 11 PRs since v1.17.1 (#229 through #240) in Keep-a-Changelog sections: Added / Changed / Fixed / Docs / CI. Breaking change is #232 (slim MCP tool manifest, merged action pairs). - docs/getting-started/installation.md: uninstall section now describes the four opt-in prompts (data, MCP integration, mkcert CA, images) and --force semantics. - docs/troubleshooting.md: new entry for the aardvark-dns drift case (every DNS lookup stalling ~5 seconds after a dual-stack migration). - docs/usage/lifecycle.md: new info block describing stale-site auto-cleanup — fsnotify fast path on parked dirs, 30s sweep across the full registry, eventbus publish so the dashboard refreshes.
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.
Summary
Adds an opt-in FrankenPHP runtime as an alternative to the shared PHP-FPM container. Sites declare
runtime: frankenphp(optionallyruntime_worker: true) in.lerd.yaml, or switch at runtime withlerd runtime frankenphp [--worker]. Each FrankenPHP site spins up its owndunglas/frankenphp:php<version>-alpinecontainer; nginx reverse-proxies to it on port 8000 and workerspodman execinto it.What's in
Site.Runtime/.lerd.yaml runtime:schema pluslerd runtimeCLI that writes both fields and cleans them up on switch to fpm.Framework.FrankenPHPadapter hook withEntrypoint,WorkerEntrypoint,Env,WorkerEnv,SupportsWorker. Built-in Laravel and Symfony adapters:frankenphp php-server -r public/for fresh-per-request dev ergonomics (code edits take effect immediately).octane:start --server=frankenphp --workers=auto, with pcntl installed at container boot via the image's bundled install-php-extensions helper.frankenphp php-server -r public/.frankenphp php-server --worker=public/index.php --watchso file edits hot-reload withoutlerd restart.frankenphp php-serverrooted at the framework's public dir.mergeBuiltinFrankenPHPbackfills the hook onto store framework defs that predate this feature.symfony/runtime,symfony/framework-bundle, orsymfony.lock).lerd isolate 8.3and the dashboard's PHP picker actually pick up the new image tag.secure,unsecure, pause/unpause, restart, unlink, andlerd startall handle the FrankenPHP branch.SuccessExitStatus=1 130 143on generated worker units so Symfonymessenger:consumeand similar workers stop cleanly without spuriousFailedjournal entries.FrankenPHPbadge (withworkersuffix in worker mode) next to the existing service badges; Xdebug toggle is hidden on FrankenPHP sites since shared FPM Xdebug state doesn't apply. API exposesruntimeandruntime_workeron/api/sites. PHP version picker now routes FrankenPHP sites through the FrankenPHP link path instead of regenerating a broken FPM vhost.runtime: frankenphp (worker)on the site detail info line.site_runtimeMCP tool plus updated SKILL / cursor / junie guidelines.lerd initoffers a FrankenPHP prompt when it detects signals (laravel/octanewithOCTANE_SERVER=frankenphp,runtime/frankenphp,runtime/frankenphp-symfony, or aContainerfile.lerdFROMdunglas/frankenphp).lerd doctorsurfaces the same hint on registered sites still on FPM.docs/features/frankenphp.mdcovers runtime switching, worker vs non-worker tradeoffs, hot reload caveats per framework, and current limitations.Tested
Scaffolded Laravel 12 + Octane and Symfony 7.4 + Messenger projects at
~/Code/lerd-fp-tests/{laravel-fp,symfony-fp}. Verified per request serving, worker-mode resident PHP, queue/messenger workers executing viapodman execinto the FrankenPHP container,lerd runtimeround-trips cleanly removing.lerd.yamlruntime fields, and hot reload works in non-worker mode for both frameworks plus Symfony worker mode.Out of scope (follow-ups)
lerd php:ext add) on FrankenPHP sites.--watchhot reload (needs chokidar-cli, ~150MB boot overhead). Workaround: non-worker mode for dev iteration, orphp artisan octane:reloadfor quick worker refresh.