When we built our own site, we treated it like a client project with one extra rule: every claim on it has to be checkable. This post is the build log. If you view source on any page here, you can verify all of it.
Static HTML is still the fastest thing on the web
Most agency sites are heavier than the products they advertise. Ours ships as static HTML rendered at build time with Astro. There’s no server rendering pages on request and no JavaScript framework booting in your browser before text appears. A page here is a file on a CDN, and the CDN is Cloudflare’s edge, so it’s served from somewhere near you.
The numbers that follow from that decision: the homepage HTML is a few kilobytes gzipped, fonts are preloaded so text doesn’t flash, and the largest interactive thing on the site is a mascot.
JavaScript only where something moves
Astro’s islands model means the page is static by default and hydrates only the components that genuinely need to run. On this site that’s essentially one thing: the orange mascot that peeks out of the page edges. It’s a Svelte component that loads lazily after the page is idle, watches scroll position, and costs nothing before that.
Everything else that looks interactive, like the FAQ accordions and the mobile menu, is native HTML. A details element doesn’t need a framework.
The part about ChatGPT
Buyers increasingly ask AI assistants who should build their app. Assistants answer by reading the web, and they read it with impatient crawlers that parse HTML and leave. That made two of our decisions for us.
First, static HTML again: what GPTBot and ClaudeBot fetch is the complete page, not an empty shell waiting for JavaScript. Second, we publish the plumbing that makes a site legible to machines: structured data on every page, a sitemap, a robots.txt that explicitly welcomes AI crawlers, and an llms.txt that summarizes the whole site in one file.
Then we went one step further and started watching the watchers. Our Cloudflare Worker logs every AI crawler visit, including which pages they ask for and what status they get back:
if (env.POSTHOG_KEY && PAGE_PATTERN.test(url.pathname) && BOT_PATTERN.test(userAgent)) {
ctx.waitUntil(
fetch(`${env.POSTHOG_HOST}/i/v0/e/`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(event),
}),
);
}
The interesting part is the status code. When an AI crawler requests a page that doesn’t exist, that’s a machine telling us what it expected to find here. That 404 list becomes a content plan.
Things we deliberately didn’t do
No CMS: posts like this one are Markdown files in the repository, versioned by git, shipped as static HTML. No analytics on your first paint: the tracking script loads only in production and after the page settles. No cookie banner theatrics: we don’t set tracking cookies that would need one. No fake testimonials while the real case studies get written, which is also why the reviews page links to sources you can check.
The same trade, offered to you
None of this is exotic. It’s a set of small decisions made in the same direction: ship less, render early, be legible to machines, claim nothing you can’t show. That’s the trade we make on client work too, which is the actual reason our own site works this way.
If you want your site or product held to the same standard, tell us what you’re building.