Live, animated, and immersive — built for competitive programming events.
CodeVerse Scoreboard is a purpose-built, real-time competition scoreboard designed for multi-round competitive programming events. It automatically scrapes live standings from VJudge, processes and validates submissions, and pushes updates to all connected clients via WebSockets — all wrapped in a stunning sci-fi themed UI with synthesized sound effects.
Real-time leaderboard with animated rank changes, problem status cells, and countdown timer
Post-round celebration with Gold, Silver, and Bronze podiums + round navigation
- Real-Time Updates — WebSocket-powered live scores every ~30 seconds via Socket.IO
- 3-Round Support — Independent rounds with configurable questions and separate leaderboards
- Top 3 Podium — Animated podium view (Gold / Silver / Bronze) with round navigation
- Sci-Fi Sound System — 8 synthesized sound effects using Web Audio API
- Smart Timer — Auto-syncing countdown:
Starts in→Ends in→Contest Over - Fully Responsive — Optimized for desktop, tablet, and mobile with sticky columns
- Smooth Animations — Framer Motion spring animations for rank changes and layout shifts
Frontend (/client)
- React 19 · TypeScript · Vite
- Tailwind CSS 4 · Framer Motion
- Socket.IO · React Router 7 · Web Audio API
Backend (/server)
- Express 5 · Socket.IO · CORS
- In-Memory Buffer with versioning
Scraping Script (/script)
- Puppeteer · dotenv · User-Agents
Deployment
- Vercel (frontend) · Render (backend)
codeverse-scoreboard/
│
├── client/ # React Frontend Application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Page-level components
│ │ └── utils/ # Helper functions and utilities
│ └── public/
│
├── server/ # Express.js Backend
│ └── src/
│ ├── routes/ # API endpoints
│ ├── middleware/ # Auth and other middleware
│ └── bufferController/ # Data buffering logic
│
└── script/ # VJudge Scraping Script
└── main.js # Main scraping logic
┌─────────────┐ scrape every 30s ┌──────────────┐ POST /api ┌──────────────┐
│ VJudge │ ────────────────────────► │ Script │ ────────────────► │ Server │
│ Contests │ (Puppeteer) │ (Node.js) │ (sanitized) │ (Express) │
└─────────────┘ └──────────────┘ └──────┬───────┘
│
Socket.IO emit
│
┌──────▼───────┐
│ Client │
│ (React) │
└──────────────┘
- Node.js ≥ 18
- npm ≥ 9
git clone https://github.com/your-username/codeverse-scoreboard.git
cd codeverse-scoreboardCreate .env files from the examples in each directory:
client/.env
VITE_BACKEND_URL=http://localhost:4000server/.env
PORT=4000
KEY=your-secret-api-keyscript/.env
KEY=your-secret-api-keyImportant
The KEY value must match between server/.env and script/.env for the scraper to authenticate with the backend.
# Install all dependencies (run from root)
cd client && npm install && cd ..
cd server && npm install && cd ..
cd script && npm install && cd ..Open 3 separate terminals:
# Terminal 1 — Backend
cd server
npm run dev# Terminal 2 — Frontend
cd client
npm run dev# Terminal 3 — Scraper
cd script
npm run devNavigate to http://localhost:5173 — the scoreboard will load and connect via WebSocket.
- Import the
client/directory to Vercel - Set the
VITE_BACKEND_URLenvironment variable to your backend URL - Vercel auto-detects Vite and builds accordingly (
vercel.jsonhandles SPA rewrites)
- Import the
server/directory to Render - Set
PORTandKEYenvironment variables render.yamlis pre-configured for automatic deployment
The scraper runs as a long-lived Node.js process. It can be deployed on:
- A VPS (via
pm2orsystemd) - A local machine during the competition
- Any cloud VM
This project is open source under the ISC License.
- Backend logic adapted from acmnuceskhi/coderscup-scoreboard-2025 — we appreciate their open-source contribution which served as a foundation for our scoring system.
Star this repo if you found it useful!
Made by the CodeVerse Team

