Why TextButler works the way it does

TextButler adds an assistant to the iMessage, WhatsApp, and Beeper chats you choose on your Mac. By default, it answers “butler” requests and marks its replies as AI. It runs in the background on your Mac with no window, and your coding agent can set it up.

View the source on GitHub

It answers only where you allow

You turn replies on one conversation at a time. Keyword mode waits for “butler”; Smart mode can recognize a request for help without it. Both modes pause after you write in the chat and limit how often the assistant answers.

It starts off

New installs start paused, every conversation starts off, and setup sends no messages. textbutler pause stops all replies at once, and textbutler contacts disable turns off one conversation.

Its notes are files you can edit

Each conversation gets a folder of plain files on your Mac: how you talk, what matters, and what’s off-limits. Optional learning, off by default, can also remember up to 64 sourced notes; textbutler habitats show lists them and textbutler habitats memory-clear removes them. Your settings and sign-ins live elsewhere, where the butler can’t change them.

Why replies are marked

The person you’re texting should know when an assistant wrote the reply. By default, TextButler wraps replies and acknowledgments in the 🤖{ } marker before sending. You can change or remove it for one conversation; do that only with people who already know you use TextButler. Your own chat always keeps a visible marker.

TextButler also records which messages it sent, so it never mistakes its own replies for yours.

Pick what writes replies

QwenClaude CodeCodexDevin

Replies can be written by a local model through Ollama, by Qwen through your own Vercel AI Gateway key, or by your Claude Code, Codex, or Devin subscription through xcb. A local model writes replies on your Mac; optional web search still sends queries through your saved Gateway key.

Through xcb, the model can’t run commands on your Mac, and xcb keeps your sign-in. TextButler decides who gets a reply and does the sending.

Open the setup guide · Read the architecture