01 · Personal · Game
Tortuga
A real-time multiplayer strategy game played on a hexagonal board: hop, capture and resurrect turtles against friends in live lobbies, or take on three levels of AI.
- Role
- Designer & developer
- Client
- Personal project
- Timeframe
- 2025 — ongoing
Overview
The story
Tortuga is a two-player strategy game fought out on a hexagonal board. Each player commands a squad of turtles racing to land one on the tiki goal hex on the far side — wiping out the enemy team wins too.
The movement system is where the strategy lives: turtles only move by hopping over an adjacent turtle into the empty hex beyond. Hop an opponent and it flips belly-up — dead, but not gone, because hopping over a dead turtle resurrects it onto whichever team you choose. Hops chain, with one catch: every live turtle you cross in a single chain must belong to the same team, while dead turtles chain freely.
Under the hood it's a TypeScript monorepo: a Next.js/React client, a shared types package keeping both sides honest, and a Socket.IO server embedded in a Next.js API route. The multiplayer rules engine — captures, resurrections, win conditions, rematch flow — runs server-side, with live lobbies, a challenge/accept flow and real-time move sync between players.
Single-player runs against one of three hand-built AI opponents, from a friendly Easy to a Hard that punishes loose play. The whole game ships as a multi-stage Docker build, self-hosted on a VPS behind nginx, with CSP frame-ancestors headers scoped so it embeds securely in this portfolio's iframe.
Highlights
What makes it tick
- Real-time multiplayer with lobbies, a challenge/accept flow and live move sync over Socket.IO
- Capture and resurrection mechanics layered onto a hex-grid race game
- Chained multi-hop moves — live turtles must share a team in one chain, dead turtles chain freely
- Three hand-built AI difficulties, from friendly to ruthless
- TypeScript monorepo with shared game-logic types across client and server
- Dockerised, self-hosted on a VPS behind nginx, with a CSP-scoped iframe embed into this site
Stack
Built with
- Next.js
- React
- TypeScript
- Socket.IO
- Node.js
- Tailwind CSS
- Docker
- nginx
Gallery
In the wild



