Colophon
A project write-up pointed at the site itself. It leads with what went wrong, for the same reason every other write-up here does.
- projects shipped
- 9 projects shipped
- end-to-end spec files
- 24 end-to-end spec files
- unit tests
- 52 unit tests
Counted from the repository at build time · 29 runtime dependencies, 18 for development
The run log that fails
Findings against my own work on this site, in the order they were made. Each one was caught by diffing, measuring or testing — none by looking at the page.
The index mark contradicted itself
The same project was 01 on the home page and 05 everywhere else, because each surface numbered from its own list. It survived a design pass, a content reconciliation and two audits.
Every existing assertion checked that a mark rendered. None checked that the same mark rendered twice.
Three things were never ported, and nothing went red
The contact page shipped with no design system, the Now-building strip was missing, and analytics were dropped. All three were caught by diffing the old implementation against the new one.
129 passing end-to-end tests, and a suite that says nothing about what should exist and does not.
A deploy depended on a setting invisible from the repository
vercel.json lost its "framework" key, and the build failed with "No Next.js version detected" against a repository containing no Next at all — a dashboard preset set by hand years earlier decided how it built.
A failed cutover, and the same defect appearing independently on a second site from the same reasoning.
An LCP improvement that was not one
Removing the entrance animation was argued to improve Largest Contentful Paint, because an element at opacity 0 is not painted. Measured against production, LCP equalled FCP with and without it — a 0ms gap on every run of both.
The reasoning was sound and the conclusion was wrong. It is corrected in the source rather than deleted.
A privacy sentence that was true in production and false locally
The notice calls the analytics first-party. Vercel proxies them through this domain in production; against the dev server the package falls back to a vendor CDN, which the page does not name.
The test caught it. Review had already passed it, and I had already written the sentence.
Stack
The pieces that decide how the site behaves. Versions are read from package.json at build time, so a bump cannot leave this page claiming the old one.
Astro 7.1.3
Static by default. Every route but /contact is prerendered HTML.
Tailwind CSS 4.3.3
Design tokens in one file, consumed as utilities.
React 19.2.8
One island, on /contact. Nothing else on the site hydrates.
Zod 4.4.3
The contact schema, shared by the browser and the server action.
Resend 6.18.0
Delivers the contact email. See /privacy for what it receives.
Upstash 2.0.8
Five contact submissions an hour, per IP.
Satori + resvg 0.29.0
Open Graph cards, rendered at build time rather than by a service.
Honest limits
Every one of these is read off something the repository already records — a config note, a gate, a marked slot — rather than inferred. If one is wrong, the record is wrong.
- The end-to-end suite runs against the dev server, not a production build, because the Vercel adapter has no preview command. The serverless wrapper around /contact is never exercised locally.
- Playwright runs on a single worker. The dev server saturates as the suite grows, and the count has been lowered three times; a flaky gate is not a gate.
- One accessibility violation is known and shipped: Shiki's comment token measures 4.02:1 against a 4.5:1 threshold in light mode. It is asserted by value in the a11y gate rather than excluded, so it cannot go quiet.
- The reading line — the only way a phone addresses a row — needs CSS scroll-driven animation. Where it is unsupported there is no scroll addressing at all, by design rather than by fallback.
- Four retention periods on /privacy are unstated. The page is honest and visibly incomplete, which is better than the alternative but is still incomplete.
- There is no writing section. The design for one exists; the posts do not.
- This page cannot count the site's end-to-end tests or measure its own JavaScript. Both are explained above, and both are the reason it reports spec files instead.