Hackathon · 2026
El Impostor
Juego de deducción social multijugador en tiempo real con IA que reemplaza al moderador humano.

Contexto
El proyecto fue desarrollado durante la hackathon oficial coorganizada por el streamer midudev y la empresa de infraestructura cloud CubePath. El objetivo principal consistió en digitalizar y automatizar un popular juego de deducción social, en el cual los jugadores deben debatir e identificar al impostor infiltrado en la sala.
Motivación
La motivación principal surgió del escenario único que ofrecía la hackathon: CubePath otorgaba a cada participante un servidor VPS gp.micro (con recursos acotados de 2 vCPU y 4 GB de RAM) pero con total libertad de configuración y despliegue.
Al tratarse de una competencia en colaboración con midudev, busqué crear una aplicación interactiva que resultara muy divertida para probar en vivo en un streaming con la comunidad, y que al mismo tiempo me permitiera exprimir al 100% la infraestructura asignada, desafiando los límites del servidor al mantener conexiones concurrentes persistentes, una base de datos relacional y comunicación con modelos de IA corriendo bajo el mismo hardware.
Qué hice
- Servidor de Juego en Tiempo Real (
apps/game-server): Desarrollado sobre Bun aprovechando su motor nativo de WebSockets. Mantiene el estado efímero del juego totalmente en memoria RAM y ejecuta una máquina de estados determinista (Lobby->Assigning->Clues->Discussing->Voting->Results), administrando reconexiones, turnos y broadcasts a los clientes. - API Backend REST (
apps/api): Desarrollada con Hono y PostgreSQL. Administra la autenticación sin fricción previa (donde los usuarios pueden ingresar inmediatamente como invitados y registrarse solo al unirse o crear partidas), la persistencia de estadísticas e historial a largo plazo, y la integración con Google Gemini AI para generar categorías y términos dinámicos al iniciar cada ronda. - Shared Core (
packages/shared): Paquete centralizado de TypeScript que define los eventos WebSocket y los esquemas de validación con Zod. Garantiza que el frontend, el backend HTTP y el servidor de juego compartan exactamente los mismos contratos de datos sin margen de error. - Frontend Client (
apps/web): Aplicación SPA desarrollada con React, Vite y Tailwind CSS. Utiliza Zustand para manejar el estado de autenticación y la conexión por Socket, brindando una experiencia fluida ("War Room") con animaciones en tiempo real.
Flujo de Comunicación y Sincronización S2S
- Inicio de Partida: El cliente envía una petición vía HTTP/REST a la API (
apps/api), la cual consulta a Gemini AI para generar las palabras secretas y valida el esquema con Zod. - Orquestación S2S: La API envía internamente la palabra y configuración al
apps/game-servermediante un endpoint protegido con claves secretas de servicio a servicio (INTERNAL_API_KEY). - Ciclo de Juego: El
apps/game-serverasume el control por WebSockets bidireccionales, sincronizando las fases (reparto privado de roles, envío de pistas por turnos, chat en vivo y votación en tiempo real). - Persistencia Final: Al concluir la partida, el servidor de juego envía de forma asíncrona un reporte (
Archive Match) a la API REST para persistir el historial, estadísticas y puntajes en PostgreSQL.
Despliegue e Infraestructura (CubePath + Dokploy)
Todo el ecosistema se desplegó en un único VPSgp.micro utilizando Dokploy como orquestador en contenedores aislados con límites estrictos de memoria RAM:
- Frontend Web: Contenedor Docker acotado a
256 MB RAM(impostor.brunoarias.dev). - API Backend: Contenedor Docker acotado a
256 MB RAM(api.brunoarias.dev). - Game Server: Contenedor Docker acotado a
512 MB RAM(ws.brunoarias.dev). - PostgreSQL: Instancia gestionada acotada a
1 GB RAM. - Networking: Enrutamiento por subdominios y capa de seguridad gestionada mediante Cloudflare.
Diseño y Assets
- Estilo: Bordes pronunciados, contenedores bien delimitados y sombras sólidas sin desenfoque. Este lenguaje visual aporta claridad directa a la interfaz, logrando que los controles (como el botón para mantener y revelar el rol secreto) se sientan como componentes físicos.
- Colorimetría: Paleta cromática donde cada color cumple una función clara dentro del juego (agentes, infiltrados, alertas y modos especiales) para acelerar la lectura visual y la comprensión del estado de la partida.
- Identidad (Ver Logo): Isotipo vectorial diseñado para representar el misterio y el sigilo del juego, refinado manualmente en Inkscape a partir de un boceto inicial generado por IA.