AfterwordThe 100 Builds Documentary Page
What it does for you
A zero-npm generator that reads the sprint's tracker and logs and writes one long story page: the ramp, every lesson, and what went wrong.

Screenshots

In more detail
Afterword is a generator that turns the sprint's own logs into one long story page about how the 100 builds went. The portfolio (#96) shows what I built. This page shows how it went: the ramp, the lessons, and the things that kept breaking.
Honest limits
The mobile layout is untested beyond reading the CSS, because headless Chrome will not lay out narrower than about 500 px. Screenshots of the opening and chapter three were captured and reviewed, not the whole page on real devices. And the page is only as good as the logs behind it: it quotes them verbatim, so it cannot fix what they got wrong.
How I built it
Claude Code built it on the last day, in one session of about half an hour. build.mjs reads the tracker, the learnings log, the build log, the skill matrix, the schedule, my profile, the Claude Code and Codex split notes, every case-study YAML block and every LOG-ENTRY.json, then writes one page into dist/.
The page opens with the count from the tracker and an honest split of who built what: Claude Code, Claude Cowork and Codex. Then the ramp by tier, every lesson in ten chapters, the recurring problems with real quotes of the fixes, and links out to the portfolio and the proof pack.
I set the content rules: no invented numbers or quotes, no em dashes, banned topics filtered sentence by sentence, and never claiming one tool built everything. Claude Code turned each rule into a test on the built page. Every sentence on the page is either a count computed from the records, a verbatim line from them, or fixed copy I checked against them.
What I learned
- Attribution needs a written order of precedence: the Cowork tool column first, then the LOG-ENTRY builder field, then the tracker tool. Six Codex LOG-ENTRY files started with a hidden UTF-8 byte-order mark and would have silently counted as Claude Code without stripping it.
- Counted themes only read well when ranked by lift against the whole log. Raw frequency put "tests" first in all ten chapters, because tests show up everywhere.
- A page built from logs inherits the logs' mess: two separators for lessons, template lines that look like entries, old em dashes, and a sentence splitter that broke on
build.mjs. A test fixture for each malformed case made each one a single fix. - Headless Chrome's plain screenshot of a deep
#anchoron a long page came back blank. Driving Chrome over the DevTools protocol, scrolling the element into view, then capturing, worked every time. - The data surfaced a naming collision I had not planned to show: two app names (Tack, Quire) were each used for two projects.
What carried forward
Afterword is a direct product of the coordination setup. The LOG-ENTRY protocol, where each builder writes its own file and never touches the shared tracker, is what made attribution possible at all. The BOM problem is the same one the merge script hit on the tandem day. With #96, it is one of two generators that rebuild from every case study, and it links straight to it.
If I took it further
I would give the lesson log a strict machine format from day one (number, app name, lesson) instead of parsing two styles. I would also add a phone-width check through device emulation.
#099 Built with Claude Code September 24, 2026 230 automated checks