Inspiration
Know those tiktok videos where marbles are falling down and the lowest wins the grand prize. Well we wanted to make that in 5 hours cause we taught it would be cool.
What it does
Each marble is represented by a popular character (Spongebob, Obama, etc.) and they all sing any song that the user provides, and then the character thats currently in the lead will sing that song with its SOUL.
How we built it
We built a real-time browser game with a React + TypeScript frontend and a Node.js/Express backend.
Physics and marble movement are handled with Matter.js, while Socket.IO keeps race state synced live between server and client.
For AI voice conversion, we integrated the Musicfy API (voice list + convert voice flow).
We added persistence with SQLite (saved characters + generated outputs) and local file storage for generated audio so songs remain available after reloads.
Challenges we ran into
- Normalizing Musicfy API responses and handling inconsistent payload shapes
- Preventing “Unknown” character/song labeling and mapping outputs back to the correct character
- Keeping race rendering, leaderboard updates, and audio playback in sync
- Supporting character persistence (name/image/song) across app restarts
- Safely removing players mid-race without breaking physics/race state
Accomplishments that we're proud of
- End-to-end flow from voice selection -> character creation -> song conversion -> live race playback
- Persistent character library with reusable songs
- Leader-aware audio switching (the top racer’s song plays automatically)
- Real-time multiplayer-style race updates with smooth camera tracking
What we learned
- How to design resilient API adapters for external AI services
- Real-time state management patterns with Socket.IO + React
- Practical tradeoffs of local persistence and media storage
- Importance of data normalization and fallback naming rules for UX quality
What's next for Singing Marbles
- Hosted deployment with cloud object storage for songs/images
- Shareable race lobbies and spectator links
- Playlist/queue support per character
- Better voice/song management UI and moderation/licensing guardrails
Built With
- express.js
- matter.js
- musicfy
- node.js
- react
- socket.io
- sqlite
- typescript

Log in or sign up for Devpost to join the conversation.