Guía: Montar un visor de partidas de ajedrez en vivo
Requisitos Previos 📋
- Servidor de partidas: Un servidor TLCS (Tom’s Live Chess Server) activo que transmita las partidas en tiempo real. Esto puede lograrse con software de broadcasting compatible TLCS (por ejemplo, Arena GUI o ChessBase) o con CuteChess CLI adaptado para emitir jugadas en protocolo TLCSjccrl.com.
- Node.js: Tener instalado Node.js en el servidor donde correrá el visor. Se recomienda usar la versión LTS (por ejemplo Node 18.x)jccrl.com. También se sugiere instalar el administrador de procesos PM2 para ejecutar el visor en segundo plano (opcional)jccrl.com.
- Entorno del servidor: Puede ser Windows (p.ej. un servidor HP ProLiant con Windows Server) o Linux (un VPS Linux). Asegúrese de tener acceso de administrador para instalar dependencias y abrir puertos de red necesarios.
1. Instalación de Node.js y descarga de node-tlcv
- Instalar Node.js: En el servidor local (HP ProLiant) instale Node.js desde el sitio oficial. Use la versión LTS estable (por ejemplo 18.x)jccrl.com. En Windows, obtenga el instalador MSI; en Linux, use el gestor de paquetes (ej.
apt-get install nodejs npmen Debian/Ubuntu). Verifique la instalación con:node --versionynpm --version. - Obtener el código de node-tlcv: Descargue el visor web node-tlcv (implementación en Node de Tom’s Live Chess Viewer). Puede clonar el repositorio GitHub o bajar un zip:
git clone https://github.com/jhonnold/node-tlcv.git cd node-tlcvEsto creará la carpetanode-tlcvcon el código fuentejccrl.com. - Instalar dependencias: Dentro del directorio
node-tlcv, ejecute el comando de NPM para instalar las librerías necesarias:npm installEste paso descargará todos los paquetes requeridos (por ejemplo, Express, WebSocket, etc.) definidos enpackage.jsonjccrl.com.
2. Configuración de node-tlcv
Una vez instalado, hay que configurar node-tlcv para que se conecte a la fuente de partidas (TLCS) y sirva la interfaz web correctamente:
- Archivo de configuración: Cree el archivo
config/config.json(si no existe). En este JSON se indican las conexiones al servidor TLCS y el puerto web del visor. Por ejemplo:{ "connections": ["localhost:16001"], "port": 8080 }En"connections"debe listar la dirección host:puerto donde escucha su servidor TLCS. Por ejemplo, si el servidor TLCS (que emite las partidas) corre en el mismo equipo en el puerto 16001 (por defecto de TLCS), usar"localhost:16001". Puede agregar múltiples fuentes TLCS en la lista si fuera necesariojccrl.comjccrl.com. El campo"port": 8080indica que el visor web usará el puerto 8080 (puede cambiarlo si 8080 está ocupado). - Archivo de entorno (.env): En la raíz del proyecto
node-tlcv, cree un archivo llamado.envpara configurar credenciales y variables sensibles. Añada al menos:TLCV_PASSWORD=UnaContraseñaSegura ADMIN_USERNAME=admin # opcional, usuario admin por defectoAquí define la contraseña para el panel de administración web de node-tlcv (usuario por defecto “admin”)jccrl.com. Guarde este archivo. - Configuración de red: Asegúrese de abrir los puertos necesarios:
- El puerto TLCS (por defecto 16001) en el servidor local debe aceptar conexiones entrantes desde node-tlcvjccrl.com. Si TLCS y node-tlcv están en la misma máquina, esto no requiere apertura externa, pero sí que TLCS esté activo escuchando en ese puerto.
- El puerto web de node-tlcv (por defecto 8080) debe permitirse en el firewall para acceso externojccrl.com. En Windows, puede crear una regla de firewall para habilitar TCP 8080; en Linux, use
ufwu otro firewall para abrirlo. Si el visor se accederá desde internet (por iframe), configure también el enrutador para hacer port forwarding del 8080 hacia el servidor local (y considere usar una IP estática o DNS dinámico para alcanzarlo)jccrl.com.
- Imágenes de piezas (♟️): El visor web utiliza la librería Chessboard.js para renderizar el tablero, la cual espera encontrar las imágenes de las piezas de ajedrez en una ubicación específica. Sin estas imágenes, el tablero aparecerá vacío (sólo casillas) y en la consola se verán errores 404 al buscar los PNG. Para evitarlo:
- Descargue las imágenes de piezas de Chessboard.js (estilo “wikipedia”). Puede obtenerlas del repositorio oficial: ruta
website/img/chesspieces/wikipedia/en el proyecto Chessboard.jsstackoverflow.com. Son 12 archivos PNG estándar (rey, dama, torre, alfil, caballo, peón en blanco y negro, nombradoswK.png,wQ.png, …,bP.png). - En la carpeta de
node-tlcv, cree el directoriopublic/img/chesspieces/wikipedia/(dentro depublic/). Coloque allí los archivos PNG de las piezas. Ejemplo de estructura resultante:node-tlcv/ ├── config/ │ └── config.json ├── public/ │ ├── client.js (archivo cliente generado al compilar) │ └── img/ │ └── chesspieces/ │ └── wikipedia/ │ ├── wK.png (rey blanco) │ ├── wQ.png (dama blanca) │ ├── wR.png (torre blanca) │ ├── wB.png (alfil blanco) │ ├── wN.png (caballo blanco) │ ├── wP.png (peón blanco) │ ├── bK.png (rey negro) │ ├── bQ.png (dama negra) │ ├── bR.png (torre negra) │ ├── bB.png (alfil negro) │ ├── bN.png (caballo negro) │ └── bP.png (peón negro)Estas rutas deben coincidir exactamente con las que busca Chessboard.js por defecto (por ejemplo,.../img/chesspieces/wikipedia/wK.pngpara el rey blanco)stackoverflow.com. Una vez copiados, el visor podrá cargar las piezas sin errores.
- Descargue las imágenes de piezas de Chessboard.js (estilo “wikipedia”). Puede obtenerlas del repositorio oficial: ruta
3. Compilación y ejecución del visor node-tlcv
Con la configuración lista, proceda a construir y lanzar el servidor de visualización:
- Compilar la aplicación: Node-tlcv está escrito en TypeScript, por lo que primero se debe transpilar a JavaScript. Ejecute en la carpeta del proyecto:
npm run buildEsto generará el código compilado en la carpetabuild/listo para ejecutarsejccrl.com. - Iniciar el servidor de visor: Hay dos modos: en primer plano (útil para pruebas) o como servicio en segundo plano:
- Modo directo: Inicie el servidor manualmente con Node:
node build/src/main.jsMantendrá la consola abierta mostrando logs (útil para depurar)jccrl.com. - Modo servicio: Use PM2 u otro gestor para correr en background. Por ejemplo, si tiene pm2 instalado globalmente:
pm2 start build/src/main.js --name "tlcv-viewer"Esto ejecutará node-tlcv como un proceso demonizado con el nombre tlcv-viewer. Puede añadirpm2 savepara guardar la configuración ypm2 startuppara arrancar automáticamente al iniciar el sistemajccrl.com.
- Modo directo: Inicie el servidor manualmente con Node:
- Verificar funcionamiento: Una vez iniciado, el visor quedará escuchando en el puerto configurado (8080 por defecto). Compruebe estos puntos:
- Abra un navegador en el servidor local y visite
http://localhost:8080. Debería cargar la página del visor. Si aún no hay partidas, verá probablemente un mensaje de “Waiting for connection” o similar. Esto indica que el servidor web está activojccrl.com. - Mire la consola/registro donde corre node-tlcv. Cuando logra conectarse a la fuente TLCS, debería aparecer un log tipo:
[INFO] Connected to localhost:16001confirmando la conexión al servidor TLCSjccrl.com. También es buena señal ver heartbeats periódicos que envía/recibe el TLCS. - Panel de administración: Pruebe acceder a
http://<IP>:8080/admindesde un navegador. Ingrese el usuario (por defectoadmin) y la contraseña definida en el.env. Debería ver el dashboard de administraciónjccrl.com. Desde allí puede monitorear conexiones, enviar mensajes, etc., aunque para una operación básica no es necesario cambiar nada.
- Abra un navegador en el servidor local y visite
- Interfaz del visor: Cuando haya una partida en curso alimentando TLCS, la página principal (
http://<IP>:8080) mostrará el tablero de ajedrez con las piezas en la posición actual y la lista de jugadas realizadas. La interfaz imita a la de Tom’s Live Chess Viewer: las jugadas se añaden en tiempo real y el tablero se actualiza tras cada movimiento. (Asegúrese de que el TLCS efectivamente está transmitiendo las jugadas; de lo contrario el tablero permanecerá estático en la posición inicial).
4. Integración de las partidas en vivo desde CuteChess CLI
El desafío principal es conectar las partidas generadas por CuteChess CLI al sistema TLCS/TLCV para que sean visibles en el visor web:
- Entender TLCS vs PGN estático: Node-tlcv funciona en vivo, es decir, espera recibir las jugadas a medida que ocurren mediante el protocolo TLCS (un servicio de streaming de partidas). No basta con tener archivos PGN guardados; se necesita un proceso que envíe cada movimiento al instante. TLCV fue concebido como cliente de TLCS, por lo que node-tlcv actúa como un puente: se conecta a un servidor TLCS y retransmite los datos vía WebSocket a los navegadoresjccrl.com.
- Opciones para obtener un feed TLCS de CuteChess: Por defecto, CuteChess CLI no incluye salida TLCS nativa. Sin embargo, hay varias formas de lograrlo:
- Usar un servidor TLCS auxiliar (Arena, ChessBase): Una opción es ejecutar el torneo con una GUI que sí pueda emitir TLCS. Por ejemplo, Arena Chess GUI puede observar partidas o gestionar un match y transmitirlo en vivo vía TLCS (puerto 16001) en la LANjccrl.com. También ChessBase tiene un módulo TLCS. En este enfoque, podría configurar Arena con los mismos motores, time controls, etc., para duplicar el torneo de CuteChess o reproducir las partidas, y habilitar su función de LAN Broadcast. Node-tlcv se conectaría a Arena (host:16001) como fuente. Nota: Arena requiere interfaz gráfica, pero en un servidor Windows es viable.
- Wrapper o script personalizado para CuteChess: Alternativamente, implementar un pequeño programa que lea la salida de CuteChess CLI y la envíe a un socket TLCS. En los requisitos se menciona la posibilidad de “wrappers personalizados como cutechess-cli con salida TLCS”jccrl.com. Esto podría hacerse, por ejemplo, ejecutando CuteChess CLI con opción
-debugpara ver cada jugada en texto y, a cada movimiento, formatearlo y enviarlo al puerto TLCS adecuado. Esta es una solución de programación personalizada (no proporcionada de fábrica), pero algunos entusiastas han logrado integrar CuteChess con TLCS de esta manera. Si opta por este camino, asegúrese de respetar el formato TLCS en los mensajes (consulte especificaciones TLCS si fuera necesario). - Sin TLCS (no recomendado para vivo): Si no dispone de manera de emitir TLCS, la alternativa sería mostrar partidas ya terminadas cargando el PGN tras cada juego. Por ejemplo, hay plugins WordPress que leen un archivo PGN actualizado periódicamentejccrl.com. No obstante, esto no mostrará jugada a jugada en tiempo real, sino que actualizaría la partida una vez finalizada o cada X segundos, y no utiliza node-tlcv. Dado que el objetivo es un visor en vivo estilo Tom’s, es altamente preferible implementar alguna de las soluciones TLCS anteriores para obtener una transmisión continua.
- Configuración de CuteChess CLI: Continúe usando CuteChess CLI para automatizar sus torneos (por ejemplo, con
-games,-engineetc.). Configure la salida PGN (-pgnout) para guardar partidas en un archivo local si desea archivarlas, pero paralelamente habilite el mecanismo TLCS de su elección. Por ejemplo, si usa Arena como puente, puede indicarle que cargue (o escuche) las partidas de CuteChess. Una forma práctica es hacer que CuteChess CLI escriba en un archivo PGN en una ubicación conocida, y tener Arena con la opción “Read Game from file” (o similar) para seguir la partida, la cual luego Arena retransmite via TLCS. Cada vez que CuteChess haga una jugada, Arena la verá y la emitirá a los espectadores TLCS (node-tlcv) en tiempo real.
En resumen, node-tlcv necesita un flujo TLCS en vivo de las partidas. Asegúrese de proveerlo ya sea usando una GUI auxiliar (Arena/ChessBase) o una modificación de CuteChess CLI. Una vez logrado esto, node-tlcv recibirá las jugadas y su página web mostrará el tablero y movidas sincronizadas con el juego que esté corriendo en CuteChess CLI.
5. Publicación en la web y visualización mediante iframe
Ahora, para mostrar el visor en su sitio web (ijccrl.com), existen dos modalidades. La preferida es usar un iframe apuntando al visor en el servidor local, delegando la carga de trabajo allí.
Opción 1: Embeber vía iframe (visor en servidor local)
En esta opción, node-tlcv sigue corriendo en el servidor HP ProLiant local (por ejemplo en su red doméstica/oficina), y usted inserta un iframe en la página web pública que carga el contenido desde ese servidor:
- Asegurar accesibilidad: El servidor local debe ser accesible desde internet. Esto típicamente implica tener una IP pública o DNS apuntando a su red, y haber hecho port-forward del puerto 8080 en el router hacia la máquina local. Compruebe que puede acceder a
http://<su-ip-pública>:8080desde fuera (por ejemplo, probando con datos móviles). Si el acceso externo no es posible (por CG-NAT u otras restricciones), tendrá que optar por la Opción 2 (ejecutar en el VPS). - Insertar el iframe: En el código HTML de su página (por ejemplo, en WordPress podría ser un bloque HTML personalizado), agregue algo como:
<iframe src="http://<IP-o-dominio-del-ProLiant>:8080" width="800" height="600" frameborder="0" allowfullscreen> </iframe>Esto creará un marco en la página que mostrará la interfaz del visor cargada desde su servidor local (puerto 8080)jccrl.com. Ajuste elwidthyheightsegún el tamaño deseado del tablero/visor. Puede también usar estilos CSS para hacerlo responsive si lo necesita. - HTTPS y contenido mixto: Si su sitio ijccrl.com usa HTTPS, es importante que el contenido del iframe también lo haga; de lo contrario, los navegadores bloquearán el “mixed content”. Puede resolver esto de dos formas:
- Configurando un certificado SSL en su servidor local (por ejemplo, usando Let’s Encrypt si tiene un nombre de dominio apuntando al mismo, o un túnel tipo Cloudflare). Luego el iframe
srcseríahttps://.... - Proxy inverso en el VPS: Una alternativa es crear un subdominio o ruta en su propio VPS que redirija al contenido del visor. Por ejemplo, configurar en Apache/Nginx que las peticiones a
https://ijccrl.com/visor/sean proxy haciahttp://<IP-local>:8080. De esta manera, el iframe podría llamar a una URL bajo el mismo dominio HTTPS. Nota: Esto requiere que el servidor local sea accesible desde el VPS y puede implicar exponer la IP local; úselo sólo si entiende la configuración.
- Configurando un certificado SSL en su servidor local (por ejemplo, usando Let’s Encrypt si tiene un nombre de dominio apuntando al mismo, o un túnel tipo Cloudflare). Luego el iframe
- Ventajas del iframe: La carga de procesamiento (manejo de websockets, actualizaciones del tablero, etc.) recae totalmente en el servidor local. El VPS sólo embebe el contenido, por lo que su CPU/RAM apenas se utilizan para esto. Esto previene sobrecargar el VPS y permite que el pesado cálculo del torneo siga en la máquina local.
Opción 2: Ejecutar el visor en el propio VPS
Si por algún motivo no puede usarse el iframe (por ejemplo, dificultades de red, o desea una integración más limpia), puede instalar node-tlcv en el VPS y servir el visor directamente desde allí:
- Instalación en VPS: Repita los pasos de instalación y configuración en su servidor web (VPS). Es decir, instale Node.js allíjccrl.com, obtenga el código de node-tlcv y configure
config.jsony.env. La diferencia será la sección"connections": deberá apuntar al servidor TLCS adecuado. Si el TLCS también corre en el VPS (por ejemplo, usando Arena en el VPS), entonces serálocalhost:16001. Si el TLCS sigue estando en el servidor local (HP ProLiant), entonces apunte la conexión al IP público del ProLiant: ej."connections": ["<IP-pública-ProLiant>:16001"]. Asegúrese de que el servidor TLCS del ProLiant acepte conexiones externas (puerto 16001 abierto y reenviado). - Lanzar node-tlcv en VPS: Ejecute
npm installynpm run buildigual que antesjccrl.com, luego inicie connode build/src/main.jso con pm2 en el VPS. El visor ahora estará accesible enhttp://<IP-VPS>:8080(o el puerto que haya configurado) desde internet. Verifique que puede abrir esa URL en el navegador y que muestra el tablero (igual que en las pruebas locales). - Integración en la web: Dado que el visor ahora corre en el mismo servidor (o misma red) que su sitio web, tiene varias formas de integrarlo:
- Via iframe local: Similar a Opción 1, puede poner
<iframe src="http://localhost:8080" ...>si la página web se sirve desde el mismo VPS. Esto funcionaría porquelocalhost:8080sería accesible para el navegador sólo si la página web y node-tlcv están en el mismo host. Más seguro es usar<iframe src="http://<IP-VPS>:8080">. Como esta URL estará bajo la misma IP de su dominio (aunque diferente puerto), muchos navegadores la tratan como contenido mixto también. Considere asignar un subdominio (ej.live.ijccrl.com) apuntando al VPS y configurar node-tlcv para usar el puerto 80 o 443 detrás de un proxy, para que el iframe pueda serhttps://live.ijccrl.comsin puerto. - Integración directa en página: Puede incluir el visor sin iframe, aprovechando que está en el mismo dominio. Por ejemplo, configure un proxy inverso en Apache/Nginx para mapear una ruta (ej.
/broadcast/) hacialocalhost:8080. Con Apache, en.htaccesspodría agregar:RewriteEngine On RewriteRule ^broadcast/(.*)$ http://localhost:8080/$1 [P,L] ProxyPass /broadcast http://localhost:8080 ProxyPassReverse /broadcast http://localhost:8080(Más reglas serían necesarias para WebSocket; ver la documentación)jccrl.comjccrl.com. Esto hará que cualquier petición ahttps://ijccrl.com/broadcast/...sea atendida por node-tlcv. Luego, en una página HTML o WordPress, inserte el contenedor y los scripts del cliente TLCV:<div id="chessboard" style="width: 600px; height: 600px;"></div> <script src="/broadcast/client.js"></script> <script> const client = new TLCVClient('https://<su-dominio>/broadcast'); client.start(); </script>Este código creará el tablero dentro del<div id="chessboard">y conectará con el servidor TLCV (vía WebSocket) usando la URL proxy del mismo dominiojccrl.com. El resultado es el mismo visor incrustado directamente en su página, sin iframe. - Seguridad y rendimiento: Si opta por correr node-tlcv en el VPS, tenga en cuenta la carga adicional. Por suerte, node-tlcv es relativamente ligero. Puede manejar múltiples espectadores concurrentesjccrl.com, pero monitoree el consumo de CPU/RAM durante eventos concurridos. Para seguridad, cambie la contraseña periódicamente y si es posible restrinja el acceso al
/adminpor IP (puede usar un middleware Express comoexpress-ipfilterpara sólo permitir su IP)jccrl.com. Si su sitio es público, es recomendable habilitar TLS (HTTPS) también para el subdominio o ruta del visor, y asegurarse de configurar correctamente las excepciones de WebSocket en el proxy (Upgrade headers)jccrl.com.
- Via iframe local: Similar a Opción 1, puede poner
6. Conclusiones y consejos finales 🤔
Siguiendo estos pasos, tendrá un visor web en vivo para sus partidas de ajedrez por computadora, muy al estilo del clásico Tom’s Live Chess Viewer. Para repasar:
- CuteChess CLI + TLCS: Continúe automatizando sus torneos con CuteChess CLI, pero integre una solución para emitir las jugadas en vivo (ya sea incorporando un servidor TLCS como Arena, o desarrollando un adaptador). Esto alimentará a node-tlcv con los datos que necesitajccrl.com. Sin esa pieza, el visor no podrá mostrar las partidas en tiempo real.
- Node-tlcv: Es el componente que convierte el stream TLCS en una atractiva página web interactiva. Una vez configurado (conexiones, puerto, imágenes), ejecutándose y vinculado a TLCS, publicará el tablero y la lista de movidas automáticamente vía WebSockets a todos los clientes conectadosjccrl.com. Ofrece además un panel admin para monitoreo, aunque para funcionamiento básico no requerirá mucha intervención.
- Iframe vs Integrado: La decisión entre embeber por iframe o correrlo en el VPS puede depender de sus recursos y capacidad técnica. El iframe es más sencillo y conserva recursos del VPS, pero requiere que el servidor local sea accesible externamente. Ejecutarlo en el VPS proporciona quizá mayor estabilidad de acceso (el mismo servidor del sitio aloja todo) a costa de consumir recursos de éste. Ambas opciones son válidas – incluso podría mantener la opción del iframe como primaria, y usar la del VPS como contingencia.
- Pruebas: Antes de anunciarlo al público, realice pruebas internas. Por ejemplo, inicie un mini-torneo de 2 motores a pocas partidas y observe en el visor si todo se actualiza correctamente. Pruebe acceder desde distintos dispositivos al iframe/página. Esto le permitirá ajustar detalles (tamaño del visor, latencias, configuración de seguridad) en un entorno controlado.
En definitiva, con CuteChess CLI gestionando el torneo y node-tlcv sirviendo de visor web, logrará ofrecer a sus espectadores partidas en vivo con tablero gráfico y movidas al instante, replicando la experiencia de Tom’s Live Chess Viewer. ¡Buena suerte con su implementación! ♞✅
Fuentes: La presente guía se basa en documentación actualizada de node-tlcv y experiencias de la comunidad. Para más detalles técnicos, puede consultar el repositorio oficial de node-tlcvjccrl.comjccrl.com y guías de integración publicadas en JCCRLjccrl.comjccrl.com, así como recomendaciones de Chessboard.js para manejo de recursos estáticosstackoverflow.com. Cada entorno puede tener particularidades, por lo que se recomienda adaptar estos pasos según sus necesidades específicas.
Referencias:
- Jhonnold (2025). node-tlcv – Tom’s Live Chess Viewer (README)github.comjccrl.com
- JCCRL (2025). Guide to Implementing node-tlcv for Chess Engine Tournament Broadcastingjccrl.comjccrl.com
- JCCRL (2025). Chess Broadcasting Guide (WordPress/Hostinger Integration)jccrl.comjccrl.com
- StackOverflow (2022). Use of Chessboard.js library – loading piece imagesstackoverflow.com

Jorge Ruiz
Filólogo y amante de la antropología social africana
