# Sternboard > En náutica, un barco *makes a sternboard* cuando avanza hacia **atrás**, popa > primero. Eso es una retro: mirar atrás para seguir adelante. _stern_ (atrás) + > _board_ (tablero). Clon libre de retro board, sin registro. Tableros por columnas con plantillas, revelación de notas a demanda, timer compartido, votos configurables, action items y export a Markdown. Cada board puede tener un **temporizador de autodestrucción** elegido al crearlo. ## Arquitectura - **Servidor autoritativo** (Fastify + Socket.IO). Una room de Socket.IO por board. El estado vive en Postgres (fuente de verdad) y se hidrata en memoria por room; cada acción escribe en DB y hace broadcast del estado al resto. - **Identidad sin login**: el board es un slug no adivinable en la URL. Al entrar se pide nombre (obligatorio) y se genera un `participantId` (UUID) guardado en `localStorage`. El creador recibe un `moderatorToken`. - **Autodestrucción**: `boards.expires_at` se fija al crear; un job borra los expirados y el front muestra la cuenta atrás. ``` web/ Vite + React + TS (UI del board) server/ Fastify + Socket.IO + Drizzle (Postgres) ``` ## Arrancar en local ```bash # 1. Levanta Postgres docker compose up -d db # 2. Servidor cd server cp .env.example .env npm install npm run db:push # crea las tablas npm run dev # http://localhost:3001 # 3. Front (otra terminal) cd web npm install npm run dev # http://localhost:5173 ``` O todo en contenedores: `docker compose up --build`. ## Protocolo Socket.IO Cliente → servidor: `board:join`, `note:add`, `note:update`, `note:delete`, `note:move`, `vote:toggle`, `board:reveal`, `board:phase`, `timer:start`, `timer:stop`, `actionitem:add`, `actionitem:update`, `actionitem:delete`. Servidor → cliente: `board:state` (estado completo), `error`.