Node.js Live Production Site

Power & Hall 501 Darts Tournament

A real-time multiplayer darts tournament scorer built with Node.js, Express, and WebSockets. Supports 2-8 players, single-elimination bracket tournaments, best-of-N leg formats, live TV scoreboard display, real-time checkout suggestions, British TTS voice announcements, and a persistent all-time leaderboard - with a responsive tablet score-entry UI and a separate fullscreen TV view.

Power & Hall 501 Darts Tournament

Project Overview

501 Darts is a self-hosted, real-time tournament scorer designed for group play. It runs in a browser with no app install required, and is designed to work across two screens simultaneously: a tablet or phone for score entry and a TV or monitor for the audience scoreboard.

Key Features

  1. Real-time multi-screen sync via WebSockets -- the score entry tablet and TV display stay in perfect sync through a persistent WebSocket connection with automatic reconnection.
  2. Single-elimination tournament bracket -- supports 2 to 8 players with a bracket drawn automatically or manually, advancing automatically on match completion.
  3. Best-of-N leg format -- choose Best of 1, 3, 5, or 7 legs per match. Individual leg wins and overall match wins are tracked separately.
  4. Dart-by-dart score entry -- full numpad UI with Single, Double, and Treble multipliers plus Miss, Outer Bull (25), and Double Bull (50). The TV display updates on every individual dart thrown.
  5. Live checkout suggestions -- as a player approaches a finish, the TV display shows the optimal checkout route from a built-in brute-force checkout engine.
  6. British TTS voice announcements -- edge-tts with en-GB-RyanNeural voice calls out scores, 180s, checkouts, match winners, and delivers trash talk between turns.
  7. Undo support -- the last dart thrown can be undone, rolling back score, stats snapshots, and bracket state cleanly.
  8. Straight-out rules -- no double-in or double-out. Hit exactly zero to win the leg.
  9. Persistent all-time leaderboard -- stats persisted to disk as JSON and CSV: matches played and won, legs, three-dart average, 180s, high checkout, best leg darts, and tournament wins.
  10. Player history cards -- past players remembered and shown as animated physics cards on the setup screen for quick re-entry.
  11. Manual bracket mode -- pick matchups manually each round rather than using the random draw.
  12. Match history log -- every completed match appended to a persistent JSON log with full results and statistics.

Technical Highlights

Built entirely without a frontend framework. Vanilla JavaScript handles all multi-view SPA routing, rendering, and WebSocket client logic. The server is a lean Express 4 and ws Node.js application with no database -- all state stored as flat JSON files. TTS audio generated on demand by edge-tts, cached in the OS temp directory, and served as static files. The test suite covers the game engine, checkout calculator, bracket logic, match progression, and dart log using Node built-in test runner.

Technology Stack
Node.js Express 4 WebSocket (ws) edge-tts Vanilla JS HTML5 CSS3
Hosting & Infrastructure

Self-hosted on a Synology NAS running Node.js 20, served behind Nginx with SSL/TLS. State stored as flat JSON files in a data/ directory. TTS audio cached in the OS temp directory. Managed as a systemd user service with automatic restart on failure.

Site Status

This is a live production site. It handles real user traffic and data in a production environment.

Visit Live Site All Projects

Like what you see?

I build custom web applications, CMS solutions, and enterprise systems built to last. Let's discuss your project.

Get in Touch