{"id":48217730,"url":"https://github.com/cdilga/multiplayer-racer","last_synced_at":"2026-04-04T19:01:48.352Z","repository":{"id":280603075,"uuid":"941706653","full_name":"cdilga/multiplayer-racer","owner":"cdilga","description":"A local multiplayer racing game","archived":false,"fork":false,"pushed_at":"2026-01-12T03:21:42.000Z","size":29822,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-12T03:24:08.274Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cdilga.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-02T22:38:33.000Z","updated_at":"2026-01-07T10:24:29.000Z","dependencies_parsed_at":"2025-03-04T10:37:22.289Z","dependency_job_id":null,"html_url":"https://github.com/cdilga/multiplayer-racer","commit_stats":null,"previous_names":["cdilga/multiplayer-racer"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cdilga/multiplayer-racer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdilga%2Fmultiplayer-racer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdilga%2Fmultiplayer-racer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdilga%2Fmultiplayer-racer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdilga%2Fmultiplayer-racer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cdilga","download_url":"https://codeload.github.com/cdilga/multiplayer-racer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdilga%2Fmultiplayer-racer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31409471,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-04T19:01:47.166Z","updated_at":"2026-04-04T19:01:48.185Z","avatar_url":"https://github.com/cdilga.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# 🏎️ Multiplayer Racer\n\n### *Real-time browser-based multiplayer racing on the big screen*\n\n[![CI](https://github.com/cdilga/multiplayer-racer/actions/workflows/test.yml/badge.svg)](https://github.com/cdilga/multiplayer-racer/actions/workflows/test.yml)\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)\n[![Python](https://img.shields.io/badge/Python-3.11+-3776AB?logo=python\u0026logoColor=white)](https://python.org)\n[![Node.js](https://img.shields.io/badge/Node.js-20+-339933?logo=node.js\u0026logoColor=white)](https://nodejs.org)\n[![Three.js](https://img.shields.io/badge/Three.js-r128-black?logo=three.js\u0026logoColor=white)](https://threejs.org)\n[![Rapier](https://img.shields.io/badge/Rapier-3D_Physics-orange)](https://rapier.rs)\n[![Socket.IO](https://img.shields.io/badge/Socket.IO-4.5-010101?logo=socket.io\u0026logoColor=white)](https://socket.io)\n\n\u003cbr /\u003e\n\n\u003cimg src=\"docs/images/gameplay-demo.gif\" alt=\"Multiplayer Racer Demo\" width=\"800\" /\u003e\n\n*Watch the full game flow: lobby → players join → race!*\n\n\u003cbr /\u003e\n\n**Connect your phone. Race your friends. Party game chaos.**\n\n[Getting Started](#-quick-start) •\n[Features](#-features) •\n[How It Works](#-how-it-works) •\n[Development](#-development) •\n[Roadmap](#-roadmap)\n\n\u003c/div\u003e\n\n---\n\n## 🎮 What is Multiplayer Racer?\n\nMultiplayer Racer is a **Jackbox/Kahoot-style party racing game** where players use their smartphones as controllers while the race displays on a shared screen (TV, projector, or monitor).\n\nPerfect for:\n- 🎉 **Party nights** - Everyone joins with their phone\n- 🏠 **Living room gaming** - No extra controllers needed\n- 🎊 **Events \u0026 gatherings** - Easy setup, instant fun\n\n### Key Highlights\n\n| Feature | Description |\n|---------|-------------|\n| 📱 **Phone as Controller** | Touch controls optimized for mobile |\n| 📺 **Big Screen Display** | 3D racing view on the host screen |\n| 🔗 **Easy Join** | QR code or room code to connect |\n| ⚡ **Real-time** | WebSocket-powered instant response |\n| 🎵 **Dynamic Audio** | Music tracks \u0026 sound effects |\n| 🔧 **Physics Tuning** | Built-in debug panels for customization |\n\n---\n\n## 🚀 Quick Start\n\n### Prerequisites\n\n- **Python 3.11+** with pip\n- **Node.js 20+** with npm\n- Modern web browser with WebGL support\n\n### Installation\n\n```bash\n# Clone the repository\ngit clone https://github.com/cdilga/multiplayer-racer.git\ncd multiplayer-racer\n\n# Install Python dependencies\npip install -r requirements.txt\n\n# Install Node.js dependencies\nnpm install\n```\n\n### Start Racing\n\n```bash\n# Start the server\npython server/app.py\n```\n\nOpen your browser to **http://localhost:8000** - you're ready to race!\n\n### Join the Game\n\n1. **Host** opens the game on a big screen/TV\n2. **Players** scan the QR code or enter the room code on their phones\n3. **Everyone** picks a name and joins the lobby\n4. **Host** clicks \"Start Race\" when ready\n\n---\n\n## ✨ Features\n\n### 🏁 Multiplayer Racing\n- **Room-based matchmaking** with 4-character codes\n- **QR code join** - Scan and play instantly\n- **Multiple players** racing simultaneously\n- **Real-time synchronization** via WebSockets\n\n### 🎮 Mobile Controls\n- **Touch joystick** for steering\n- **Accelerate/brake buttons** optimized for thumbs\n- **Full-screen mode** for immersive play\n- **Responsive design** for all screen sizes\n\n### 🚗 3D Racing Experience\n- **Three.js rendering** with smooth 60fps gameplay\n- **Rapier physics engine** for realistic car handling\n- **Dynamic camera** following the action\n- **Multiple track designs** (oval, figure-8)\n\n### 🎵 Audio System\n- **6 music tracks** for different game phases\n- **Sound effects** for collisions, engines, UI\n- **Audio ducking** for clear SFX over music\n- **Volume controls** built into the UI\n\n### 🔧 Developer Tools\n- **Physics debug panel** (Press F4) - Tune car handling live\n- **Stats overlay** (Press F3) - FPS, physics updates, player info\n- **Keyboard controls** for testing without mobile\n- **Comprehensive test suite** with Playwright\n\n---\n\n## 🔄 How It Works\n\n### System Architecture\n\n```mermaid\nflowchart TB\n    subgraph HOST[\"🖥️ HOST (Big Screen)\"]\n        direction LR\n        L[\"📋 Lobby\u003cbr/\u003eQR Code + Players\"]\n        R[\"🏎️ 3D Racing\u003cbr/\u003ePhysics + Rendering\"]\n        E[\"🏆 Results\"]\n        L --\u003e R --\u003e E\n    end\n\n    subgraph SERVER[\"⚡ Flask + Socket.IO Server\"]\n        RM[\"Room Management\"]\n        PS[\"Player Sync\"]\n        CR[\"Control Routing\"]\n        QR[\"QR Generation\"]\n    end\n\n    subgraph PLAYERS[\"📱 Mobile Controllers\"]\n        P1[\"Player 1\"]\n        P2[\"Player 2\"]\n        PN[\"Player N\"]\n    end\n\n    HOST \u003c--\u003e|\"WebSocket\"| SERVER\n    SERVER \u003c--\u003e|\"WebSocket\"| PLAYERS\n```\n\n### Game Flow\n\n```mermaid\nsequenceDiagram\n    participant H as 🖥️ Host\n    participant S as ⚡ Server\n    participant P as 📱 Players\n\n    H-\u003e\u003eS: Create Room\n    S--\u003e\u003eH: Room Code + QR\n\n    P-\u003e\u003eS: Scan QR / Enter Code\n    S--\u003e\u003eH: Player Joined\n    S--\u003e\u003eP: Waiting for Start\n\n    H-\u003e\u003eS: Start Game\n    S--\u003e\u003eH: Initialize Physics\n    S--\u003e\u003eP: Show Controls\n\n    loop Racing\n        P-\u003e\u003eS: Control Input\n        S-\u003e\u003eH: Update State\n        H-\u003e\u003eH: Render Frame\n    end\n```\n\n---\n\n## 🛠️ Development\n\n### Tech Stack\n\n| Layer | Technology |\n|-------|------------|\n| **Frontend** | Three.js, Vanilla JS, CSS |\n| **Physics** | Rapier 3D (WASM) |\n| **Backend** | Flask + Flask-SocketIO |\n| **Real-time** | Socket.IO |\n| **Testing** | Playwright E2E |\n| **Build** | Vite |\n\n### Project Structure\n\n```\nmultiplayer-racer/\n├── server/              # Flask backend\n│   └── app.py          # Main server (rooms, WebSocket handling)\n├── frontend/            # HTML templates\n│   ├── host/           # Big screen interface\n│   └── player/         # Mobile controller interface\n├── static/\n│   ├── js/             # Game logic\n│   │   ├── host.js     # Host game loop \u0026 rendering\n│   │   ├── player.js   # Mobile controls\n│   │   ├── rapierPhysics.js  # Physics integration\n│   │   ├── audioManager.js   # Sound system\n│   │   ├── carModel.js       # 3D car geometry\n│   │   └── trackBuilder.js   # Track generation\n│   ├── css/            # Stylesheets\n│   └── audio/          # Music \u0026 SFX\n├── tests/e2e/          # Playwright test suite\n└── docs/               # Documentation \u0026 images\n```\n\n### Running Tests\n\n```bash\n# Run all tests\nnpm test\n\n# Run with visible browser\nnpm run test:headed\n\n# Run with Playwright UI\nnpm run test:ui\n```\n\n### Debug Controls (Host)\n\n| Key | Action |\n|-----|--------|\n| `F3` | Toggle stats overlay |\n| `F4` | Toggle physics parameters panel |\n| `R` | Reset all cars |\n| `Arrow Keys` | Test drive controls |\n\n---\n\n## 🗺️ Roadmap\n\n### Current Status: Alpha\n\nThe game is fully playable locally with core features working:\n- [x] Room creation \u0026 QR code joining\n- [x] Mobile touch controls\n- [x] 3D rendering with Three.js\n- [x] Rapier physics integration\n- [x] Real-time multiplayer sync\n- [x] Audio system with music \u0026 SFX\n- [x] Debug/tuning tools\n\n### Coming Soon\n\n| Phase | Features |\n|-------|----------|\n| **Phase 1** | Damage system, explosions, improved physics |\n| **Phase 2** | Multiple game modes (Derby, Race) |\n| **Phase 3** | More tracks, obstacles, power-ups |\n| **Phase 4** | Online hosting, public lobbies |\n| **Phase 5** | Steam release, car customization |\n\n\u003e 🌐 **Online Demo** - Coming soon! Currently local network only.\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! This project follows Test-Driven Development:\n\n1. **Fork** the repository\n2. **Create** a feature branch (`git checkout -b feature/amazing-feature`)\n3. **Write tests first** (they should fail)\n4. **Implement** the feature (make tests pass)\n5. **Commit** your changes (`git commit -m 'Add amazing feature'`)\n6. **Push** to the branch (`git push origin feature/amazing-feature`)\n7. **Open** a Pull Request\n\nSee [CLAUDE.md](CLAUDE.md) for detailed development guidelines.\n\n---\n\n## 📄 License\n\nThis project is licensed under the **GNU General Public License v3.0** - see the [LICENSE](LICENSE) file for details.\n\n---\n\n## 🙏 Acknowledgments\n\n- [Three.js](https://threejs.org) - 3D graphics library\n- [Rapier](https://rapier.rs) - Physics engine\n- [Flask](https://flask.palletsprojects.com) \u0026 [Socket.IO](https://socket.io) - Backend framework\n- [Playwright](https://playwright.dev) - E2E testing\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Made with ❤️ for party game nights**\n\n[⬆ Back to Top](#️-multiplayer-racer)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcdilga%2Fmultiplayer-racer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcdilga%2Fmultiplayer-racer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcdilga%2Fmultiplayer-racer/lists"}