Web based Mumble client, powered by WebRTC
  • JavaScript 71.5%
  • Go 28.3%
  • Shell 0.2%
Find a file
2026-10-08 00:06:37 +02:00
bridge docs(bridge): document trust APIs and verify bounded decoder 2026-10-07 23:13:31 +02:00
deploy feat(deploy): persist bridge egress with an atomic dedicated service 2026-10-08 00:06:37 +02:00
docs feat(deploy): persist bridge egress with an atomic dedicated service 2026-10-08 00:06:37 +02:00
public fix(ui): serve a local application icon without missing requests 2026-10-07 10:56:11 +02:00
src fix(connection): wait between retries and stop after three attempts 2026-10-07 23:35:34 +02:00
tests fix(connection): wait between retries and stop after three attempts 2026-10-07 23:35:34 +02:00
.env.example docs(bridge): document trust APIs and verify bounded decoder 2026-10-07 23:13:31 +02:00
.gitattributes Initial commit 2026-10-07 09:52:04 +02:00
.gitignore build: add lightweight Vite tooling and pinned protocol codecs 2026-10-07 10:14:13 +02:00
index.html fix(ui): serve a local application icon without missing requests 2026-10-07 10:56:11 +02:00
package-lock.json feat(audio): add local RNNoise suppression before VAD and Opus 2026-10-07 21:04:00 +02:00
package.json docs(bridge): document trust APIs and verify bounded decoder 2026-10-07 23:13:31 +02:00
README.md docs: record final feature coverage and deployment verification 2026-10-07 23:30:31 +02:00
THIRD_PARTY_NOTICES.md docs(bridge): document trust APIs and verify bounded decoder 2026-10-07 23:13:31 +02:00
vite.config.js feat(client): wire live Mumble UI and preserve private voice intent 2026-10-07 10:52:47 +02:00

MumbWeb

Mumble en el navegador, con canales, chat y voz Opus. Una interfaz familiar, sin instalar nada en el equipo del usuario.

MumbWeb: canales, usuarios y chat en la vista de escritorio

Captura de la demo local. Los nombres y mensajes son ejemplos; no hay conexión ni audio de un servidor público.

El cliente usa JavaScript, AudioWorklet y libopus WASM. El puente Go conecta WebSocket con Mumble por TLS y conserva los paquetes Opus, sin mezclarlos ni transcodificarlos. No hay framework de UI, fuentes externas ni CDN. El códec se carga al conectar.

Qué incluye

  • Canales, chat público y privado, movimiento de usuarios con ratón, tacto o selector de canal, según permisos. En móvil, canales con ancho completo y conversación inferior plegable; en escritorio, ancho del chat ajustable.
  • PTT sin activaciones accidentales al soltar Espacio, activación por voz con medidor y umbral, RNNoise opcional antes de Opus, volumen por usuario, susurros morados y escucha de canales adicionales.
  • Tema automático, claro u oscuro; estadísticas agrupadas de usuario y servidor; imágenes externas mediante el puente, con descarga y memoria acotadas.
  • Recepción mono/estéreo a 48 kHz, paquetes de hasta 120 ms y emisión ajustable de 6 a 400 kbps, dentro del presupuesto del servidor.
  • Conexiones guardadas y preferencias locales. Las contraseñas y tokens no se guardan.
  • Castellano, inglés, catalán y valenciano, elegidos a partir del idioma del navegador.
  • Pasarela con catálogo y servidores públicos arbitrarios validados, cuotas configurables, certificado propio por cuenta, favoritos en el servidor y consola administrativa local.

El proyecto está en desarrollo. La matriz de cobertura distingue las funciones verificadas de las pendientes; todavía no tiene la cobertura del cliente oficial de escritorio. El análisis de alternativas explica las decisiones de arquitectura.

Probar en local

Necesitas Node.js 22.12+, npm y Go 1.24+, además de un servidor Mumble.

npm ci
npm run dev

En otra terminal, si Mumble tiene un certificado con CA y hostname válidos:

MUMBLE_HOST=mumble.example.net npm run bridge

Abre http://127.0.0.1:5173. Pulsa Conectar, indica el servidor y tu nombre. La pasarela local se configura automáticamente; puedes cambiarla en Opciones avanzadas. Explorar demo permite ver la interfaz sin servidor.

Para destinos públicos arbitrarios con certificado autofirmado, el diálogo muestra la huella SHA-256 antes de conectar y exige aceptarla explícitamente; una huella cambiada exige una nueva confirmación. Los destinos del catálogo conservan la política TLS del operador. La configuración del puente explica certificados, identidades y destinos autorizados.

Desplegar

La guía de despliegue incluye un servicio systemd, NGINX con HTTPS/WSS, cuotas por IP, restricciones de salida y monitorización con alertas. Los archivos de ejemplo están en deploy/.

La web y la pasarela pueden compartir origen: el usuario sólo ve servidor, nombre y contraseña. Admite invitados y cuentas opcionales con certificado Mumble individual y servidores guardados en el puente. El servidor Mumble conserva su autenticación y sus permisos. La guía de cuentas y consola explica su configuración.

Ver el diálogo de conexión.

Confía en el operador de la pasarela. El cifrado termina allí y vuelve a establecerse hacia Mumble: el operador puede acceder a voz, chat y credenciales. Utiliza un nombre alternativo y nunca una identidad administrativa compartida.

El modo público admite servidores públicos validados fuera del catálogo; puede cerrarse al catálogo con ALLOW_ARBITRARY_TARGETS=false. Comprobar que un servicio responde como Mumble no da permiso para usarlo ni evita abusos contra él. Las defensas limitan el riesgo; un servicio anónimo sigue necesitando supervisión y acuerdos con los administradores de destino. La guía explica los límites y los criterios para bloquear o retirar un servidor.

Desarrollo y pruebas

npm test
npm run test:bridge
npm run build

Las pruebas de interoperabilidad y navegador necesitan un servidor desechable; algunas crean canales y usan permisos administrativos. Las instrucciones y resultados están en verificación.

El protocolo vive en src/protocol/, el audio en src/audio/, la interfaz en src/ui.js y la pasarela en bridge/. Se conservan las licencias y procedencia del protocolo Mumble y de libopus en THIRD_PARTY_NOTICES.md.

Más detalle: uso y funciones · estadísticas y unidades · audio y límites de red · configuración del puente.