How pairing works
Your Mac answers only accounts on its allowlist. Pairing is how an account gets on it: the Mac prints a six-digit code, you send that code from the account you want to use, and that account is added. The code works once and expires in 15 minutes.
Messages from anyone else never reach an agent. On Telegram, strangers get one line telling them the bot is private. On the other apps they get nothing.
Approvals follow the same rule. An Approve button pressed by an account that is not paired does nothing.
Add a second device
tweetybird pair
This prints a fresh code. Send it from the new account (a second phone, an iPad, a partner who is on call). Both accounts can now text and approve.
See and revoke devices
tweetybird pair list
tweetybird pair revoke <id>
Revoking takes effect on the next message. If a phone is lost, revoke it, then rotate the bot token in BotFather and run tweetybird setup to paste the new one.
Choosing the app
| App | What setup needs | Approvals |
|---|---|---|
| Telegram | A bot token from BotFather. Setup walks you through it. The slash-command menu fills in automatically. | Buttons |
| iMessage | The imsg tool (brew install steipete/tap/imsg) and Full Disk Access for Node in System Settings, Privacy and Security. | Reply yes, no, or always |
| Slack DM | A Slack app with a bot token (xoxb-, scopes chat:write, im:history, im:read, files:read, files:write) and an app token (xapp-) with Socket Mode and Interactivity on. | Buttons |
| Discord | A bot token with the Message Content intent on. DM the bot. | Reply yes, no, or always |
tweetybird setup --whatsapp shows a QR code; scan it from WhatsApp, Linked devices. | Reply yes, no, or always |
Every app pairs the same way: send the six-digit code from the account you want. On apps without buttons, reply "yes", "no", or "always" to an approval.
Telegram is the recommended default. It has the slash-command menu, tap-to-approve buttons, message edits for progress, and a 49MB file limit.