Servidor Fastify + Socket.IO + Drizzle/Postgres; front Vite+React (EN/ES, tema claro/oscuro). Tableros por columnas con plantillas, notas privadas/públicas, agrupación, votos configurables (multivoto), timer compartido con alarma, fases, action items, export Markdown/JSON e import, autodestrucción, gestión de columnas. Imagen única (front servido por el servidor) y CI que la construye y publica.
1.8 KiB
1.8 KiB
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 enlocalStorage. El creador recibe unmoderatorToken. - Autodestrucción:
boards.expires_atse 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
# 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.