You know the moment. The agent is 40 seconds into refactoring the auth middleware and your brain goes: "oh, and after that fix the retry logic, update the docs, and rename that terrible function."
You can't send that message. Well, you can, but the agent cheerfully derails into all three tasks at once and now nothing works, including the thing that was working two minutes ago.
So you hold it in your head. Then you open a second session in another worktree, which spawns its own follow-ups, and eventually your head is the worst issue tracker you own. My system was a notes.txt, and telling myself I'd definitely remember.
So I wrote a plugin: opencode-todo. A personal backlog that lives in the sidebar.
- /todo-add, /todo-run, /todo-remove, /todo-edit, /todo-list, /todo-clear, all dialog-driven, they show up in / autocomplete
- a "My Backlog" panel that updates live while you work
- session-scoped, so each worktree keeps its own list
- state is one human-readable JSON file (.opencode/queue.json), nothing else
The part I actually care about: the agent never sees any of it. Nothing auto-executes, nothing auto-drains, no model turns spent on bookkeeping. /todo-run just drops the task into your composer and marks it done. Pressing Enter is still your job.
Free, MIT, one command:
opencode plugin opencode-todo --global
Repo: https://github.com/ainformatico/opencode-todo
Curious how others handle this. Half of me expects someone to say "just use a text file", and fair, but now the text file has a sidebar.