H1 2026: Build to Think
The half-year report. Generated 2026-07-10 — on Anthropic’s Fable model — through the bent lens of Build to Think.
“No design doc could have described this project, because the project didn’t exist until I started building it.”
Six months. One person. No team, no budget, no design docs — and 758 commits. This isn’t a portfolio review so much as a seismograph reading of a single mind that thinks by building, working in the cracks around a day job at Google Labs: the weekend afternoons, the pre-dawn sprint that peaks at 5am, the evening session around nine. Below is the whole of H1 2026 — every project in the workshop, the telemetry that reveals its rhythm, and the one lesson the rhythm teaches.
The lesson isn’t any single project. It’s the shape of the work, and it’s a lesson the builder named himself: the hard part of building to think isn’t the ideas or the energy — it’s picking up where you left off. Every project that matured this half-year left itself a note for the next session. Every project that died, died in the gap between sessions. Hold that thought; the data proves it.
sf — what began as a Tufte-style atlas of an SF move became a full arcade driving game on real LiDAR elevation data. The map was the thinking tool; the game was the conclusion. Live at sf.ummerr.com.Audit Meta — the half-year, in four numbers
The whole half-year in four numbers: 758 commits from one person, 78% of them in a two-month detonation (March–April), nine things shipped to production, at a hard $0 of infrastructure. Everything below is downstream of these four facts.
| Metric | Value |
|---|---|
| Mainline commits, H1 2026 (Jan 1 – Jul 10) | 758 (no-merges, author date; StreakUp excluded) |
| Repositories crawled | ~13 active (across ~/CodeProj, ~/ummerr.github.io, the archetypes clone) |
| Shipped to production | 9 (all on free tiers) |
| Busiest single day | Apr 12 · 84 commits — the inference launch |
| Busiest weekdays | Wed / Sat / Sun · 129 each (a three-way tie) |
| Peak hour | 5am · 95 commits (the pre-dawn burst; evenings ~9pm are second) |
| Infrastructure cost | $0 (Vercel Hobby, Supabase Free, GitHub Pages, itch.io, OpenStreetMap, USGS 3DEP) |
| Engineers employed on this portfolio | 1 (not by training) |
| Model that generated this report | Fable |
The shape of the year
The monthly histogram tells a story a design doc never could. January and February are near-silent — a Minecraft mod and the first stirrings of a habit tracker. Then March and April detonate: 595 of the year’s 758 commits — 78% — land in a single two-month window. May and June taper, not into rest but into finishing: a driving game, a golf sim, a shipped card game.
| Month | Commits | What was burning |
|---|---|---|
| Jan | 5 | LabsCraft — an LLM agent wakes up inside Minecraft |
| Feb | 8 | The Dopamine Rat begins its first rebuild |
| Mar | 279 | archetypes (mobile → web), bookmarks goes public, the site reboots |
| Apr | 316 | inference (63 commits in 5 days), the sf atlas, bass, archetypes v2 |
| May | 85 | sf becomes a driving game; golf; the Dopamine Rat grows a nervous system |
| Jun | 63 | flowtcg ships as a real game, then grows its own tooling |
Cumulative commits — H1 2026 · Jan → Jul
The half-year as a running total, scoped to the window where the building actually happened. A gentle Jan–Feb ramp, then the line goes near-vertical through March and April, then eases into the finishing months. The labelled dots are the two steepest single days; the line draws itself left-to-right as it scrolls into view, and the accent endpoint is today.
Daily commits — H1 2026, week by week
Every cell is a day across H1 2026; darker is quieter, the warm cell is the single busiest day (Apr 12, the inference launch). Hover any cell for the date, the count, and which repos moved. The dense block is the March–April detonation; the lighter tail is the finishing work of May and June.
The day’s hours, plotted as a clock
Zoom from the calendar to the clock and the work style resolves into two peaks — but not the ones you’d guess. The single busiest hour is 5am (95 commits); the whole 5–9am pre-dawn window is 35% of the half-year. The second rise is the 8–10pm evening, cresting around nine. In between, the workday is a valley — and the small hours he’d probably say he works, 2 to 4am, are essentially dead. (A nice irony for a portfolio whose flagship habit-tracker is built on the gap between what you think your rhythm is and what the sensors record.) This is not a steady cadence; it’s a person stealing compressed bursts from the edges of a full-time job, and thinking out loud in commits while they do it.
Commits by hour of day — the bimodal builder
Two peaks, one valley: the pre-dawn burst that spikes at 5am and the 8–10pm evening session, with the workday a trough and the 2–4am small hours near-empty. By weekday, Wednesday, Saturday, and Sunday tie for the lead (129 each) — the workshop runs on stolen time, mostly at the edges of the day.
Commits per project · H1 2026
Where the half-year's energy actually went — counting only commits inside the H1 window, so the decade-old site is measured by its 2026 work, not its lifetime. The flagship (bookmarks) towers; then archetypes-v2, sf, and inference, trailing into the one-weekend experiments. (The mobile-built archetypes-v1 keeps its own 8-commit bar.)
The one real insight: continuity is the constraint
Here is the pattern that only becomes visible when you audit all thirteen projects at once — and it’s the lesson the builder named himself: the ability to make the next session easier via the previous one, when you keep forgetting where you left off.
The audit turns that worry into a finding. The projects that matured all built external memory for the next session:
- golf keeps a
DECISIONS.md— a running log of “forks taken, with the reason.” When the swing mechanic needed a rewrite in June, that log is why the next session knew what had already been tried. - The Dopamine Rat v3 opens its migration doc with a section literally titled “Where v2 will fight v3” — pre-writing the frictions before writing the code, handing the next session the argument instead of a blank slate.
- bookmarks runs
scripts/check-facts.tsas aprebuildgate: the project refuses to deploy if it can’t verify its own claims. It remembers its own standards so the builder doesn’t have to. - This very site is the ultimate case — the project-audit lineage is a note-to-self about the entire portfolio, regenerated seven times since March. (You’re reading the H1 edition of it.)
And the projects that stalled all died in the gap between sessions:
- bass was paused after exactly three days. It shipped a complete pedagogy — a 33-tab library, a fretboard explorer, a 90-day practice heatmap — and logged exactly one real practice session (“Right thumb kept wanting to clamp — noted for next time.” There was no next time.) The tool built to enforce the habit outran the habit.
- The Dopamine Rat v2 was abandoned mid-repair, its final commit reading “fix: resolve 27+ TypeScript build errors.” The session ended in the middle of a mess — and who wants to walk back into 27 build errors cold? The next session never started.
That’s the whole thesis. When you work in bursts — a Saturday afternoon, a midnight hour — the enemy isn’t the blank page. It’s the cold start. The projects that won H1 are the ones that left the campfire lit: a decision log, a migration doc, a fact-checker, an audit. “I forget where I left off” isn’t a discipline problem to grind through with more willpower — it’s a design problem, and the fix is to build the thing that remembers for you.
This report is that thing, for the portfolio as a whole.
The portfolio, project by project
This half’s throughline — flowtcg ships, then tools itself · sf: atlas → driving game · the Dopamine Rat, rebuilt three times · bookmarks becomes a work instrument
The March–April detonation — archetypes: phone → atlas · inference: 63 commits in 5 days · the site reboots as the workshop’s logbook
Where the year opened — LabsCraft’s LLM villager · golf: a decision log with a physics engine
Bench & footnotes — bass: the tool that outran the habit · kareemrpg: the shipped gift · VidMetaPrompt & the rest · footnotes · the H1 scorecard
The Sequel That Tooled Itself: Flow Slays IO → flowtcg
Jun 2 – Jun 24 · 19 commits · shipped & playable
A playable Slay-the-Spire deckbuilder themed on Google Flow, and the clearest “finished thing generates its own next work” story of the year. HP is Morale, energy is Focus, the enemies are launch hazards — Scope Creep, GPU Quota Shortage, Hallucination (“Cites a paper that does not exist”) — and the boss is The Launch Review Committee. Four playable PMs, each a real deck: Amar the Prompt Engineer, Olivia the Research Scientist, Thomas the Eng Director, Anika the Agent Wrangler.


