* Installed APK: app-debug-0805_1616-hall3d-bg.apk — web hub https://badminton-inky.vercel.app/ · https://badminton-inky.vercel.app/downloads/ (sideload · Play Store separate) · APK locks to landscape from launch · board file badminton_scoreboard.html
* License & security: Own HTML/JS + Android WebView tooling (Apache-2.0 lineage). Pro sync uses redis (BSD) / existing KV — no new GPL. UI fonts are Google Fonts OFL or system fonts. By default scores stay in localStorage; with Pro, room snapshots sync via token/PIN. Optional visit stats may count anonymously. On APK, USB/BT score clickers ask for a local 4-digit connect code first (not server auth · rate-limited).
* Language: Menu → Language: Korean / English / 中文. UI, help, and TTS follow the locale (help.html / help_en.html / help_zh.html).
* Menu & font: Use the top Menu for voice, TTS, language, font, skin, teams, and help. Font choice is saved on this device only (offline may fall back to system fonts). Skins include Hall depth board and Oval field depth (photo backdrop + tilted score panels).
* Team · Club League (phase 1): Menu → Team · Club (/event). Daily vs club gate · 5-step wizard · match templates · scoring vs team-win · form vs lineup · validate then generate. Scoreboard + multi-court (PIN·Redis). ExcelJS/qrcodejs MIT · TeamClubUI local · no new GPL. Club season ops = phase 2.
* Connect (TV · Remote · Pro): Menu → Connect: TV (HDMI/Smart View + Simple mode), Remote (BT keyboard/mouse guide), Pro (room + TV display / phone remote URLs + 4-digit PIN). Host shows the PIN; the remote URL asks for PIN before connecting (token/PIN rate limits · Redis). Cast/BT settings need Android bridge.
* Keyboard / camera remote: ← left +1 · → right +1 (hold −1). A volume (camera) remote: key 25 = left +1, 24 = right +1; hold either for undo (APK: external BT only; the device’s own volume buttons stay normal). While waiting for first serve, a short ←/→ or volume 25/24 picks that side’s server. USB/BT clickers and wireless mice need the connect code on APK before scoring.
* Title ticker: Tap the top title or Menu → board title to set the title and ticker background (news/sports/esports/gold/green/dark). Saved on this device only (inline SVG · no new npm/GPL).
* TTS mode: Menu → TTS: Match (score/serve TTS · default), Casual (streak/fighting + start/cheer MP3), Quiet (no spoken TTS). Start and cheer MP3 play in Casual only. Saved on this device only.
* Streak & first-serve TTS: In Casual mode, when the same team scores 2, 3, or 4 in a row, after score/serve cues TTS says the streak. On first-set serve pick (Casual), after the start sound duck, TTS says who serves.
* TTS speed & voice: In the same TTS dialog, use the 0.8–1.5 slider and a system TTS voice name installed on the device (no voice files shipped · no new GPL). Choosing a voice plays a short test phrase.
* Android TTS: In the APK (WebView), speech uses the device system TextToSpeech (platform API · no new npm/GPL). Browsers use the Web Speech API. Speed and voice settings are the same.
* Match setup: Menu → Match: format (singles/doubles), series (1 game / best of 3 / best of 5 / custom), points to win (21 / 15 / 11 / custom, cap = points+9). When changing rules: keep scores (immediate) or confirm first (scores still kept). Adjust games (set ± / reset sets) is in the same menu.
* Handicap: Use Handicap on the first-serve overlay (main sets-panel handicap button is hidden). Enter scores, left/right +1, or tap score digits. You can reopen while serve is unpicked even if scores > 0. First-serve after handicap plays the start sound.
* First-serve overlay: At 0:0 (or after handicap with serve unset), a center dialog appears. After confirming New match, the first-serve overlay opens again. Pick ←/L or →/R for left/right team, or tap serve disks as before. Below the arrows: USB/wireless/watch/phone L/R hint, plus format and series. From the overlay in doubles, default first server is the net-side player (A).
* Match clock & score feedback: After first serve, the sets panel shows match elapsed (m:ss). Scoring shows a brief +1 badge. New match uses a large confirm dialog and clears game, sets, and serve. While the win overlay is open, scoring is locked.
* TTS order & cheer: After a point, fighting and serve cues play in sequence. On game win the cheer MP3 plays for up to about 3 seconds, then win TTS and next-game cues follow.
* Undo & mouse: Bottom Undo sits before Simple. After 3s idle, the sets panel shows ← Left +1 · Right +1 → / Long-press −1 (no per-team mouse PNGs).
* Mouse: Hover the game score number and click to add 1 point for that team. Elsewhere on the board, left button adds 1 for the left-side team, right button for the right-side team (by screen left/right even after swapping teams).
* Mouse: When the cursor leaves the pad, left button → left team +1, right button → right team +1 (screen left/right, even after swap).
* Swap sides: Swaps blue/white cards left and right. Center set numbers follow screen sides.
* Android: In Chrome menu (⋮), use Install app or Add to Home screen. Voice scoring by team name still works after install. Sideload the APK filename above (allow unknown sources).
* Rename teams: Use the popup to edit and save (works on tablet/mobile).
* Player display name: During a rally, tap a player circle to set a display name on the bubble. Leave blank to restore Serve/Receive (or A/B). At 0–0 first-serve pick, tapping a circle selects first serve first. When a display name is set, serve TTS and first-serve cues use that name instead of the team label / A–B.
* Reset sets: Menu → Match → Adjust games → Reset sets, or voice reset sets (game score unchanged).
* Data storage: Game/set scores, team names, board title, saved teams stay only in this device’s browser (or installed app).
- Not stored on a server; not synced across devices. Clearing site data or app storage may erase them.
* Save teams: Save team stores label, memo, scores, names, sets; Saved teams to load or delete later.
* Serve: Circles on the serve rail. At 0–0, singles: tap one serve circle to pick the first server. In singles play, the team that scored serves next; when the opponent scores, serve changes. Doubles: serve A/B vertically (top = partner, bottom = net/set side). Pick the bottom (net-side) circle on the serving team. In doubles play, only the bottom circle blinks for serve/receive.
* Receive (doubles): On the receive rail, receive A/B vertically; the diagonal match to the opponent’s server is highlighted on the bottom circle (hidden at 0–0 until first server is chosen).
* Game end: 21+ with a 2-point lead, or 30–29 → winner shown, winner set +1, game score reset. Deuce from 20–20. Normal end with serve pick may auto-swap sides; one undo restores set, score, sides, serve.
* Voice examples (English UI):
+1: Say the team name on screen (e.g. Blue Team) or screen left · right.
−1: team name minus (e.g. blue team minus) or left minus · right minus.
Multi: blue team 3 points add, white team 4 subtract, blue 2 add.
Teams: blue team, white team, blue, white.
Other: new match / reset, undo, reset sets, optional wake word scoreboard.