96 lines
3.4 KiB
Markdown
96 lines
3.4 KiB
Markdown
# Multi-Machine Discord Channel Setup
|
|
|
|
## Context
|
|
|
|
You have one Discord bot and multiple machines, each running Claude Code with the Discord plugin. You want messages sent to different Discord text channels to route to different machines — e.g., `#desktop` reaches your desktop, `#laptop` reaches your laptop.
|
|
|
|
This works because the Discord plugin's `gate()` function checks guild channel opt-in per `access.json`. Each machine connects with the same bot token, and Discord delivers all messages to all instances — but each instance only acts on messages from its opted-in channel(s), silently dropping the rest.
|
|
|
|
## Prerequisites
|
|
|
|
- A Discord server where the bot is installed
|
|
- One text channel per machine (e.g., `#desktop`, `#laptop`, `#server`)
|
|
- Channel IDs for each (Developer Mode → right-click channel → Copy Channel ID)
|
|
|
|
## Steps
|
|
|
|
### 1. Create Discord channels
|
|
|
|
In your Discord server, create one text channel per machine. Name them however you like (machine name, location, etc.).
|
|
|
|
### 2. Copy bot token to each machine
|
|
|
|
On each machine:
|
|
```
|
|
mkdir -p ~/.claude/channels/discord
|
|
```
|
|
Write `~/.claude/channels/discord/.env`:
|
|
```
|
|
DISCORD_BOT_TOKEN=MTQ4ODQ2... (same token on all machines)
|
|
```
|
|
```
|
|
chmod 600 ~/.claude/channels/discord/.env
|
|
```
|
|
|
|
The token is already saved on this machine. For others, copy the token value over (e.g., via NFS, ssh, or manually).
|
|
|
|
### 3. Configure each machine's access.json
|
|
|
|
On **each machine**, set up `~/.claude/channels/discord/access.json` with only that machine's channel opted in.
|
|
|
|
Example for machine "desktop" (channel ID `111111111111111111`):
|
|
```json
|
|
{
|
|
"dmPolicy": "allowlist",
|
|
"allowFrom": ["YOUR_USER_SNOWFLAKE"],
|
|
"groups": {
|
|
"111111111111111111": {
|
|
"requireMention": false,
|
|
"allowFrom": []
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Example for machine "laptop" (channel ID `222222222222222222`):
|
|
```json
|
|
{
|
|
"dmPolicy": "disabled",
|
|
"allowFrom": ["YOUR_USER_SNOWFLAKE"],
|
|
"groups": {
|
|
"222222222222222222": {
|
|
"requireMention": false,
|
|
"allowFrom": []
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Key decisions:
|
|
- **DMs**: Enable on one machine only (`"dmPolicy": "allowlist"`) and disable on the rest (`"dmPolicy": "disabled"`), so DMs don't trigger all machines
|
|
- **`requireMention`**: Set to `false` if you want every message in the channel to reach Claude without @mentioning; `true` if you prefer explicit mentions
|
|
- **`allowFrom` in groups**: Leave empty to allow any server member, or restrict to your snowflake
|
|
|
|
### 4. Start Claude Code with the Discord channel on each machine
|
|
|
|
```
|
|
claude --channels plugin:discord@claude-plugins-official
|
|
```
|
|
|
|
All machines connect simultaneously. Each only processes messages from its own channel.
|
|
|
|
## DM handling
|
|
|
|
Since all instances receive DMs, only one machine should have DMs enabled. Set `"dmPolicy": "disabled"` on all others. Pick whichever machine you consider your primary for DM-based conversations.
|
|
|
|
## Shared access.json via NFS (optional)
|
|
|
|
If you want allowlists to stay in sync without manual copying, you could put the `.env` on NFS and use per-machine `access.json` files. However, since each machine needs different `groups`, the `access.json` must be per-machine. The `.env` (same token) can be shared.
|
|
|
|
## Verification
|
|
|
|
1. Start Claude with `--channels plugin:discord@claude-plugins-official` on two machines
|
|
2. Send a message in machine A's channel → only machine A receives it
|
|
3. Send a message in machine B's channel → only machine B receives it
|
|
4. Send a DM → only the machine with DMs enabled receives it
|