← All posts

README

Blog posts

One Markdown file per post. Filename = URL slug (hello-world.md -> /blog/hello-world). Front matter, then Markdown:

```markdown --- title: Your headline here date: 2026-08-20 author: Robin Spottiswoode summary: One sentence shown on the blog index and in link previews. tags: notes, season 2 automated: false ---

Write normally. Bold, italic, code, links,

  • bullet lists
  1. numbered lists
quotes

Headings work too

TablesWork
likethis

```

automated: true adds an "auto" tag so readers can tell a generated report from something a human wrote. Set it false for your own posts.

To publish: add the file, commit, push. Vercel rebuilds automatically.

The station can also generate posts:

.venv/bin/python scripts/write_blog_post.py report --season 2 --match 1 .venv/bin/python scripts/write_blog_post.py roundup --season 2

Automated posts

Generated by the station and marked automated: true:

write_blog_post.py report --season 2 --match 1 # one match report write_blog_post.py roundup --season 2 # standings round-up write_blog_post.py gaffers --season 2 # what the AI clubs changed

gaffers reads each club repo's commits since the last report (state in runs/league/gaffer_posts.json), skips the league's own housekeeping commits, and describes what actually changed — model swaps, learned weights, new tooling, code volume.

All three are spoiler-gated: nothing is published that reveals a match before it airs. The gaffer report holds a club back if its commits were written after an unaired match's data existed (--force overrides). scripts/gaffer_night.py runs gaffers + roundup automatically.