A pixel-art map of Bishkek where every landmark is a portal into a multiplayer mini-game. Tap a place → invite friends → play together. Built for a hackathon. Summer activity, the fun way.
| Place | Game | What it is |
|---|---|---|
| 🎤 Park Yntymak | Karaoke Battle | One person sings, everyone rates 1–5, highest average wins |
| 🚗 Ala-Archa Mountains | Mini-Drive | Endless dodge down the mountain road, grab boorsok 🥟 |
| 🎮 Cosmopark | Tap Brawl | 15s mash-off, most taps wins |
| ⛲ Ala-Too Square | coming soon | more games |
npm install
npm run devOpen the URL it prints. To play multiplayer right now with zero setup, open the room link in a second browser tab/window — it uses a local fallback that works across tabs on one machine.
For real multiplayer across devices, add Supabase:
- Create a project at supabase.com.
- Copy
.env.example→.env.localand fill inVITE_SUPABASE_URLandVITE_SUPABASE_ANON_KEY(Project Settings → API). - (Optional) Run
supabase/schema.sqlin the SQL editor if you want persistence. The live game uses Realtime channels and needs no tables. - Restart
npm run dev. The lobby will say "Live multiplayer via Supabase realtime."
The app ships with a placeholder public/art/overworld.svg. To generate nicer AI pixel art:
- Put
OPENAI_API_KEY=sk-...in.env.local(server-side only, never shipped to the browser). npm run gen:art→ writes PNGs topublic/art/.- Swap
overworld.svgforoverworld.pnginsrc/screens/MapScreen.tsx.
Vite + React + TypeScript · Supabase (realtime presence + broadcast) · OpenAI image API (build-time art) · pixel everything.
- Each landmark click creates a room with a 4-letter code + share link.
- Players join via the link; presence drives the live player list.
- Game state (karaoke rounds, ratings, taps) is sent over broadcast events.
- Scores live on each player's presence record — every client owns its own score, so there's no central server to break on stage.