Discord¶
Connect Pynchy as a Discord bot for guild channels, threads, and DMs. A thread becomes an isolated conversation that inherits its parent channel's workspace configuration.
Set up Discord¶
- Create a bot in the Discord Developer Portal. Under Bot → Privileged Gateway Intents, enable Message Content Intent.
- Invite it with the
botscope and View Channels, Send Messages, Send Messages in Threads, Read Message History, Add Reactions, Connect, and Speak. Do not grant Administrator. - Store the token in the host environment, then reference its name from
data/personalization/pynchy.toml:
- Configure the connection and its workspaces. Pynchy resolves configured names at startup, creates missing text channels when allowed, and keeps raw Discord IDs in runtime state:
[connections.mybot]
type = "discord"
bot_token_env = "DISCORD_BOT_TOKEN"
default_thread_participants = ["<your-discord-user-id>"]
dm_policy = "allowlist" # open | allowlist | disabled
allow_from = ["alice"]
group_policy = "allowlist" # open | disabled | allowlist
[connections.mybot.chat.pynchy]
name = "Pynchy"
users = ["alice"]
[connections.mybot.chat.pynchy.channels.general]
name = "General"
kind = "voice"
[workspaces.discord-general]
profiles = ["pynchy-dev"]
chat = "connection.discord.mybot.chat.pynchy.channels.general"
[workspaces.discord-admin]
profiles = ["pynchy-dev"]
[workspaces.discord-dm]
profiles = ["pynchy-dev"]
Repo-backed cores need a profile with repo = "owner/repo". Text-channel threads inherit their configured parent workspace profile. Declare persistent child threads on the workspace when organizing multiple conversations under one profile; see Organize Child Conversations. Pynchy adds every default_thread_participants user to newly created Discord threads; use Discord user snowflakes, not display names.
- Install dependencies, restart Pynchy, and inspect the channel state:
registered_groups should contain JIDs such as discord:channel:<channel-id> or discord:direct:<user-id>.
Capabilities¶
- Guild channels, threads, and DMs
- Inbound and outbound reactions
- Streaming responses with safe 2,000-character splitting
- Safe mention defaults that never ping
@everyoneunless asked - History catch-up after reconnect
For the optional voice workspace and inbound audio transcription, see Voice and speech.
Want to customize this? Write your own channel plugin — see the Plugin Authoring Guide. Have an idea but don't want to build it? Open a feature request.