Communitygithub.com

timerise-ai/digital-signage

Habilidad de agente: Construir un módulo de señalización digital — biblioteca multimedia, listas de reproducción por pantalla, registro de pantallas, emparejamiento de dispositivos mediante PIN y URL de aprovisionamiento, reproductor de TV a pantalla completa con recuperación de congelamiento, monitoreo de salud y control remoto — en Next.js App Router con Firestore o Supabase.

¿Qué es digital-signage?

Este skill proporciona una solución completa de señalización digital para pantallas desatendidas en espacios físicos. Está diseñado para Next.js App Router con Firestore o Supabase/Postgres y cubre tanto el panel de administración (gestión de medios, listas de reproducción, registro de pantallas) como el runtime del dispositivo (reproductor a pantalla completa, emparejamiento mediante PIN o URL de aprovisionamiento, polling para obtener contenido). El skill enfatiza robustez para entornos no supervisados: cada pantalla recibe un token único y revocable, la reproducción nunca se detiene (timeouts y manejadores de error en cada elemento multimedia), y el estado operativo se mantiene mediante un canal de polling de 30-60 segundos en lugar de streaming en tiempo real. Incluye reglas estrictas para evitar problemas comunes como la derivación del intervalo de polling desde el estado de render, la sobrecarga de booleanos, la confianza en alcances proporcionados por el cliente, o el uso de tokens compartidos. El módulo completo se construye siguiendo referencias detalladas para modelos de datos, rutas API, emparejamiento, runtime del reproductor, UI de administración y operaciones (salud, previsualización, control remoto). También se incluyen extensiones opcionales como programación por franjas horarias, listas de reproducción compartidas y precarga.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add timerise-ai/digital-signage

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Señalización Digital — Pantallas + Anuncios

Una pantalla en un local no es una página web. Funciona sin supervisión durante meses en un stick de TV barato, nadie mira la consola, y el modo de fallo es un fotograma congelado que nadie nota durante una semana. Cada decisión aquí existe para sobrevivir a eso.

Este skill incluye un módulo completo: CRUD de administración para medios y listas de reproducción, un registro de pantallas, emparejamiento mediante PIN y URL de aprovisionamiento, un reproductor a pantalla completa y la capa operativa (salud, previsualización, control remoto) que lo hace manejable.

Cuándo usar

Construir o extender pantallas que reproduzcan medios en bucle en un espacio físico, en Next.js App Router con Firestore o Supabase/Postgres.

Cuándo NO usar

  • Servicio de anuncios web (impresiones, pujas, píxeles de seguimiento, etiquetas de terceros) — un problema diferente con infraestructura diferente.
  • Quioscos interactivos donde el usuario toca para realizar una transacción. La señalización es unidireccional.
  • Un único video incrustado en una página de marketing. Usa una etiqueta <video>.
  • Configuración genérica de Next.js, CMS o autenticación — se asume que existe.