The engineering is quietly disciplined: Next.js 15 / React 19, Zustand, Zod-validated JSON content, synthesized Web Audio SFX (zero audio assets, ±4% pitch variance), pixel-art portraits baked to PNG in pure Node. The engine never branches on a specific card — everything flows through one applyEffect(effect, ctx). That data-driven purity set up the punchline: once shipping a card was a single JSON entry, the bottleneck became authoring at scale, so the final commits built lib/cardCsv.ts — a CSV importer with a tiny effects DSL (damage 7; vulnerable 1, damage 4 x2) made “forgiving of real-world spreadsheets.” No spec scopes a content importer up front. Only living inside your own finished product surfaces the need.
The Atlas That Became a Game: sf → sf.ummerr.com
Apr 19 – Jun 17 · 118 commits · shipped
The half-year’s biggest arc. It began as a Tufte-style personal atlas of an SF move — a MapLibre map with hillshade, contours, and hand-curated layers (“11 Infatuation burritos,” top-5 Cole Valley cafes, microclimates) — and mutated into “the Rush,” a full SF-Rush-2049-style arcade driving game on real LiDAR terrain (React Three Fiber + Rapier physics). Three drivable worlds now share one engine: San Francisco, the Googleplex, and “The Office” (a tiny car on a giant startup-office floor, complete with half-pipe). A single two-day sprint (May 26–27, ~50 commits) scaffolded the entire game.


