# 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