Docs: hosted-instance usage (bot invite links) + step-by-step Discord bot registration guide for self-hosting (with screenshots) #58

Closed
opened 2026-07-05 15:58:07 +00:00 by robocub · 1 comment
Collaborator

The current README covers self-hosting requirements tersely (Requirements / Quickstart / Configuration notes), but two documentation gaps keep coming up:

1. Hosted-instance usage docs (once the hosted instance is set up)

For people who just want to bridge their Discord server / Matrix room using our hosted instance rather than self-hosting:

  • A "Use the hosted instance" section/page: what the hosted bridge is, what it costs (nothing?), what data flows through it.
  • Direct invite URLs for each hosted puppet bot so server admins can add them to their guild in one click (OAuth2 URLs pre-scoped with Connect, Speak, Use Voice Activity, Change Nickname).
  • Matrix-side steps for the hosted homeserver: how to get the bridge bot into your room (invite for restricted/invite-only rooms), and the org.matrix.msc3401.call.member PL 0 room requirement — including the gotcha that Element's "Join Element calls: Default" label is unreliable and the raw m.room.power_levels must be checked.
  • How to request a bridge / where to ask (#nether-voicebridge:nether.im), and what info to provide (guild + channel, room id).

Blocked on the hosted instance actually existing (groundwork: #43 feasibility analysis, #45 tenants, #46 per-(bot,guild) allocation) — but the doc structure can be drafted now with placeholders for the invite URLs.

2. Self-hosting: detailed Discord bot registration guide (with screenshots)

Registering the puppet-pool bot applications is the most confusing part of self-hosting and the README currently compresses it to one bullet. We need a dedicated walkthrough (e.g. docs/discord-bot-setup.md, screenshots under docs/images/) covering, for each puppet bot:

  • Creating the application in the Discord Developer Portal — with screenshots of each step.
  • The Bot tab: creating the bot user, copying the token (and that it's shown once), which portal toggles/intents the bridge needs.
  • Generating the OAuth2 invite URL: bot scope + the exact permission set (Connect, Speak, Use Voice Activity, Change Nickname), with a screenshot of the URL generator and a ready-made URL template (just substitute the client id).
  • Inviting the bot to every guild you want it usable in (per-(bot,guild) allocation means the pool can be shared or partitioned across guilds — explain briefly).
  • How many bots to create: one bot per simultaneous Matrix speaker per guild + the anchor; two bridged channels in the same guild need distinct bots.
  • Naming/avatar guidance: avatars are global per bot and rate-limited, nicknames are set per-guild at runtime by the bridge (so don't hand-pick avatars expecting per-user identity).
  • ⚠️ Create the applications deliberately, by hand — scripted mass-creation trips Discord's abuse heuristics.
  • Wire the tokens into config.toml [puppets] (and the env-var alternative for Docker/systemd deployments).

While we're in there, consider consolidating the Matrix-side setup (appservice registration, sender_localpart namespace stem, room PL requirement) into a parallel self-hosting walkthrough so the README can link out to both instead of carrying all the detail inline.

Acceptance

  • A first-time self-hoster can go from zero to a working puppet pool following only the guide, without asking in the support room.
  • A server admin can onboard onto the hosted instance following only the hosted-instance page (once it exists).
The current README covers self-hosting requirements tersely (Requirements / Quickstart / Configuration notes), but two documentation gaps keep coming up: ## 1. Hosted-instance usage docs (once the hosted instance is set up) For people who just want to bridge their Discord server / Matrix room using **our hosted instance** rather than self-hosting: - [ ] A "Use the hosted instance" section/page: what the hosted bridge is, what it costs (nothing?), what data flows through it. - [ ] **Direct invite URLs for each hosted puppet bot** so server admins can add them to their guild in one click (OAuth2 URLs pre-scoped with *Connect, Speak, Use Voice Activity, Change Nickname*). - [ ] Matrix-side steps for the hosted homeserver: how to get the bridge bot into your room (invite for restricted/invite-only rooms), and the **`org.matrix.msc3401.call.member` PL 0** room requirement — including the gotcha that Element's "Join Element calls: Default" label is unreliable and the raw `m.room.power_levels` must be checked. - [ ] How to request a bridge / where to ask ([#nether-voicebridge:nether.im](https://matrix.to/#/%23nether-voicebridge:nether.im)), and what info to provide (guild + channel, room id). Blocked on the hosted instance actually existing (groundwork: #43 feasibility analysis, #45 tenants, #46 per-(bot,guild) allocation) — but the doc structure can be drafted now with placeholders for the invite URLs. ## 2. Self-hosting: detailed Discord bot registration guide (with screenshots) Registering the puppet-pool bot applications is the most confusing part of self-hosting and the README currently compresses it to one bullet. We need a dedicated walkthrough (e.g. `docs/discord-bot-setup.md`, screenshots under `docs/images/`) covering, for **each** puppet bot: - [ ] Creating the application in the [Discord Developer Portal](https://discord.com/developers/applications) — with screenshots of each step. - [ ] The Bot tab: creating the bot user, copying the **token** (and that it's shown once), which portal toggles/intents the bridge needs. - [ ] Generating the **OAuth2 invite URL**: `bot` scope + the exact permission set (*Connect, Speak, Use Voice Activity, Change Nickname*), with a screenshot of the URL generator and a ready-made URL template (just substitute the client id). - [ ] Inviting the bot to **every guild you want it usable in** (per-(bot,guild) allocation means the pool can be shared or partitioned across guilds — explain briefly). - [ ] How many bots to create: one bot per simultaneous Matrix speaker per guild + the anchor; two bridged channels in the *same* guild need distinct bots. - [ ] Naming/avatar guidance: avatars are global per bot and rate-limited, nicknames are set per-guild at runtime by the bridge (so don't hand-pick avatars expecting per-user identity). - [ ] ⚠️ Create the applications **deliberately, by hand** — scripted mass-creation trips Discord's abuse heuristics. - [ ] Wire the tokens into `config.toml` `[puppets]` (and the env-var alternative for Docker/systemd deployments). While we're in there, consider consolidating the Matrix-side setup (appservice registration, `sender_localpart` namespace stem, room PL requirement) into a parallel self-hosting walkthrough so the README can link out to both instead of carrying all the detail inline. ## Acceptance - A first-time self-hoster can go from zero to a working puppet pool following only the guide, without asking in the support room. - A server admin can onboard onto the hosted instance following only the hosted-instance page (once it exists).
Author
Collaborator

Docs shipped to master (5b4ee91):

  • docs/hosted-instance.md — the "use the hosted instance" page: what it is, cost (free), data flow (links the privacy policy), Matrix-side steps (invite for restricted rooms; the PL-0 org.matrix.msc3401.call.member requirement with the Element "Default"-label gotcha spelled out), and how to request a bridge in #nether-voicebridge:nether.im.
  • docs/discord-bot-setup.md — the self-hosting puppet-bot walkthrough: portal app creation, Bot tab / token / intents (GUILDS | GUILD_VOICE_STATES only), the OAuth2 invite URL (ready-made template, permission integer 103809024), per-guild invites with the per-(bot,guild) allocation explainer, avatar/nickname guidance, the deliberate-creation warning, and wiring tokens into [puppets].
  • README cross-links to both.

Left open — two items need a human/the live instance:

  1. Invite URLs (section 1) — hosted-instance.md has <!-- TODO(operator) --> placeholders; the real per-bot OAuth2 URLs can only be filled once the hosted pool's applications exist. Blocked on the hosted instance going public.
  2. Screenshots (section 2) — discord-bot-setup.md references 7 docs/images/discord-setup-*.png shots, listed in an HTML comment at the bottom of the file, still to be captured from the Developer Portal.

Keeping this open to track those two follow-ups.

**Docs shipped to master** (`5b4ee91`): - `docs/hosted-instance.md` — the "use the hosted instance" page: what it is, cost (free), data flow (links the privacy policy), Matrix-side steps (invite for restricted rooms; the PL-0 `org.matrix.msc3401.call.member` requirement with the Element "Default"-label gotcha spelled out), and how to request a bridge in [#nether-voicebridge:nether.im](https://matrix.to/#/%23nether-voicebridge:nether.im). - `docs/discord-bot-setup.md` — the self-hosting puppet-bot walkthrough: portal app creation, Bot tab / token / intents (`GUILDS | GUILD_VOICE_STATES` only), the OAuth2 invite URL (ready-made template, permission integer `103809024`), per-guild invites with the per-(bot,guild) allocation explainer, avatar/nickname guidance, the deliberate-creation warning, and wiring tokens into `[puppets]`. - README cross-links to both. **Left open — two items need a human/the live instance:** 1. **Invite URLs** (section 1) — `hosted-instance.md` has `<!-- TODO(operator) -->` placeholders; the real per-bot OAuth2 URLs can only be filled once the hosted pool's applications exist. Blocked on the hosted instance going public. 2. **Screenshots** (section 2) — `discord-bot-setup.md` references 7 `docs/images/discord-setup-*.png` shots, listed in an HTML comment at the bottom of the file, still to be captured from the Developer Portal. Keeping this open to track those two follow-ups.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
dark/nether-voicebridge#58
No description provided.