A small Node daemon that takes the lifecycle events claude code
already fires — and pipes them into the discord rich-presence card on your
profile. Your friends see what you're building, your future self gets
lifetime stats. Zero polling between sessions.
Built with Node SEA — the CLI is a single executable with Node baked in. No
runtime install, no npm install, no PATH gymnastics. The desktop
app bundles the same binary plus a config GUI.
.exe you can drop on a USB stick..dmg. Drag, drop, done. Auto-updates from GitHub releases.git clone, npm install, npm link. Linux / *BSD / WSL.The card text follows whatever claude is doing right now — not a generic rotation that cycles through the same six stats forever. Lifetime numbers only show up when you're actually idle.
Every aggregate below is computed locally by walking
~/.claude/projects. Incremental, cached, no telemetry, no
network beyond the discord IPC itself.
Hours, prompts, tokens, sessions, streaks, hotspot files, lines added/removed, languages, bash commands, web domains, subagent runs — pulled from your transcripts and cached at ~/.claude-rpc/aggregate.json.
Per-model spend (Opus / Sonnet / Haiku) at public list prices. Edit one file to override.
src/pricing.jsHeatmap, hour histogram, top tools / files / projects / languages.
$ claude-rpc statusSSE-pushed updates, range selector (7d/30d/90d/1y/all), day-detail modal, project drilldown.
$ claude-rpc serve · :47474Shields-style SVG generator and a live endpoint when the daemon's up.
Electron config editor: presence (drag-reorder, variable autocomplete, presets), discord, assets, timing, daemon controls, stats.
claude-rpc insights prints 3–5 contextual lines about your week — trend, peak weekday, hotspot, cost pace, streak progress. Useful for stand-ups, useful for self-awareness, useful for nothing — up to you.
The first setup seeds a config, registers the lifecycle hooks
with claude code, and copies the binary into a stable per-user location so
future manual updates can never break your hook entries.
Claude Code fires lifecycle events on its own clock
(SessionStart, PreToolUse,
Notification, SessionEnd…). Each event
updates a small JSON file on disk; the daemon watches that file and
pushes a frame to discord within a second.
When you close claude code, the presence clears immediately. No 5-minute "is it still running?" timeout. Shipped with v0.3.5.
No database, no message bus, no background polling when claude code isn't
running. The file-based IPC is intentional — it makes the whole system
inspectable with cat and jq.
Claude fires lifecycle events. Each one runs a tiny script that updates a shared state file.
~/.claude/settings.jsonLong-running. Connects to discord's local IPC. Watches the state file, builds the card, pushes a frame.
src/daemon.jsWalks transcripts incrementally for the lifetime aggregates. Feeds the dashboards and the idle rotation frames.
~/.claude-rpc/aggregate.json
claude-rpc serve — range selector, heatmap, languages stack, leaderboards.
Shipping small. Each release tag is a real artifact you can download — no nightlies, no marketing-driven version numbers. Read the source on your way through.
presence.byStatus) + 9 new template vars (fileLang, gitBranch, …).
Download, run claude-rpc setup,
paste your discord application id into the config, start the daemon. That's the whole flow.