voice-bridge: Discord voice <-> Lotus voice room (patched nether-voicebridge)
Lint / Shell (shellcheck) (push) Successful in 2m0s
Lint / JS (eslint) (push) Successful in 2m1s
Lint / No secrets in webhook configs (push) Successful in 18s
Lint / Landing page is rendered (matrix (push) Successful in 18s
Lint / Python (ruff) (push) Successful in 25s
Lint / Secret scan (gitleaks) (push) Successful in 14s
Lint / Shell (shellcheck) (pull_request) Successful in 9s
Lint / JS (eslint) (pull_request) Successful in 9s
Lint / No secrets in webhook configs (pull_request) Successful in 7s
Lint / Python deps (pip-audit) (push) Successful in 1m7s
Lint / Landing page is rendered (matrix (pull_request) Successful in 4s
Lint / Python (ruff) (pull_request) Successful in 6s
Lint / Secret scan (gitleaks) (pull_request) Successful in 6s
Lint / Python deps (pip-audit) (pull_request) Successful in 30s

Production setup for the Discord voice bridge on LXC 151: config and
appservice-registration templates (secrets rendered on the server), an
idempotent install script (one Synapse restart on first install, creates
the bot account so it can be invited), and a hardened systemd unit.

voice-limit-guard: VOICE_LIMIT_EXEMPT_USERS lets the bridge's own bot
listen in a call without taking a slot; relayed Discord speakers still
count. Unit tests added (61 pass); verified live on the dev stack.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
This commit is contained in:
Lotus CI
2026-10-29 12:51:56 -04:00
co-authored by Claude Opus 5.5
parent db2f523028
commit 46d0e98424
8 changed files with 258 additions and 3 deletions
+34
View File
@@ -448,6 +448,40 @@ while the bridge or Synapse was down are bridged when it starts again.
---
## Voice Bridge (nether-voicebridge, Lotus-patched)
Bridges Discord voice into a Lotus voice room. People on Discord appear **inside the Matrix call**
under their Discord names, with a speaking indicator. People in Lotus appear in the Discord channel
as `[Matrix] <name>`, with mute mirrored to Discord.
| | Text | Voice |
|---|---|---|
| Discord (Lotus Guild server) | #matrix-bridge | matrix-bridge |
| Matrix (Lotus) | Discord Bridge (mautrix-discord) | Discord Voice Bridge (`!yS_ZIHL3sOKQJBt4NiIQyiHKt3cv6HrIDeq7OxDpSM0`) |
- **Build:** upstream [nether-voicebridge](https://nether.codes/nether/nether-voicebridge) `cf52945`
plus 11 Lotus patches (reported upstream). Patches, bug log and issue drafts live in
`/root/code/voice-bridge-trial/`. **Don't run the unpatched release**. Without the patches the
bridge can't see anyone using current Element Call or Lotus Call (`livekit_alias`), and encrypted
voice breaks after a restart on Synapse.
- **Accounts:** the bot is `@lotus-voice_bot`, shown in encrypted calls as "Discord Voice Bridge".
Discord speakers are `@lotus-voice_<discord id>`. The appservice registration is
`/etc/matrix-synapse/lotus-voice-registration.yaml`.
- **Discord bots:** Lotus Voice 1–3, one per Matrix person speaking at once. Each has only Connect,
Speak, Use Voice Activity and Change Nickname, and none can see #matrix-bridge text.
- **Files on LXC 151:**
- binary: `/opt/lotus-voice/lotus-voice-bridge`
- config: `/etc/lotus-voice/config.toml` (0600, holds the bot tokens)
- state: `/var/lib/lotus-voice`
- service: `lotus-voice-bridge`, logs via `journalctl -u lotus-voice-bridge`
- **Voice limits:** `voice-limit-guard` ignores `@lotus-voice_bot` (`VOICE_LIMIT_EXEMPT_USERS`), so
the bot never takes a slot. Discord speakers count like anyone else. When a room is full the
bridge stops trying cleanly, and the Discord user just isn't heard.
- **Install / upgrade:** on the Proxmox node hosting LXC 151, run
`bash voice-bridge/install.sh <binary> <secrets file with BOT1..BOT3>`. The first install
registers the appservice, restarts Synapse once and creates the bot account. Then invite
`@lotus-voice_bot:matrix.lotusguild.org` to the voice room. Upgrades just swap the binary.
## Bot profiles
Every bot account has a proper name and an avatar in one style (white glyph on a coloured square). Image sources are in `avatars/` and `discord-bridge/bot-avatar.png`.