How many minutes of AI do you have left?
An always-on macOS desktop floating ball that shows your AI token runway — at a glance, across all your providers, before you hit empty.
Why TokenRunway
“Runway” is the startup word for how long you can keep burning before you're out. TokenRunway puts that number on your desktop.
👀 Glanceable
See your remaining quota without switching away from your work or opening a browser.
🔀 Unified providers
Volcano (5h / 7d / 30d windows), DeepSeek (balance) and Kimi Code (weekly quota) rendered homogeneously; click for a full dashboard.
🔮 Prediction over reporting
Computes ETA from burn rate — “at the current pace, your 5h quota has 12 minutes left.” Know before it happens.
🌱 Low-overhead resident
Native SwiftUI + AppKit, tiny resident memory and CPU; never steals focus.
Supported providers
Adapter-first architecture: every provider maps onto one unified quota model.
| Provider | What is shown | Status |
|---|---|---|
| Volcano Engine (火山引擎) | 5h / 7d / 30d rolling windows | ✅ real-verified |
| DeepSeek | Pure account balance (¥) | ✅ real-verified |
| Kimi Code | Weekly quota + rolling rate windows | ✅ real-verified |
| MiMo · Zhipu | Quota / balance | 🚧 added, verify |
| OpenAI · Anthropic | Quota / balance | 🔜 planned |
Install
Build from source (Homebrew cask pending notarization).
# build
git clone https://github.com/kungf/token-runway.git
cd token-runway
swift build
# credentials — outside the repo, in ~/.trwy/config.json (chmod 600) # { "providers": { "deepseek": { "token": "sk-..." }, "volcano": { "ak": "...", "sk": "..." } } }
# verify with the CLI
.build/debug/trwyctl all
# package & run
./Scripts/make-app.sh
open build/TokenRunway.app
No credentials? Run the real UI with synthetic data: TRWY_MOCK=mixed open build/TokenRunway.app (scenarios: healthy · warning · critical · exhausted · mixed · balance-critical).
Interactions
| Gesture | Action |
|---|---|
| hover | floating summary (provider + per-window percentages) |
| click | open dashboard (all providers at a glance) |
| scroll | cycle core liquid between 5h ↔ 7d (outer monthly ring unchanged) |
| drag | move the ball; snaps to nearest screen edge on release |
| right-click | menu (refresh / pause / settings / hide) |