All Work

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.

January–February 2025macOSShipped

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.

Information Design

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.

Craft

"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.

Systems Thinking

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.

Product Strategy

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.

Craft

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

1
Observation

Developers leaving the terminal to check usage in a browser — a glanceability gap.

2
Metaphor

Apple Activity Rings are culturally pre-loaded. No legend required.

3
Build

Single-provider MVP, then multi-provider expansion without rebuilding views.

4
Ship

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

Ships production software, not prototypesThinks in systems (multi-provider architecture)Writes design rationale, not just pushes pixelsAI-native workflow (built with Claude Code)