Free SEO + AI visibility snapshot for your site. See what's holding it back.

Get your snapshot
Automation4 min read

My Claude Meetup Talk: How My Bots Ring Claude Code’s Doorbell

My Claude Meetup Talk: How My Bots Ring Claude Code’s Doorbell

I gave a talk at the Claude User Meetup in Pasadena on October 28 about how my AI agents message my Claude Code sessions, and the slides are right below.

Picture a nerd standing in a room, explaining that his bots have bots. Yes, I know how that sounds. The deck itself was made in Claude, which feels like the correct amount of recursion for the topic.

Hi, I'm Alex. A quick tour of something I built in about two days with Claude Code: a bridge so my other AI agents can talk to my Claude Code sessions.
Hi, I’m Alex. A quick tour of something I built in about two days with Claude Code: a bridge so my other AI agents can talk to my Claude Code sessions.
I was the copy-paste router between my agents. Oppo and Lia couldn't reach Claude Code, so everything went through me or a GitHub issue a session had to poll.
I was the copy-paste router between my agents. Oppo and Lia couldn’t reach Claude Code, so everything went through me or a GitHub issue a session had to poll.
Every Claude surface assumes a person is typing, and my requester is Oppo. A session has no public endpoint, so I built the front door: HTTPS in, route, reply out.
Every Claude surface assumes a person is typing, and my requester is Oppo. A session has no public endpoint, so I built the front door: HTTPS in, route, reply out.
The goal the whole time: a bot messages Claude Code to do something, and Claude Code does the thing. Push, not poll. Not a dashboard, not a framework.
The goal the whole time: a bot messages Claude Code to do something, and Claude Code does the thing. Push, not poll. Not a dashboard, not a framework.
Message in, session wakes up, reply goes back out. A small daemon checks the token, picks the right session and drops the message in. Claude replies with a tiny CLI.
Message in, session wakes up, reply goes back out. A small daemon checks the token, picks the right session and drops the message in. Claude replies with a tiny CLI.
Demo data, real flow. Ticket in, Claude acks with an ETA, opens a PR and stops. Oppo relays my go, Claude merges. The real first run was a client ticket.
Demo data, real flow. Ticket in, Claude acks with an ETA, opens a PR and stops. Oppo relays my go, Claude merges. The real first run was a client ticket.
A Missive rule turns a VIP email into a brief. The reply half is wired. Lia's side is the next test.
A Missive rule turns a VIP email into a brief. The reply half is wired. Lia’s side is the next test.
Agents fail quietly unless you design for it. Every failure card carries the real error and the fix, and failures push a notification to my phone.
Agents fail quietly unless you design for it. Every failure card carries the real error and the fix, and failures push a notification to my phone.
Every live session, found automatically, with a read-only transcript. One composer to write to a Claude session, Oppo, or both.
Every live session, found automatically, with a read-only transcript. One composer to write to a Claude session, Oppo, or both.
An installable app with push notifications, behind Cloudflare Access. This is how I check on my agents from the couch.
An installable app with push notifications, behind Cloudflare Access. This is how I check on my agents from the couch.
That's the 150% setting I'm using right now. Plus a small Swift menu bar app with status, an unread badge and a New Claude session button.
That’s the 150% setting I’m using right now. Plus a small Swift menu bar app with status, an unread badge and a New Claude session button.
Read the docs, then read the binary. Let a second model gate every merge. Scope what an unattended agent can touch. Three things I'd tell you before you build one.
Read the docs, then read the binary. Let a second model gate every merge. Scope what an unattended agent can touch. Three things I’d tell you before you build one.
Device badges are in review. Next is one view across my laptop and Mac mini, then turning on Lia's side.
Device badges are in review. Next is one view across my laptop and Mac mini, then turning on Lia’s side.

Want the long version, breakage included? I wrote the whole thing up in the build story. This post is the companion to the deck, so I won’t re-walk every slide.

The goal fit in one sentence

A bot messages Claude Code to do something, and then Claude Code does the thing. That was the success criterion the whole time. Not a dashboard, not a framework.

Push, not poll. The message shows up in the session whether or not anyone is looking. Before this, I was the copy-paste router between my agents. Oppo is the Grok-based bot that runs my ops queue (I wrote about giving Grok Bot the integrator seat), and Lia lives in Missive. Neither of them could reach Claude Code, which is where my building actually happens.

Why not just message Claude?

Because the requester isn’t me, it’s Oppo. Every Claude surface I know of assumes a person is typing, and the useful context lives in my local Claude Code sessions: my repos, skills, logins and history. A fresh chat has none of that.

So why couldn’t Grok just call a session directly? In my testing, a session is a local process with no public endpoint, and its cross-session inbox only took messages from other Claude sessions on the same Mac. Anthropic’s Claude Code Channels feature can push events in, but it’s a research preview, and a custom channel needs a development flag during the preview, with a warning on every launch.

What worked for me was a front door: authenticated HTTPS in, route to the right session, reply back out.

What would I tell you before you build one?

Three things, the same three I told the room.

  • Read the docs, then read the binary. As far as I could tell, the inbox socket is documented and the message shape isn’t. My first two attempts vanished silently, no error, nothing. I ended up finding the format in the binary.
  • Let a second model gate every merge. A Fable reviewer failed most of my first drafts, and on real bugs: a misrouted message, a focus trap, a crash loop. Bugs I would have shipped.
  • Scope what an unattended agent can touch. I use per-service tokens, Access in front of the web UI, written rules the inbox session reads, and a backup before any production write. An agent that’s reachable from the internet with its prompts off is a real risk.

That third one is the one I’d tattoo on a forearm if I were braver. Don’t copy my setup because it’s fun. I’m still working out where the edges are.

What’s next

Device badges are in review now, so I can see which Mac each session runs on. After that comes one view of my laptop and Mac mini sessions together, over Tailscale. Then Lia goes live: client email in, brief out, replies back in Missive. The reply half is wired, and her side is the next test.

None of it is fancy. A daemon, a hook and a queue is about as boring an AI stack as you can get, and that’s the point. If you’re stringing agents together at your own shop, it’s the kind of plumbing we do in our AI workflows work.

Over to you

Which handoff in your setup still runs through you and a copy-paste?