Draw a line, ride it as a roller coaster.

Measure the real g-forces it pulls, then share the ride with anyone.

Context
self-initiated
Stack
  • JavaScript
  • Reddit Developer Platform
  • itch.io
  • Web
  • What it is — draw a line freehand and thoosie turns it into a rideable roller coaster, running real physics on it.
  • My role — everything: design, engineering, physics, launch.
  • Built with — JavaScript, one codebase, shipped to the Reddit Developer Platform, itch.io and the open web.
  • Outcome — live on all three platforms; two testers played for twenty-five minutes unprompted.

The premise

You draw a track freehand. thoosie turns it into a rideable coaster and runs real physics on it, measuring speed, vertical G, airtime and inversions, then lets you ride it from the train.

Everything hard about this sits in the gap between those two things. Drawing is loose and expressive. Physics is unforgiving. A line that looks great is often a ride that either stalls out halfway up the hill or pulls G-forces that would put a person in the hospital. The app has to let people draw freely and still produce something that works.

The constraint

One codebase, three platforms, and they do not agree about anything.

Three genuinely different environments. thoosie ships to the Reddit Developer Platform, to itch.io, and to its own standalone site at thoosie.net. Reddit runs the game inside a sandboxed embed on someone else's page, in a viewport it controls and can resize under you; itch.io runs it in an iframe with its own fullscreen and sizing rules; the standalone build owns the whole window and can assume nothing about either of the other two.

It is all JavaScript, and it is one codebase. A core with three forks looks the same from outside and rots within a month, because the third platform's bug fix never makes it back into the first. Everything that differs between the three is isolated at the edges: how the canvas learns what size it is, how input arrives, where a saved coaster is persisted, how fullscreen is requested. The game does not know which of the three it is running in.

That constraint is a design decision before it is an engineering one. Every feature has to be specified in a way that survives all three. Anything that depends on a known viewport, on a real URL, or on a window the game controls gets designed differently or does not get built.

What I built

A full track editor. Freehand, straight, and arc tools, plus a library of prefab elements: first drops, vertical loops, camelbacks, bunny hops, valleys, barrel rolls, half loops, Immelmanns, dive loops. Track types that behave differently under the physics sim: chain lift, launch, brake run, and trigger track.

A trigger and reaction system, so pieces can respond to the train passing: a brake run that holds the train, counts down, then launches it onward, or track that physically moves between two positions when a trigger fires. That turned the editor from a drawing tool into something closer to a small state machine, and it's the feature that made people build things I didn't anticipate.

Live physics telemetry surfaced during the ride: current speed, vertical G, airtime accumulating in real time, then a summary of height, top speed, max and min G, inversions, length and ride time.

Plus the unglamorous half: autosave, cross-platform level sharing, a gallery, a tutorial, a content filter on shared coasters, and a full mobile pass. Cross-platform sharing is the one with teeth in it. A coaster drawn in the Reddit embed opens on the standalone site, so the save format had to be settled before any of the three shipped, while all three could still be changed to agree.

The decision that mattered

The physics readouts started as debug output. I kept them and made them a first-class part of the interface, because watching airtime tick up while you're cresting a hill you drew is the thing that makes the feedback loop work. Players learn what makes a good coaster by watching the numbers move while they ride.

It's the same instinct as DrawEvolve. The system teaches you to get better. It does not do it for you.

Outcome

Launched, on all three platforms, off the one codebase. Promoted through the coaster and indie dev communities with a single gameplay clip.

Two testers played for twenty-five minutes unprompted, without being asked to and without stopping to give feedback. That is the number I watched for. A physics toy has no goals and no score, so time spent playing is the only thing left to measure.