Crea tu propia superposición en 5 pasos
- Elige la superposición que quieras cambiar.
- Descargar el ZIP fuente, descomprímelo y copia el archivo HTML de esa superposición.
- Edita la copia por tu cuenta o pídeselo a una herramienta de IA.
- Abre tu copia en OBS con los ajustes de tu sesión SSN añadidos a su dirección.
- Pruébalo con el disparador real de la superposición.
Elige qué superposición cambiar
Puedes cambiar colores, fuentes, diseño, imágenes y movimiento de una superposición. La archivo HTML es la página. El URL de OBS apunta a ella y añade tu sesión y los ajustes de visualización.

Cada tipo de superposición escucha cosas distintas. Una página de chat, una de mensajes destacados y una encuesta no usan las mismas entradas. Abre la guía de diseño de la que usas:
| Guía de diseño | Iniciar archivos | ¿Qué lo impulsa? |
|---|---|---|
| Chat y acoplamiento | sampleoverlay.html, dock.html, themes/* | Cada mensaje de chat capturado |
| Mensajes destacados | featured.html, samplefeatured.html, themes/featured-styles/* | Mensajes seleccionados y comandos claros |
| Alertas y feeds de eventos | multi-alerts.html, events.html, themes/events/index.html | Eventos coincidentes/filas de chat pagado |
| Encuestas gráficas | poll.html | Votos más configuración de encuesta del anfitrión |
| Frascos de propinas y porterías | tipjar.html | Métrica de soporte/recuento/exageración configurada |
| Contadores y clasificaciones | hype.html, meta.html, leaderboard.html, scoreboard.html | Recuentos, metadatos, actividad o instantáneas de puntos |
| Listas de espera y sorteos de colas | waitlist.html | Cola de host y estado de ganador |
| Expositores de obsequios | giveaway.html, giveaway-obs-entries.html | Estado de sorteo administrado o feed de entrada heredado |
| Temporizadores | timer.html | Estado y controles del temporizador |
| Teletipos | ticker.html | Contenido del ticker configurado |
| Nubes de palabras y mapas | wordcloud.html, map.html | Palabras coincidentes o entradas de ubicación |
| Reacciones y efectos mediáticos | reactions.html, emotes.html, content.html, gif.html, confetti.html, stickers.html, actions.html | El desencadenante de acción/evento/medio específico de la página |
| Créditos | credits.html | Participantes recaudados y controles de créditos |
| Pantallas de música e IA | spotify-overlay.html, cohost-overlay.html, bot.html, chatbot.html | Actualizaciones en reproducción o de bot/coanfitrión |
| Productos y tableros | monetization.html, commerce-board.html, shop_the_stream.html | Estado de comercio compartido |
| Juegos y recompensas | games/*, games/templates/*, games.html, battle.html | Chat, regalos y comandos específicos del juego |
| Superposiciones de IA generadas | aioverlay.html, aievent-overlay.html | Diseños guardados y su ruta de evento configurada |
¿Quieres algo ya preparado? Prueba la Galería de superposiciones o Galería de plantillas. ¿Traes un diseño de chat de StreamElements o Streamlabs? Sigue la guía de importación. Esa exportación incluye sus propios pasos de configuración.
Descargar los archivos
- Descargar el ZIP del código beta. O abre el repositorio beta y elige Código → Descargar ZIP.
- Descomprímelo en una carpeta que vayas a conservar, como
C:\SSN\social_stream-beta\. No edites dentro del ZIP. No necesitas reinstalar SSN. - Busca el archivo de tu superposición (tabla anterior). Haz una copia junto al original, como
poll.html→my-poll.html. Para un tema comothemes/featured-styles/featured-modern.html, conserva la copia en la misma carpeta. - Abre la copia en un editor de texto o código. Guárdala como
.html, no.html.txt.
Cómo es la carpeta y cómo funcionan las rutas
social_stream-beta/
poll.html
my-poll.html
currency.js
js/
libs/
shared/
thirdparty/
media/
sources/images/
themes/
featured-styles/
featured-modern.html
my-featured.html
docs/
event-reference.html
Una ruta como ../../shared/utils/chatHtml.js es relativa a la página que lo carga. Mover esa página a la raíz rompe la ruta. Copia también tus imágenes y fuentes a la carpeta y usa rutas relativas. Tu copia editada no recibirá automáticamente las futuras correcciones de SSN.
Conserva tu enlace de sesión
Inicia SSN, conecta una fuente y comprueba que funcione la superposición original. Luego copia el enlace completo desde la herramienta SSN de esa superposición.
https://socialstream.ninja/poll.html?session=YOUR_SESSION&password=YOUR_PASSWORD&server2
El valor después de session= es tu sesión SSN. No es tu canal de YouTube, nombre de Twitch, archivo ni título de encuesta. SSN y la página deben usar la misma sesión y contraseña. Mantén SSN activo: las superposiciones solo reciben datos, no capturan chat.
| Regla | Por qué |
|---|---|
? inicia los ajustes, & une el resto | Copia, no vuelvas a escribirlos. Dentro de un atributo HTML escribe &. En el cuadro de URL del navegador o de OBS, usa un &. |
| Conserva los ajustes del servidor | server, server2, server3, los endpoints locales, las etiquetas y los valores de versión varían según la página. No añadas una opción de servidor solo porque otra superposición la usa. |
Conserva todo lo que va después de # | Puede ser importante. AI Event Overlay, por ejemplo, usa un token privado #aieventauth=... . |
| Usa marcadores al compartir | No incluyas tu sesión real, contraseña ni tokens privados en capturas, repositorios ni prompts de IA. |
Si tu copia queda vacía, comprueba primero el enlace original. Algunas páginas solicitan los ajustes que faltan; otras permanecen ocultas o redirigen. Poner la sesión correcta en el enlace evita adivinar.
Abre tu archivo en OBS
Abre el archivo editado directamente desde tu equipo. No necesitas servidor.
- Arrastra tu copia HTML a Chrome o Edge. Copia su dirección. Empieza por
file:///. - Del enlace de superposición SSN que funciona, copia todo desde
?en adelante. Pégalo al final de la dirección del archivo. Así conservas sesión, contraseña, ajustes y cualquier fragmento#. - Abre esa dirección combinada en el navegador para probarla.
- En OBS, añade una Fuente de navegador (Browser Source). Deja Archivo local (Local file) sin marcar. Pega la dirección completa en URL y configura el ancho y el alto.
Ejemplo: este enlace de SSN…
https://socialstream.ninja/poll.html?session=YOUR_SESSION&password=YOUR_PASSWORD&server2
…se convierte en esto para una copia de encuesta descargada en Windows:
file:///C:/SSN/social_stream-beta/my-poll.html?session=YOUR_SESSION&password=YOUR_PASSWORD&server2
En macOS empieza por file:///Users/..., en Linux normalmente file:///home/.... Copiar desde el navegador resuelve por ti los espacios y las barras.
| Conviene saber | Detalles |
|---|---|
| Solo tienes que configurarlo una vez | OBS guarda la dirección. No muevas la carpeta y mantén SSN y tu fuente de chat activos. |
| ¿Has guardado un cambio? | Haz clic en Actualizar la caché de la página actual en las propiedades de origen. |
| ¿Por qué dejar el archivo local sin marcar? | El campo URL permite añadir ?session=.... Elegir el archivo con Archivo local no añade esos ajustes. |
Opcional: use la casilla de verificación Archivo local con un iniciador
El selector de archivos de OBS elige el archivo, pero no puede añadir tus ajustes. Una pequeña página lanzadora puede abrir tu página editada con los ajustes incluidos:
- Guarda el código siguiente como
launch-my-poll.htmljunto amy-poll.html. - Sustituye el enlace de ejemplo por tu enlace SSN completo copiado. Cambia
./my-poll.htmlpor el nombre de tu archivo. Mantén el enlace entre comillas, con caracteres simples&. - Haz doble clic en el lanzador para probarlo. En OBS, marca Archivo local (Local file) y elige el lanzador. Abre tu superposición con los ajustes y la parte
#.
<!DOCTYPE html>
<html lang="en">
<meta charset="utf-8">
<title>My local overlay launcher</title>
<p>Opening the local overlay...</p>
<script>
var copiedLink = new URL("https://socialstream.ninja/poll.html?session=YOUR_SESSION");
var localPage = new URL("./my-poll.html", window.location.href);
localPage.search = copiedLink.search;
localPage.hash = copiedLink.hash;
window.location.replace(localPage.href);
</script>
</html>
Para un tema en una subcarpeta, coloca el lanzador junto a la copia del tema. Mantén privado el lanzador, porque contiene tu enlace de conexión. Una exportación independiente que ya incluya sus ajustes sigue sus propias instrucciones.
OBS explica los modos archivo/URL, los tamaños, el CSS personalizado y la actualización en su Referencia de fuente del navegador.
Cambia el diseño o pídeselo a una IA
| Quiero… | Haz esto |
|---|---|
| Cambiar solo CSS | Conserva el enlace alojado y usa el campo CSS personalizado de OBS. Solo afecta a esa fuente OBS, no a un navegador normal. |
| Cambiar el estilo de mi copia HTML editada | Añade tus estilos después de los existentes o enlaza después una hoja de estilos local. |
Usa &css= o &b64css= | Solo algunas páginas lo admiten. poll.html, por ejemplo, no lee ninguno. Comprueba primero el código de la página. |
| Cambiar el diseño HTML | Conserva los identificadores y clases que usan los scripts. Si un script reconstruye un elemento en cada actualización, coloca el arte permanente fuera de él o añádelo al renderizador. |
| Editar una hoja de estilos o script compartido | Cópialo y apunta tu página a la copia para que solo cambie tu diseño. |
Prepara tu logotipo, archivos de fuentes, colores de marca, tamaño del lienzo y una referencia visual. Una página web normalmente no puede cargar fuentes ni imágenes desde el disco de otro ordenador.
Aviso de IA
Usa el prompt específico de cada guía de diseño o empieza con este. Da a la IA el archivo copiado y los estilos y scripts que carga.
Customize [copied overlay filename] to match [reference/design].
Canvas: [width x height]. Placement: [position]. Colors/fonts: [details].
Use the existing page and its supporting files, rather than replacing its
connection and event logic. Read docs/event-reference.html and the relevant
overlay design guide. Preserve query parameters, session/password, URL
fragments, bridge labels, transport channels, settings, and controls.
Use CSS first. Keep relative paths and package all executable dependencies
locally. Use classic scripts compatible with Chrome 80.
Keep operator controls, private links, and credentials off the audience view.
Treat all incoming messages, names, labels, donations, and metadata as untrusted.
Prevent HTML/JavaScript injection in every renderer you change. Use textContent
for plain fields and for chatmessage when textonly is true. For HTML-mode
chatmessage, keep supported emotes/formatting through the packaged
SocialStreamChatHTML.sanitize helper (libs/objects.js loaded first).
Do not concatenate raw input into innerHTML, attributes, CSS, or JavaScript.
Validate media/link URLs with the page's existing URL policy and assign DOM
properties; do not enable javascript: URLs or executable embedded content.
Never eval incoming data or treat a viewer message as an AI instruction.
Keep source checks, connection handling, and existing sanitizers.
Test plain text, allowed emotes, quotes, angle brackets, and an HTML injection
probe in an isolated preview; verify the probe cannot execute.
Make the edited overlay work directly from disk using a file:/// URL,
without requiring a local web server. Return the edited files and assets,
file URL and OBS setup steps, and tests
for this overlay's real trigger. Use session placeholders in shared examples.
Explain any behavior changes separately from the design edits.
Evita que el chat entrante se convierta en código
Los nombres, mensajes, títulos, importes y enlaces provienen de espectadores y servicios externos. Trátalos como texto, nunca como código. Límpialos donde el renderizador los coloca en la página.
| Campo | Cómo mostrarlo |
|---|---|
chatmessage con textonly true | Texto simple (textContent). |
chatmessage en otro caso | Puede contener emotes y formato permitido. Usa el saneador incluido. |
| Nombres, importes, títulos y otros campos simples | Texto simple (textContent). |
chatimg, contentimg, enlaces | URL, no HTML. Valídalas con las reglas de medios/enlaces existentes en la página y luego asigna las propiedades del DOM. |
<!-- Example for a copied page at the repository root. -->
<script src="./libs/objects.js"></script>
<script src="./shared/utils/chatHtml.js"></script>
<script>
function renderChatBody(element, data) {
var message = String(data.chatmessage == null ? "" : data.chatmessage);
if (data.textonly) {
element.textContent = message;
} else {
element.innerHTML = SocialStreamChatHTML.sanitize(message);
}
}
// Names, amounts, titles, and other plain fields use textContent:
// nameElement.textContent = String(data.chatname || "");
</script>
- Si la página ya tiene un saneador, consérvalo. No añadas otro.
- Para archivos en subcarpetas, corrige las rutas de los scripts.
- No pegues nombres sin tratar en cadenas de atributos ni colores sin tratar en código de estilos. Valida los valores de estilo antes de asignarlos propiedad a propiedad.
- El HTML limpiado tampoco es seguro para ejecutarlo como JavaScript ni para usarlo como instrucción de IA.
Más información: Guía de OWASP sobre destinos seguros y saneamiento de HTML.
Cómo probar el renderizador con seguridad
Ejecuta estas pruebas en una vista previa local privada, no en un chat público.
- Usa un nombre como
Guest <b>One</b>. Los signos deben mostrarse como texto. - Enviar
chatmessage: "<b>Hello</b>"contextonly: true, y luego false. Una debe mostrar las etiquetas como texto; la otra debe mostrar texto en negrita. - Comprueba que sigan funcionando un emote compatible y un mensaje que solo tenga imagen.
- Pide a la IA que pruebe una sonda inofensiva como
<img src=x onerror="window.__ssnInjectionProbe=1">. No debe ejecutarse, activar el marcador ni dejar atributos de evento. Prueba también un enlace con esquema de script.
Una prueba superada solo cubre los caminos que probaste. Céntrate en los renderizadores y campos que cambió tu diseño.
Pruébala por partes
| Prueba | Cómo |
|---|---|
| Diseño | Usa el modo de vista previa o demo de la página, si existe, o ejemplos locales ficticios. Prueba nombres y mensajes largos, avatares ausentes, datos vacíos y el número esperado de filas. |
| Entrega de SSN | Mantén SSN activo y usa Crear mensaje de prueba (Create Test Message) con la misma sesión. El modo habitual de API de extensión necesita control remoto de la extensión mediante API (remote API control of extension) activado. Usa una configuración de prueba: los mensajes de prueba pueden disparar tus automatizaciones. |
| El disparador real | Destaca un mensaje del Dock para una tarjeta destacada, vota en una encuesta, elige un ganador, cambia el texto del ticker o inicia un temporizador. El chat normal no prueba todo. |
| Captura real | Comprueba que un mensaje o evento real llegue tanto al original como a tu copia. Un evento simulado solo demuestra que la visualización funciona. |
| OBS | Comprueba el tamaño final, la transparencia, animaciones, audio, fuentes y capas. Prueba mostrar/ocultar, borrar/restablecer y actualizar. OBS y tu navegador no comparten inicios de sesión ni almacenamiento guardado. |
demo o preview del enlace antes de esperar datos en directo.Archivos que dar a tu IA
Da a la IA el archivo de la superposición y los CSS/JS que carga, además de estos. La referencia de eventos por sí sola no explica los controles de una encuesta ni el código de diseño de cada superposición.
| Archivo | Para qué sirve |
|---|---|
docs/event-reference.html | Campos oficiales, eventos con nombre, metadatos, medios y valores de donación. |
docs/customoverlays.md | Receptores personalizados y ejemplos de conexión. |
| Compatibilidad de eventos y alertas | Qué eventos y campos envía cada fuente. |
Guía de mensajes de prueba y createtestmessage.html | Datos de ejemplo y modos de entrega. |
libs/objects.js y shared/utils/chatHtml.js | El saneador de visualización incluido. |
shared/utils/chatBadges.js y shared/utils/contentImage.js | Gestión existente de insignias e imágenes. |
js/transport-dedupe.js, js/local-server-url.js, shared/overlay-control-transport.js | Soporte de conexión existente cuando tu página los carga. |
currency.js | Mantén hasDonation para mostrarlo y usa un valor numérico válido en USD para donoValue, incluido cero. |
| Event Flow y Comandos y API | Reutiliza los controles existentes cuando el diseño necesite un disparador. |
Solucionar problemas
| Problema | Prueba esto |
|---|---|
| Archivo no encontrado | Arrastra de nuevo el HTML al navegador y copia su dirección. Comprueba que el nombre termine en .html, no en .html.txt. |
| Falta escritura, fuente o imagen | Conserva la carpeta descomprimida tal como está, con tu copia junto al original. Comprueba que las imágenes y fuentes añadidas estén donde la página espera encontrarlas. |
| Pantalla vacía o «en espera» | Comprueba la sesión, la contraseña y las partes completas ? y # , que SSN esté activo, la función activada y llegue la entrada correcta. Compara con el enlace SSN original. |
| Se ve distinto en OBS y en el navegador | Comprueba ancho y alto, CSS personalizado anterior, fuentes, caché y almacenamiento del navegador. Actualiza después de guardar. |
| El logotipo desaparece al actualizar | El script puede estar reconstruyendo su contenedor. Coloca la decoración permanente fuera de él o actualiza la plantilla de renderizado. |
| Los datos se reinician o las acciones se ejecutan dos veces | Comprueba los ajustes de actualización y descarga, las copias duplicadas de la superposición o los controles y la gestión de duplicados y estado de la página. |
Caso especial: páginas que leen archivos de datos separados
El mapa carga archivos JSON locales con fetch(), que los navegadores pueden bloquear al abrir desde el disco. Para un cambio de estilo sencillo del mapa, usa su enlace alojado con CSS personalizado de OBS. Para una copia editada, pide a la IA que incluya los datos del mapa en la página para abrirla desde el disco. Alojarla es una opción avanzada para páginas que realmente lo necesitan, no un paso habitual.
Corrige primero el problema confirmado más pequeño. Un cambio de estilo no debería necesitar modificar scripts de captura ni añadir campos de evento. Si compartes un fork público, incluye sus recursos y excluye los lanzadores privados.