The map was the thinking tool; the game was the conclusion. After a week spent reasoning about where to eat near 332 Frederick, the same heightfield got flipped from “read the terrain” to “drive the terrain,” and the commits narrate learning physics by feel: “Stop bikes back-flipping on throttle,” “flip engine-force sign so W drives nose-first.” Twelve build-time fetch:* scripts pull OSM/USGS data so there’s no runtime API to pay for; the Apr 20 “Swap Mapbox for MapLibre + OpenFreeMap” commit drove hosting to ~$0.
The Decision Log With a Physics Engine: golf
May 7 – Jun 17 · 6 commits · local prototype
A LiDAR-terrain golf journal — public elevation data for courses actually played, rendered as interactive 3D, plus a playable Three.js sim on the same DEM. A pnpm monorepo (Next.js journal + Vite/Three sim) where journal and sim share one elevation.json per course — “one source of truth.” Each of the six commits is phase-sized; Phase 1 (real Grint data) is still blocked on a manual .har drop.
Its DECISIONS.md is the “leave the campfire lit” mechanic in file form — a log of forks-taken-with-reasons. The best entry: a June swing rework, discovered by playing, found that the drag-tempo meter “froze on the downswing — players read it as ‘the meter just stops’” — so the hidden three-click swing was promoted to default. The prototype was the usability test.
The Flagship: bookmarks → prompts.ummerr.com
Feb 28 – Jun 3 · 276 commits · shipped (password-gated)
The most-committed project of the year, and a three-act transformation. A Chrome extension intercepts Twitter/X bookmarks; a two-tier Claude pipeline (Haiku triage → Sonnet extraction) classifies them into a curated gen-media prompt dataset; the site publishes analysis on top. Next.js 16, Tailwind v4, Supabase — deliberately $0 (the 10-second Vercel-Hobby function timeout is a named constraint in CLAUDE.md, which is why triage runs on Haiku).
Act one: a personal tool (Feb). Act two: a public research artifact — over the Mar 26–27 weekend, 89 commits in 48 hours turned it into a “prompt observatory” with a State of Prompting 2026 report, a benchmark-style datacard, and a 216-test suite. Act three: a work instrument — the May–June Omni sentiment report and the /flow-brief exec brief, whose commits read like prose revisions (“tighten to punchy, exec-ready phrasing”): git as drafting. Intellectual honesty is wired into CI — check-facts.ts gates every deploy, and commits like “Replace fake ELO scores with real arena data” show a builder auditing his own claims automatically.
The Workshop’s Logbook: ummerr.github.io
49 commits in H1 · shipped since 2014
The personal Jekyll site rebooted this half from a dormant portfolio into the publishing surface for the whole practice. A Mar 24–30 burst built the essays system and migrated eight Medium essays local; April turned the audit into a living artifact with hand-rolled SVG vizzes; May made the commit charts interactive (the cumulative curve and heatmap you scrolled past).
The site is recursive: the audit workflow regenerates an essay about the workshop, published by the workshop. The Jun 24 commit pair — “Add ‘The workshop improves itself’ section” + “Regenerate project audit” — is the thesis committing itself. This H1 report is the eighth entry in that lineage.
The Trilogy: The Dopamine Rat (v1 → v2 → v3)
Feb 15 – May 8 · 37 commits across three repos · v3 live
A compassion-first habit tracker with a Tamagotchi-style rat that mirrors your dopamine state — rebuilt three times. v1 (codexDopeRat, 0 commits) was a 1,217-line sketch that nonetheless invented the whole vocabulary, including a compassion.ts of after-a-slip prompts (“Noticing is the skill”). v2 (dopeRatGravity) added gamification — streaks, XP, a correlational “Lab” — and was abandoned mid-repair on “resolve 27+ TypeScript build errors.” v3 (gravityDopeRat, 35 commits) matured into a biometric nervous system: a React PWA + Supabase + Vercel cron pulling Garmin and Hevy data, blended with a single daily subjective sleep tap.
The insight is that each rebuild changed the app’s epistemology, not its features. v1 asked “what should I say to myself”; v2 asked “how do I score myself”; v3 stopped trusting self-report entirely — “Mismatch between subjective sleep and wake biometrics is the headline insight.” The rebuilds were the reasoning; git only recorded the conclusions.
The Experiment, Doubled: Archetypes (v1 + v2)
Mar 21 – Apr 23 · 168 commits across two repos · v2 live
A cross-system atlas of personality archetypes (Jungian, Enneagram, Tarot, MBTI, KWML) that maps correspondences between traditions. v1 was built entirely on the Claude Code mobile app — 8 commits over 4 days, 272 archetypes across 15 systems, in vanilla HTML/JS. Four days later the serious v2 rebuild began (160 commits, Next.js) as a narrow “KWML Explorer” and metastasized into a full atlas: a /mirror energy sorter, a /today daily draw, 3D MBTI totems, an Apr 22–23 Quiz + Reading flow with URL-encoded answers.
The phone prototype wasn’t a draft of v2 — it was the argument for v2. Swiping through 272 flat records on a phone revealed the real product was correspondence (Emperor ↔ Aries ↔ Enneagram 8 ↔ ENTJ ↔ Ruler), and v2’s entire feature-vectors data layer and resonance networks are that single insight industrialized.
The Year’s Opening Move: minecraft-mods
Jan 6 – Feb 16 · 9 commits
Two hand-built mods in one repo. MTL Memories (Forge 1.20.1) is a nostalgia mod about Montreal/McGill — poutine, bagels, Habs jerseys. LabsCraft (Fabric 1.21.4, 46 Java files + a ~1,400-LOC TypeScript agent server) is the headline: you’re an APM intern at Google Labs, and your quest-giver — Josh Woodward, a deadpan PM whose system prompt includes “You have a ‘hard stop in 30’ that never actually happens” — is driven by a live LLM agent server.
AgentBridge.java POSTs a world-state snapshot to localhost:3001 every second; a Node server runs a perceive → decide → reason → act loop where deterministic triggers.ts gate whether to think, SQLite holds conversation memory (auto-summarized after 20 turns), and a provider fallback chain — Claude Sonnet 4.5 → Gemini 2.5 Flash → local Ollama → hardcoded dialogue — degrades gracefully. The LLM must return structured JSON actions (SAY, WALK_TO, GIVE_ITEM, ADVANCE_QUEST) that a typed executor plays back. It’s a working model of how its builder thinks about agents professionally — the LLM never touches game state directly, it’s sandboxed behind a typed action schema — shipped as a toy, and satirized in the villager’s prompt. The Feb 15, 10:45pm Sunday commit is titled “go claude go”: one commit, ~4,300 lines, the entire agent server.
The Shipped Gift: kareemrpg
Godot workspace · shipped at ummerr.itch.io/kareemrpg
A playable birthday gift — a Godot 4 top-down RPG walking through a friend’s life, with real friends as NPCs, framed as a comic afterlife retrospective. The godot/ workspace is a visible learning ladder: five folders (learningproj → daytworpg → dialogictut → the shipped game) where each throwaway isolated exactly one unknown — movement, then NPCs, then dialogue. The empty kareemrpg-beta shows the ambition existed before the skill; the ladder closed the gap. Scenes map Kareem’s life geographically — montreal, seattle, burning_man, brooklyn_roof_pool. Built in 2025, it’s not H1 work, but it’s the shipped proof that the ladder-of-throwaways method predates the year.
The Public Self-Audit: inference → inference.ummerr.com
Apr 12 – Apr 17 · 63 commits · shipped
“The Fun Inference Calculator” — an interactive explainer of how gen-AI compute costs scale across text, image, audio, and video, “with accessible analogies instead of ML jargon.” React + Vite, zero backend, ~4,900 lines. 63 commits in 5 days; 38 in the first 48 hours — the single most intense burst of the half-year (and the spike that makes April 12 the busiest day on the heatmap).
Roughly a third of the commit log is epistemic, not constructive — “Recalibrate cost numbers against real-world pricing,” “dehedge Sora,” “Correct Vertex pricing after research audit.” Building the calculator forced every fuzzy pricing belief to become a checkable number. The site is a public audit of the builder’s own mental model of the economics he talks about at work — complete with an exec on-ramp and a print stylesheet, because the real audience was his own understanding.
The Ritual That Outran Itself: bass
Apr 18 – Apr 20 · 10 commits · paused
The year’s cleanest counter-example, and the proof of the whole thesis. A static site scaffolding a daily 15-minute bass-practice loop — “not a content library, a daily loop” — where git commits are meant to be the streak tracker. Its PLAN.md is genuinely excellent product thinking: “structure + feedback + consistency > content volume.” And then, over three days, it shipped a 33-tab library, a fretboard explorer, and a 90-day practice heatmap — and logged exactly one practice session: “Right thumb kept wanting to clamp — noted for next time.”
There was no next time. The last two commits scaled the content library to 30 tabs while zero further practice was logged — the tool built to enforce the habit outran the habit, because researching and building about a practice is more fun than the practice. It died in the gap between sessions with nothing to carry it across. That’s not a failure to hide; it’s the single most instructive artifact in the portfolio.
The Test Bench: VidMetaPrompt
A video-metaprompt experiment — a bench for iterating on prompt structures for generated video, with no committed history. Scratch space, not a shipped thing, but a live index of what the builder is chewing on: the day-job problem (prompting for generative video) rehearsed on personal time.
Footnotes: smaller projects
- film (1 commit) — an Astro photo-portfolio template, scaffolded and parked.
- cursorMint — a finance utility (no git).
- testExport / dopRatTest — a Godot export artifact and an empty scaffold dir; harmless debris of the process.
- StreakUp — a cloned reference (2023–24), not the author’s code; studied for patterns and excluded from every count in this report.
The H1 Build-to-Think Scorecard
Continuity → Outcome — did the project leave the campfire lit?
The whole thesis on one card. The projects that matured are the ones that wrote themselves a memory — a decision log, a migration doc, a fact-checker. The ones that stalled ended a session in the middle of a mess and never restarted. Continuity, not effort, is what separates the two halves.
Nine shipped things, $0 of infrastructure, one person who is not an engineer by training — in a half-year where two months did 78% of the work. The portfolio isn’t a list of products; it’s a thinking log with a URL for each thought. A Minecraft villager was how he reasoned about agent architecture. A cost calculator was how he audited his own understanding of the economics he PMs. A deckbuilder was how he metabolized shipping under a launch committee.
Closing
The lesson the whole year teaches — the one worth carrying into H2 — is quieter than any single project. In a practice built on bursts, the work between sessions is the work. The projects that matured left themselves a note; the projects that died went cold in the gap. “I forget where I left off” isn’t a personal failing to fix with more discipline — it’s a design problem to solve with a DECISIONS.md, a migration doc, a fact-checker, an audit.
The builders who win aren’t the ones with more energy. They’re the ones who leave the campfire lit.
This report is that campfire, for the portfolio as a whole.
Regenerated with /audit from ~/CodeProj/, on the Fable model. The master audit lives at ~/CodeProj/PROJECT_AUDIT.md.