So here's the thing, I use Claude Code all day. Like, all day (and I'm less ashamed of it now!). And my colleagues are on Discord, watching my status sit on "Online" whilst I'm deep in some project having the most productive session of my life. Nobody knows. Nobody sees the "effort". This felt like a problem that needed solving (it wasn't, but here we are).

I wanted my Discord profile to show what Claude Code is doing in real time. Not just "Online". The actual activity. Writing code. Running commands. Thinking. The whole thing. And if I'm running multiple sessions? It should get progressively unhinged about it.

Nobody asked for this. I built it anyway.

What It Actually Looks Like

The result is a Discord Rich Presence card that updates live as you use Claude Code. Single session? Clean and informative. Multiple sessions? It starts going balls to the walls:

Screenshot showing the active Discord presence.
An example custom status :)

The single session card shows what Claude is currently doing -> writing code, running commands, searching, thinking - along with the elapsed time. The multi-session card escalates with messages like "Dual-wielding codebases", "4 parallel universes deep", and my personal favorite: "My RAM filed a complaint (5 projects)".

How It Works (The 30-Second Version)

The architecture is pretty simple:

Diagram showcasing the call flow of the plugin
A butchered bad drawing of Claw'd and Discord ^^

Claude Code fires lifecycle events — session started, tool used, prompt submitted, session ended. I catch those with a bash hook script that POSTs to a local daemon. The daemon holds the Discord RPC connection, tracks all active sessions, resolves what to display, and pushes it to Discord.

Three moving parts, little complexity. The hook is a bash script. The daemon is a Node.js process. The whole thing installs with one command:

npx claude-code-discord-status setup

That's it. It registers the hooks, starts the daemon, you configure your style of personality, and your Discord status is live!

The Personality Layer

A status card that just says "Writing code" is boring. So I went a bit overboard. :P

Every action Claude takes gets its own pool of rotating messages. In example: "Writing code" -> "Hands in the codebase", "Surgery on the source code", "Bending the codebase to my will". Running a command? "Pressing enter and praying". Reading files? "Downloading the codebase into my brain". Thinking? "Staring into the void (productively)". You get the idea.

The single-session state line rotates too. Instead of a static label, you get things like "Keyboard go brrr", "Possessed by the codebase", "Entered the flow state, no ETA", or my personal favorite: "Left on read, busy coding".

But where it really gets fun is multi-session mode. The more Claude Code instances you run simultaneously, the more unhinged the messages get:

  • 2 sessions"Pair programming with myself", "Both repos get custody"
  • 3 sessions"Three-ring circus", "Three projects walk into a bar..."
  • 4 sessions"One for each brain cell", "The 4 horsemen of shipping"
  • 5+ sessions"Send help (5 projects)", "Gone feral (6 projects)", "At 7 repos you unlock prestige mode"

And if you hover over the card? Hidden tooltip easter eggs:

"Technically I'm one Claude in a trenchcoat"
"Schrödinger's codebase: all edited at once"
"Alt-tabbing is my cardio"
"Every repo thinks I only work on them"

Not everyone wants their Discord status to say "Possessed by the codebase", fair enough. So there are message presets you can pick during setup:

Preset Style Example
minimal Just the facts "Coding"
professional Clean, understated "Actively developing"
dev-humor Programmer jokes "// TODO: sleep"
gen-z Meme-flavored "No thoughts just code"
chaotic Living dangerously "Deploying on a Friday"

A Few Nerdy Details

For the technically curious, some decisions I'm happy with:

The hook is bash, not Node. Claude Code gives hooks a 5-second timeout budget. Node takes ~100ms just to start up. Bash + curl? Instant. The entire hook script reads JSON from stdin, parses it with jq, and fires off a POST. It's 120 lines and the most boring, reliable code in the project (which is a feature!!).

The whole daemon is ~300 lines of logic. HTTP server, session registry, Discord RPC wrapper, presence resolver. That's it. The rest of the codebase is message pools, config handling, and the CLI setup wizard. I'm a firm believer that if your side project's core logic doesn't fit in your head, you've (or Claude :P) overengineered it.

Try It

If you use Claude Code and Discord, it's one command:

npx claude-code-discord-status setup

The source is on GitHub, works on Node 18+. Star it if you like it, open an issue if you break it.

Until next time <3