Under Construction — this site is actively being built. Check back soon.
All Work
The popover open on a dark macOS desktop. The popover shows the multi-provider tabbed interface — Claude tab active, two rings visible (inner at ~60% fill, outer at ~30% fill), pace dot visible on the inner ring slightly behind the fill arc. Provider tab icons visible at the top. Composition reads left-to-right: menu bar icon (small) -> popover (large, center of composition).
CraftBuildStrategy·macOS·1 monthShipped

Tokenomics

Developers don't leave their terminal to check token usage anymore. One month. One designer. Shipped.

50+

Developers using daily

1 month

Concept to shipped

5

AI providers

v2.5

Current version

AI developers need to know if they have headroom for a long coding session. That data exists — it's just in the wrong place. The only signal was an error in the terminal, mid-session, after you'd already hit the wall.

My role

Solo designer. Product vision, UX design, information design, AI-assisted SwiftUI implementation, distribution pipeline, documentation.

Where judgment was required

The moments that shaped the product.

A split composition. Left side: a page of the UX doc — the 'Weather App Model' section visible with the key architectural decision highlighted. Right side: the shipped popover matching the doc's description. A connecting arrow or visual alignment between doc spec and shipped UI. Caption zone: 'Spec written before implementation. Shipped code matched it.'

Product Strategy

A UX spec that predicted the shipped architecture

Before building multi-provider support, I wrote a full UX document specifying the 'Weather App Model,' worst-of-N menu bar logic, a sublabelOverride escape hatch, and a tabbed popover. The shipped code matched the spec. Design documentation that leads engineering — not follows it — is rare. This case study proves it can happen on a solo project.

Two rings rendered at exactly the same fill percentage (50%) side by side. Left ring: no pace dot, just the arc. Right ring: pace dot visible at a different angular position (behind the fill arc). Below each: small label 'raw data' vs. 'actionable signal.' The rings should be rendered at approximately 3x the actual menu bar size so the dot reads clearly.

Information Design

The pace dot: from data to decision in one visual element

A ring at 50% fill is raw data — it tells you where you are. The pace dot marks where fill should be right now if consumption were perfectly even. That transforms utilization into a decision: am I burning ahead of pace, or do I have headroom? This is an original information design element, not a UI component. A developer would have shown you the number. This shows you what the number means.

Two screenshots of the reset label in the popover. Left: 'Resets Friday' with a subtle visual marker indicating it IS Friday. Right: 'Resets today.' Same day, two versions of the same line.

Craft

Two lines of Swift. One edge case that ships wrong if you're not paying attention.

On Friday, showing 'Resets Friday' is technically correct and practically useless. This edge case only becomes visible when you think from the user's temporal context, not the system's. The fix is two lines of Swift. The insight — that a day label has to be relative to now, not literal — is what separates a shipped product from a deployed prototype.

The popover About view, or a small label diagram. Left column: provider-specific language ('7-day window,' 'model context window,' 'daily request cap'). Right column: behavioral language ('nearest limit,' 'broader context'). An arrow connecting each left-side label to its right-side equivalent.

Systems Thinking

When the label breaks, describe the behavior instead

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' and 'broader context' — labels that describe what the ring does, not what the provider calls it. That's content architecture. The 320pt popover is the wrong surface for a lookup table.

Terminal output of the release pipeline running, with key stages visible (signing, notarization, Cask update). The craft of shipping visualized as a designed system, not a script.

Product Strategy

Distribution is a design problem

The gap between 'working prototype' and 'product strangers can install' is where most side projects die. The 10-stage automated release pipeline — code signing, notarization, Homebrew Cask, Sparkle auto-update, GitHub Releases — exists to eliminate the installation friction that stops adoption. Deciding to solve the distribution problem is a product strategy decision, not an engineering one.

Process

1
Observation

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

2
Design Insight

Apple Activity Rings are culturally pre-loaded. No legend required. The pace dot adds the missing temporal dimension.

3
Build

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

4
Ship

Homebrew Cask, code signing, notarization, Sparkle auto-update. Product strangers can install.

What Shipped

50+

Daily users

5

AI providers

v2.5

Current version

0

View layer rewrites

Shipped via Homebrew Cask and GitHub Releases — code signed, notarized, auto-updating. 50+ developers use it daily. Five AI providers supported without rewriting the view layer. Currently at v2.5 with an active roadmap. Open source.

  • 50+ developers use it daily — adopted without a single marketing effort
  • Five AI providers supported: zero changes to the view layer for each addition
  • 10-stage automated release pipeline from source to installed app
  • Shipped in one month, solo, from observation to product strangers download

What I Learned

The difference between data and signal is the most undervalued problem in information design. A ring at 50% is a number with a shape. The pace dot is a judgment: you are ahead of pace, or you have room. Those are not the same thing, and the distance between them is where most dashboards fail. The second lesson came from multi-provider expansion — when provider-specific labels stopped working across five different API conventions, the solution was behavioral language that describes what the ring does rather than what the provider calls it. That's content architecture, not copywriting. It only becomes visible as a design problem when your system scales past the first use case.

What this demonstrates

End-to-end ownership: design, implement, distribute, maintainArchitecture-aware design: the view layer was written once and never rewrittenDesign documentation that leads engineering — the UX spec predicted the shipped codeAI as an implementation partner: one month, solo, in real users' hands