Architecture
How a request becomes a page.
Three mechanisms worth seeing rather than reading: what changed when hosting moved off S3, how a request resolves through the App Router, and how the JSON tool loads as an independent client chunk.
Diagram 1
Deploying a change — before and after Amplify
Both rows start at the same git push and end at the same browser — what changed is everything in between. The old path needed a developer to run the export build and two AWS CLI commands by hand; the new path is a single automatic build triggered by the push itself, with Amplify owning the CDN, TLS and cache invalidation that CloudFront needed done manually before.
Diagram 2
Request → route resolution
Every route resolves through the root layout except the two metadata routes, which the App Router generates directly — that's the one deliberate bypass in the tree. /about resolves through the root layout but opts out of both shared header/footer layouts, unlike its two siblings.
Diagram 3
/tools/json — server shell, client-loaded tool
The dashed line is the one that matters: everything above it is in the initial HTML; everything below loads as its own chunk after hydration, so the JSON tool's logic never has to ship on routes that don't use it. It still deploys inside the same build as the host, though — an independently deployable tool would need Module Federation in that spot instead of dynamic().
For the full written breakdown of routing, layouts, error boundaries and hosting, see architecture.md in the repository.