Installs just this skill. Get the whole plugin for auto-invocation.
โก How it fires
How this skill gets triggered: by you, by Claude, or both.
Fires itselfClaude auto-loads it when your prompt matches the work.
You can call itInvoke it directly when you want it.
Slash command/add-imessage
๐๏ธ Context preview
The summary Claude sees to decide when to auto-load this skill.
Add iMessage channel integration via Chat SDK. Local (macOS) or remote (Photon API) mode.
๐ Stats
Stars30,324
Forks12,869
LanguageTypeScript
LicenseMIT
๐ฆ Ships with nanoclaw
</> SKILL.md
add-imessage.SKILL.md
---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). NanoClaw doesn't ship channels in trunk โ
this skill copies the iMessage adapter in from the `channels` branch.
The mechanical steps under **Apply** carry `nc:` directive fences: an agent reads
the prose and applies them, and a parser can apply them deterministically from
the same document. Every directive is idempotent, so the whole skill is safe to
re-run; anything a parser can't apply falls back to the prose beside it.
## Apply
### 1. Copy the adapter
Fetch the `channels` branch and copy the iMessage adapter into `src/channels/`
(overwrite โ the branch is canonical):
```nc:copy from-branch:channels
src/channels/imessage.ts
src/channels/imessage-registration.test.ts
```
### 2. Register the adapter
Append the self-registration import to the channel barrel (skipped if the line
is already present). This one line is the skill's only reach-in into core:
```nc:append to:src/channels/index.ts
The phone number or email you iMessage from โ a +E.164 number (e.g. +14155551234) or an email / Apple ID (e.g. you@icloud.com).
```
iMessage is a native adapter: it sends the raw handle as the conversation
address, with no channel prefix โ so the messaging-group platform id is that
handle as-is.
```nc:run capture:platform_id
echo "{{owner_handle}}"
```
`owner_handle` and `platform_id` are what the owner-wiring step needs. The
welcome iMessage goes out through the adapter once the service is running โ in
local mode that needs Full Disk Access granted (above); in remote mode it goes
via your Photon server.
## Next Steps
If you're in the middle of `/setup`, return to the setup flow now. Otherwise wire
this channel with `/init-first-agent` (or `/manage-channels`).
## 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.
## Troubleshooting
**The mode answer is rejected.** It must be exactly `local` or `remote`, lowercase. Local only exists on macOS โ it reads this Mac's `chat.db` directly โ so on any other OS the platform check stops you and remote (Photon) is the only path.
**Local mode: outgoing works but nothing ever arrives.** Full Disk Access wasn't granted to the *actual* Node binary the service runs under โ with nvm the path changes per Node version (`~/.nvm/versions/node/v22.x.x/bin/node`), so an old grant silently stops covering a new binary. Re-open System Settings โ Privacy & Security โ Full Disk Access, add the binary at `$(which node)`, then restart the service.
**Remote mode: Photon values rejected or unreachable.** The server URL must start with `http://` or `https://` โ copy it and the API key from your Photon dashboard at photon.codes. If the adapter starts but sends fail, curl the server URL from this machine to rule out a network path issue.
**Your handle is rejected at the resolve step.** It must be a bare +E.164 number (`+14155551234` โ no spaces, dashes, or parentheses) or an email/Apple ID. Use the exact handle you actually send iMessages from โ a number-vs-email mismatch means your messages never map to the wired conversation.
**Adapter installed but silent.** Run `pnpm exec vitest run src/channels/imessage-registration.test.ts` โ red means the barrel import or the `chat-adapter-imessage` install drifted, so re-run the Apply steps. If green, restart the service (`bash setup/lib/restart.sh`) so it loads the adapter and the mode config, then check `logs/nanoclaw.error.log`.