Menu bar rings in both states (at-pace vs. over-pace) side-by-side on a dark macOS desktop. Show the popover open with multi-provider tabs visible.
Tokenomics
I built a macOS app that 50+ developers use daily — in one month, with AI.
My Role
Solo designer-developer. Product vision, UX design, SwiftUI implementation, distribution pipeline, documentation.
macOS
Platform
Solo
Design + Dev
1 month
Timeline
5 providers
Shipped
“AI developers need to know if they have headroom for a long coding session. That data exists — it's just in the wrong place.”
Key Design Decisions
The moments that shaped the product.
Annotated diagram: a ring at 50% without dot vs. same ring with dot at the 30% mark. Annotation arrows: 'raw data' vs. 'actionable signal'. Two panels side-by-side.
Invented the pace dot to turn raw data into actionable signal
A ring at 50% is raw data. The pace dot shows where fill should be if consumption were perfectly even — converting utilization into a decision: am I burning ahead of pace, or do I have room? This is an original information design element, not a UI component.
Two screenshots of the reset label: 'Resets Friday' (the bug, shown on a Friday) vs. 'Resets today' (the fix, same day). Side-by-side comparison.
"Resets today" — two lines of code, one temporal context fix
On Friday, showing 'Resets Friday' is technically correct and practically useless. This edge case ships wrong if you're not paying attention to how people actually read. The fix is two lines of Swift. The insight is thinking from the user's temporal context, not the system's.
About view before/after: Left shows Claude-specific language ('7-day window'). Right shows behavioral language ('broader context'). Both in context of the actual popover view.
Behavioral language that holds across all providers
When the outer ring means '7-day window' for Claude, 'model context window' for Codex, and 'daily request cap' for Gemini, provider-specific labels break. The solution: 'nearest limit' (inner) and 'broader context' (outer). Content architecture, not copywriting — the 320pt popover is the wrong surface for a lookup table.
The UX doc alongside a code snippet from the shipped implementation. Doc as prediction, code as proof. Split-screen treatment.
A UX doc that predicted the shipped architecture
Before building v2.2, I wrote a multi-provider UX doc specifying the 'Weather App Model,' worst-of-N menu bar logic, sublabelOverride escape hatch, and tabbed popover. The shipped code matched the doc. Design documentation that leads engineering, not follows it.
Terminal output of distribute.sh running, with the 10 stages visible. The craft of shipping in a command line.
10-stage release pipeline — shipping is the craft
The gap between 'working prototype' and 'product strangers can install' is where most side projects die. Code signing, notarization, Homebrew Cask, Sparkle auto-update, GitHub Releases — this is the work that doesn't show up in a Dribbble shot but is the difference between a project and a product.
Process
Developers leaving the terminal to check usage in a browser — a glanceability gap.
Apple Activity Rings are culturally pre-loaded. No legend required.
Single-provider MVP, then multi-provider expansion without rebuilding views.
Homebrew Cask, code signing, notarization, Sparkle auto-update.
What Shipped
5
AI providers
10
Release stages
v2.5
Current version
0
View layer rewrites
Shipped via Homebrew Cask and GitHub Releases. Signed, notarized, auto-updating. Open source with an active roadmap including watchOS companion and team dashboards.
- Shipped via Homebrew Cask and GitHub Releases (signed, notarized, auto-updating)
- 5 AI providers supported with zero view layer changes
- 10-stage automated release pipeline
- Open source (source-available license)
What I Learned
The gap between 'working prototype' and 'product strangers can install' is where most side projects die. Code signing, notarization, auto-updates, error states — this is the craft that doesn't show up in a Dribbble shot.
Signals for Recruiters
More Work
All projects →