Overlay de un rosco (estilo Pasapalabra) para usar en stream, con un panel de control separado del overlay que se muestra en OBS. Ambos se sincronizan en tiempo real usando Firebase Firestore, así que pueden estar en pestañas o incluso PCs distintas.
control.html / js/control.js: panel de control. Ahí armás las 25
preguntas del rosco, creás la partida y vas marcando cada letra como
correcta, incorrecta o pasapalabra. Maneja también el cronómetro.overlay.html / js/overlay.js: la vista que agregás como Browser
Source en OBS. Fondo transparente, sin controles visibles una vez
conectada.js/rosco-data.js: las 25 letras del rosco clásico (sin K ni W) y la
plantilla de preguntas.js/state.js: toda la lógica de sincronización con Firestore y del
cronómetro compartido.js/firebase-config.js: acá van las credenciales de tu proyecto de
Firebase (ver configuración abajo).firestore.rules: reglas de seguridad de ejemplo.js/firebase-config.js, reemplazando los valores de ejemplo.firestore.rules y publicá.No hace falta backend propio ni build: es HTML/JS estático que importa el SDK de Firebase directo desde su CDN.
Como usa módulos ES (type="module"), no podés abrir los archivos con
file:// directo — necesitás servirlos por http. Alguna opción simple:
npx serve .
# o
python3 -m http.server 8080
Después abrí:
http://localhost:8080/control.htmlhttp://localhost:8080/overlay.html?room=TUCODIGOPara producción, lo más simple es desplegarlo con Firebase Hosting
(firebase deploy) o subirlo a GitHub Pages / Netlify, ya que es todo
estático.
control.html, completá las preguntas de cada letra (o cargá un
JSON exportado de una partida anterior) y elegí la duración del reloj.C / X / P, con ↑/↓ para
moverte y Espacio para iniciar/pausar el reloj).El overlay se actualiza solo, en tiempo real, sin que tengas que tocar nada en OBS durante la partida.
Para importar/exportar tandas de preguntas:
[
{ "id": "A", "type": "starts", "clue": "Animal doméstico muy fiel", "answer": "Perro" },
{ "id": "B", "type": "contains", "clue": "Fruta con B en el medio", "answer": "Banana" }
]
type puede ser "starts" (Empieza por) o "contains" (Contiene la).