pnpm monorepo with three workspaces: - @sbt/shared: zod ScoreboardState + WebSocket protocol (single source of truth) - @sbt/server: Fastify REST + raw ws WebSocket + Drizzle/Postgres, run via tsx - @sbt/web: React + Vite + Tailwind installable PWA Real-time core: the WebSocket server holds authoritative per-board state in memory, broadcasts to all clients (editors + OBS overlays) instantly, and debounces Postgres saves (~750ms). One useScoreboardSync hook powers the editor, the no-login co-edit control page, and the read-only OBS overlay. Includes email+password auth (JWT cookie), scoreboard CRUD, logo upload, customizable scorebug (characters/stocks/score/subtitles/callout/side-swap/theme), Docker Compose + Caddy/nginx deploy configs, and docs/PLAN.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
13 lines
762 B
XML
13 lines
762 B
XML
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
|
||
<rect width="512" height="512" rx="96" fill="#0d1b2a"/>
|
||
<rect x="56" y="176" width="400" height="160" rx="20" fill="#162534" stroke="#24384c" stroke-width="6"/>
|
||
<rect x="196" y="176" width="120" height="160" fill="#e63946"/>
|
||
<text x="256" y="276" font-family="system-ui, sans-serif" font-size="86" font-weight="800"
|
||
fill="#ffffff" text-anchor="middle" dominant-baseline="middle">0–0</text>
|
||
<circle cx="96" cy="370" r="12" fill="#e63946"/>
|
||
<circle cx="128" cy="370" r="12" fill="#e63946"/>
|
||
<circle cx="160" cy="370" r="12" fill="#e63946"/>
|
||
<circle cx="416" cy="370" r="12" fill="#e63946"/>
|
||
<circle cx="384" cy="370" r="12" fill="#e63946"/>
|
||
</svg>
|