Arquitectura

 ADMIN (navegador)                     SERVIDOR                      DISPOSITIVO (TV)
 ──────────────────                   ────────                      ───────────────
 subida de medios ──────────────► almacenamiento de objetos ◄──── URL pública/firmada ─┐
 CRUD de anuncios ─────────┐                                                           │
 editar lista de reproducción ──┼──► /api/admin/*  ──► anuncios + pantallas ──┐           │
 emitir comando ───────────┘      (autenticación de personal)  (con ámbito)   │           │
                                                                              ▼           │
 emparejar pantalla ◄──── PIN ────────────► /api/display/pair                │           │
                                              genera token por pantalla     │           │
                                              ▼                                       │
                                             /api/display/playlist ─── sondeo ───┤
                                              ▲ resuelve adIds → anuncios               │
                                              └── lleva telemetría arriba,              │
                                                  comandos abajo                   bucle del reproductor

Un solo tipo de solicitud sostiene todo el runtime: el dispositivo sondea /api/display/playlist, enviando telemetría hacia arriba y recibiendo contenido y comandos hacia abajo. Todo lo operativo viaja por ese canal.

Hechos críticos — leer antes de diseñar nada

  1. La lista de reproducción es un array ordenado en la pantalla, no una entidad separada. display.adIds: string[] es la lista de reproducción — el orden es libre, sin joins, una sola lectura. Introduce una entidad separada de lista de reproducción solo cuando el mismo contenido deba ejecutarse en varias pantallas; consulta modelo-de-datos.md para la compensación y extensiones.md para la migración.
  2. Sondea; no transmitas en streaming. Un sondeo de 30–60 s es más barato, sobrevive a pilas de red inactivas y se reconecta gratis. El tiempo real es una mejora opcional, no la base. Almacena en caché la respuesta con un ETag o pagarás por una lectura completa por pantalla por sondeo.
  3. Las subidas de medios van del navegador al almacenamiento directamente, nunca a través de una ruta de API. Los manejadores de ruta tienen límites de tamaño de cuerpo y queman cómputo al proxyar bytes.
  4. El dispositivo no es confiable y no está supervisado. Almacena una credencial de larga duración en localStorage en hardware al que cualquiera puede acercarse. Esa credencial debe ser por pantalla y revocable.
  5. El reproductor nunca debe poder detenerse. Cada elemento multimedia tiene un tiempo de espera, un manejador de errores y una forma de saltarlo. Un recurso dañado avanza; no se atasca.

Reglas estrictas

Nunca derives el intervalo de sondeo del estado de renderizado. Sondea en un intervalo estable y lee el estado de la diapositiva desde una ref. Un temporizador cuyo efecto depende del índice de la diapositiva se destruye y recrea en cada diapositiva, por lo que una actualización más larga que una diapositiva nunca se ejecutaría; el contrato de comportamiento fija el tiempo del sondeo al tiempo de pared.

Nunca sobrecargues un solo booleano como "pausado" y "eliminado". Usa active para la intención del operador y un deletedAt separado para el ciclo de vida, o un elemento eliminado reaparecerá en cuanto alguien lo active de nuevo.

Nunca confíes en un ámbito de inquilino/ubicación proporcionado por el cliente. Dérivalo en el servidor desde la sesión de personal autenticado o desde la fila de pantalla a la que se resuelve el token, y aplícalo en cada ruta [id] — devolviendo 404, no 403, para que los ids no se puedan sondear.

Nunca emitas un token compartido para cada pantalla. Genera un token por pantalla en el emparejamiento, almacena solo su hash y haz que la revocación sea una única actualización de fila.

Nunca inicies el temporizador de duración de una imagen antes de onLoad. En una TV lenta, la diapositiva expirará antes de que sea visible.

Nunca lleves el estado de pantalla duradero en un comando único. La pantalla en blanco y la toma de control deben sobrevivir a la recarga diaria del dispositivo y a un ciclo de encendido — entrégalos como estado en cada sondeo (mode), y mantén el canal de comandos con confirmación para comandos únicos genuinos como la recarga. Y cualquier comando cuyo efecto sea una recarga debe confirmar su recepción antes de recargar, o el servidor lo reenviará para siempre.

Inicio rápido

  1. Completa el contrato de integración para tu aplicación y confirma el cambio de nombre de dominio — adaptacion.md.
  2. Modela las entidades y elige entre array o tabla de unión — modelo-de-datos.md.
  3. Crea tablas/colecciones, índices, reglas de seguridad y el bucket de medios — backend-firestore.md o backend-supabase.md.
  4. Construye los endpoints del dispositivo y de administración, incluyendo el emparejamiento y la verificación de tokens — rutas-api.md.
  5. Empareja una pantalla — emparejamiento.md — luego incorpora el bucle del reproductor — runtime-reproductor.md.
  6. Construye el back-office: biblioteca multimedia, lista de pantallas, editor de listas de reproducción — ui-admin.md.
  7. Agrega salud, previsualización y control remoto antes de poner en producción — operaciones.md.
  8. Verifica contra la tabla de contrato de comportamiento en runtime-reproductor.md — desconecta el cable de red, elimina el anuncio actual a mitad del bucle, emite una recarga — y envía las pruebas de la máquina del reproductor como cobertura de regresión.

Directorio de referencias

Carga la referencia que coincida con las palabras clave del disparador. Para diseño desde cero, lee modelo-de-datos.md primero.

El código en rutas-api.md y operaciones.md está escrito para Firestore como backend canónico; backend-supabase.md define cada sustitución — la tabla de unión que reemplaza adIds, y los equivalentes SQL de las funciones de servicio.

EscenarioPalabras clave del disparadorReferencia
Integrar esto en una aplicación existenteadaptar, renombrar, integración, inquilino, aplicación anfitrionaadaptacion.md
Entidades, campos, forma de la lista de reproducciónesquema, modelo, Anuncio, Pantalla, lista de reproducción, tabla de unión, eliminación suavemodelo-de-datos.md
Backend Firestore/FirebaseFirestore, firebase-admin, reglas de seguridad, índice compuesto, Firebase Storagebackend-firestore.md
Backend Supabase/PostgresSupabase, Postgres, RLS, migración, bucket de almacenamiento, Tiempo Realbackend-supabase.md
Endpoints, emparejamiento, tokens, almacenamiento en cachéruta API, emparejamiento, PIN, token, ETag, verificación de ámbito, zodrutas-api.md
Cómo emparejar una pantallaemparejamiento, PIN, URL de aprovisionamiento, hub, credencial, desemparejaremparejamiento.md
El bucle del reproductor de TVreproductor, bucle, fundido cruzado, congelamiento de video, rotación, retrato, bloqueo de activación, sin conexiónruntime-reproductor.md
Interfaz de back-officeadministración, subida, biblioteca multimedia, editor de listas de reproducción, URL de aprovisionamientoui-admin.md
Salud, previsualización, control remotolatido, última vez visto, sin conexión, previsualización, recargar, pantalla en blanco, toma de control de emergencia, registro de auditoríaoperaciones.md
Programación, reutilización, informesfranjas horarias, fecha de inicio, campaña, lista de reproducción compartida, prueba de reproducción, precarga, multi-zonaextensiones.md
Por qué las plantillas difieren de un puerto ingenuoprocedencia, libro mayor, justificación, conservado, agregadoprocedencia.md

Skills relacionados