rickleberry builds

What I Built This Week

2026-07-05

Forty-one projects touched, 91 commits, 48 sessions, and 163 steering prompts — this was a sprawling week. No single spike project dominated; instead it felt like a maintenance sweep that kept getting interrupted by genuinely new ideas.

48
Claude sessions
91
git commits
239
files created
163
Eric steers
41
projects
What got built this week

NBA pick-trade explainer (data_explorer)

It started with a simple frustration: NBA trade season has gotten incomprehensible. Picks now chain through swap rights, protections, and conditional top-X clauses, and no single graphic on the internet shows you who actually ends up with what. The prompt was rough — "I'm prototyping a function that accepts a trade + conditions and converts it into a clean graphic/flow chart" — but the direction was clear enough.

The first render was a mess, text overlapping text, which was called out directly. What eventually landed was a 30-slot draft board grid where each cell colours to the team that currently holds the pick and shows the conditions stacked beneath it. The ownership layer (ownership.py) and the conditional expansion logic (expand.py) ended up as separate modules with their own test files, which was the right call — the expansion rules are gnarly enough that you want them isolated. It's shipped and live. Whether it's useful to anyone besides me is a different question.

Paper trader gets a risk committee

The paper trader was scaffolded the week before; this week it got a spine. The original agent was "hungry" — it would take positions without much guardrailing. That lasted about two days before it felt irresponsible. The fix was a full risk layer: a gate that every order passes through, a policy file that defines the mandate ("stable-growth" or "hungry-but-governed"), and a CLI called the committee that lets you override the policy at runtime.

The interesting design choice was treating the risk policy as a first-class file rather than hardcoded logic. You can swap the mandate by editing risk_policy.py and restarting — no code changes. It also exposed a subtle bug: the daily session was crashing on read-only tool results and a cp1252 log encoding error, both of which only showed up once the scheduler was running unattended overnight. Those are now fixed. Reports post to trader.ericbackman.com each morning.

dive-channel: the stub that was silently lying

A monitoring alert (Uptime Kuma, set up mid-week) flagged that data.ericbackman.com had no DNS record. That triggered a broader look at the dive-channel upload pipeline, which surfaced something worse: is_already_uploaded() in check_uploaded.py was a bare stub returning None. Every candidate video looked like it had never been uploaded. The dedup check was a no-op. This had been in production.

The fix — implementing the actual predicate against the YouTube upload manifest — was straightforward once the problem was named. The stub got replaced with a real lookup against shorts.json and longform.json. Also this week: the long-form ambient pipeline (hour-long reef footage for sleep/study viewers) got its first scheduled upload, a 4K reef compilation queued for 23:30 UTC. The wildlife interaction veto policy also got written down after a review session flagged an octopus clip where an instructor was prodding the animal — deleted and reuploaded without it.

eric-travels: 5,782 photos, one session

This one came out of an iCloud archaeology session. The goal was a personal photo map — pins for every location, filterable by year, clustered by trip. The initial commit is large because the data is large: 5,782 photos, 161 locations, pulled from EXIF metadata. A classifier pass ran against the photos to tag them, and a separate transcode.py handles resizing for web.

The tricky part was the Neuchâtel exchange year, which EXIF had as one blob of timestamps across a dozen cities. That got manually split into 13 locations by itinerary date. The site is up at erictravels.ericbackman.com behind email auth — it's not on the public portfolio, intentionally. One pin per location, sidebar with month/year trip labels, album view on click. Clean enough for now.

Commits per day

The commit volume was remarkably flat across the week — no single blowout day. July 4th had the most commits but mostly from PLAYBOOK.md generation sweeping across a dozen repos simultaneously, which inflated the count. The real work happened July 1–2, when paper-trader's risk layer and the NBA pick board were both in flight at the same time.

Where the commits went

The spread across 41 projects is both a feature and a problem. Nothing was neglected catastrophically this week, but the Gemini API key that leaked into a weekly-log review file back in W22 still hasn't been confirmed revoked at the Google console — it was redacted in a commit but that's not the same thing. That's on the list for Monday morning before anything else.

rickleberry


Auto-assembled by rickleberry from one week of Claude Code sessions, git history, and file activity.
Built with AI, curated by a human.