What it does

Shake Down turns phones into a controller for a game that everyone plays together. Open the website, join your friend's room, and start the game. During the gameplay, go left, go right, go down, tap it will be shown on screen. Complete the action in the provided time and you move on. Actions come in rounds of three. Each round the pace quickens. Miss enough actions and you'll lose a heart. Get all actions correct in a round and earn an extra heart or a sabotage on your opponent. Last player with hearts left wins. In the end, brag to your friends about the end stats like the podium, hits, misses, and best reaction time. If you're not ready to face other players yet, Train Solo or read the welcome menu.

How we built it

The whole stack is TypeScript. The phone web app is Svelte 5, which can be installed via a Progressive Web App (PWA). The game server is a Cloudflare Worker with a Durable Object per room (via PartyServer). The server holds that room's entire game state and acts as a single source of truth for the actions, timer, and score. Phones talk to the server over WebSockets and never decide the outcome on their own. Phones detect a gesture locally and report it, while the server judges hit or miss.

Since sabotages exist per player, the server sends a personalized message to the client for each action instead of a full broadcast. There is a clock-sync layer between server and client so the countdown bar feels accurate despite differing network latency.

Challenges we ran into

  • Sensor reliability across phones. I started with shake detection through accelerometer, but the DeviceMotionEvent.acceleration isn't reliable across mobile browsers. So, I performed a switch-up of the whole move set to orientation tilt and touch.
  • Permission prompts. Motion and orientation sensors aren't given up freely, so the game had to ask for permissions to access the sensors. When I first implemented the sensing, I missed this step and none of the motion worked.
  • Making sabotages actually work. Shifting from "broadcast one command" to "a personalized command per connection" touched every part of the round logic, which required lots of backend maintenance.
  • Mobile CSS issues. Flex children not behaving as expected was the norm. Buttons, inputs, and on screen text regularly went off screen. Managing these issues consisted of online forms and the help of AI.
  • Tuning the actual feel. When I first created new features, they were never perfect from the start. Hours went into play-testing each feature to make it feel right. The UI, the delays, and the time to react, were all something I had to test with players to get the correct tolerances.

Accomplishments that I am proud of

  • Zero installs to play: all anyone has to do is visit the website and you're in a live round within seconds.
  • A server-authoritative loop that still feels instant: appealing to the human mind, instant feedback was the goal for this entire app, which is not something that comes easily.
  • A sabotage system: these sabotages give lower-skill players an easier time defeating and having fun with higher-skill players, lowering the barrier of entry for everyone.
  • A full solo training mode: no one likes getting thrown right into it, so that's why solo mode was developed to get new players up to speed.
  • Haptics, sound, and visuals: each of these elements makes this game feel more rewarding and fun to play. Without them, it would have been a boring game.

What we learned

  • Mobile sensor APIs are so inconsistent, so a calibration step is required to play.
  • Network latency and clock drift make a big difference in who can play well and who can't.
  • Keeping the server as a source of truth is infinitely better than the clients running all of the logic.
  • CSS can be frustrating, but with enough work it is possible to make it beautiful.

What's next for Shake Down

  • Ghost mode: eliminated players don't really do anything while they watch their friends battle. So adding a feature to keep the eliminated players incorporated would be benificial.
  • A shared/TV screen: an ability to see what's happening all in one place for bystanders, so they feel inclined to play.
  • More sabotages: full game sabotages and rewards were something I was looking into and believe would be a good addition.
  • A ranked mode: players could join the game and battle players that are at the same level as them.
Share this project:

Updates

Submission history