The GamesOne engine, and the players are faces the visitor made.

Play a match

The cast of the games: a row of coloured cut-out heads standing under a large black and white portrait.
Role
Designer & builder
Team
Solo
Built with
Canvas, vanilla JavaScript
Modes
A match, a race, a cup, and one held back
Year
2026
Overview

The games on my Play page are one physics engine wearing several faces: a football match, a marble race, a knockout cup, and a survival mode I have not shipped. The cast is always the same, the cut-out heads visitors make in the Head Maker, and the fact that they are photographs of real people is the idea.

The cast

The heads came first, and the games came out of them.

People make a head and then have nowhere to put it. Every mode is an answer to that. A head owns its own physics, face, blinks and contact shadow, and a mode never rewrites it: it posts a position and the head reads it. That is why a face still blinks halfway down a marble race.

The lobby cast: eight coloured cut-out heads in a line under a large black and white portrait of Jayden.
One cast, four modes. Everything else is the mode’s business.
The match

The pile in front of the goal is the product, not the defect.

Three separate times I was offered the standard fix for players all converging on a ball: separation steering, roles and zones. Every time it made the match tidier and less worth watching. The bar is whether it surprises you, not whether you can follow the tactics. The only note I have written for this mode asks for the opposite: more airborne ball, more flips, more bounces nobody saw coming.

A match in progress: coloured heads packed around the ball near one goal, with the flip-card scoreboard above them.
Eight heads and one ball. Nobody is told to spread out.
The distinction that matters

Chaos that resolves is the game. Chaos that stops is dead time.

The scrum in the goalmouth clears in under a second every time, so it stays. The thing worth fixing was different, and I found it by watching rather than counting: the ball trapped for long stretches in one small circle while a crowd churned around it, invisible to every measurement because it was being struck constantly. The fix moves the ball, upward and out, and lets the pile follow.

A match with the ball airborne between two groups of heads.A match with the heads spread across the pitch chasing a loose ball.
The escape is deliberately vertical, because height is what makes the next moment unpredictable.
What I did not change

The keeper looks lazy, and the keeper is correct.

Its leash is short, and it sits at the end of it most of the match, so from the stands it reads as a head that gave up. I tried lengthening it. Goals fell, the pile got both more common and longer, and the complaint that started the investigation got worse. The short leash is what keeps the goalmouth busy, so it shipped as written.

The race

Fair means every lane meets the same amount of course, not that everyone finishes together.

Lanes at the edges were falling clean through half the obstacles. That is easy to fix wrongly, because the moment your starting lane predicts where you finish, the race is over before it begins. So what gets equalised is how much course a lane meets, never where anyone lands. A change that makes the finishes more orderly is a change that broke it.

The marble race at the drop: twelve coloured heads falling into a peg lattice, with the running order down the left gutter.
Twelve lanes, one course, and a running order that has changed by the next screen.
One course, not a shuffled deck

A layout nobody chose cannot be tuned.

The course used to be random sections, so every measurement was an average over layouts I had never seen. It is one authored descent now: pegs, funnels, sliding gates, spinners and a clear run in. Real marble racing works the same way, one track a season. Everything that is not the layout stays random.

The end of a marble race: the first four racers checked off in the running order while the rest are still on the course.
The qualifiers are checked off as they land. Nothing about the order was decided at the start.
The cup

Simulate runs the real match with nobody watching.

I use this bracket to settle a real fantasy draft, so a scoreline it invented would make the whole screen useless. Skipping a match does not roll dice: it hands the engine a clock it can crank and plays the match out with the drawing switched off. Any number here that looks like a ranking has to have been earned, or the row says so.

The tournament panel: a tab row for the rounds, the next fixture between two heads, the match length, and Leave, Simulate and Kick off.
One panel, one primary action. The match length is read off the engine rather than restated.
What is not on the page

The fourth mode is finished and I am still holding it back.

A survival mode where the floor is lava, with a molten shader rising under the cast, has worked for months. It is not in the menu. The match and the cup already reward somebody passing through, and a third door would turn the page into a list instead of an invitation. It is the easiest thing here to ship, which is why it needs a reason.

The unshipped survival mode: heads on narrow platforms above a rising molten surface.
Built, tested, and waiting for a slot it has earned.
Outcome

Nothing got tidier.

Every change to the match carries the same question now: did this make it calmer? Time in the air, time contested, how long anything stands still, how often the lead changes. They exist so I can prove I have not quietly sanded off the thing that makes people watch.

The Play page at 390 and at 320 pixels wide, the cast lined up under the headline at both.
The same cast on a phone. The heads are sized to the screen, never cropped out of it.