| # BlueBubbles (iMessage) |
|
|
| Connect Hermes to Apple iMessage via [BlueBubbles](https://bluebubbles.app/) β a free, open-source macOS server that bridges iMessage to any device. |
|
|
| ## Prerequisites |
|
|
| - A **Mac** (always on) running [BlueBubbles Server](https://bluebubbles.app/) |
| - Apple ID signed into Messages.app on that Mac |
| - BlueBubbles Server v1.0.0+ (webhooks require this version) |
| - Network connectivity between Hermes and the BlueBubbles server |
|
|
| ## Setup |
|
|
| ### 1. Install BlueBubbles Server |
|
|
| Download and install from [bluebubbles.app](https://bluebubbles.app/). Complete the setup wizard β sign in with your Apple ID and configure a connection method (local network, Ngrok, Cloudflare, or Dynamic DNS). |
|
|
| ### 2. Get your Server URL and Password |
|
|
| In BlueBubbles Server β **Settings β API**, note: |
| - **Server URL** (e.g., `http://192.168.1.10:1234`) |
| - **Server Password** |
|
|
| ### 3. Configure Hermes |
|
|
| Run the setup wizard: |
|
|
| ```bash |
| hermes gateway setup |
| ``` |
|
|
| Select **BlueBubbles (iMessage)** and enter your server URL and password. |
|
|
| Or set environment variables directly in `~/.hermes/.env`: |
|
|
| ```bash |
| BLUEBUBBLES_SERVER_URL=http://192.168.1.10:1234 |
| BLUEBUBBLES_PASSWORD=your-server-password |
| ``` |
|
|
| ### 4. Authorize Users |
|
|
| Choose one approach: |
|
|
| **DM Pairing (recommended):** |
| When someone messages your iMessage, Hermes automatically sends them a pairing code. Approve it with: |
| ```bash |
| hermes pairing approve bluebubbles <CODE> |
| ``` |
| Use `hermes pairing list` to see pending codes and approved users. |
|
|
| **Pre-authorize specific users** (in `~/.hermes/.env`): |
| ```bash |
| BLUEBUBBLES_ALLOWED_USERS=user@icloud.com,+15551234567 |
| ``` |
|
|
| **Open access** (in `~/.hermes/.env`): |
| ```bash |
| BLUEBUBBLES_ALLOW_ALL_USERS=true |
| ``` |
|
|
| ### 5. Start the Gateway |
|
|
| ```bash |
| hermes gateway run |
| ``` |
|
|
| Hermes will connect to your BlueBubbles server, register a webhook, and start listening for iMessage messages. |
|
|
| ## How It Works |
|
|
| ``` |
| iMessage β Messages.app β BlueBubbles Server β Webhook β Hermes |
| Hermes β BlueBubbles REST API β Messages.app β iMessage |
| ``` |
|
|
| - **Inbound:** BlueBubbles sends webhook events to a local listener when new messages arrive. No polling β instant delivery. |
| - **Outbound:** Hermes sends messages via the BlueBubbles REST API. |
| - **Media:** Images, voice messages, videos, and documents are supported in both directions. Inbound attachments are downloaded and cached locally for the agent to process. |
|
|
| ## Environment Variables |
|
|
| | Variable | Required | Default | Description | |
| |----------|----------|---------|-------------| |
| | `BLUEBUBBLES_SERVER_URL` | Yes | β | BlueBubbles server URL | |
| | `BLUEBUBBLES_PASSWORD` | Yes | β | Server password | |
| | `BLUEBUBBLES_WEBHOOK_HOST` | No | `127.0.0.1` | Webhook listener bind address | |
| | `BLUEBUBBLES_WEBHOOK_PORT` | No | `8645` | Webhook listener port | |
| | `BLUEBUBBLES_WEBHOOK_PATH` | No | `/bluebubbles-webhook` | Webhook URL path | |
| | `BLUEBUBBLES_HOME_CHANNEL` | No | β | Phone/email for cron delivery | |
| | `BLUEBUBBLES_ALLOWED_USERS` | No | β | Comma-separated authorized users | |
| | `BLUEBUBBLES_ALLOW_ALL_USERS` | No | `false` | Allow all users | |
| | `BLUEBUBBLES_SEND_READ_RECEIPTS` | No | `true` | Auto-mark messages as read | |
|
|
| ## Features |
|
|
| ### Text Messaging |
| Send and receive iMessages. Markdown is automatically stripped for clean plain-text delivery. |
|
|
| ### Rich Media |
| - **Images:** Photos appear natively in the iMessage conversation |
| - **Voice messages:** Audio files sent as iMessage voice messages |
| - **Videos:** Video attachments |
| - **Documents:** Files sent as iMessage attachments |
|
|
| ### Tapback Reactions |
| Love, like, dislike, laugh, emphasize, and question reactions. Requires the BlueBubbles [Private API helper](https://docs.bluebubbles.app/helper-bundle/installation). |
|
|
| ### Typing Indicators |
| Shows "typing..." in the iMessage conversation while the agent is processing. Requires Private API. |
|
|
| ### Read Receipts |
| Automatically marks messages as read after processing. Requires Private API. |
|
|
| ### Chat Addressing |
| You can address chats by email or phone number β Hermes resolves them to BlueBubbles chat GUIDs automatically. No need to use raw GUID format. |
|
|
| ## Private API |
|
|
| Some features require the BlueBubbles [Private API helper](https://docs.bluebubbles.app/helper-bundle/installation): |
| - Tapback reactions |
| - Typing indicators |
| - Read receipts |
| - Creating new chats by address |
|
|
| Without the Private API, basic text messaging and media still work. |
|
|
| ## Troubleshooting |
|
|
| ### "Cannot reach server" |
| - Verify the server URL is correct and the Mac is on |
| - Check that BlueBubbles Server is running |
| - Ensure network connectivity (firewall, port forwarding) |
|
|
| ### Messages not arriving |
| - Check that the webhook is registered in BlueBubbles Server β Settings β API β Webhooks |
| - Verify the webhook URL is reachable from the Mac |
| - Check `hermes logs gateway` for webhook errors (or `hermes logs -f` to follow in real-time) |
|
|
| ### "Private API helper not connected" |
| - Install the Private API helper: [docs.bluebubbles.app](https://docs.bluebubbles.app/helper-bundle/installation) |
| - Basic messaging works without it β only reactions, typing, and read receipts require it |
|
|
|
|