Pico Race
Pico Race is a top-down arcade racer in the tradition of GeneRally: short races, four controls, up to six cars sharing one screen, and handling that is easy to pick up and hard to master.
Six players race together over the network. It runs on iOS, Android, macOS, Windows, Linux and the web.
You can play it in a browser at picorace.net.
Racing online
Six drivers to a race. You find one through the lobby browser or drop straight into matchmaking, and lobbies can be public or private, protected with a password or handed round as a join code. Each one shows region and ping before anyone commits to a grid, and there is chat in the room while cars, liveries and countries get picked.
Anyone without a car slot watches instead. A spectator receives the same race stream as the drivers and sends nothing back. Results feed the leaderboards, and a championship runs as a bracket across far more drivers than the six on any one grid.
The driving model
This is the part with the most care in it, because it is the thing people actually remember about the original. Cars should hold on predictably, break away progressively rather than snapping, and stay catchable once sideways.
Four ideas do most of the work. Heading and velocity are tracked separately, so a car can point one way and travel another, and the angle between them is the slide. Lateral velocity is cancelled every step, but only up to a friction ceiling, and whatever is left over is the drift. That ceiling drops off past a slip threshold, so grip builds and breaks instead of switching on and off. Drive and brake share a friction budget with cornering, so power applied mid-slide spins the wheels rather than driving the car forward.
Cars carry the same parameters the original does, and grip and slowdown are given per surface on the car rather than on the track. That is why a rally car and a formula car feel like different machines the moment they leave the tarmac, instead of both losing the same fraction of the same number.
The simulation runs at fixed sub-steps, so it is frame-rate independent, and surface roughness is hashed from world position rather than drawn from a random source, so it is deterministic. Ghosts, replays and tests reproduce exactly, and both properties are covered by tests.
Content is data
Cars are lists of coloured polygons with physical figures in human units, and tracks are a centreline plus a width. The builder strokes that into a surface grid, then derives the timing gates, starting grid and AI line from the same centreline, so they cannot disagree with each other.
Five championships ship, each a calendar, a class of car and a points table: a twenty-four round open-wheel series, rally, rallycross, touring cars and clubmans. The whole 2026 Grand Prix calendar is built from surveyed GeoJSON by a conversion pipeline rather than traced by eye. The circuits are stylised rather than scaled, which is forced rather than chosen: at this size a real hairpin scales to a corner tighter than the car trying to take it, so the shape is kept and the geometry that cannot fit is opened out.
None of the series is named after a real championship. Those names are registered marks, and naming a game mode after one is using someone's mark as a product name rather than making a descriptive reference. The circuits keep their real geography, because a country is not a trade mark.
The AI drivers
The AI plans in the same terms a player does, in terms of where the road goes, how fast a corner can be taken and whether it is sliding, rather than following a script. One implementation covers every circuit, including ones built later. Steering is pure pursuit: solve for the arc that reaches a point on the line about half a second ahead, then ask the car for exactly the rotation that arc needs.
Human and AI drivers are interchangeable, which is what lets AI fill out a grid and take over from a player who drops out of a championship mid-season. Pace comes from the corner-entry equation scaled by skill rather than from reaction lag, because lag in a feedback loop makes a slow driver a crashing one, and that reads as broken rather than beatable.
Status
Active. Built in Flutter and Flame from a single codebase, with the web build compiled to WebAssembly and a render path written to allocate nothing per frame, which matters far more in a browser than on desktop. Sound and gamepad support are not in the current build.