Project · Real-time multiplayer game
StrongArm
Play together · Fight together
v1 · More updates to comeAn online 1v1 arm-wrestling game, inspired by the mini-game in The Outlast Trials. Two players face off on a server: a power bar shifts from side to side through a series of precision and timing mini-games. The first player to pull the bar all the way to their side wins.
Why this project matters
My first backend / API, built entirely in Rust
I designed and wrote the entire Rust game server myself, without AI assistance. It is the heart of the project: it hosts game rooms in memory, controls the authoritative game state, calculates power and scores, and broadcasts everything to both players in real time. A hands-on learning experience in API design, concurrent state management, real-time communication and Tokio's asynchronous runtime.
Gameplay
Three mini-games, one power bar
Each round is a sequence of fast mini-games played in real time. The better and faster you perform, the further the bar (from -100 to +100) moves to your side.
Single
Press a sequence of keys revealed one at a time.
Word
Type the displayed word or words as quickly as possible.
Timing
Press Space at the exact moment the cursor crosses the target zone.
Gallery
In pictures





Architecture
A frontend for the UI, a backend as the source of truth
Handles the lobby, mini-games and end screen. Access to game pages is protected by a Next.js proxy that calls /authorize and injects the player_id into the headers, so the player never has to enter it.
The source of truth for the game. Hosts rooms in memory, calculates power and scores, and broadcasts game state in real time via Socket.IO (the /game namespace). Player identity is carried by a JWT cookie.
Browser ──HTTP──▶ Next.js (proxy: /game/* authorization) │ │ │ └──HTTP (Axios)──▶ Rust / Axum backend └──────────WebSocket (Socket.IO /game)──▶ Backend (socketioxide)
Tech stack
What powers StrongArm
Frontend
- Next.js 16App Router
- React 19UI
- TypeScriptStatic typing
- Tailwind CSS 4Styling
- Socket.IO ClientReal time
- AxiosHTTP requests
Backend
- RustLanguage
- Axum 0.8HTTP framework
- TokioAsync runtime
- socketioxideSocket.IO server
- SerdeJSON serialization
- jsonwebtokenCookies / tokens JWT
Deployment
Fully automated CI/CD
- 1
Build & test
Every push to master that affects the backend runs cargo build and cargo test via GitHub Actions.
- 2
Docker image
Multi-stage --release build, then push to Docker Hub (allfantine/strongarm_backend).
- 3
Deployment
Copy the Docker Compose file to a DigitalOcean droplet over SSH, then run docker compose pull && up -d.