I run a handful of side projects — this blog's API, a Kubernetes practice lab, a couple of others — and for a while each one had its own scattered todo list: a README section here, a half-remembered "I should really fix that" buried in an old chat session there. It never stuck.
One board, tagged by project
The fix was almost embarrassingly simple: one GitHub Projects (v2) board, not tied to any single repository, with a Tag field (blog, lab, ...) to separate items by project, and a Status field (Todo / In Progress / Done) for the usual flow. Items are draft issues rather than real linked GitHub issues — so a todo doesn't need a home repo before it's allowed to exist.
Letting Claude write to it directly
The part I actually like: I gave Claude a fine-grained GitHub token, scoped to nothing but read/write on Projects, stored the same way as every other credential these projects need — a per-project secrets file, never committed, loaded into the shell automatically. Projects v2 has no REST API, so everything goes through GitHub's GraphQL API directly. Claude reads the board's fields and existing items first, then adds new ones as draft issues with the right Status/Tag set, matching the convention already there.
So when a working session on any of these projects surfaces something worth doing later — a follow-up fix, a rough edge found mid-conversation — it goes straight onto the board instead of getting lost. Earlier today, while building this blog's write API, five loose ends got added the same way: a missing field, a permission that needed extending, a logging gap. Nothing dramatic, just the normal cleanup list every project accumulates — now it actually stays somewhere.