All writing

We shipped a site in a weekend. Here is the system.

Twelve pages, a blog, and a working form, Friday to Sunday. The order of operations mattered more than the hours.

We shipped a site in a weekend. Here is the system.

What shipped

A marketing site for a consulting client: twelve pages, a blog, a contact form wired to a database, deployed on the edge. Started Friday evening, live Sunday night. This is the system that made that possible.

The rule that made it possible

Scope was locked before anything was built. One page listing every page, every section on each page, and what each section says. The client signed off on the list, not on mockups. Mockups invite taste debates. A list invites yes or no.

Every idea that arrived during the build went onto a list called "later". The list is now the phase-two backlog. Nothing on it was discussed during the weekend.

The stack, and why

Astro for the site. Static output, islands where interaction was needed, nothing else. A page that ships no JavaScript loads fast by default, and most pages here ship none.

Cloudflare Pages for hosting. Git push deploys. The form posts to a Cloudflare Worker, which writes to Supabase. No server to configure, because there is no server.

Content lived in markdown from the first hour. Design lived in a small token file: three fonts, a handful of colour variables, one type scale. When every spacing decision is a variable, a redesign is find-and-replace.

The schedule

Friday evening: repository, tokens, typography, the base layout. Stop when the home page renders unstyled content. Midnight.

Saturday morning: components. Buttons, cards, nav, footer. Each built once, in isolation.

Saturday afternoon: pages, assembled from the morning's components. Copy pasted in from the locked document, not written at the keyboard.

Saturday evening: the contact form end to end. Worker, validation, database write, confirmation page.

Sunday morning: images and the last two pages. Sunday afternoon: accessibility pass, meta tags, redirects. Sunday night: DNS cutover.

What got cut

Animations beyond a single reveal. A dark mode. A search box the blog did not yet need. Each cut was written down with a reason. Written cuts are decisions; silent cuts are debts.

What transfers

The weekend is not the point. The point is the order: scope locked as text, tokens before components, components before pages, plumbing before polish. Run the same order on a larger project and the timeline stretches, but the sequence does not change.

The backlog list is where the speed actually comes from. A build slows down when every new idea negotiates with the current task. Put the idea on the list and close the negotiation.


All writing