site/├── autoload.php requires phpanta/autoload.php, maps the site's namespace, boots the app├── composer.json psr-4: the site's namespace → src/<Ns>/, and Phpanta\ → phpanta/src/├── public/index.php a last-resort handler, then <Site>::current()->run()├── src/<Ns>/ the app class, controllers, views, models, words├── data/ what the site reads at runtime, outside the webroot├── assets/ts/ the site's TypeScript; assets/ts/phpanta links to the framework's├── assets/css/ the site's stylesheet, as one @import manifest└── phpanta/ the framework, as a git submodule
The URL is relative, so every remote the site is pushed to finds its own copy of the framework beside it. Editing the framework in place is the point: a change is a commit in phpanta/, then git add phpanta and a commit in the site.
Everything else — where data/ is, which directory is the webroot, where the update serial lives, the error log, the route to the API — the framework derives from those, and the derivations are final.
A route pairs a Path case with a controller, and the controller returns a response. A ViewResponse renders its view inside the app's shell — or, for a request Navigation made, as a fragment led by its title.
A PHP host gets plain files: phpanta/src/ and phpanta/autoload.php, the site's src/ and autoload.php, and the prod webroot — copied by any means, or sent as one signed request by the framework's PushUpdate command. A static host gets an export:
Every page is rendered by its own route's controller — once more in each language, at an address that names it — every address is moved under the base path, and the export fails on any link to a page it did not write or to an anchor that page does not have. This site is that command's output.