The year-to-date audit. Generated 2026-07-21 on Opus 4.8, read through the lens of Build to Think — and redrawn, this round, in the spirit of Edward Tufte: one ink, one accent, no chartjunk.

“No design doc could have described this project, because the project didn’t exist until I started building it.”

Seven months, one person, no team, no budget — 798 commits in the cracks around a day job at Google. This isn’t a portfolio review; it’s a seismograph reading of a mind that thinks by building. Here’s the whole year in one line, then the three lessons it teaches, then every project at a glance.

The shape of the year · commits per week, in three acts

Apr 12 · 84 in one daythe detonation75%of the year's 798 commits fell intwo months — March & AprilACT Ithe quietACT IIthe detonationACT IIIfinishing & cutting
798
commits · Jan 1 → Jul 21 · one pair of hands
75%
landed in March + April alone
11
shipped to production · all free tiers
$0
total infrastructure cost

Two quiet months, then a detonation — 595 of the commits, 75% of the year, fall in a single March–April window — then a long tail that turns from finishing to cutting. That silhouette is the argument. Three lessons hide inside it: the projects that survive the quiet stretches are the ones that leave themselves a note; the mature move in the tail isn’t adding but removing; the newest work is built, from commit one, to survive the next gap. Here they are.


Lesson 1 — Continuity is the real constraint

The thing that kills a build-to-think project isn’t lack of energy or ideas. It’s the cold start — walking back into a session and not knowing where you left off. Every project that matured this year left itself a note for the next session. Every project that died, died in the gap between two of them.

Left the campfire lit → matured

  • golf — a DECISIONS.md of forks-taken-with-reasons
  • dopamine rat v4 — a NEXT.md written before any feature
  • bookmarks — a check-facts.ts gate that blocks its own deploys
  • the site — this audit lineage, a note-to-self about everything
  • flowtcg — a Zod content schema that became a CSV importer

Went cold in the gap → stalled

  • dopamine rat v2 — last commit: "resolve 27+ build errors"
  • bass — a perfect practice tool; one logged practice

Who restarts a session that ended in a mess? The next session simply never began.


Lesson 2 — Maturity looks like subtraction and extraction

In the spring the practice accreted — projects swelled with features, one repo absorbed a whole game. This month it did the opposite. The clearest example: the sf atlas had grown an arcade driving game inside itself. In July that game was lifted out into its own repo, and the atlas went back to being an atlas. Splitting the monorepo was the thought: these are two different ideas, and they should stop sharing a home.

One repo, three homes · the July extraction

sf the monorepo Apr → Jun rush the driving game, extracted to its own repo sf the journal returns — now an Astro content site golf → muni the sibling sim promoted to primary; old build archived, not deleted

Maturity as separation of concerns you can survive: give each exploration its own address, and keep — don't destroy — what it grew out of.


Lesson 3 — Build the memory first

The Dopamine Rat has been rebuilt four times — and v4 wins by deleting the other three. v1 was a compassion-first sketch; v2 added scoring and died on build errors; v3 grew a Garmin/Hevy “biometric nervous system.” v4 is a subtraction: three dependencies, one screen, a checklist and a rat. It’s the first version engineered from commit #1 to survive its own maker’s discontinuity.

Four rebuilds · commits per version of the Dopamine Rat

v1 · 0the sketch v2 · 2died on 27 errors v3 · 35biometric v4 · 11subtraction · live

Each rebuild changed the app's epistemology, not its features. v4 is the smallest — and the only one built on a campfire log.

“This file exists because v2 died on ‘27+ build errors’ and v3 died on unpushed branches — both cold-start deaths.” — the opening of v4’s NEXT.md

The winners don’t just leave the campfire lit anymore. They build the campfire first, then subtract everything that isn’t the fire.


The portfolio, at a glance

Every project this year, sorted by commits — with its whole activity history as a sparkline, its span, and its status. Bold rows changed since the last audit.

This round’s deltasDopamine Rat v4 · rush · stems · prompts-mcp · Flow Slays IO · sf · golf · archetypes · bookmarks Shipped & steadyinference · minecraft-mods · kareemrpg · the site Bench & footnotesbass · VidMetaPrompt · footnotes

The portfolio, at a glance · every project, one commit history

projectactivity · Jan → Jul, by weekcommitsspanstatusbookmarks277Feb–Julshippedarchetypes164Mar–Julshippedsf123Apr–Julshippedinference63Aprshippedthe site57Jan–Julshippeddopamine-rat48Feb–Julv4 · liveflowtcg24Jun–Julshippedbass10Aprpausedminecraft-mods9Jan–Febshippedarchetypes-v18Marshipped · phonegolf7May–Julprototypestems5Julnew · phase 1rush2Julnew · from sffilm1Marparked

