Skip to content

Out of Claude Time? Write It Down. Pick It Up Later. ​

How a TODO backlog and model-aware task sizing keep a side project moving inside Claude's usage windows


The Problem ​

I've been building PiPiece, a Raspberry Pi camera controller with a Vue.js touchscreen UI, using Claude Code as my day-to-day AI pair. Claude Code gives me a 5-hour session window and a weekly cap, and building software doesn't respect either. I'd get deep into a refactor, hit the limit, and come back hours later having lost the thread. Re-explaining scope from scratch at the start of every session was burning the exact budget I was trying to protect.

The Insight ​

The fix wasn't to work faster. It was to stop keeping the backlog in my head, or buried in one long-running conversation, and write it down as something a cold session could pick up without me in the room. Each unit of work needed three properties: small enough to fit inside a session, self-contained enough that a fresh Claude instance could read it and start, and tagged with how hard it actually was, so I wasn't spending Opus-tier time and tokens on a one-line fix.

What I Built ​

It starts with an audit, not a plan. I run a prompt, .claude/prompts/fable-project-audit.md, against Fable, a fast Claude model, with one rule: read-only. It walks the server, the Vue UI, the Python scripts, and the Pi's operational setup, and its only allowed output is new files under TODO/, one finding per file. It's told to read the README and CLAUDE.md first, specifically so it doesn't recommend reinventing something I already built on purpose.

Every finding follows a fixed template: Problem, Affected files, Proposed fix, Effort, Testing, plus a model field. Default is sonnet. It gets bumped to opus for exactly three things: nontrivial coordinate or numerical math, large multi-module orchestration, or real architectural ambiguity with no existing pattern to mirror. Everything else, however tedious, stays on the cheaper model.

Picking a finding back up is its own skill, /fix-todo. It resolves the ID, confirms scope against the current code (the file already answers most questions, so this is a check, not a discovery interview), verifies the test suite is green before touching anything, implements the fix test-first, reverifies, and retires the finding into TODO/done/. If the model field says opus and the active session isn't already Opus-tier, it hands the implementation step to a foreground Opus subagent with the full spec pasted in, then reads the diff itself before trusting the summary back. One finding, one focused commit, every time.

The backlog itself used to be gitignored, a personal scratch pad that never left my laptop. I just moved it into source control so the open findings and the done/ archive travel with the repo instead.

Two From the Backlog ​

An easy one, server-012, sonnet, Effort S:

toLocalDateKey() builds a new Intl.DateTimeFormat on every call, inside a loop over 15,551 sightings-log entries. It's 50% of self-time in the CPU profile, and the reason a live report endpoint ran over two minutes and rebooted the 2GB Pi.

js
const LOCAL_DATE_FORMAT = new Intl.DateTimeFormat('en-CA', {
  year: 'numeric', month: '2-digit', day: '2-digit',
});
function toLocalDateKey(dateInput) {
  const date = dateInput instanceof Date ? dateInput : new Date(dateInput);
  return LOCAL_DATE_FORMAT.format(date);
}

One formatter, built once, moved to module scope. Under an hour, no design decisions to make, no reason to spend a bigger model on it.

A hard one, scripts-005, opus, Effort M:

compute_transform(reference_wcs, frame_wcs, shape) has to derive the affine or projective transform that maps a new astrophotography subframe onto the reference frame's pixel grid, from two WCS solutions, accurately enough that stacking dozens of frames doesn't smear the stars.

That one is a genuine least-squares fit over control points, with an affine-versus-homography judgment call built in. Getting the transform quietly wrong is worse than getting it slowly right, which is exactly what the model: opus field exists to catch.

The Takeaway ​

Usage limits turned out to be a forcing function, not just a constraint. Writing a finding precise enough that a cold session can execute it without me around is the same discipline as writing a good ticket for a teammate. Tagging it with the model it actually needs is the same discipline as not routing a junior task to your most expensive engineer. Neither one was optional once the clock was real.


The audit prompt, the backlog template, and the /fix-todo skill are all in the PiPiece repo, linked below.

— John Webb Cole

Built with Claude Code (Sonnet and Opus) and audited with Fable, reviewed by me.

GitLab · Docs · jwc.dev