Why
A member portal is usually a table of links nobody opens.
Making it a place people want to be turns showing up into something they'd do for its own sake: check the notice board, catch something, see who else is around.
Tethos Island
A multiplayer game, built solo
The Tethos member portal is a cozy 3D island in the browser. Members fish, catch bugs, fill a museum, study in a café and hang out together, under the real sky of London, Ontario. I designed and built it on my own. Play it at play.tethos.ca
Context
Why
A member portal is usually a table of links nobody opens.
Making it a place people want to be turns showing up into something they'd do for its own sake: check the notice board, catch something, see who else is around.
Solo
I'm the only developer. The game design and mechanics, the multiplayer server, the backend, the character rig and animation, my models, shaders and hairstyles are mine.
I build it with a team of role-scoped Claude Code agents I run (build, QA, reviewer): about 2,400 commits and 2,900 tests so far.
Status
The title screen and sign-in are live. The island opens to members soon, with combat and classes coming in a later update.
Build
Multiplayer
A Colyseus server sends 20 updates a second in a compact position and pose format. Other players are smoothed with an adaptive 120 to 300 ms buffer, so they glide instead of teleporting.
Each player only receives the people within 50 units, recomputed twice a second, and the server checks every move. Shards fill to 30 and cap at 40.
The economy
Nothing that pays out trusts the browser. The server rolls every catch; the client only asks for a roll at a spot, casts have to be spaced out, and the catch has to land within a window.
All of it runs in Postgres functions with hourly caps. One of those fixes closed a hole that let players write their own item counts and sell them.
Performance
It has to run on student Chromebooks, so the budgets are tested in code. Merging the ground and cliff pieces into blocks cut the world from 697 draw calls to 252.
Players draw in detail tiers: 12 in full detail, 12 reduced, the rest hidden. A full 40-player shard costs about 3% more than 24.
Sky and weather
Sunrise, sunset and the weather come from Open-Meteo for London, Ontario, with a NOAA-computed table when it's down. Weather maps to clear, rain, snow, fog or wind, and everyone on the island sees the same sky.
Craft
Art pipeline
Everything I model is built by Python scripts that run Blender headless, 128 of them: the character rig, the café and shop interiors, weapons, enemies and props, with level-of-detail versions.
Characters
One rig for everyone, with animation keyed by hand in code and IK foot planting. Twelve residents with daily routines, and 21 hairstyles I made.
Shaders
Custom water, sky, grass and faces, a curved horizon, and a pixel finish over the top. 31 shader files in all.
Stack
Game
Three.js, React Three Fiber, drei, TypeScript, custom shaders.
Server
Colyseus for realtime, Next.js 16 and React 19, Supabase (Postgres functions, auth, pg_cron), Vercel.
Art
Blender 5.2, driven by Python.