Project Audit
Generated 2026-04-18, viewed 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.”
A confession, up top: the author is a PM who ships more side projects in a quarter than many engineering teams ship in a year, refuses to write design docs, and then writes a document called a “Project Audit” about the projects he refused to design. The audit is, in this sense, the revenge of the spec — arriving two months late, in third person, wearing a blazer.
Audit Meta — the audit, audited
Every audit wants to measure itself. This one obliges. The cadence has settled: every couple of days the repos change shape, and the site grows another essay-length commit.
| Metric | Value |
|---|---|
| Repositories crawled | 17 (across ~/CodeProj, ~/ummerr.github.io, /tmp/archetypes-audit) — one new since last round (bass) |
| Shipped to production | 9 |
| Total tracked commits | 845+ |
| Infrastructure cost | $0 (Vercel Hobby, GitHub Pages, Supabase Free, itch.io) |
| Prior audits in the lineage | 3 — Apr 12, Apr 16, Apr 18 (this one) |
| Engineers employed on this portfolio | 1 (not by training) |
The year at a glance
Zoom out from the two-day delta to the twelve-month backdrop. Most of it is empty. The live cells cluster in the right-hand third — the “2026 run” — with the tallest cells at the very rightmost edge.
Daily commits — rolling 52 weeks · Apr 2025 → Apr 2026
Eleven months of quiet, then the 2026 run — the GitHub-style heatmap renders the shape of the portfolio on a single row. The brightest cell is Apr 12 (84 commits across all repos — the day inference shipped and archetypes v2 ramped). The next-brightest is Mar 26 (55). The rightmost column is today (Apr 18, 23 commits) — the day `bass` was born and Archetypes v2's iconographic endgame landed. Strict grayscale: density is the signal, nothing else.
What changed since April 16
The top-level list grew by one. A brand-new project (bass) appeared today, four commits old. Archetypes v2 went from “pre-launch sketch” to “mobile-responsive, iconographically-unified, OG-share-carded, quiz-flow-choreographed app.” Bookmarks corrected itself about Veo 4 (it doesn’t exist yet; the previous copy implied otherwise). A UX experiment on the Dopamine Rat got reverted six hours after shipping.
Two-day delta — Apr 16 → Apr 18
Three projects grew and one was born. Bookmarks tidied its editorial layer. Inference kept polishing. Archetypes v2 added 32 commits in 48 hours — mostly mobile responsiveness and iconographic unification. The dashed line is new: bass, four commits old by bedtime.
The retraction this round. The bookmarks “State of Prompting” essay quietly referenced Veo 4 as if it had shipped. It has not. The copy was revised at 00:05 local on Apr 18 — a retraction logged in git as Remove fabricated Veo 4 references from State of Prompting. Worth noting as a pattern: two audits ago got Archetypes v1 wrong, and now State of Prompting got Veo 4 wrong. Both corrections happened in public. The portfolio is not above shipping then apologizing; it simply ships and apologizes.
The day’s hours, plotted as a clock
Midnight is now decisively dominant (88 commits). 11pm moved into second place (71). The noon writing-hour dropped to #4 but is still there. Translation: the late-night wing has extended. The days contain the meetings; the nights contain the repos — and the nights got longer this month.
Commits by hour of day — 24-hour radial
Six warm spokes — midnight, 8am, 11am, noon, 8–9pm, 11pm — anchor the bimodal pattern. Late-night build sprints meet a noon writing block. The 4–6am wedge is the only stretch the keyboard rests.
The Flagship: bookmarks → prompts.ummerr.com
Status: Shipped • Commits: 244 (+5) • Sprint: 49 days, Feb 28 – Apr 18, 2026 Stack: Next.js 16 · React 19 · TypeScript · Tailwind v4 · Supabase Postgres · Claude Haiku (triage) + Sonnet 4.5 (depth)
Still the flagship. Still the bookmarks-to-research-instrument arc. This round was mostly editorial: the live “State of Prompting 2026” page got its April refresh, the Veo 4 references (which implied a model that has not shipped) were removed, the Arena Leaderboards section was cut for noise, and an image→video pipeline insight was added to the insights dashboard.
Everything from the prior audit is still load-bearing. The two-tier classifier (Haiku triage, Sonnet 4.5 depth), the Chrome extension (Manifest V3), the Image-to-Prompt reverse tool, the quality audit with eight heuristics, the dataset datacard, the methodology page — all live, all shipped, all free-tier. 9 test files. 216+ assertions.
Deltas since April 16:
- Apr 18 00:05 —
Remove fabricated Veo 4 references from State of Prompting. A retraction logged in the commit graph. - Apr 17 00:14 —
Refresh State of Prompting for April 2026. The editorial stayed live while being revised. - Apr 17 00:10 —
Remove Arena Leaderboards from State of Prompting. Benchmarks that didn’t age well got pulled. The charts that remain are the ones that still mean something. - Apr 16 23:22 —
Add image → video pipeline insight. The pipeline motif is now first-class across the insights dashboard.
Build to Think verdict. A mature project corrects itself in public. The Veo 4 retraction is a small fact but a real one — the essay layer of bookmarks is now load-bearing enough to need a changelog. That’s a signal. The Chrome extension became a dataset became an editorial became an editorial with corrections.
The Long-Running One: ummerr.github.io
Status: Shipped (continuously, since 2014) • Commits: 359 (+7) • Lifespan: 11.5 years Stack: Jekyll • GitHub Pages • Bulma + custom CSS + Tailwind v4 • Geist + Instrument Serif
The heartbeat of the portfolio. Every other project ships through or alongside this site. 11 published essays, 10 portfolio case studies (Amex, Tradesy, Breazy, Kollider, Level, TheKind, Battle Bakery), a film photography gallery, a split-pane markdown editor with localStorage auto-save, and a 57MB Godot WebAssembly game embedded because at some point it became easier to embed it than not.
Tuesday is still the giant — 81 commits, 43% of all weekday activity. Noon peak. The daytime counterweight: the site is the writing project, everything else is the building project.
This round: seven new commits. Three of them are the previous audit’s publication (Regenerate project audit 2026-04-16, Rewrite project audit with literary voice and 6 new SVG vizzes, Add 60-day commit timeline to project audit). The site is literally publishing its own telemetry. The audit you are reading will itself become another three commits in the next audit.
The Trilogy: The Dopamine Rat (v1 → v2 → v3)
A habit tracker starring an emotional pixel rat. Three versions trace a philosophy pivot from gamification to harm reduction. This round: a usability overhaul — “one-screen home, bottom sheets, reactive rat” — was shipped and then reverted six hours later. What survived: fix: prevent iOS Safari auto-zoom on input focus. A clean example of the portfolio’s willingness to ship, observe, and undo.
The trilogy — a philosophy by subtraction
v1 named the problem. v2 tried every tool that sounded relevant. v3 asked: what actually helps someone recover? — and cut everything that didn't. The pivot from grind for points to recovery over purity could not have been written down in February. It had to be built in February so it could be discarded in March.
The v3 mechanics that survived the cut: a 5-mood × 6-emotional-state × trajectory engine; blended scoring (60% today, 40% three-day rolling average); urge surfing with a 20-minute timer and tiered partial credit for “mostly making it”; parent mode with softened sleep penalties; harm-reduction physics (edible scored above spliff; alcohol escalates at drink 3+); offline-first with an async Supabase sync queue. 163 activities across 16 categories — down from ~700.
The Experiment, Doubled: Archetypes (v1 + v2)
Two audits ago this was a “single-commit experiment.” Last audit it was a “two-repo lineage.” Today it’s — in v2 — a mature site in its editorial mid-game. Breadth on v1, depth on v2, and then, this week, polish on v2.
Archetypes — breadth → depth
Left: ten archetypal systems spread laterally, three interfaces beneath them, all drawn with vanilla JS on a phone. Right: six systems chosen, each given vertical depth — KWML as the pedagogical spine, plus an Atlas layer for cross-system mappings, a Mirror for shadow prompts, a Profile for cross-system tensions, and a Today surface for daily archetype. The decision to go deep was only thinkable after the wide version had shipped.
v2’s grammar. A DESIGN.md enforces a shared visual language across all six systems: KWML uses 3D platonic solids with bloom; Jungian organic forms; Enneagram instruments; MBTI animated cognitive glyphs; Tarot halos; Hero’s Journey silhouettes. Four motion primitives (breath, spin, pulse, shimmer) defined once. Five semantic totem scales (xs–hero, 22–200+ px) with animation budgets. Cards layer frame → field → token. This is the part where the project becomes serious.
v2’s editorial scaffolding. Debates taxonomy (confidence/impact/status fields). Exemplars network with source attributions — /atlas/exemplars was just expanded by 25 figures with a tiered index. A weak-hermeneutic methodology page with pipeline infographics. Citations linked from debates back to bibliography entries — a real graph, not a citation theater.
What +32 commits looks like. The mobile-iconography endgame: MBTI hero 3D totem, bespoke 2.5D Tarot arcana glyphs, animated Hero’s Journey silhouettes, a “one glyph at every scale” rule for MBTI. Tarot card back-face hit-testing fixed. /mirror rebuilt from placeholder to full cross-system energy sorter — seeded question pool, mini-constellation reveal, poetic two-word handles for each reading, shareable constellation OGs. /today Daily Draw shipped with cycle-complete selection, shadow strip, across-traditions reflection. OG share cards overhauled (two-column archetype layout, matching typography, wired into per-page opengraph-image routes). Mobile responsiveness pass across NavBar, homepage hero, Atlas, constellation, Hero’s Journey wheel, MBTI totem, Tarot arc, detail hero rows. And one quiet act of engineering restraint: MBTI grid totems swapped from 3D to 2D glyphs to stay under the WebGL context cap. A budget visible in the code.
Build to Think verdict. v1 asked can I map every system on a phone? v2 first asked what if I pick six and treat them as editorial? and has now asked a third question: what does this look like in someone’s hand? Each question was only legible after the prior version shipped. The mobile pass is the build-to-think signal most people miss — it looks like polish, but it’s actually the moment the project decides what its primary surface is. v2 chose both (desktop Three.js + phone glyphs) and made them the same grammar.
The Mods: minecraft-mods
One directory, two projects, two entirely different personalities.
MTL Memories (Forge 1.20.1, Java 17). A nostalgia mod for Montreal and McGill 2004–2008. 14 custom items (poutine, Montreal bagel, smoked meat, Gerts token, Arcade Fire vinyl). 5 quest storylines. Status: exploratory. The quest framework runs, but it’s a foundation without the visual layer — which is roughly the state of memory itself.
LabsCraft (Fabric 1.21.4, Java 21 + a Node.js agent server). An LLM-powered mod simulating an APM internship at “Google Labs” on an AI video product called “Flow.” The centerpiece is Josh Woodward, a PM NPC whose dialogue is generated by Claude Sonnet (Gemini fallback). This is exactly as on-the-nose as it sounds, which is the point.
The mod (46 Java files, 5,391 LOC) sends world state every tick via HTTP to an agent server (13 TS files, 1,394 LOC) running Express on port 3001. Six trigger types (chat, interaction, idle-near-objective, quest-complete, danger, periodic proximity). SQLite stores conversation history, top-5 extracted memories per player, and quest state. Memory extraction every five conversations; summarization at threshold. Josh’s character brief: deadpan PM humor, references to syncs/sprints/P0s/OKRs, max three sentences per turn. Status: shipped — built jar at build/libs/labscraft-1.0.0.jar, 148 unit tests, three Claude worktrees active during the build.
Build to Think verdict. Two modes sharing a disk and nothing else. MTL Memories is pure nostalgia-as-enumeration: the act of listing what to include is the project. LabsCraft is the technically serious frontier — an agentic NPC architecture (perceive → decide → reason → execute) with per-player memory and multi-provider LLM fallback, emerging from iteration.
The Gift: kareemrpg
Shipped on itch.io. A birthday gift for a friend named Kareem. Five learning projects in 16 days, each one existing solely so the next one could exist:
- learningproj (May 24) — first GDScript, 25 lines, “what is a node?”
- kareemrpg-beta (May 24) — mobile RPG skeleton
- dialogictut (May 25) — Dialogic addon + NPC basics
- daytworpg (May 25) — 9 scripts, dialogue, audio, NPC/follower systems
- dialogictutotrial (Jun 9) — final game: 66 scripts, 68 dialogic files, 29 scenes
Exported as WebAssembly, published on itch.io, embedded at ummerr.com/kareemrpg. The fastest build-to-learn cycle in the portfolio: from zero Godot experience to a published game in 16 days. The learning ladder is the project history — if you opened the directory cold you could reconstruct the syllabus from the timestamps alone.
The Explainer: inference → inference.ummerr.com
Status: Shipped • Commits: 63 (+3) • Sprint: 6 days Stack: React 19 · TypeScript · Vite · Tailwind v4 · Lucide React Live: inference.ummerr.com
“The Fun Inference Calculator.” An interactive web explainer for generative AI compute costs across modalities.
Deltas since April 16. Add lifecycle diagrams and inline SVG glyphs to Under the Hood — the 12-section bridge page now has inline visualization. Commit to one voice: tighten copy, scrub emoji, chapter Under the Hood — an editorial pass. Restore animated blob hero background — the still hero got reverted; the animated blob was the right call. Everything else from the prior audit is still live: Frontier Frictions, Lifecycle, Techniques Ladder, Forward Bets, Failure Modes, Unit Swap, Hidden Costs, Cost Drop Tracker, Video Price Watch, Silicon, Batch vs Realtime, Napkin Math Playground.
Build to Think verdict. The third audit doesn’t change the verdict — it reinforces it. A one-day explainer became a six-day site; the “Cost Drop Tracker” could only be imagined after the calculator existed. Specs don’t generate second-order surfaces. Only running code generates second-order surfaces.
The Ritual: bass
Status: Live structure (unshipped domain) • Commits: 4 • Sprint: 1 day, Apr 18, 2026 Stack: Next.js (App Router) · TypeScript · Tailwind v4 · pnpm · flat markdown content
Born today. A personal site that scaffolds a daily 15 minutes of bass practice. Not a content library — a daily loop: warm up → skill of the week → fretboard minute → play something fun → log it. Git is the streak tracker. All content is flat markdown in the repo.
Five commits, in order: initial commit (09:56) · scaffold next.js app router + tailwind (10:24) · build v1 site spine: lessons, fretboard, drills, practice log (20:44 — a ten-hour gap, presumably a day job) · docs: rewrite README as live status doc (20:49) · style: warm palette pass — cream bg, amber accents, colored step pips (21:09).
What shipped in v1. / — the daily loop: five numbered steps + streak + 90-day heatmap + explore nav. /lessons — ten beginner lessons with status badges (not-started / learning / practicing / comfortable / retired). /lessons/[slug] — lesson detail. /fretboard — fretboard explorer, beginner-default (neutral dots, note-name labels, four presets: All notes / C major / A minor / E minor pentatonic); “Show advanced” reveals 12 roots, 5 scales, degree/interval labels. /drills/fretboard-notes — silent note-recognition drill, two modes (Name→Fret, Fret→Name), 12 prompts per round, single-string SVG. /log — copy-template flow for today’s practice entry, filename hint, recent-entries list. URL presets supported: /fretboard?preset=c-major.
The pedagogy. A PLAN.md file — 15KB, six build phases, references to BassBuzz / Scott’s Bass Lessons / StudyBass / TalkingBass / Justin Guitar / Berklee / Fogg & Clear habit-formation science — enumerates the thesis before any code:
“The site is not a content library. It is the scaffold around Ummerr’s daily 15 minutes with the bass in hand.”
Six principles are written down explicitly: beginner-first defaults, one next action, silent-first (no audio in v1), git is the database, progress must be visible (heatmap, lesson-status transitions, streaks), pedagogy over features. The site’s home page is the five-step loop. Not a dashboard of features — the loop itself.
The AGENTS.md reveal. A single file in the repo, eight lines:
“This is NOT the Next.js you know. This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in
node_modules/next/dist/docs/before writing any code. Heed deprecation notices.”
That one file — a one-sentence correction to the agent’s priors — is a complete Build to Think artifact: the author noticed the tool’s training data was stale, wrote down the correction in eight lines, and moved on. No meeting. No ticket.
Build to Think verdict. The clearest Build to Think instance in the entire portfolio, because the product is literally the loop that Build to Think advocates: a daily 15 minutes with an instrument, logged in markdown, streak-tracked by git. The site isn’t for visitors. It’s a personal scaffold that happens to be public because it’s easier to ship Next.js on Vercel than to build a bespoke tracker. Five small things, ≈15 minutes, skip any of them. Showing up is the win.
The pattern is familiar now: the author builds a tool to practice a skill, and the tool teaches him the skill’s shape. bass joins bookmarks, inference, and the Dopamine Rat as a tool whose use is indistinguishable from its design.
The Test Bench: VidMetaPrompt
A framework for transforming high-level creative video ideas into structured 7-component prompts for Veo-3 generation. Modular: Analysis Engine, Knowledge Base, Character Builder, Generation Engine, Quality Validator. 15+ implementation modules; UI scaffolds exist and are empty. Where bookmarks discovered its shape through deployment, this one discovers its shape through tests. Same principle, different probe.
Footnotes: smaller projects
cursorMint — Personal finance tracker. Loads bank CSVs, standardizes transactions, stores in SQLite, plots spending. ~350 lines. No git. Functional utility — it exists because the alternative was a SaaS that would have cost more than the groceries it tracked.
film — Astro 6 photography portfolio scaffold. Single commit. Template stage.
StreakUp — Cloned from rezahedi/StreakUp as an architectural reference. This is not my code. A production-quality habit tracker studied for patterns (CRUD flow, streak lifecycle, timezone handling, Prisma schema design).
testExport — Godot web export test. Binary artifact. Not a development project; it’s evidence.
dopRatTest — An empty directory. The most honest project in the portfolio. It knows it doesn’t exist.
The Build-to-Think Scorecard
Every project started without a spec. The interesting column is the right one — what only became visible because building forced it into the open.
Spec → Reality — the gap building made visible
Every project started with code, not a spec. Constraints taught. Writing followed building. The arrows are the gap building made visible.
Closing
The thing you notice after three audits in a week is that the audit is no longer a document — it is a cadence. Every couple of days the repos change shape, and the site grows another essay-length commit, and the portfolio becomes slightly more legible to its author.
Today’s delta was one new project (bass), one sprawling mobile-iconography pass (archetypes v2), one small editorial retraction (bookmarks / Veo 4), and one brave six-hour experiment that was reverted the same morning (gravityDopeRat / one-screen home). None of these were on anyone’s roadmap two days ago. All of them are in git now.
No design doc could have described this document, because this document didn’t exist until it started regenerating itself.
This audit was generated by 8 parallel Claude Code agents burning ~340k tokens across 3 filesystem locations and 17 repositories. Zero permission prompts, by design. To regenerate, run /audit from ~/CodeProj/.