Tokens are the new currency and it's handy to monitor them, right from your desktop!
- Glanceable β Large percentage, always visible on your desktop
- Auto-refresh β Polls every 60 seconds
- Zero config β Reads your existing OpenClaw session, no API keys to enter
- Lightweight β Native Swift, minimal footprint
git clone https://github.com/LizMyers/token-ticker.git
cd token-ticker
swift build -c release
cp .build/release/TokenTicker /Applications/Launch with Spotlight: Cmd+Space β TokenTicker
IMPORTANT β select the executable, not the folder
Requires: macOS 13+ and OpenClaw
TokenTicker OpenClaw (local files)
ββββββββββββ ββββββββββββββββββββββββ
β Widget βββreadβββββββ ~/.openclaw/agents/ β
β (60s) βββsessionsβββ sessions.json β
ββββββββββββ ββββββββββββββββββββββββ
Reads session data directly from ~/.openclaw/agents/ β no subprocess needed.
Want Token Ticker waiting for you every morning? Add a LaunchAgent:
# Create the plist (update the path to match your setup)
cat > ~/Library/LaunchAgents/com.liz.token-ticker.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.liz.token-ticker</string>
<key>ProgramArguments</key>
<array>
<string>/YOUR/PATH/TO/token-ticker/.build/release/TokenTicker</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
</dict>
</plist>
EOF
# Enable it
launchctl load ~/Library/LaunchAgents/com.liz.token-ticker.plistNote: The EnvironmentVariables section ensures Token Ticker can find openclaw when launching at login. Without it, the widget will appear empty.
To disable auto-launch later:
launchctl unload ~/Library/LaunchAgents/com.liz.token-ticker.plistTo re-enable, run the load command again. Token Ticker remembers its window position between restarts.
Want Token Ticker waiting for you every morning? Add a LaunchAgent:
# Create the plist (update the path to match your setup)
cat > ~/Library/LaunchAgents/com.liz.token-ticker.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.liz.token-ticker</string>
<key>ProgramArguments</key>
<array>
<string>/YOUR/PATH/TO/token-ticker/.build/release/TokenTicker</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
</dict>
</plist>
EOF
# Enable it
launchctl load ~/Library/LaunchAgents/com.liz.token-ticker.plistNote: The EnvironmentVariables section ensures Token Ticker can find openclaw when launching at login. Without it, the widget will appear empty.
To disable auto-launch later:
launchctl unload ~/Library/LaunchAgents/com.liz.token-ticker.plistTo re-enable, run the load command again. Token Ticker remembers its window position between restarts.
All visual tweaks live in ContentView.swift:
Font size & weight:
.font(.system(size: 42, weight: .light)) // percentage display
.font(.system(size: 13, weight: .medium)) // labelsSpacing:
.padding(.top, 23)
.padding(.bottom, 26)
.padding(.leading, 20)Widget size:
.frame(width: 160, height: 160)Refresh interval (in TokenDataProvider.swift):
Timer.scheduledTimer(withTimeInterval: 60, repeats: true) // seconds- Apple-style frosted glass effect. Widget now uses NSVisualEffectView with blur material to match macOS Weather widget aesthetic. Features forced dark appearance with desktop wallpaper blur in both light and dark modes.
- Light mode fix: updated background styling. Widget now uses a semi-transparent black background with white text in both light and dark modes, matching macOS Weather widget aesthetic. Removed frosted glass effect for cleaner appearance.
- Fix: model display now tracks the actual model in use. Reads
modelOverridefrom OpenClaw session data instead of shelling out toopenclaw sessions, so switching models (e.g. Haiku to Gemma) updates correctly. - Session sorting by recency. When multiple sessions exist, picks the most recently active one.
- No more subprocess. Reads
~/.openclaw/agents/directly β faster and more reliable.
- Dynamic model name β The widget now reads the active model from
openclaw sessionsinstead of displaying a hardcoded name. Supports Claude, GPT, and other model naming conventions.
- Initial release β floating desktop widget with token usage percentage, trend lobster, and auto-refresh.
Built by Liz Myers & Claude, for the OpenClaw community.
MIT
