Waiting on the agent
When an AI coding agent is working, I usually end up staring at the terminal or drifting to something that has nothing to do with engineering. The wait is short enough that I never start anything, and frequent enough to add up.
I wanted that dead time to be spent on something I would otherwise postpone: practicing algorithm problems.
A nudge, not a blocker
The app lives in the menu bar and stays out of the way. It only speaks up after an agent has been busy for a configurable delay, and then it suggests one problem. I can solve it, mark it done, or skip it with a sarcastic excuse. Nothing is locked and nothing is tracked remotely.
Detecting work without hooks into the agents
Instead of integrating with each tool, the app polls the process table through
ps and looks for Claude Code, Codex, and Cursor by executable name. An agent
counts as working only after sustained CPU activity across consecutive samples,
and goes idle again after a few quiet ones, so a brief spike does not trigger
anything.
That detection and the problem picker live in a separate core module with unit tests; the SwiftUI popover is a thin layer over it. Updates use Sparkle.
Where it stands
It is an alpha. Detection is based on CPU heuristics and process names, so it can miss an agent or fire at the wrong time, and the problem list is a small built-in set rather than a live LeetCode feed. It requires macOS 26 or later.
Built with
Swift / SwiftUI / Sparkle
.png)