name: add-imessage description: Add iMessage channel integration via Chat SDK. Local (macOS) or remote (Photon API) mode.
Add iMessage Channel
Adds iMessage support via the Chat SDK bridge. Two modes: local (macOS with Full Disk Access) or remote (Photon API).
Install
NanoClaw doesn't ship channels in trunk. This skill copies the iMessage adapter in from the channels branch.
Pre-flight (idempotent)
Skip to Credentials if all of these are already in place:
src/channels/imessage.tsexistssrc/channels/imessage-registration.test.tsexistssrc/channels/index.tscontainsimport './imessage.js';chat-adapter-imessageis listed inpackage.jsondependencies
Otherwise continue. Every step below is safe to re-run.
1. Fetch the channels branch
git fetch origin channels
2. Copy the adapter and its registration test
git show origin/channels:src/channels/imessage.ts > src/channels/imessage.ts
git show origin/channels:src/channels/imessage-registration.test.ts > src/channels/imessage-registration.test.ts
3. Append the self-registration import
Append to src/channels/index.ts (skip if the line is already present):
import './imessage.js';
4. Install the adapter package (pinned)
pnpm install chat-adapter-imessage@0.1.1
5. Build and validate
pnpm run build
pnpm exec vitest run src/channels/imessage-registration.test.ts
Both must be clean before proceeding. imessage-registration.test.ts is the one integration test: it imports the real channel barrel and asserts the registry contains imessage. It goes red if the import './imessage.js'; line is deleted or drifts, if the barrel fails to evaluate, or if chat-adapter-imessage isn't installed (the import throws) — so it also implicitly verifies the dependency from step 4. The adapter also calls core's createChatSdkBridge(...); that typed core-API consumption is guarded by pnpm run build.
End-to-end message delivery against a real iMessage account is verified manually once the service is running — see Next Steps.
Credentials
Local Mode (macOS)
Requirements: macOS with Full Disk Access granted to the Node.js binary.
The Node binary path is buried deep (e.g. ~/.nvm/versions/node/v22.x.x/bin/node). To make it easy, open the folder in Finder so the user can drag the file into System Settings:
open "$(dirname "$(which node)")"
Then tell the user:
- Open System Settings > Privacy & Security > Full Disk Access
- Click +, then drag the
nodefile from the Finder window that just opened - Toggle it on
Stop and wait for the user to confirm before continuing.
Remote Mode (Photon API)
- Set up a Photon account
- Get your server URL and API key
Configure environment
Local mode -- add to .env:
IMESSAGE_ENABLED=true
IMESSAGE_LOCAL=true
Remote mode -- add to .env:
IMESSAGE_LOCAL=false
IMESSAGE_SERVER_URL=https://your-photon-server.com
IMESSAGE_API_KEY=your-api-key
Sync to container: mkdir -p data/env && cp .env data/env/env
Next Steps
If you're in the middle of /setup, return to the setup flow now.
Otherwise, run /manage-channels to wire this channel to an agent group.
Channel Info
- type:
imessage - terminology: iMessage has "conversations." Each conversation is with a contact identified by phone number or email address. Group chats are also supported.
- how-to-find-id: The platform ID is the contact's phone number (e.g.
+15551234567) or email address. For group chats, the ID is assigned by iMessage internally. - supports-threads: no
- typical-use: Interactive 1:1 chat — personal messaging
- default-isolation: Same agent group if you're the only person messaging the bot across iMessage and other channels. Separate agent group if different contacts should have information isolation.