Saltar al contenido principal

Hackathon · 2026

El Impostor

Juego de deducción social multijugador en tiempo real con IA que reemplaza al moderador humano.

Stack
Bun 1.3 · Hono 4 · React 19 · WebSockets · PostgreSQL · Gemini AI · Turborepo 2 · Zustand 5 · Tailwind CSS 4 · React Router 7 · Zod 3
El Impostor
01

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.

02

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.

03

Qué hice

Diseñé e implementé un monorepo con módulos especializados (Turborepo + Bun Workspaces) para minimizar la latencia y maximizar la eficiencia en el VPS de recursos limitados. El sistema se compone de 4 módulos desacoplados pero integrados mediante contratos compartidos:
  • 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

  1. 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.
  2. Orquestación S2S: La API envía internamente la palabra y configuración al apps/game-server mediante un endpoint protegido con claves secretas de servicio a servicio (INTERNAL_API_KEY).
  3. Ciclo de Juego: El apps/game-server asume 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).
  4. 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 VPS gp.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.
04

Diseño y Assets

La interfaz se diseñó con un enfoque Mobile-First bajo una estética Neobrutalista, elegida para transmitir una experiencia táctil y dinámica de juego de mesa digital:
  • 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.
05

Galería

Vistas de Escritorio (4)

Vistas Móviles (17)

Recursos y Assets (1)