The deep dives

Flow Slays IO → flowtcg

Jun 2 – Jul 17 · 23 commits · shipped & playable

A shipped Slay-the-Spire deckbuilder that keeps generating its own next work — this round it hardened instead of expanding.

Themed on Google Flow: HP is Morale, energy is Focus, the boss is The Launch Review Committee. The engine never branches on a specific card — lib/engine/effects.ts is “the ONLY place card/enemy behavior is resolved.” July’s four commits are pure polish and durability: full-art holographic frames (six roles = six factions, “no schema change”), a fuzzy-matching bulk art importer, a table importer that swallows spreadsheet or markdown paste, and a fix pass so a page refresh no longer loses your run.

Flow Slays IO character select
Character select — pick your PM, survive the road to launch.
Flow Slays IO combat
Combat — Morale, Focus, and a hand of cards against a launch hazard.

The atlas that became a game, then un-became one → sf

Apr 19 – Jul 16 · 123 commits · shipped · sf.ummerr.com

The year's biggest arc, and its cleanest reversal — the games moved out, the journal came back.

It began as a Tufte-style atlas of an SF move (“11 Infatuation burritos,” microclimates) and mutated into an SF-Rush-2049 driving game on real LiDAR terrain. Then July’s “Extract Rush and Muni games into their own repos” lifted the whole game stack out, and sf reverted to an Astro content journal whose new active feature is a weather “nice out” console. The map was the thinking tool; the game was the conclusion; the split was the next thought.

The sf atlas
The atlas — paper-and-ink cartography of a real move.
The Rush driving game
The Rush — the same LiDAR heightfield, now drivable and now its own repo.

A decision log with a physics engine → golf

May 7 – Jul 14 · 7 commits · local prototype

It argued itself into a new primary app, then kept the old one instead of deleting it.

A LiDAR-terrain golf project that, in July, promoted muni — a 2D-canvas arcade sim — to the main app and pushed the old Three.js journal into _archive/. A “game-feel juice pass” added windup, screen shake, and a chiptune bed, scope-guarded so the engine tests stayed green at par 72. Its DECISIONS.md records the pivot itself; Phase 1 (real round data) is honestly logged as still blocked — which is exactly why the next session knows where to start.

The flagship → bookmarks

Feb 28 – Jul 11 · 277 commits · shipped (password-gated) · prompts.ummerr.com

The most-committed project of the year quietly turned from public research into a private exec instrument.

A Chrome extension intercepts X bookmarks; a two-tier Claude pipeline (Haiku triage → Sonnet extraction) classifies them into a curated gen-media prompt dataset — deliberately $0, with check-facts.ts gating every deploy. Its arc: personal tool → public “prompt observatory” (89 commits in one weekend) → a private “Omni + Flow brief” (now at a 199-post corpus) that a Google gen-media PM actually uses.

The learning build that closed a loop → prompts-mcp

shipped to Vercel · a learn-by-building MCP server

He taught himself the Model Context Protocol by serving his own dataset through it.

An MCP server exposing the ~1,381 prompts from the flagship to any MCP host — TypeScript, Zod, both stdio and remote Streamable-HTTP transports. The README walks M0→M5 and demonstrates every MCP primitive. The fastest way to understand a protocol is to build a complete example on top of data you already care about.

The workshop’s logbook → ummerr.github.io

57 commits YTD · shipped since 2014

The workshop that publishes essays about itself.

A dormant Jekyll site rebooted into the publishing surface for the whole practice — an essays system, migrated Medium archive, and this living audit with its hand-drawn SVGs. The recursion is the point: the audit workflow regenerates an essay about the workshop, published by the workshop. You’re reading it run again.

Rebuilt four times → the Dopamine Rat

Feb 15 – Jul 21 · 48 commits across four repos · v4 live at doperat.vercel.app

A compassion-first habit tracker whose fourth version wins by deleting the first three.

v1 invented the vocabulary; v2 added scoring and died on build errors; v3 pulled Garmin + Hevy biometrics. v4 is a subtraction — Vite + React + three dependencies, one screen, a checklist and a reactive rat, PWA-installable. Its load-bearing feature, “Today’s Brick,” records only the order one task got done relative to “the harder hour,” on the principle “measure the order of actions, not the purity of the person.”

