scoreboardtools/apps/web/vite.config.ts
Ashraf Shafiq 9169bea79f Scaffold real-time SSBU scoreboard PWA
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>
2026-06-27 00:09:27 -04:00

37 lines
1.1 KiB
TypeScript

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { VitePWA } from 'vite-plugin-pwa';
// Dev proxy forwards API + WebSocket to the Fastify server on :3000 so the web
// app and server share an origin (matching the production reverse-proxy setup).
export default defineConfig({
plugins: [
react(),
VitePWA({
registerType: 'autoUpdate',
// Never cache the OBS overlay route — it must always be live.
workbox: { navigateFallbackDenylist: [/^\/overlay\//] },
manifest: {
name: 'Scoreboard Tools',
short_name: 'Scoreboard',
description: 'Real-time Super Smash Bros Ultimate tournament scoreboards',
theme_color: '#0d1b2a',
background_color: '#0d1b2a',
display: 'standalone',
start_url: '/',
icons: [
{ src: '/icon.svg', sizes: 'any', type: 'image/svg+xml', purpose: 'any maskable' },
],
},
}),
],
server: {
port: 5173,
proxy: {
'/api': 'http://localhost:3000',
'/uploads': 'http://localhost:3000',
'/ws': { target: 'ws://localhost:3000', ws: true },
},
},
});