Real-time multiplayer Halligalli for midnight card-table races.
Create a room, ready up with friends, flip around a server-authoritative table, and race to spot the exact-five fruit total first. Solo practice is included, but the product story is a fast multiplayer Halligalli arena.
Live demo: https://play.halligalli.games on Azure Kubernetes Production.
- Real-time rooms: create a 4-character room code, ready up, and race friends on one shared table.
- Halligalli race loop: flip cards, read the visible fruit count, and compete for the exact-five hit.
- Table-true rules: clockwise flips, top-card-only counting, exact-five bell windows.
- Server authority: multiplayer clients emit intent; the server owns flips, scoring, and match finish.
- Solo practice: train reaction speed, accuracy, streaks, and missed-window discipline.
- Training memory: local history, trend charts, daily goals, and achievements without accounts.
- Midnight table polish: 3D card flips, bell particles, Boss Yang pressure, sound, and reduced-motion fallbacks.
Independent browser project; not affiliated with any commercial card-game publisher.
node --version # v24.x
pnpm install
pnpm run dev # Vite dev server on :5173
pnpm run dev:server # socket.io server on :3001, in a second terminalOpen http://localhost:5173.
Single-player works with only pnpm run dev. Multiplayer needs pnpm run dev:server.
pnpm run test
pnpm run typecheck
pnpm run build
pnpm startContainer checks:
docker build -t halligalli-arena:local .
docker run --rm -p 3001:3001 halligalli-arena:local
curl --fail http://localhost:3001/readyzFor a local all-in-one image that serves the built frontend and socket.io from one Node process:
docker build --target standalone -t halligalli-arena:standalone .
docker run --rm -p 3001:3001 halligalli-arena:standaloneCards flip clockwise around the table. Each player has a face-up pile, but only the top card counts. Older cards underneath are invisible to the rule engine.
Ring when one fruit totals exactly five across visible top cards.
| Event | Points |
|---|---|
| Correct ring base | +120 |
| Collected cards | +6 per card |
| Speed bonus | up to +~50 |
| Consecutive streak | +10 per hit in current streak |
| Wrong ring | -50 |
| Penalty cards paid | -4 per card |
| Missed bell window | -30 |
| Mode | Flip speed | Speed-bonus window |
|---|---|---|
| Easy | ~1.85 s | generous |
| Normal | ~1.4 s | standard |
| Boss | ~900 ms | tight |
src/
├── App.tsx # UI shell and single-player game loop
├── audio/useAudioEngine.ts # Web Audio hook
├── game/ # shared browser + server game logic
└── multiplayer/ # socket protocol and client projection
server/
├── GameEngine.ts # multiplayer authority
├── Room.ts # lobby and player model
├── health.ts
└── index.ts # HTTP server + socket.io router
docs/operations/ # release, Azure, and rollback docs
- React 19 + Vite 8 + TypeScript + plain CSS.
- Node.js 24 + socket.io 4.
- Browser progress stays in
localStorage. - No account system, database, router, state library, or CSS framework.
- Stable visible copy stays bilingual in Chinese and English.
- New animations must respect
prefers-reduced-motion.
Halligalli Arena stores training progress locally in the browser. It does not require accounts, payment data, or a server-side player profile.
Multiplayer rooms are transient in-memory socket.io rooms. The server owns scoring and match results so clients cannot submit authoritative wins.
See SECURITY.md for reporting and safety boundaries.
Azure Kubernetes Production is the active production story after the June 19, 2026 AKS cutover. It uses the standalone Halligalli runtime, infrastructure-owned Helm Chart and Azure Kubernetes Desired State, Argo CD, and same-origin traffic at play.halligalli.games.
Container Apps-backed Azure Production is historical after cutover; its Terraform-managed resources were destroyed and it is not an active fallback. Production Kubernetes chart templates, real Azure Kubernetes Desired State, and cloud operations live in the infrastructure repo.
- Release branch:
master - Versioning: Release Please creates human-merged release PRs and
vX.Y.Ztags - Release image: release tags build, scan, and publish immutable GHCR standalone images
- Azure infrastructure: AKS and GitOps desired state are operated from the infrastructure repo
- Historical Azure Production: docs-only Static Web Apps plus Container Apps record
- Kubernetes production render surface: infrastructure-owned chart, values, and Argo CD Application
- Health check:
/health - Readiness check:
/readyz
The first Container Apps-backed Azure Production activation has been verified historically. Current production language should use Azure Kubernetes Production; old Container Apps resources should be inspected or destroyed only through deliberate local infrastructure operations.
Operations docs:
Small, focused pull requests are welcome. Start with CONTRIBUTING.md, then run:
pnpm run test
pnpm run typecheck
pnpm run buildMIT. See LICENSE.