BV

Setups.

How I build and ship things, one workflow at a time. Each runs from idea to production. Pick a step to see how it works and where it lives in the repo.

01 · Flow

This site

How I develop this repository, from a note on my phone to a page in production. Mostly agents, two checks, and no deploy button.

  1. 01 Plan & capture

  2. 02 Build & draft

  3. 03 Test & quality

  4. 04 Release & operate

01 · Plan & capture

Capture a note

Most articles start as a few lines typed with my thumb. A Shortcut on my iPhone sends the note to GitHub as an issue labelled draft-article.

The Shortcut's token can file issues on this one repo and nothing else. It can never touch code, which is what I want from a credential that syncs through iCloud.

  • Apple Notes
  • Shortcuts
  • GitHub Issues

Source

At commit 5b5a893, the one this page was built from.

01 · Plan & capture

Claim the issue

An agent only picks up an issue that I opened and that carries the draft-article label. A label alone isn't enough, because anyone with triage access can add one.

Before writing anything, the agent adds article-in-progress as a lock. Two agents never draft the same note.

When a note is missing facts, the questions go on the issue. That's the only place I'm asked anything.

  • GitHub Issues
  • gh CLI

Source

At commit 5b5a893, the one this page was built from.

02 · Build & draft

Shared context

Every agent starts from the same two places. AGENTS.md says what the repo is and what it cares about. The skills folder holds the procedures.

The skills are written so that any coding agent can follow them. When one is wrong, the fix goes into the skill, not into one agent's memory.

  • AGENTS.md
  • Skills

Source

At commit 5b5a893, the one this page was built from.

02 · Build & draft

One worktree per task

Each task gets its own branch in its own git worktree. Parallel agents never share a checkout, so they can't step on each other's files.

Branch and commit names follow one pattern, which keeps the history readable when most of it is written by agents.

  • Git worktrees
  • Claude Code

Source

At commit 5b5a893, the one this page was built from.

02 · Build & draft

Draft and cover

The agent ghostwrites the full article from the note, measured against a style guide derived from everything I've published. Structure and analogies it may invent. Facts, numbers and anything I did, never.

The cover is dithered from a source image by a script, in the same terracotta palette the site uses.

  • Style guide
  • sharp
  • Bayer dither

Source

At commit 5b5a893, the one this page was built from.

03 · Test & quality

Fingerprint scrub

A deterministic pass over every model-written draft. It measures sentence rhythm, punctuation and filler phrases against my own articles and reports what drifts.

It works the same whichever model wrote the draft, which is the point.

  • Node.js

Source

At commit 5b5a893, the one this page was built from.

03 · Test & quality

Build-time checks

The build is the test suite. Content must match its schema, every colour pair must pass WCAG AA in both themes, and every URL the site has served must still exist.

Any of those failing fails npm run generate, so it never gets as far as a deploy.

  • Astro
  • Zod
  • WCAG AA

Source

At commit 5b5a893, the one this page was built from.

03 · Test & quality

Required check

Every pull request runs the same build on a clean Linux runner. Master requires it to pass, so a red build can't be merged.

There's no human review gate. This check is the gate.

  • GitHub Actions

Source

At commit 5b5a893, the one this page was built from.

04 · Release & operate

Preview

Cloudflare builds every pushed branch and posts a preview link on the pull request. Anything visual gets looked at there before it merges.

  • Cloudflare Pages

Source

At commit 5b5a893, the one this page was built from.

04 · Release & operate

Merge is publish

Master is production. Squash-merging a pull request is the only publish step, and Cloudflare deploys it within a minute or two.

The site is fully static. No server runs at request time, so there's nothing else to deploy.

  • GitHub
  • Cloudflare Pages

Source

At commit 5b5a893, the one this page was built from.

04 · Release & operate

Clean up

After a merge the agent removes its worktree, its local branch and the build output. An idle clone holds the source and nothing else.

Then the next note comes in, and the loop starts again.

  • Git

Source

At commit 5b5a893, the one this page was built from.