Work / 06 of 06
Portfolio island
3D web game · walkable portfolio
A portfolio you can walk around: a low-poly island where every project has a house in the market and a minigame of its own.
Visit Portfolio island- Role
- Solo: game design, 3D, physics and front end
- Years
- 2026
- Status
- Live, built for desktop; phones partly supported
- Stack
- React Three Fiber · Three.js · Zustand

5
minigames, one per project
2
vehicles to ride, a skateboard and a go-kart
240 Hz
physics steps for the kart's tyres
2.4 MB
of 3D models over the wire, down from 5.6
The brief
A CV page tells you what someone built. I wanted one that lets you play it. The island is my portfolio as a small game: walk up to the house, the campfire or the notice board to read about me, and step into a project's house in the market to play a minigame made as a tribute to it. It still has to work as a portfolio, so the same content loads first as a plain card that search engines can read, and there is a flat overview for anyone who just wants the facts.
What I built
- A low-poly island in React Three Fiber, laid out as plain data (shoreline, paths, landmarks and seeded prop placement) that the scene, collisions, ground texture, minimap and map all read.
- Two vehicles: a skateboard with real ollies that lands on low props and rides along them, and a go-kart with a two-axle tyre model, handbrake drifts, skid marks, smoke and grass that it flattens as it drives.
- Five minigames, one per project: melt-me's candle workshop, food-lib's spaghetti kitchen, workout-lib's idle-tycoon gym, Coach's rooftop rhythm workout and pokehelper's real-time Pokémon battle.
- Partial phone support: it is designed for a keyboard and a big screen first, but on a phone held sideways it plays with touch controls (joystick, A and B buttons, a kart you steer by pointing) and a pared-down HUD so the small view stays clear.
- A server-rendered landing card with Open Graph tags, JSON-LD, a sitemap and llms.txt, all generated from the same content file as the island.
Inside
01The market
Each project has a house down the market's west side, built to match its minigame. Walk up to a door to read about the project, then press Enter to play.
02Go-kart
Hold A for gas and point the stick the way to go. A sharp turn at speed drifts by itself, leaving skid marks and smoke and flattening the grass.
03melt-me candle workshop
Melt soy wax before it burns, add the order's scent and colour, stir, pour and decorate. Two custom candles win the round.
04food-lib kitchen
Boil spaghetti, then toss it in a pan with the order's sauce and topping. A held plate shows its food-lib nutrition per 100 g.
05workout-lib gym
An idle tycoon played by walking onto things: check guests in, clear their mess, and spend the takings on machines, upgrades and staff. Rush hours and VIPs keep it busy.
06Coach bootcamp
A rhythm workout on an Athens rooftop. Kick, squat, jump and punch on the beat alongside Coach over a synthesised track, with the reps counted in Greek.
07pokehelper battle
A real-time Pokémon battle in Lorelei's room. Both Pokémon move on their own while you call the attacks and dodge the ones you see coming. Here Charizard's Flamethrower sweeps after Mimikyu.
Decisions
- 01
Text first, island second
The landing card is rendered to HTML at build time and painted before any 3D code loads. The app and Three.js are imported only after the first contentful paint, minigames are fetched in the background once a visitor sets off, and shaders are compiled one task at a time so the first frame never freezes the page. Without a GPU the island waits until Explore is pressed, and without WebGL the site falls back to the card and an overview.
- 02
A kart that drifts like one
The kart runs a two-axle tyre model in 240 Hz substeps: slip angles give each axle its sideways force up to its grip, and the rear shares grip with the engine and brakes. A held drift swaps to a kinematic slide whose arc stays the same at any speed, with the tail on a damped spring and the wheels countersteering by themselves, so a drift starts and ends without a jolt.
- 03
Controls that follow the camera
The camera always faces north. Steering relative to the kart flipped the controls whenever it drove towards the screen, which felt broken on a phone. On touch screens the stick now points where to go: the kart turns to head that way, drifts on its own through a sharp turn, and backs up when you point behind it.
- 04
Games that are fair
Each minigame teaches itself with a how-to-play screen, a checklist and a ring on the next station. The battle's rival was tuned by simulating thousands of fights against a bot. Its damage follows the main games' formula and type chart, scaled so a fight lasts about half a minute.
- 05
Small over the wire
Vercel's CDN doesn't compress .glb files, so the build brotli-compresses the models in place and serves them with the matching header: 5.6 MB of models arrive as 2.4 MB.