{"id":50140424,"url":"https://github.com/brmble/brmble","last_synced_at":"2026-05-24T01:02:28.633Z","repository":{"id":338795924,"uuid":"1157135223","full_name":"brmble/brmble","owner":"brmble","description":"Brmble is a self-hosted, privacy-first platform for voice, chat and screensharing compatible with Mumble.","archived":false,"fork":false,"pushed_at":"2026-05-18T20:15:31.000Z","size":34698,"stargazers_count":4,"open_issues_count":61,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-18T20:33:38.133Z","etag":null,"topics":["livekit","matrix","mumble","rnnoise"],"latest_commit_sha":null,"homepage":"https://github.com/brmble/brmble","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brmble.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-13T13:24:49.000Z","updated_at":"2026-05-18T19:42:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/brmble/brmble","commit_stats":null,"previous_names":["brmble/brmble"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/brmble/brmble","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brmble%2Fbrmble","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brmble%2Fbrmble/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brmble%2Fbrmble/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brmble%2Fbrmble/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brmble","download_url":"https://codeload.github.com/brmble/brmble/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brmble%2Fbrmble/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33417489,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"ssl_error","status_checked_at":"2026-05-23T22:14:43.778Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["livekit","matrix","mumble","rnnoise"],"created_at":"2026-05-24T01:02:27.727Z","updated_at":"2026-05-24T01:02:28.549Z","avatar_url":"https://github.com/brmble.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Brmble\n\nSelf-hosted gaming communication. Voice over Mumble, persistent chat over Matrix, screen sharing over LiveKit — wrapped in a single desktop client (Windows only).\n\nThe client is a native desktop app with a modern web-based UI inside, including theming and a familiar chat-app layout.\n\n## Screenshots\n\n_Coming soon._\n\n## Mumble compatibility\n\nBrmble is built on top of Mumble, not as a replacement. The voice server is an unmodified Mumble server. That means:\n\n- **Standard Mumble clients work without changes.** Anyone with the official Mumble client (or any third-party Mumble client) can connect to the same server and talk to Brmble users in the same channels.\n- **Mixed use is the intended setup.** A server with the Brmble container running alongside Mumble can host both kinds of clients at the same time. Brmble clients get voice + persistent chat + screen sharing; standard Mumble clients get voice only. Everyone shares the same channels and can hear each other.\n- **No fork, no patched server.** Brmble does not modify the Mumble protocol or the Mumble server. The chat and screen-sharing features live in a separate Brmble container that sits next to Mumble. If you turn the Brmble container off, your server is back to plain Mumble.\n\nThe only requirement for cross-client interop is that the Brmble container has to be reachable for clients that want chat and screen sharing. Standard Mumble clients ignore it.\n\n## Architecture\n\n```\n                    ┌──────────────────────────────┐\n                    │  Brmble Server (1 container) │\n                    │  ┌────────────┐              │\n                    │  │ ASP.NET    │  HTTPS :8080 │── client API + /_matrix proxy\n                    │  ├────────────┤              │\n                    │  │ Continuwuity (Matrix)     │── persistent chat\n                    │  ├────────────┤              │\n                    │  │ LiveKit SFU │  :7881 +UDP │── screen sharing (TCP 7881 + UDP 50000-50100)\n                    │  └────────────┘              │\n                    └─────────────┬────────────────┘\n                                  │ ICE :6502 (optional, for user mapping)\n                                  ▼\n                    ┌──────────────────────────────┐\n                    │  Mumble Server (separate)    │── voice (TCP/UDP :64738)\n                    └──────────────────────────────┘\n```\n\nThe Brmble server bundles ASP.NET Core, Continuwuity (Matrix homeserver) and LiveKit into one image. Mumble runs separately — Brmble does not replace it.\n\n## Install the client\n\nDownload the latest release from \u003chttps://github.com/brmble/brmble/releases/latest\u003e:\n\n- `Brmble-win-Setup.exe` — installer, auto-updates from GitHub releases.\n- `Brmble-win-Portable.zip` — standalone, no install, no auto-update.\n\nWindows 10/11 only. The client embeds WebView2 (installed automatically by the setup if missing).\n\nOn first launch the client generates a self-signed X.509 certificate that becomes your identity across voice, chat and screen sharing. **Back it up via Settings → Export Certificate.** If the certificate is lost, you become a new user with empty chat history, even if you reuse the same Mumble username.\n\n## Install the server\n\nYou need two containers: one for Mumble, one for Brmble. The Brmble container speaks HTTPS directly on port `8080` with a built-in self-signed certificate; the Brmble client trusts it without any extra setup. No browser ever talks to it directly — only the Brmble client does.\n\n### 1. Mumble server\n\nThe official image works as-is, but a few settings matter for the Brmble integration:\n\n```yaml\nservices:\n  mumble:\n    image: mumblevoip/mumble-server:latest\n    restart: unless-stopped\n    ports:\n      - \"64738:64738\"\n      - \"64738:64738/udp\"\n    volumes:\n      - mumble-data:/data\n    environment:\n      # Required for Brmble integration\n      MUMBLE_CONFIG_ALLOWHTML: \"true\"\n      MUMBLE_CONFIG_ICE: \"tcp -h 0.0.0.0 -p 6502\"\n      MUMBLE_CONFIG_WELCOMETEXT: |\n        \u003cbr/\u003eWelcome to my server.\u003cbr/\u003e\n        \u003c!--brmble:{\"apiUrl\":\"https://mumble.example.com:8080\"}--\u003e\n\n      # Recommended (lets Brmble post images, long messages and embeds)\n      MUMBLE_CONFIG_IMAGEMESSAGELENGTH: \"0\"\n      MUMBLE_CONFIG_TEXTMESSAGELENGTH: \"0\"\n      MUMBLE_ACCEPT_UNKNOWN_SETTINGS: \"true\"\n\nvolumes:\n  mumble-data:\n```\n\nKey points:\n\n- **`allowhtml=true`** — required. The Brmble client embeds an HTML comment in the welcome text that points the client to the Brmble server (see below). Mumble strips HTML comments unless HTML is allowed.\n- **`MUMBLE_CONFIG_WELCOMETEXT`** — must include an HTML comment of the form `\u003c!--brmble:{\"apiUrl\":\"https://\u003chost\u003e:\u003cport\u003e\"}--\u003e`, e.g. `https://chat.example.com:8080` or `https://203.0.113.10:8080`. The `apiUrl` host **must match the Mumble server host** the user connected to — if a user connects to `mumble.example.com`, the marker must use `https://mumble.example.com:8080`, not a different hostname. This is how a Brmble client discovers the matching Brmble server when a user connects to your Mumble server. Plain Mumble clients ignore the comment.\n- **`MUMBLE_CONFIG_ICE`** — exposes Mumble's ICE control plane on TCP `6502` so the Brmble server can map Mumble sessions to Matrix users. Bind it to a private network (or the docker-compose internal network) — never expose it to the public internet. Set an ICE secret on Mumble and pass the same value to Brmble via `Ice__Secret` if you need authentication.\n- `IMAGEMESSAGELENGTH` and `TEXTMESSAGELENGTH` default to small values; `0` means unlimited and is required for embeds, link previews and longer messages.\n\n### 2. Brmble server\n\n```yaml\nservices:\n  brmble:\n    image: ghcr.io/brmble/brmble-server:latest\n    restart: unless-stopped\n    ports:\n      - \"8080:8080\"                   # HTTPS (self-signed)\n      - \"7881:7881\"                   # LiveKit RTC TCP\n      - \"50000-50100:50000-50100/udp\" # LiveKit RTC UDP\n    volumes:\n      - brmble-data:/data\n    environment:\n      # Required\n      MATRIX_SERVER_NAME: chat.example.com\n      MATRIX_APPSERVICE_TOKEN: ${MATRIX_APPSERVICE_TOKEN}\n\n      # Optional — connect to your Mumble server's ICE endpoint\n      Ice__Host: mumble\n      Ice__Port: \"6502\"\n      Ice__Secret: \"\"\n\n      # Optional — force LiveKit to advertise a specific public IP\n      # LIVEKIT_NODE_IP: \"203.0.113.10\"\n\nvolumes:\n  brmble-data:\n```\n\nRequired environment:\n\n| Variable | Description |\n|---|---|\n| `MATRIX_SERVER_NAME` | Public Matrix domain. Should match the host clients reach (e.g. `chat.example.com`). Matrix user IDs become `@\u003cid\u003e:\u003cMATRIX_SERVER_NAME\u003e`. Cannot be changed after first start without resetting `/data`. |\n| `MATRIX_APPSERVICE_TOKEN` | Shared secret between the bundled Matrix homeserver and the Brmble backend. Generate with `openssl rand -hex 32`. Keep stable across restarts. |\n\nOptional environment:\n\n| Variable | Default | Description |\n|---|---|---|\n| `Ice__Host` / `Ice__Port` / `Ice__Secret` | `mumble-server` / `6502` / *(empty)* | Mumble ICE endpoint. Without this, Mumble↔Matrix user mapping is disabled. |\n| `LIVEKIT_NODE_IP` | *(auto)* | Pin LiveKit's advertised IP. Useful for local/LAN setups; leave unset on public servers and LiveKit will auto-detect. |\n| `MATRIX_ADMIN_USER` / `MATRIX_ADMIN_PASSWORD` | `brmble-admin` / *(generated)* | Override the auto-created Matrix admin. Generated password is stored in `/data/admin-password`. |\n| `MATRIX_ALLOW_REGISTRATION` | `false` | Set to `true` to allow open Matrix registration after first-run setup. Brmble does not need this — clients register themselves via the appservice. |\n| `CONDUWUIT_STARTUP_TIMEOUT` | `60` | Seconds to wait for the Matrix homeserver on first boot. |\n\nPorts:\n\n- `8080/tcp` — single HTTPS entry point, served with a built-in self-signed certificate. The Brmble client accepts the self-signed cert directly. Map it to a different host port if `8080` is already in use.\n- `7881/tcp` and `50000-50100/udp` — LiveKit RTC. Expose these directly. UDP is what actually carries WebRTC media; TCP `7881` is fallback only.\n\nThe first start runs ~30 seconds while the bundled Matrix homeserver initialises and registers the appservice. State after first start lives entirely in the `brmble-data` volume.\n\n## Connecting the client\n\n1. Open the Brmble client and add a server.\n2. Enter the Mumble host (e.g. `mumble.example.com:64738`) and a username.\n3. On connect, the client reads Mumble's welcome text, pulls the `apiUrl` out of the `\u003c!--brmble:{...}--\u003e` marker, and starts talking to the Brmble server for chat and screen sharing.\n\nA user connecting with a standard Mumble client skips all of the above and gets voice only. They share channels with Brmble users normally — the two client types coexist on the same server without any extra configuration.\n\n## Updating\n\n- **Client**: auto-updates from GitHub releases on installer builds; portable builds need to be replaced manually.\n- **Server**: pull a newer image and recreate the container. The `/data` volume migrates automatically.\n  ```bash\n  docker compose pull brmble \u0026\u0026 docker compose up -d brmble\n  ```\n\n## Building from source\n\nRequirements: .NET 10 SDK, Node 20+, Docker.\n\n```bash\n# Server image\ndocker build -t brmble-server:dev -f src/Brmble.Server/Dockerfile .\n\n# Client (Windows)\ncd src/Brmble.Web \u0026\u0026 npm install \u0026\u0026 npm run build\ndotnet publish src/Brmble.Client/Brmble.Client.csproj -c Release -r win-x64 --self-contained -o publish\n```\n\nFor day-to-day development, see [`CLAUDE.md`](CLAUDE.md) (running the client with hot reload, Docker setup, build commands).\n\n## Repository layout\n\n```\nsrc/Brmble.Server/   ASP.NET backend, Dockerfile, Matrix/LiveKit glue\nsrc/Brmble.Client/   Win32 + WebView2 desktop client\nsrc/Brmble.Web/      React + Vite frontend (rendered inside the client)\nlib/MumbleSharp/     Mumble protocol library (vendored)\ndocker-local/        docker-compose for local dev (Mumble + Brmble)\ndocs/                Architecture notes, specs, integration guides\n```\n\nRelevant docs:\n\n- [`docs/tech-stack.md`](docs/tech-stack.md) — component overview and licensing\n- [`docs/auth-specification.md`](docs/auth-specification.md) — certificate-based identity model\n- [`docs/mumble-integration-guide.md`](docs/mumble-integration-guide.md) — how the client talks to Mumble\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrmble%2Fbrmble","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrmble%2Fbrmble","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrmble%2Fbrmble/lists"}