Terminus Cancrorum Est — monitor Claude Code processes, token usage, and costs
Project description
TCE - Terminus Cancrorum Est
"The End of the Crab"
A macOS menu bar app + web dashboard + CLI for monitoring Claude Code processes, token usage, and costs.
The Problem
Running multiple concurrent Claude Code sessions across many projects leaves you blind:
- No process visibility — How many Claude sessions are running? Which are stuck?
- Zombie and stale processes — Forgotten sessions silently consume hundreds of MBs
- Resource hogs — Claude processes can spike to 75%+ of your system's CPU or memory
- Token cost blindness — Opus 4.5 costs $90/M output tokens. Costs compound invisibly across sessions.
- No session history — Which projects burned the most tokens today?
tce gives you real-time visibility into all of this from a single command, a menu bar icon, or a web dashboard.
Install
pipx install tce-monitor
That's it. On macOS, this automatically includes the menu bar and native webview. On Linux, you get the CLI and web dashboard. Requires Python 3.11+.
To auto-start at login (macOS):
tce install
Don't have pipx? Install it with
brew install pipx && pipx ensurepath(macOS) orpip3 install --user pipx(any platform).
Quick Start
# See all your Claude processes with CPU/memory usage
tce status
# Check how much you've spent on tokens
tce usage
# Kill all idle processes
tce kill-stale
# Kill a specific resource-heavy process
tce kill 12345
# Launch the web dashboard
tce dashboard
# Run menu bar app with live monitoring
tce run
CLI Reference
| Command | Description |
|---|---|
tce status |
Process health overview — PIDs, projects, memory, CPU, uptime, health status |
tce usage |
Token usage and costs — per-model breakdown with input, output, cache tokens |
tce sessions |
Recent session history — project, duration, tokens, lines changed, summary |
tce kill <PID> |
Kill a Claude process (SIGTERM). Add --force for SIGKILL |
tce kill-stale |
Find and kill all stale processes at once |
tce pin <PID> |
Pin a process — exempts it from stale detection |
tce unpin <PID> |
Remove pin from a process |
tce dashboard |
Start the web dashboard on localhost:5111 and open in browser |
tce dashboard-stop |
Stop the running dashboard server |
tce run |
Full app — menu bar + dashboard (macOS) or dashboard-only (other platforms) |
tce install |
Install as macOS login service (auto-start at login via launchd) |
tce uninstall |
Remove macOS login service |
Example Output
============================================================
TERMINUS CANCRORUM EST — Process Status
============================================================
Total: 7 | Healthy: 4 | Stale: 3 | Zombie: 0 | Pinned: 0
Resource Alerts: 1 | Total Memory: 3449 MB
============================================================
[+] PID 17742 rpgmaster 6 MB 0.0% 6.9h healthy
[!] PID 31230 crab-trap 392 MB 0.0% 6.8h stale
terminal: /dev/ttys002
[+] PID 41126 openclaw 219 MB 82.5% 1.4h healthy
⚠️ RESOURCE ALERT: CPU 82.5% of system
[+] PID 59593 adventure-graph 953 MB 0.0% 2.3h healthy
terminal: /dev/ttys003
[!] PID 85244 tweek-public 1167 MB 0.0% 6.1h stale
terminal: /dev/ttys007
WARNING: 3 stale process(es) detected. Use 'tce kill-stale' to clean up.
WARNING: 1 process(es) consuming excessive resources (>75% CPU or memory).
============================================================
TERMINUS CANCRORUM EST — Token Usage & Costs
============================================================
Total Cost: $22,248.66
Total Sessions: 183
============================================================
Model Input Output Cache Rd Cache Cr Cost
-------------------- ---------- ---------- ---------- ---------- ------------
Opus 4.5 2.9M 8.0M 7.4B 460.4M $ 20,318.33
Opus 4.6 392.0K 365.9K 734.6M 41.2M $ 1,906.99
Sonnet 4.5 4.4K 655 23.6M 2.7M $ 17.26
Haiku 4.5 5.7K 6.5K 31.4M 3.5M $ 6.07
-------------------- ---------- ---------- ---------- ---------- ------------
TOTAL 3.3M 8.3M 8.2B $ 22,248.66
Web Dashboard
Start with tce dashboard and open http://localhost:5111.
Features
Processes Tab
- Live process table with color-coded health dots (green/yellow/red/blue)
- PID, project name, memory, CPU%, uptime, child process count, terminal
- Resource usage: CPU and memory as % of total system (with alert indicators)
- One-click Kill, Force Kill, and Pin/Unpin buttons
- Status badge: "ALL HEALTHY", "STALE DETECTED", "ZOMBIE DETECTED", or "RESOURCE ALERTS"
- Auto-refreshes every 10 seconds
Token Usage Tab
- Cost breakdown by model with color-coded bars
- Stacked bar chart of daily token consumption (last 30 days) via Chart.js
- Detailed token table: input, output, cache read, cache creation per model
- Total cost prominently displayed
Sessions Tab
- Recent sessions sorted by start time
- Project name, start time, duration, input/output tokens
- Lines added/removed (green/red)
- Session summary text
Design
- Dark theme with monospace typography
- Tailwind CSS + Chart.js
- Sticky header with live status badge
- Responsive layout (2-6 column stat cards)
API Endpoints
All data is available programmatically:
| Method | Path | Description |
|---|---|---|
GET |
/ |
Dashboard HTML |
GET |
/api/processes |
Process list (JSON) |
GET |
/api/usage |
Token usage + costs (JSON) |
GET |
/api/sessions?limit=20 |
Recent sessions (JSON) |
POST |
/api/kill/{pid}?force=false |
Kill a process |
POST |
/api/pin/{pid} |
Pin a process |
POST |
/api/unpin/{pid} |
Unpin a process |
macOS Menu Bar
With pip install 'tce-monitor[macos]', run tce run to get a persistent menu bar icon:
-
Menu bar icon: Crab emoji with status badges
- 🦀 💀2 — 2 zombie processes (highest priority)
- 🦀 ⚠️1 — 1 resource alert
- 🦀 🟡3 — 3 stale processes
- 🦀 — all healthy
-
Dropdown menu: All processes with detailed metrics
- Health icons (✅ healthy, 🟡 stale, 💀 zombie, 📌 pinned)
- CPU usage with 🔴 red circle when >75% of system
- Memory usage with 🔴 red circle when >75% of system
- Uptime in hours
- Example:
⚠️ ✅ 12345 — my-project (🔴 CPU: 85.0%, Mem: 1024MB, 1.2h)
-
Per-process actions: Kill, Force Kill, Pin/Unpin
-
Resource alert details: Expand processes with ⚠️ to see system-wide percentages
- Example:
System Usage: 🔴 CPU 82.5%, Memory 6.2%
- Example:
-
Open Dashboard: Launch the web dashboard in a native webview window
-
macOS notifications: Alerts when processes go stale, become zombies, or consume excessive resources (with 30-minute cooldown per alert type)
-
Summary line: Process count, total memory, and resource alert count
- Example:
5 processes | 5877 MB total | ⚠️ 2 resource alerts
- Example:
The menu bar runs on the main thread (required by PyObjC) with the web dashboard on a daemon thread.
Enabling Notifications
Desktop notifications require terminal-notifier (installed automatically by tce install, or manually with brew install terminal-notifier).
After the first notification fires, macOS will silently suppress future alerts unless you allow them:
- Open System Settings > Notifications > terminal-notifier
- Toggle Allow Notifications to ON
- Set alert style to Banners or Alerts
Important: If you use Focus / Do Not Disturb, notifications will be blocked while it's active. Add
terminal-notifierto your Focus mode's allowed apps, or notifications will only appear when Focus is off.
Process Detection
Claude Code doesn't appear as claude in ps aux. Detection uses two strategies:
| Strategy | How |
|---|---|
| Primary | Executable path contains .local/share/claude/versions/ |
| Fallback | cmdline[0] == 'claude' |
Both are checked per-process via psutil, with graceful handling of AccessDenied and NoSuchProcess.
Health Classification
| Status | Icon | Criteria |
|---|---|---|
| Healthy | + / green |
Running or sleeping, under all thresholds |
| Stale | ! / yellow |
Sleeping with <1% CPU for >4h (interactive) or >8h (background) |
| Zombie | X / red |
Process in stopped (T) or zombie (Z) state |
| Pinned | * / blue |
User-exempted from stale detection via tce pin |
Interactive vs. background is determined by whether the process has an attached terminal (/dev/ttys*).
Resource Alerts
TCE monitors CPU and memory consumption per process as a percentage of total system resources:
| Metric | Threshold (Default) | Alert Trigger |
|---|---|---|
| CPU | 75% of system | Process using ≥75% of total CPU cores |
| Memory | 75% of system | Process using ≥75% of total RAM |
Alert Types:
HIGH_CPU— Process exceeds CPU thresholdHIGH_MEMORY— Process exceeds memory thresholdBOTH— Process exceeds both thresholds
Example: On an 8-core system with 16GB RAM:
- A process using 6+ cores (≥600% in
psterms) triggersHIGH_CPU - A process using 12+ GB triggers
HIGH_MEMORY
Visual Indicators:
- CLI: ⚠️ with exact percentages (
⚠️ RESOURCE ALERT: CPU 82.5% of system) - Menu bar: 🔴 red circles next to exceeding values (
🔴 CPU: 85.0%) - Notifications: macOS alerts with actionable kill suggestions
Independent from health status: A process can be healthy (active) but still trigger resource alerts.
Data Sources
| Source | Path | What It Provides |
|---|---|---|
| Live processes | psutil |
PID, executable, cmdline, cwd, terminal, CPU%, RSS, children |
| Stats cache | ~/.claude/stats-cache.json |
Token counts per model, daily activity, session totals |
| Session meta | ~/.claude/usage-data/session-meta/*.json |
Per-session: project, duration, tokens, tools used, lines changed, summary |
Token data uses mtime-based caching — files are only re-read when modified.
Model Pricing
Costs are computed from Anthropic's published pricing (per million tokens):
| Model | Input | Output | Cache Read | Cache Creation |
|---|---|---|---|---|
| Opus 4.5 | $15.00 | $75.00 | $1.50 | $18.75 |
| Opus 4.6 | $15.00 | $75.00 | $1.50 | $18.75 |
| Sonnet 4.5 | $3.00 | $15.00 | $0.30 | $3.75 |
| Haiku 4.5 | $0.80 | $4.00 | $0.08 | $1.00 |
Configuration
Settings are loaded from environment variables (with CLAUDE_MONITOR_ prefix) and .env files:
| Variable | Default | Description |
|---|---|---|
CLAUDE_MONITOR_PORT |
5111 |
Dashboard server port |
CLAUDE_MONITOR_HOST |
127.0.0.1 |
Dashboard bind address |
CLAUDE_MONITOR_PROCESS_POLL_INTERVAL |
10 |
Seconds between process scans |
CLAUDE_MONITOR_STALE_INTERACTIVE_HOURS |
4.0 |
Hours before interactive process is stale |
CLAUDE_MONITOR_STALE_BACKGROUND_HOURS |
8.0 |
Hours before background process is stale |
CLAUDE_MONITOR_STALE_CPU_THRESHOLD |
1.0 |
CPU% below which a process is considered idle |
CLAUDE_MONITOR_RESOURCE_CPU_PERCENT_THRESHOLD |
75.0 |
CPU% of system before resource alert |
CLAUDE_MONITOR_RESOURCE_MEMORY_PERCENT_THRESHOLD |
75.0 |
Memory% of system before resource alert |
CLAUDE_MONITOR_ALERT_COOLDOWN |
1800 |
Seconds between macOS alerts for same PID |
CLAUDE_MONITOR_RESOURCE_ALERT_COOLDOWN |
1800 |
Seconds between resource alerts for same PID |
Auto-Start at Login (macOS)
The easiest way to have TCE start automatically when you log in:
tce install
This creates a macOS launchd service that:
- Starts
tce run(menu bar + dashboard) at every login - Keeps the process alive (auto-restarts if it crashes)
- Logs to
~/.terminus-cancrorum-est/logs/
To remove:
tce uninstall
Manual launchd Setup
If you prefer to manage the plist yourself:
cp scripts/com.terminus-cancrorum-est.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.terminus-cancrorum-est.plist
To stop:
launchctl unload ~/Library/LaunchAgents/com.terminus-cancrorum-est.plist
Claude Code Skill Integration
TCE includes a Claude Code skill so any Claude session can query your processes. Drop this project in your workspace and Claude will automatically use it:
You: "Check my Claude processes"
Claude: [runs tce status] → reports 7 processes, 3 stale
You: "How much have I spent on Claude?"
Claude: [runs tce usage] → $22,248.66 total, Opus 4.5 dominant
You: "Kill stale processes"
Claude: [runs tce kill-stale] → killed 3 processes
The skill is defined in .claude/skills/terminus-cancrorum-est/SKILL.md.
Development
git clone https://github.com/tmancino/Terminus-Cancrorum-Est.git
cd Terminus-Cancrorum-Est
pip install -e ".[macos,dev]"
# Run tests
pytest tests/ -v --cov=tce
# Lint
ruff check tce/ tests/
# Type check
mypy tce/
Project Structure
Terminus-Cancrorum-Est/
├── tce/ # Installable Python package
│ ├── cli.py # CLI entry point (tce command)
│ ├── app.py # Full app: menu bar + dashboard
│ ├── menubar.py # rumps macOS menu bar
│ ├── dashboard.py # FastAPI web dashboard
│ ├── webview_window.py # Native webview (macOS, optional)
│ ├── process_scanner.py # psutil process detection + health
│ ├── token_tracker.py # Stats cache + session meta parsing
│ ├── cost_calculator.py # Token → USD pricing
│ ├── alert_service.py # macOS notification alerts
│ ├── models.py # Pydantic models
│ ├── config.py # pydantic-settings configuration
│ ├── templates/
│ │ └── dashboard.html # Tailwind + Chart.js dashboard
│ └── static/
│ └── logo.jpg
├── tests/ # 50 tests (pytest)
│ ├── test_process_scanner.py # Detection, health, pinning, scan, kill
│ ├── test_token_tracker.py # Dashboard assembly, sessions, caching
│ ├── test_cost_calculator.py # Pricing accuracy per model
│ └── test_models.py # Pydantic serialization
├── scripts/
│ └── com.terminus-cancrorum-est.plist # launchd auto-start
├── pyproject.toml # Package metadata + tool config
├── LICENSE # MIT
└── README.md
Architecture
tce run
├── Main thread: rumps menu bar [macOS only, requires pip install tce-monitor[macos]]
│ ├── Crab icon with zombie/stale badge
│ ├── Process dropdown with Kill/Pin actions
│ ├── "Open Dashboard" → native webview subprocess
│ └── macOS notification alerts (stale/zombie)
│
└── Daemon thread: FastAPI + uvicorn on :5111
├── GET / → Tailwind dashboard (Jinja2 template)
├── GET /api/processes → ProcessScanner.scan()
├── GET /api/usage → TokenTracker.get_dashboard()
├── GET /api/sessions → TokenTracker.get_recent_sessions()
├── POST /api/kill/{pid} → ProcessScanner.kill_process()
└── POST /api/pin/{pid} → ProcessScanner.pin()
On non-macOS platforms (or without the [macos] extra), tce run launches the dashboard on the main thread instead.
Platform Support
| Platform | tce CLI |
Web Dashboard | Menu Bar | Native Webview | Notifications |
|---|---|---|---|---|---|
| macOS | Yes | Yes | Yes (with [macos]) |
Yes (with [macos]) |
Yes |
| Linux | Yes | Yes | No | No | No |
| Windows | Untested | Probably | No | No | No |
License
MIT — Tommy Mancino, 2026
Project details
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 tce_monitor-0.4.0.tar.gz.
File metadata
- Download URL: tce_monitor-0.4.0.tar.gz
- Upload date:
- Size: 172.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab0881b179131fcf66bee0d405161c099e5245614b73dae4416e6ba5dafa14ea
|
|
| MD5 |
5645e95429f6f76b962e00da33e9cbe9
|
|
| BLAKE2b-256 |
7b2c5604c549c2c201edcd47769d70b4ed1216977d46212772ed38bc2b2344d2
|
File details
Details for the file tce_monitor-0.4.0-py3-none-any.whl.
File metadata
- Download URL: tce_monitor-0.4.0-py3-none-any.whl
- Upload date:
- Size: 168.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
01638086ce19c4287322c07e6952d60f22191f58dbd2cb6b4d77dd07515fecf5
|
|
| MD5 |
c70d535d3583f4ac60c4f0881315f118
|
|
| BLAKE2b-256 |
cdddd260a030d73897c2a5c185864f1be72279b540f8f4af47b20bfc45a10505
|