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>
35 lines
815 B
JSON
35 lines
815 B
JSON
{
|
|
"name": "@sbt/server",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "tsx watch src/server.ts",
|
|
"start": "tsx src/server.ts",
|
|
"test": "vitest run --passWithNoTests",
|
|
"typecheck": "tsc --noEmit"
|
|
},
|
|
"dependencies": {
|
|
"@fastify/cookie": "^9.4.0",
|
|
"@fastify/jwt": "^8.0.1",
|
|
"@fastify/multipart": "^8.3.0",
|
|
"@fastify/static": "^7.0.4",
|
|
"@sbt/shared": "workspace:*",
|
|
"bcryptjs": "^2.4.3",
|
|
"drizzle-orm": "^0.33.0",
|
|
"fastify": "^4.28.1",
|
|
"nanoid": "^5.0.7",
|
|
"postgres": "^3.4.4",
|
|
"ws": "^8.18.0",
|
|
"zod": "^3.23.8"
|
|
},
|
|
"devDependencies": {
|
|
"@types/bcryptjs": "^2.4.6",
|
|
"@types/node": "^20.14.0",
|
|
"@types/ws": "^8.5.12",
|
|
"tsx": "^4.16.2",
|
|
"typescript": "^5.5.4",
|
|
"vitest": "^2.0.5"
|
|
}
|
|
}
|