Aplicación de escritorio para gestionar tu transmisión multi‑plataforma desde una sola ventana
Descarga el instalador para tu sistema desde la ultima release:
| Windows | macOS (Intel) | macOS (ARM) | Linux (.deb) |
|---|---|---|---|
.msi |
.dmg |
.dmg |
.deb |
No requiere Node.js, pnpm ni Rust. Descarga, instala y ejecuta.
MultiStream Companion es una aplicacion de escritorio gratuita y open-source que centraliza las herramientas que todo streamer necesita:
- Multichat unificado — Lee y escribe mensajes en Twitch y Kick desde una sola ventana
- Control remoto de OBS Studio — Cambia escenas, inicia o corta tu streaming sin altabear
- Sincronizacion de titulo — Actualiza el titulo de tu directo en todas las plataformas con un solo clic
- Moderacion centralizada — Timeout y ban desde el mismo panel de chat
Esta construida con Tauri v2 (Rust) y Svelte 5 (TypeScript), lo que la hace ligera, rapida y nativa en Windows, macOS y Linux.
███████╗████████╗██████╗ ███████╗ █████╗ ███╗ ███╗███████╗██████╗
██╔════╝╚══██╔══╝██╔══██╗██╔════╝██╔══██╗████╗ ████║██╔════╝██╔══██╗
███████╗ ██║ ██████╔╝█████╗ ███████║██╔████╔██║█████╗ ██████╔╝
╚════██║ ██║ ██╔══██╗██╔══╝ ██╔══██║██║╚██╔╝██║██╔══╝ ██╔══██╗
███████║ ██║ ██║ ██║███████╗██║ ██║██║ ╚═╝ ██║███████╗██║ ██║
╚══════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
MultiStream Companion · v0.1.0 · MIT
Panel principal con control de OBS, sincronizacion de titulo y multichat en vivo.
- Windows: Windows 10+
- macOS: 10.15+
- Linux: Ubuntu 22.04+ o Debian 12+ (requiere
sudo apt install libwebkit2gtk-4.1-dev libsecret-1-dev)
- Node.js 20+ y pnpm
- Rust toolchain (via rustup)
- Linux:
sudo apt install libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libsecret-1-dev
Si solo quieres usar la app, descarga el instalador desde Releases. Si prefieres compilar desde el codigo:
git clone https://github.com/yosoyignicion/MultiStream-Companion.git
cd MultiStream-Companion
pnpm install
python3 generate_logo.py # genera el icono 512×512
pnpm tauri icon ./app-icon.png
pnpm tauri dev # lanza la app en modo desarrolloHaz clic en el logotipo (esquina superior izquierda) para abrir el panel de Ajustes. Ahi deberas introducir las credenciales de cada plataforma. Abajo te explicamos exactamente donde obtener cada una.
https://dev.twitch.tv/console/apps
- Inicia sesion con tu cuenta de Twitch
- Haz clic en "Register Your Application"
- Pon cualquier nombre (ej: "MultiStream Companion")
- En OAuth Redirect URLs escribe
http://localhost - Categoria:
Application Integration - Crea la app y copia el Client ID (texto alfanumerico como
abcdef1234567890abcdef) - Pegalo en Ajustes > Twitch Client-ID
https://twitchtokengenerator.com/
Importante: La app no incluye un flujo OAuth integrado (no abre un navegador por ti). Debes generar el token manualmente.
- Abre el enlace de arriba
- Haz clic en "Generate Token"
- Asegurate de que incluya estos permisos (scopes):
chat:read— para leer el chat via IRCuser:write:chat— para enviar mensajes al chat via Helix APIchannel:manage:broadcast— para cambiar el titulo del directomoderator:manage:banned_users— para moderacion (timeout/ban)
- Copia el token que empieza con
oauth:(ej:oauth:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) - Pegalo en Ajustes > Twitch OAuth Token
Alternativa oficial: puedes generar tu token desde la consola de desarrollador de Twitch usando el Implicit Code Flow:
https://id.twitch.tv/oauth2/authorize?response_type=token&client_id=TU_CLIENT_ID&redirect_uri=http://localhost&scope=chat:read+user:write:chat+channel:manage:broadcast+moderator:manage:banned_users
Normalmente la app detecta automaticamente tu chatroom ID solo con introducir tu Kick Username. Si falla la deteccion automatica:
- Abre tu canal de Kick en el navegador
- Abre las herramientas de desarrollador (F12) > pestana Network
- Recarga la pagina y busca la peticion a
https://kick.com/api/v1/channels/tu_usuario - En la respuesta JSON busca el campo
chatroom.id(es un numero como12345) - Pegalo en Ajustes > Kick Chatroom ID (Bypass)
- Abre OBS Studio
- Ve a Tools > WebSocket Server Settings
- Activa "Enable WebSocket server"
- Puerto por defecto:
4455(debe coincidir con el de la app) - Opcional: activa autenticacion y pon una contrasena
- En Ajustes de la app:
- OBS Host:
127.0.0.1(mismo PC) o la IP local (ej:192.168.1.100) - OBS Port:
4455 - OBS Password: la contrasena que pusiste (o vacio si no usas autenticacion)
- OBS Host:
OBS Studio solo puede transmitir a un destino RTMP a la vez. Para emitir en Twitch y Kick simultaneamente sin duplicar carga en tu PC:
- Crea una cuenta gratuita en Restream.io o StreamElements
- En la plataforma, vincula tus canales de Twitch y Kick
- Copia la URL RTMP unica y la Clave de transmision que te dan
- En OBS Studio > Ajustes > Transmision, selecciona "Servicio Personalizado" y pega esos valores
- La app funciona igual: al pulsar INICIAR DIRECTO, OBS envia una sola senal a Restream y ellos la replican a Twitch + Kick
Ventaja: tu PC solo codifica y sube un stream, no dos. Consumo de CPU y ancho de banda minimo.
| Credencial | Donde se almacena | Campo |
|---|---|---|
| Twitch Client-ID | Archivo JSON (~/.config/com.msc.app/config.json) |
twitch_client_id |
| Kick Username | Archivo JSON | kick_username |
| Kick Chatroom ID | Archivo JSON | kick_chatroom_id |
| OBS Host / Port | Archivo JSON | obs_host, obs_port |
| Twitch OAuth Token | Llavero del sistema (keyring) | twitch_oauth_token |
| OBS Password | Llavero del sistema (keyring) | obs_password |
Las credenciales sensibles (tokens y contrasenas) se guardan en el llavero seguro de tu sistema operativo, no en texto plano.
Una vez configurado todo:
- Ajustes → clic en el logotipo para abrir el panel y escribir tus credenciales
- Conectar OBS → boton grande "Conectar con OBS Studio"
- Conectar Chat → boton "Conectar" en el panel de multichat
- Controlar tu stream:
- Cambia de escena con los botones del panel de escenas
- Inicia o corta tu streaming con el boton rojo/verde
- Escribe un titulo y haz clic en "Sincronizar" para actualizarlo en Twitch
- Moderar → usa los botones 🔇 (timeout) y 🚫 (ban) junto a cada mensaje
┌─ Frontend (Svelte 5 / TypeScript) ─────────────────────┐
│ src/ │
│ ├── main.ts ← arranque de la app │
│ ├── App.svelte ← componente principal UI │
│ ├── lib/ │
│ │ ├── types.ts ← tipos compartidos TS↔Rust│
│ │ ├── stores/chat.svelte.ts ← store reactivo del chat│
│ │ └── components/ ← componentes Svelte │
│ └── (build/) ← salida de produccion │
└──────────────────────────────────────────────────────────┘
│ IPC (invoke / events)
▼
┌─ Backend (Rust) ────────────────────────────────────────┐
│ src-tauri/src/ │
│ ├── main.rs ← builder Tauri, comandos │
│ ├── config/ ← config JSON + keyring │
│ ├── obs/ ← WebSocket OBS (crate obws) │
│ ├── chat/ │
│ │ ├── twitch.rs ← IRC + Helix API │
│ │ └── kick.rs ← Pusher WebSocket v2 │
│ └── services/ │
│ └── stream_info.rs ← metadatos Twitch Helix │
└──────────────────────────────────────────────────────────┘
Flujo de IPC:
- Frontend llama a
invoke('comando', ...)→ Rust#[tauri::command]→ respuesta - Rust emite
app_handle.emit("chat-message", ...)→ frontendlisten('chat-message', ...)→ ChatStore
| Area | Que puedes hacer |
|---|---|
| Multichat | Leer y escribir mensajes en Twitch (IRC + Helix API) y Kick (Pusher WebSocket v2) desde un solo feed unificado |
| Control OBS | Conectar, listar escenas, cambiar de escena, iniciar/detener streaming |
| Titulo unificado | Actualizar el titulo en Twitch (Helix PATCH) y Kick (mock) con un clic |
| Moderacion | Timeout y ban desde el mismo panel de chat |
| Credenciales seguras | Tokens y contrasenas protegidos en el llavero del sistema operativo |
██ Deep Black #050505
██ Crimson Red #FF003C
██ Pure White #FFFFFF
| Comando | Que hace |
|---|---|
pnpm dev |
Frontend solo (Vite en :1420, HMR en :1421) |
pnpm build |
Compila frontend a build/ |
pnpm tauri dev |
Tauri + Vite juntos |
pnpm tauri build |
Compila el binario final |
pnpm eslint src/ |
Lint JS/TS/Svelte |
cargo fmt -p multistream-companion |
Formatea Rust |
python3 generate_logo.py |
Genera el icono 512×512 |
- ESLint + Prettier estan configurados pero sin npm script — ejecutar manualmente
- La app usa Svelte 5 plano (sin SvelteKit) con runes
$state/$derived/$effect - El archivo
.github/workflows/publish.ymlautomatiza el build multi‑plataforma al pushear a la ramarelease
MIT — Ver archivo LICENSE para mas detalles.
