Critz is a browser-native multiplayer bike racing game built around short knockout tournaments. Riders connect smart trainers over Web Bluetooth and race in small four-player heats, with winners and fast finishers progressing to the next round.

The starting frustration was Zwift. For most riders, racing there is dull: you get spat out the back early, disappear into your own little world, and spend the rest of the event going through the motions.

Critz was meant to fix that. Smaller races. More interaction. More pressure. More chance. Something closer to a Wednesday night five-a-side than an FTP test in public.

The fantasy was loud, bright, and theatrical. The thing we actually built never really got the visual world there. The racing could be fun, but mostly because we were racing with friends and abusing each other over video. The product idea stayed alive. The spectacle never quite arrived.

Interview

What is Critz in one blunt sentence?

Critz is a multiplayer bike racing game that lives wholly in the browser and uses smart trainers, Web Bluetooth, and short knockout rounds to make online racing feel social and immediate.

What problem were you trying to solve?

Zwift racing is boring for most people. Ninety percent of the field get dropped, the thing becomes anonymous, and you stop feeling involved. We wanted something where you had a real chance in any given round, could actually interact with the people you were racing, and would still want to hang around after getting knocked out.

Basically, I wanted fat old men to feel like athletes.

Why knockout racing?

It was the cleanest way to make every race matter. Four riders, short rounds, quick turnarounds, and a structure where you could actually see who you were up against. It also gave us a way to handicap races so they were about performance on the day, not just raw fitness.

The earlier fantasy had actually been even sillier: something more like Mario Kart for bikes, with weapons that could take over other riders' smart trainers in ERG mode.

Who was this really for?

Me, Chris, and anyone else in that 30s/40s zone who still wants social competition but does not necessarily want to disappear into serious racing culture. The mental model was Wednesday night Critz tournaments instead of Wednesday night five-a-side.

What did you imagine it becoming?

The dream version felt brutal and beautiful. Bright lights. Loud atmosphere. Tight tactical racing. Real people, short on oxygen, making bad decisions under pressure. A thing that felt exciting to race, fun to watch, and worth sticking around for even after you were out.

Beautifully brutal.
Ditch the peloton.
Survival of the smartest.

What did you actually build?

We built something that worked mechanically far better than it looked. We had browser-based racing, trainer control, multiplayer logic, and some genuinely good sprint finishes. But visually it was very thin.

At one point it was basically four balls moving up a linear track with some bloom and chromatic aberration when you sprinted. Fun, sometimes. Convincing, no.

What worked best?

The most magical moments were always the sprint finishes. Hanging on just long enough to stay clear, or timing a finish properly, felt great. The race analysis and data flow also worked better than the world-building. That was probably the most successful part of the whole project, which tells its own story.

What did not work?

The virtual world never felt good enough, and the video layer never really landed either. We tried third-party picture-in-picture video, but in practice we usually ended up second screening on Google Meet.

There was also a deeper issue with the handicap model. The lighter, fitter riders could often ride away from the heavier riders, but if they did not drop them, the heavier guys could usually outsprint them. That never felt quite right. We needed a better balance.

Why was the world so hard to get right?

Three.js felt like an obvious starting point at the time, and on our first Critz retreat in the Peak District we got something on screen quickly enough to believe in it. But I am not really a visual person, and I have aphantasia, so I do not see images in my head.

I knew the feeling I wanted, but not how to describe it precisely enough to build toward it. If you imagine a rapid zero-gravity racer in space with some of the styling mood of The Expanse, you are in roughly the right area. We never got close enough to that.

Why did the project stall?

Mostly life. Children arrived. Time disappeared. The code also got messy as we kept bolting things on, and once that happens in a passion project it gets harder to find your way back in. The idea never really died though.

Would you build it again?

Yes, but not from the old codebase. I would start clean, use agentic development heavily, stay far tighter on TDD, and probably use Bun. I also think the world-building side is still awkward terrain for LLMs, so I would be much stricter about proving the race logic first and leaving the visual ambition until later.

What would success actually look like?

Not venture-scale anything. If we could get a small community of racers together once a week, throw out a live stream, race hard, and cheer each other on, I'd be a happy man.

What I Learned

Critz taught me that the product idea and the product artefact are not the same thing. The idea was strong very early: short social bike racing is simply more appealing than being anonymously shelled off the back of a giant virtual peloton. But a game like this lives or dies on feel, and feel is carried by far more than mechanics.

It also reinforced a recurring lesson: data and logic are often easier to make real than atmosphere. We could make the races work. We could make the numbers flow. We could analyse what happened. What we could not yet do was make the world feel vivid enough to justify the fantasy.

The project is still unfinished in the most honest sense. Not dead. Not live. Just waiting for time, a cleaner restart, and a better way to bridge the gap between a strong product instinct and a convincing playable world.

Project Facts

  • Status: In Progress
  • Type: Passion project
  • Stack: Browser, Web Bluetooth, smart trainers, WebSockets, Three.js, third-party video experiments
  • Audience: Social amateur racers
  • What mattered: Short races, real tactics, visible opponents, weekly ritual