website-build-kit

Astro · Cloudflare Workers · Claude Code

Your build was green. The site was wrong.

A method for shipping production marketing sites — and a catalogue of 33 failures that passed every check on the way out. Clean build, clean types, clean deploy, wrong result.

Every one of these shipped

Not hypotheticals, and not general advice. Each failed silently on a real rebuild — the compiler was happy, the deploy was clean, and nothing anywhere reported it.

A migration that dropped 15 of 18 pages

Every route the new site emitted returned 200, so verification passed. Nothing compared the new site against the old site's inventory.

Every blog date one day early

toLocaleDateString with no timezone formats in the build machine's zone. Correct in London, wrong in Los Angeles, same commit.

Moving the apex killed the client's email

MX left behind in the old zone. Bounces go to the sender, so the people who find out cannot tell the client.

A bare CI build published localhost canonicals

No environment set, no error, no warning. The bundler ran perfectly and the site told Google it lived on localhost.

The last client's analytics on a new site

An inherited container ID in the template sent a real business's traffic to another company's property, for weeks.

A skip link that scrolled but never moved focus

The page jumps, so it looks like it worked. Keyboard users land back in the navigation.

Disallow: / and noindex cancelling out

A blocked crawler never fetches the page, so it never reads the noindex — and the staging URL gets indexed anyway.

A duplicate _headers path silently dropping the CSP

The later block replaces the earlier one rather than merging. The file still contains every header; none of them are sent.

Two halves, two commands

The template is the skeleton. The skill is the method that drives it — discovery, stack decisions, the build, then verification against the deployed thing.

Scaffold a site

Astro, static, on Cloudflare Workers. Builds green immediately, with no content, no images and no secrets.

npm create website-build-kit@latest my-site

Install the skill

For Claude Code. Then just ask — it matches on description, so there is no command to remember.

/plugin marketplace add nurkamol/website-build-kit
/plugin install website-build@website-build-kit

A skeleton, not a theme

It ships no palette, no typeface and no home page — deliberately, so that two sites built from it cannot look alike. What it does ship is the part that takes longest to get right and is easiest to get subtly wrong.

In the box

  • Form endpoint with durable storage written before the email provider is called
  • One build variable deriving indexability, analytics, canonical host and lead routing
  • Verification against the deployed site, as a gate that exits non-zero
  • WCAG 2.2 AA as a build constraint, with a dated evidence pack
  • Migration path: inventory, extract to markdown, propose redirects, fail on a lost URL
  • AVIF and WebP per width, with a manifest so nothing shifts

Deliberately absent

  • A palette, a typeface, a home page or a hero treatment
  • A component library or a design system
  • A CMS — one gets picked per project, not per template
  • Testimonials, pricing tables and galleries; those are project-shaped
  • Any provider recommendation that has not shipped on a real deploy