June 06, 2026

claude lives in my whatsapp now

a small build log

so i wanted to be able to text claude the same way i text a friend. not open an app, not a tab, not a login screen. just whatsapp, the thing already glued to my hand all day.

the trick i landed on is dumb in a good way. whatsapp lets you message yourself, that little "message yourself" chat almost nobody uses. mine is just titled "L". i pointed everything at that one chat. i type into it, claude types back into it. nobody else is in there, so it's basically a private terminal that happens to look like a normal conversation.


the thing that made this possible at all is beeper. i already run beeper on my mac and it has a local api, meaning a little program on my own machine can watch my chats and send messages as me. no whatsapp api, no business account, no waiting on meta to approve anything. it all happens on my laptop.

so the whole thing is one small daemon. it opens a websocket to beeper, tells it "only tell me about this one chat", and then it just sits there. every time a new message lands in the "L" chat, it wakes up, hands the text to the claude cli, waits for the answer, and posts that answer straight back into the chat. that's it. that's the whole magic trick.

i made it remember the conversation too, so it's not goldfish-brained between messages. it saves the session id from the last reply and feeds it back in next time, so i can say "no, the other one" and it actually knows what i mean.


i wanted it always on without me babysitting it, so it runs as a launch agent. mac word for "start this quietly when i log in and bring it back if it ever dies." i never have to think about it. laptop's on, claude's reachable.


now the part that actually fought me.

first, auth. beeper used to just hand you a token and you'd paste it and move on. somewhere along the way they switched to proper oauth, the full dance with registering a client and getting redirected to a browser and refresh tokens and all of it. so i had to write a separate little setup step that does the handshake once, stashes the tokens, and quietly refreshes them whenever they go stale. annoying for an afternoon, correct forever after. fine.

second one is funnier. because it's a message-yourself chat, every single message in there looks like it came from me. including claude's replies. so the daemon would post an answer, see a new message appear, go "ooh a message!", and feed claude's own reply back to claude. infinite loop. it'd just start talking to itself forever.

the fix is petty and i love it. every reply claude sends gets a tiny invisible marker stuck on the end, a couple of zero-width characters you can't see and can't accidentally type. so when the daemon reads a new message it checks for the marker, and if it's there it just goes "that's me, ignore" and shuts up. it can tell its own voice apart from mine without anything showing up in the actual text.


what it can't do yet: it's text only. if i send a photo it just shrugs, claude can't see it. the pieces to fix that exist, beeper can hand me the file, i just haven't wired it up. and obviously it only works while beeper's open and i'm logged into claude on that machine, since the whole thing lives on my laptop and nowhere else. which honestly i kind of like. nothing's sitting on someone's server. it's just my machine talking to itself.


the part i didn't expect to like so much is how normal it feels. claude isn't a tab i go visit anymore. it's a contact. it's in the same list as everyone else, between the food group chat and my mom, and i ping it the same lazy way i'd ping a friend who's good at the thing i'm stuck on.

tiny project. couple of files. but it moved a whole tool from "somewhere i go" to "someone i text," and that swap turned out to matter more than any feature would have.