macOS menubar app showing Claude Code rate limits and session status
Project description
ClaudeWatch
Experimental / Alpha — This is a personal project I built for my own workflow. It works for me but is rough around the edges. macOS only. Contributions and feedback welcome, but expect breaking changes.
A macOS menubar app that shows your Claude Code rate limit usage and active sessions at a glance.
What it shows
Menubar (always visible):
- Rate limit usage with smart burn-rate color indicator
- Countdown to 5-hour window reset
- Claude system status alerts (from status.anthropic.com)
Dropdown (click to expand):
- 5-hour and 7-day rate limit details
- Active sessions grouped by project with T3 thread titles
- Per-session details (model, context, cost, tokens)
- Live Claude system status (clickable → status.anthropic.com)
Supported clients
- Claude Code CLI — full status via statusline hook
- Claude Code VSCode extension — session detection
- T3 Code — thread titles and session grouping via T3's local database
Other Claude clients (claude.ai web, Claude desktop app) are not tracked — they don't go through Claude Code.
Limitations
- macOS only — uses native menubar via PyObjC/rumps
- Claude Max subscription — rate limit data comes from the OAuth usage API, which requires a Claude Max account
- Experimental — built for personal use, lightly tested, expect bugs
- ~55MB RAM — Python + PyObjC baseline; a Swift rewrite would be much lighter
Install
pip
pip install claudewatch
uv
uv tool install claudewatch
From source
git clone https://github.com/hendrickmelo/claudewatch.git
cd claudewatch
uv sync
uv run claudewatch
Setup
After installing, set up the statusline hook so Claude Code sends status data:
# Install the hook (auto-detects existing statusline)
claudewatch install
If you already have a custom statusline, chain it:
claudewatch install --chain ~/.claude/statusline.sh
Run
claudewatch
The app appears in your macOS menubar.
How it works
ClaudeWatch pulls data from multiple sources:
- OAuth usage API — polled every minute for account-wide rate limits (5-hour and 7-day)
- Statusline hook — writes per-session status files on each Claude Code interaction (context %, cost, lines changed)
- Transcript files — reads
~/.claude/projects/JSONL files for session activity and token counts - T3 SQLite database — reads
~/.t3/userdata/state.sqlitefor thread titles and session mapping - Status page — polls status.anthropic.com for incident alerts
Rate limits are account-wide, so data from any session reflects your total usage across all Claude Code clients.
Uninstall
claudewatch uninstall # remove the statusline hook
pip uninstall claudewatch # or: uv tool uninstall claudewatch
Requirements
- macOS
- Python 3.10+
- Claude Code installed
jq(for the statusline hook)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file claudewatch-0.1.0.tar.gz.
File metadata
- Download URL: claudewatch-0.1.0.tar.gz
- Upload date:
- Size: 14.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87dcce7c8a15fdf89fc0fa737a90872de64bf05b2526449350561c13d56321b5
|
|
| MD5 |
d512710c0648b4bb49edccb377ef8ce8
|
|
| BLAKE2b-256 |
2c0ba7ca143e9e50cc9df3e31eeb11a93d03674f514e4601242a91037139aa08
|
Provenance
The following attestation bundles were made for claudewatch-0.1.0.tar.gz:
Publisher:
publish.yml on hendrickmelo/claudewatch
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
claudewatch-0.1.0.tar.gz -
Subject digest:
87dcce7c8a15fdf89fc0fa737a90872de64bf05b2526449350561c13d56321b5 - Sigstore transparency entry: 1321607033
- Sigstore integration time:
-
Permalink:
hendrickmelo/claudewatch@50c9cf5b5000b987d8c5a583676687c596643f98 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/hendrickmelo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@50c9cf5b5000b987d8c5a583676687c596643f98 -
Trigger Event:
release
-
Statement type:
File details
Details for the file claudewatch-0.1.0-py3-none-any.whl.
File metadata
- Download URL: claudewatch-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a737e7ad388f9e0652ebd0e923038e23e8586cf537982aed9175cd2594bc7ab8
|
|
| MD5 |
287fb83bae89a85909c420797eea6907
|
|
| BLAKE2b-256 |
5a395cd3435d732b86704a7f792eb77d5f30f85dd048da37eaa8c8a77ef2c66b
|
Provenance
The following attestation bundles were made for claudewatch-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on hendrickmelo/claudewatch
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
claudewatch-0.1.0-py3-none-any.whl -
Subject digest:
a737e7ad388f9e0652ebd0e923038e23e8586cf537982aed9175cd2594bc7ab8 - Sigstore transparency entry: 1321607128
- Sigstore integration time:
-
Permalink:
hendrickmelo/claudewatch@50c9cf5b5000b987d8c5a583676687c596643f98 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/hendrickmelo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@50c9cf5b5000b987d8c5a583676687c596643f98 -
Trigger Event:
release
-
Statement type: