# Building alwaysriskon.com: a foundation of gates before a single page

Canonical: <https://alwaysriskon.com/writeups/building-this-site>
Published: 2026-09-30

The first build of alwaysriskon.com was 165 commits against a plan of 63 tasks, and it shipped no page at all, only the parts and the gates every page now has to pass. It ran from 26 to 28 September 2026.

## Key numbers

| Claim                             | Value       | Measured on                                           | As of      |
| --------------------------------- | ----------- | ----------------------------------------------------- | ---------- |
| Tasks in the foundation plan      | 63 tasks    | the Phase 0 and 1 implementation plan, September 2026 | 2026-09-28 |
| Commits in the foundation run     | 165 commits | the site repository, 26 to 28 September 2026          | 2026-09-28 |
| Gate steps run before every merge | 16 steps    | the pnpm gates step list, September 2026              | 2026-09-30 |

## What I set out to build

The spec for this site set a budget before it drew a single page, and the build ran on Astro because a static site ships no JavaScript it doesn't ask for. The home page gets 90 KB of gzipped JavaScript, a write-up gets 60 KB, every font file stays under 70 KB, and nothing goes out until a gate has checked it. The plan that came out of the spec had 63 tasks and not one of them was a page.

That order was deliberate. This site publishes numbers about its own work, so it has to be checked by something other than me eyeballing it. The gates went in first and the pages waited behind them.

The pages would have been quicker to show, and a screenshot of a home page makes a better first post than a list of test files. But a page built before its checks gets checked by hand forever, so the pages waited.

## The first version

The first version of the look was Draft C from the design round, the trading floor. The fan of price paths sat in front of the wordmark with a blend mode, so the letters and the paths drew over the same pixels, and the tagline was set in a thin Bodoni italic.

![The first home page draft, before the second iteration](https://alwaysriskon.com/_astro/v1-index.Bjgx4toZ_14HTb1.webp)

*Draft C, first iteration, with the draft's placeholder copy.*

It looked right from a distance. Up close the fan read as a grey field and the tagline was hard to read, and the list items moved when you hovered over them.

## What broke

The draft broke first. The italic tagline was hard to read, the fan flattened into grey, and text moved on hover when text should never move. The second iteration put the fan behind the letters with each path stroked on its own, set the tagline in roman, and replaced the text motion with a verdigris bar under the title.

Before: ![The first draft of the home page](https://alwaysriskon.com/_astro/v1-index.Bjgx4toZ_14HTb1.webp)

After: ![The second draft of the home page](https://alwaysriskon.com/_astro/v2-index.DR0nvuq__5qmS8.webp)

*Draft C before and after its second iteration, placeholder copy in both.*

Then the build. 93 of the 165 commits were fixes, which sounds bad until you see how the run worked. Claude Code wrote each task against the plan, a review read it, and the fixes landed before the next task started, so a fix commit was usually a review doing its job and not something breaking in front of a reader.

The failure worth reporting came at the end. All 15 gate steps passed on the final branch. The final review still found one critical hole, 10 important findings and 12 numbered minor ones. The critical one was in the disclosure scan, the gate that stops this site printing what it must not. A banned word with a hidden element in the middle of it read as harmless pieces to the page scan, and the page still showed the whole word.

Green gates, and a hole in the one gate that mattered most. Fixed in the final fix wave, with a test for each way of hiding text.

## What shipped

What shipped was no page at all. It was the parts every page is made of, the colour and type tokens, the font pipeline, the fan, the RISK switch that swaps the whole site between risk off and risk on, the chart module, the content schemas, the four write-up templates and the gates.

![The approved home page draft in risk off](https://alwaysriskon.com/_astro/v2-index.DR0nvuq__5qmS8.webp)

![The approved home page draft in risk on](https://alwaysriskon.com/_astro/v2-index-on.Dowlui0n_Z12g5uM.webp)

*The approved draft in both modes, with its placeholder copy.*

The drafts are the target those parts were built to. Both screens carry the drafts' placeholder copy, so the reader count and the dates on them are not real, and no page of the live site prints them outside these screenshots.

## The numbers

Cumulative hours on Site foundation, 48.6 hours from 26 Sept 2026 to 28 Sept 2026, stepped at each logged day. [Figure](https://alwaysriskon.com/writeups/building-this-site#hours-site-foundation)

The foundation ran 165 commits from 26 to 28 September. The quietest day had 18, the busiest had 95 and the last day had 52 up to the final fix.

Commits per day in the foundation run, from the repository history. [Figure](https://alwaysriskon.com/writeups/building-this-site#fig1)

The busiest day ran 23.8 hours from its first commit to its last, because the agents kept committing through the night. Every commit in the run carries a Claude co-author line, which is the honest way to read that number. It is one man and a lot of Claude Code, not one man awake for a day.

The 48.6 hours on the burn-up are the same measure added up across the run, the span from each London day's first commit to its last. It comes from the commit times in the git log, and it is not a claim about hours at a desk. The run ended with 2,053 unit tests passing on a clean checkout of the last fix.

## What carries forward

The gates carry forward. There are 16 steps now and every merge runs all of them, from the type check and the unit tests to the disclosure scan over the built pages and a browser pass over every route in both modes.

The template registry carries forward too. It is one file that holds the four templates, and the schema, the section check, the page layout and the written guides all read from it. The guides are what my own writing agents read before they fill a template, so a write-up that breaks the structure fails the build and never reaches a reader.

## The cost

48.6 hours of commit spans. The spend is £0, which is my own figure and not a measured one. Lighthouse CI and the nightly crawl of the live site are parked until after launch.

The site itself is the demo, and the content ledger at alwaysriskon.com/ledger.json lists every page with its template and topic.

## Check it yourself

- **The site itself**: <https://alwaysriskon.com>
- **The content ledger**: <https://alwaysriskon.com/ledger.json>, every page, its template and topic

## Sources

1. [Astro documentation](https://docs.astro.build)
2. [Web Content Accessibility Guidelines (WCAG) 2.2](https://www.w3.org/TR/WCAG22/), 2023-10-05
