Discord¶
Connect Pynchy as a Discord bot for guild channels, forum posts, threads, and DMs. A child conversation 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
botandapplications.commandsscopes and View Channels, Send Messages, Send Messages in Threads, Read Message History, Add Reactions, Connect, and Speak, and Manage Messages. 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"
[connections.mybot.chat.pynchy.channels.project]
name = "Project"
kind = "forum"
category = "Systems"
[workspaces.discord-general]
profiles = ["pynchy-dev"]
chat = "connection.discord.mybot.chat.pynchy.channels.general"
[workspaces.project]
profiles = ["project-worker"]
chat = "connection.discord.mybot.chat.pynchy.channels.project"
threads = [
{ name = "project plan", kind = "planning" },
]
[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, deploy the change, and inspect the channel state:
registered_groups should contain JIDs such as discord:channel:<channel-id> or discord:direct:<user-id>.
Forum Workspaces¶
Set a configured channel's kind to forum to use one forum as a workspace root. Pynchy creates the forum and its category when either does not exist. At each startup, it also adds any missing issue, automation, planning, testing, and topic tags without removing other tags.
Each managed forum post receives exactly one of those kind tags. Routed Linear issues use issue, and scheduled tasks use automation. Persistent workspace threads accept automation, planning, testing, or topic; topic provides the default. Pynchy pins the Linear issue link in each routed issue post. For a Linear-backed forum, Pynchy also maintains its Linear project link in the forum posting guidelines without replacing other guidance.
Capabilities¶
- Guild channels, forum posts, threads, and DMs
- Inbound and outbound reactions
- Streaming responses with safe 2,000-character splitting
- Interactive
ask_userprompts with buttons, selects, multi-question modals, and file uploads - File-upload answers preserve Discord attachment metadata and ephemeral URLs for the waiting agent
- Safe mention defaults that never ping
@everyoneunless asked - History catch-up after reconnect
Application commands¶
Discord exposes Pynchy's host controls as native application commands, so these controls do not depend on message text or the Message Content Intent:
/pause/reset/end-session/redeploy/pending/approve short_idand/deny short_id/q message,/queue message, and/btw messageto queue a follow-up without interrupting the current turn
Commands are registered globally when the bot connects. Discord can take time to propagate global command updates. Configured Discord magic-phrase controls are not interpreted from message text; explicit ! direct commands remain available. Other channels retain their configured text controls.
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.