A hand-drawn cat that lives on your desktop and shows your Claude Code usage in real time.
The cat sits transparent and frameless in the corner of your screen. The more of your budget you've burned, the more tired it looks β and when Claude Code is busy working, the cat starts typing along with it.
Meet November π β my own cat, and the model for every frame here.
ClaudeCat reads your own Claude Code usage and turns it into a mood. There's no separate login β it uses whatever account Claude Code is already signed into. Under the cat sits a slim 5-hour fuel gauge with a live reset countdown; hover the cat to peek at your weekly budget as a row of little hearts.
The cat's pose tracks whichever budget is tighter β load = max(5h%, weekly%):
The typing pose is an overlay: while a task is in progress ClaudeCat plays the working
animation (unless the cat is fully rate-limited β an asleep cat stays asleep). Detection is
exact β Claude Code UserPromptSubmit / Stop hooks (installed alongside the statusline
hook) flip a flag on when a turn starts and off when it ends, so the cat keeps typing through
long generations and multi-minute tool runs. Without those hooks it falls back to a coarser
transcript-activity heuristic.
| Action | What happens |
|---|---|
| Hover | Reveals the weekly hearts; they slip away when your pointer leaves. |
| Drag | Moves the cat anywhere β it stays put where you drop it. |
| Right-click | Opens the pet menu: animation speed, cat size (zoom), reset position, hide, quit. |
| Tray icon | Show/hide, install statusline hook, reset position, toggle click-through, start on login, quit. |
"Click-through" lets mouse clicks pass through the widget to the desktop behind it. All settings (size, animation speed) persist across restarts, and the app can start on login.
ClaudeCat ships for Windows. It needs the WebView2 runtime, which is preinstalled on Windows 11 and current Windows 10.
Downloads the portable app to %LOCALAPPDATA%\ClaudeCat and launches it. No admin rights, and
no SmartScreen prompt β files fetched by PowerShell aren't tagged "downloaded from the
internet", so Windows doesn't gate them:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 # Windows PowerShell 5.1
$exe = "$env:LOCALAPPDATA\ClaudeCat\claudecat.exe"
New-Item -Force -ItemType Directory (Split-Path $exe) | Out-Null
Invoke-WebRequest https://github.com/QiyuZ/ClaudeCat/releases/latest/download/claudecat.exe -OutFile $exe
Start-Process $exeDownload claudecat_x.y.z_x64-setup.exe (or the .msi) from
Releases and run it.
Seeing "Windows protected your PC"? That's SmartScreen flagging an unsigned app β expected for an open-source project without a (paid) code-signing certificate. It is not a sign the app is unsafe; the entire source is in this repo and you can build it yourself. Click More info β Run anyway. The PowerShell method above sidesteps this notice entirely.
Don't trust a prebuilt binary? Clone and build from source β see
Build from source. The standalone claudecat.exe lands in
src-tauri/target/release/.
After it starts:
- The cat appears top-right and wakes up on its own within a minute β as long as you've signed into Claude Code (see Where the numbers come from).
- (Optional) Click Connect ClaudeCat β or tray β Install statusline hook β to add the
statusline source and the exact typing detection. ClaudeCat won't overwrite a custom
statusLineyou already keep.
-
Start on login (recommended): right-click the tray icon β Start on login. The cat then appears automatically every time you sign in β no need to launch it by hand.
-
claudecatcommand: if you installed via PowerShell above, add this to your profile (notepad $PROFILE), then runclaudecatfrom any terminal:function claudecat { Start-Process "$env:LOCALAPPDATA\ClaudeCat\claudecat.exe" }
Right-click the cat for per-pet options; use the tray icon for the rest.
ClaudeCat never asks you to log in and never scrapes the web. It reads your usage from up to two local sources, preferring whichever has fresh, real data:
1. The statusline hook (preferred). Claude Code renders a statusline on each turn and
hands the script an official rate_limits payload β exact 5-hour and weekly percentages with
reset times. ClaudeCat installs a tiny hook (scripts/statusline.js) that caches this to
~/.claude/cc-pet-usage.json. This payload only appears for Pro/Max accounts and only
after the first API response in a session, so the hook carries forward the last-known
values between responses (up to 3 hours, after which stale data is dropped rather than shown).
2. The OAuth usage endpoint (fallback). Some Claude Code versions don't emit rate_limits
to the statusline at all. When the hook isn't delivering fresh data, ClaudeCat falls back to
the same endpoint Claude Code's own /usage command uses β see Privacy & security
for exactly what this reads and sends.
Either way, the numbers are exactly what Claude Code itself reports, for whatever account it's signed into.
You don't need to run
claudeto see your usage. As long as you've signed into Claude Code at least once (so its credentials exist), the OAuth fallback fetches your usage on its own the moment the widget launches. Running a Claude Code session only refreshes the statusline path and drives the cat's typing pose.
ClaudeCat is a local desktop widget. Here is everything it touches β all of it auditable in this repo:
- No separate login, no telemetry, no analytics. ClaudeCat has no backend of its own and phones no home.
- Files it reads:
~/.claude/cc-pet-usage.jsonβ the cache written by its own statusline hook.~/.claude/.credentials.jsonβ only for the OAuth fallback, to read the access token Claude Code already maintains. ClaudeCat never copies, logs, or transmits this token anywhere except the request below.- modification timestamps (not contents) of transcript files under
~/.claude/projectsβ this is how it knows a task is in progress and plays the typing animation.
- What it writes (opt-in, when you click Connect): a statusline hook and two activity
hooks (
UserPromptSubmit/Stop) in~/.claude/settings.json, plus their small scripts in~/.claude/cc-pet/. It backs up yoursettings.jsonfirst, refuses to replace a customstatusLine, and merges the activity hooks alongside any hooks you already have. - The one network call it makes: a
GETtohttps://api.anthropic.com/api/oauth/usage(Anthropic's official server) with your token, to read your own usage β the same call Claude Code makes internally. The response is normalized to percentages + reset times and cached to~/.claude/cc-pet-usage-oauth.json; no token is stored on disk. - Undocumented-endpoint caveat:
/api/oauth/usageis not a documented public API and could change without notice. If it does, ClaudeCat simply falls back to the statusline path. - Debugging is opt-in: the hook only writes a raw-payload dump (
~/.claude/cc-pet-debug.json) when you setCC_PET_DEBUG=1.
If you'd rather not use the OAuth fallback at all, you can run statusline-only β open an issue and it's a small change to gate it off.
Requires Node and the Rust MSVC toolchain (Rust + Visual Studio C++ Build Tools) for Tauri v2.
git clone https://github.com/QiyuZ/ClaudeCat.git
cd ClaudeCat
npm install
npm run tauri dev # dev run with hot reload (first compile takes a few minutes)
npm run tauri build # -> installer (bundle/) + standalone claudecat.exe in src-tauri/target/release/The standalone src-tauri/target/release/claudecat.exe is the same portable binary the
one-line installer downloads β you can run it directly once it's built.
If you keep your own statusline, chain ClaudeCat as a pass-through β the hook prints a short
π± 5h .. Β· wk .. left line β or point settings.json directly at the bundled script:
Claude Code βββΆ statusline hook βββΆ cc-pet-usage.json ββ
βββΆ Rust core (merge + poll 3s) βββΆ React UI
OAuth /usage βββββββββββββββββββΆ cc-pet-usage-oauth.json β β
transcript mtimes ββββββββββββββββββββββββββββββββββββββββββββββββ (task-active β typing)
| File | Responsibility |
|---|---|
src/pet/stateMachine.ts |
Turns usage % into a mood (load = max(5h, weekly)) and the reset-countdown helpers. |
src/characters/cat.tsx |
The only file that knows what the animal looks like: maps each mood to sprite frames (relaxed grooming loop, endless typing loop). Swap it to add a dog. |
src/components/QuotaGauge.tsx |
The 5-hour fuel gauge (paw + glossy pill) and reset countdown. |
src/components/WeeklyHearts.tsx |
The weekly budget as a hover-revealed heart health-bar. |
src/components/PetMenu.tsx |
The right-click menu (animation, size, actions). |
src/pet/useUsage.ts |
Subscribes to the Rust core; distinguishes "no data" from a real 0%. |
src/App.tsx |
Composition, onboarding, drag / hover / menu, and window sizing. |
scripts/statusline.js |
The Claude Code statusline hook that caches rate_limits. |
src-tauri/src/lib.rs |
The transparent always-on-top window, tray, autostart, the two data sources (cache merge + OAuth fallback), task-activity detection, and the hook installer. |
The art is sliced from four hand-drawn strips in src/pic/ into transparent per-frame PNGs:
pip install Pillow numpy scipy
python scripts/process_sprites.py # src/pic/*.png -> src/assets/cat/*.png
python scripts/make_state_gifs.py # src/assets/cat/*.png -> docs/*.gif (README art)Shipped
- Transparent sprite cat with real 5h / weekly data and robust reset countdowns.
- OAuth
/usagefallback for Claude Code versions that don't emitrate_limits. - Hover-reveal weekly hearts; exact typing pose from
UserPromptSubmit/Stophooks. - One-click hook install, start-on-login, CI-built releases.
More characters (next) β the character layer is deliberately isolated to a single file
(cat.tsx, a Mood β frames table), so adding a dog or other animal is mostly art plus a
character picker in the tray menu. The cheapest delight, and it proves the swap-the-character
design.
Bring-your-own-pet (the big one) β a simple pet-pack format: a folder/zip of per-mood PNG
frames plus a small pet.json mapping moods β frames and timings, dropped into a pets/
directory or imported from the menu. Ship a couple of official packs and let the community make
the rest β this turns ClaudeCat from a toy into a little platform. The existing
process_sprites.py (background knock-out + framing) becomes the authoring tool.
Richer data & signals β a small data-source badge (official / oauth) so you can see where a number comes from; a weekly usage sparkline or mini heat-map from cached snapshots; optional token & cost stats parsed from local JSONL (ccusage-style); a gentle notification when you cross 90% or when a window resets.
Reach β macOS / Linux builds (Tauri already supports them; needs platform window code and build targets) and code signing so the installer stops tripping SmartScreen.
The character is November π β my own cat β hand-drawn frame by frame for this project. Hope you like him.
Built with Tauri v2 + React + TypeScript. Data-layer inspiration from
ohugonnot/claude-code-statusline and
ccusage.
Released under the MIT License Β© 2026 QiyuZ.