The phone prototype that argued for an atlas → archetypes

Mar 21 – Jul 11 · 172 commits across two repos · v2 live

A cross-system atlas of archetypes, whose real insight was correspondence — and whose v1 was built entirely on a phone.

v1 was built entirely on the Claude Code mobile app (8 commits, 272 archetypes). Swiping flat records revealed the product was really correspondence (Emperor ↔ Aries ↔ Enneagram 8 ↔ ENTJ), and v2 (Next.js, 164 commits) industrialized that into a feature-vector data layer and resonance networks. July added a seventh system, Astrology — an interactive zodiac wheel with a bespoke SVG glyph vocabulary.

A two-commit repo holding thousands of lines → rush

Jul 12 – Jul 14 · 2 commits · extracted from sf

The moment an exploration earned its own address.

The standalone home of the driving game that grew inside sf: React-Three-Fiber + Rapier physics, drivable SF / Googleplex / office worlds on baked LiDAR terrain. Its two commits are the extraction and a rename — but they represent thousands of lines of prior thinking, relocated. The point wasn’t new code; it was deciding the game was its own thing.

The year’s opening move → minecraft-mods

Jan 6 – Feb 16 · 9 commits

An LLM villager as a working model of how he thinks about agents.

Two hand-built mods. LabsCraft (Fabric 1.21.4, 46 Java files + a ~1,400-LOC TypeScript agent server) makes you an APM intern whose quest-giver is driven by a live LLM agent server — a perceive→decide→reason→act loop with a Claude→Gemini→Ollama→hardcoded fallback chain, where the model returns structured JSON actions a typed executor replays. The LLM never touches game state directly: sandboxed behind a typed action schema, exactly how its builder reasons about agent products at work.

The shipped gift → kareemrpg

Godot workspace · shipped at ummerr.itch.io/kareemrpg

A friend's life as a walkable RPG, shipped as a birthday gift.

A Godot 4 top-down RPG walking through a friend’s life, real friends as NPCs. The godot/ workspace is a visible learning ladder — throwaway folders that each isolated one unknown (movement, then NPCs, then dialogue). Built in 2025; the proof that the ladder-of-throwaways method predates the year.

kareemrpg — a Godot RPG birthday gift
kareemrpg — a friend's life as a walkable RPG, shipped to itch.io.

The public self-audit → inference

Apr 12 – Apr 17 · 63 commits · shipped · inference.ummerr.com

A calculator that was really a public audit of his own pricing intuitions.

“The Fun Inference Calculator” — how gen-AI compute costs scale across text/image/audio/video, “with analogies instead of ML jargon.” 63 commits in 5 days — the year’s most intense burst (and the spike that makes April 12 the busiest single day). A third of the log is epistemic: “Recalibrate against real-world pricing,” “Correct Vertex pricing after research audit.” Building it forced every fuzzy belief into a checkable number.

The Fun Inference Calculator
inference.ummerr.com — the unit economics of gen-media, made legible.

The tool that outran the habit → bass

Apr 18 – Apr 20 · 10 commits · paused

The cleanest counter-example in the portfolio: a perfect practice tool, one logged practice.

A static site scaffolding a daily 15-minute bass loop, with a 33-tab library and a 90-day heatmap — and exactly one logged session (“Right thumb kept wanting to clamp — noted for next time.”). There was no next time. Researching about a practice is more fun than the practice; it died in the gap with nothing to carry it across. The most instructive artifact here.

The test bench → VidMetaPrompt

A parked bench for the day-job problem — iterating on prompt structures for generated video. No committed history; a live index of what's being chewed on.


Footnotes


The cadence — when the building actually happens

The work is bimodal by the clock: a hard spike at 5am (the single busiest hour) and a second rise across the 8–10pm evening, with the workday a trough and the small hours dead. By calendar it’s two months of detonation and a long, quieter tail.

The bimodal builder · commits by hour of day (Pacific)

9512a6a12p6p11p5am · pre-dawn9pm · evening2–4am · dark

Every day of 2026 · Daily commits, week by week

JanFebMarAprMayJunJulMWF2026-01-04: 02026-01-05: 02026-01-06: 12026-01-07: 02026-01-08: 02026-01-09: 42026-01-10: 02026-01-11: 02026-01-12: 02026-01-13: 02026-01-14: 02026-01-15: 02026-01-16: 02026-01-17: 02026-01-18: 02026-01-19: 02026-01-20: 02026-01-21: 02026-01-22: 02026-01-23: 02026-01-24: 02026-01-25: 02026-01-26: 02026-01-27: 02026-01-28: 02026-01-29: 02026-01-30: 02026-01-31: 02026-02-01: 02026-02-02: 02026-02-03: 02026-02-04: 12026-02-05: 02026-02-06: 02026-02-07: 02026-02-08: 02026-02-09: 02026-02-10: 12026-02-11: 02026-02-12: 02026-02-13: 02026-02-14: 02026-02-15: 32026-02-16: 12026-02-17: 02026-02-18: 02026-02-19: 02026-02-20: 02026-02-21: 02026-02-22: 02026-02-23: 02026-02-24: 02026-02-25: 02026-02-26: 02026-02-27: 02026-02-28: 22026-03-01: 22026-03-02: 12026-03-03: 22026-03-04: 02026-03-05: 02026-03-06: 02026-03-07: 62026-03-08: 112026-03-09: 272026-03-10: 112026-03-11: 02026-03-12: 152026-03-13: 192026-03-14: 182026-03-15: 22026-03-16: 02026-03-17: 32026-03-18: 22026-03-19: 02026-03-20: 32026-03-21: 62026-03-22: 02026-03-23: 52026-03-24: 22026-03-25: 142026-03-26: 552026-03-27: 322026-03-28: 222026-03-29: 122026-03-30: 92026-03-31: 02026-04-01: 02026-04-02: 02026-04-03: 32026-04-04: 52026-04-05: 02026-04-06: 02026-04-07: 02026-04-08: 02026-04-09: 22026-04-10: 02026-04-11: 132026-04-12: 842026-04-13: 172026-04-14: 352026-04-15: 52026-04-16: 212026-04-17: 162026-04-18: 352026-04-19: 42026-04-20: 292026-04-21: 02026-04-22: 242026-04-23: 22026-04-24: 82026-04-25: 52026-04-26: 62026-04-27: 22026-04-28: 02026-04-29: 02026-04-30: 02026-05-01: 02026-05-02: 02026-05-03: 12026-05-04: 02026-05-05: 02026-05-06: 02026-05-07: 12026-05-08: 22026-05-09: 22026-05-10: 02026-05-11: 02026-05-12: 02026-05-13: 02026-05-14: 02026-05-15: 02026-05-16: 02026-05-17: 02026-05-18: 02026-05-19: 02026-05-20: 02026-05-21: 02026-05-22: 02026-05-23: 02026-05-24: 02026-05-25: 02026-05-26: 42026-05-27: 482026-05-28: 122026-05-29: 72026-05-30: 72026-05-31: 02026-06-01: 12026-06-02: 22026-06-03: 212026-06-04: 02026-06-05: 02026-06-06: 42026-06-07: 42026-06-08: 02026-06-09: 02026-06-10: 02026-06-11: 52026-06-12: 42026-06-13: 42026-06-14: 02026-06-15: 02026-06-16: 02026-06-17: 82026-06-18: 02026-06-19: 02026-06-20: 02026-06-21: 02026-06-22: 32026-06-23: 22026-06-24: 52026-06-25: 02026-06-26: 02026-06-27: 02026-06-28: 02026-06-29: 02026-06-30: 02026-07-01: 02026-07-02: 02026-07-03: 02026-07-04: 02026-07-05: 02026-07-06: 02026-07-07: 02026-07-08: 02026-07-09: 02026-07-10: 32026-07-11: 92026-07-12: 42026-07-13: 12026-07-14: 52026-07-15: 12026-07-16: 42026-07-17: 12026-07-18: 02026-07-19: 22026-07-20: 52026-07-21: 8lessmore

Hover any day for its count and which repos moved. The dense block is the March–April detonation; the warm cell is the single busiest day (Apr 12, the inference launch).


The verdict

Eleven shipped things, $0 of infrastructure, one person who is not an engineer by training — in a year where two months did 75% of the work. The portfolio isn’t a list of products; it’s a thinking log with a URL for each thought.

The last audit named the constraint — continuity. This one shows the builder designing against it on purpose: writing the campfire log first, giving each idea its own home, and shrinking the ritual until it’s small enough to keep. When a build-to-think practice matures, the thinking shows up as removal. You don’t really understand a thing until you can say what to cut.

This report is the campfire, for the portfolio as a whole.


Regenerated with /audit from ~/CodeProj/, on Opus 4.8. Charts redrawn in the spirit of Edward Tufte. The master audit lives at ~/CodeProj/PROJECT_AUDIT.md.