LF
back to home

Project · Real-time multiplayer game

StrongArm

Play together · Fight together

v1 · More updates to come

An 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.

Next.js · TypeScriptRust · Axum

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.

01

Single

Press a sequence of keys revealed one at a time.

02

Word

Type the displayed word or words as quickly as possible.

03

Timing

Press Space at the exact moment the cursor crosses the target zone.

Gallery

In pictures

StrongArm home screen
Server search and list
Word mini-game in progress
Timing mini-game in progress
Victory screen

Architecture

A frontend for the UI, a backend as the source of truth

Frontend — Next.js

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.

Backend — Rust / Axum

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. 1

    Build & test

    Every push to master that affects the backend runs cargo build and cargo test via GitHub Actions.

  2. 2

    Docker image

    Multi-stage --release build, then push to Docker Hub (allfantine/strongarm_backend).

  3. 3

    Deployment

    Copy the Docker Compose file to a DigitalOcean droplet over SSH, then run docker compose pull && up -d.