Sketch a top-down path. Nodes connect into one continuous C¹-smooth spline.
Controls
Place — tap empty space to append a node to the end of the track.
Edit — drag a node to move it, or drag a handle tip to reshape the curve. Handles mirror automatically to keep the curve smooth.
Delete — tap a node to remove it. The track reconnects.
Track
Nodes0
Segments0
QC checklist
Build a multi-node track by tapping.
Drag handles to warp the curve.
Debug line stays smooth — no sharp kinks at any node.
3D mode
2D track editing is locked here, but bank, steepness, resolution, and sampling are all 3D-only adjustments you can make any time -- press Play when you're ready to actually drop a marble.
The rail pair stays level (equal height) by default through turns, but the track doesn't cap marble speed for you — a fast marble can still fly off a curve. Turn on Edit Bankings (bottom bar), then tap a red node to reveal its twist handle.
Camera
One finger to orbit, two fingers to pan, pinch (or scroll) to zoom.
Simulation
Marbles0
Bank (twist handles)
With Edit Bankings on, tap a red node to reveal a small green dial around it. Drag the dial's handle to roll the rails around their own direction of travel at that node — banking them into a curve, like a real coaster, so a fast marble gets pushed inward instead of skipping off the outer rail. (Not yaw — that's the 2D curve's own turning. Not pitch — that would tip the rails nose-up/down. Roll is rotation around the rail's own axis, which is what changes here.)
Sampling
Uniform-t (De Casteljau) naturally packs more samples into tight curves, giving the rail mesh & colliders finer resolution exactly where curvature is highest — the default here. Arc-length instead spaces every sample evenly by real distance, even through sharp turns.
Resolution32 / segment
Display
Track
Rail vertices0
Collider capsules0
Collider note
box3d-wasm doesn't bind a triangle-mesh shape to JS (only box/sphere/capsule/hull), so each rail is collided as a chain of static capsules following the same frames as the visual tube — a round primitive matched to a round rail.
QC checklist
Marble spawns at node 0 and rolls the full length of the track.
No jittering, snagging, or falling through the rails.
Tapping a node (with Edit Bankings on) reveals its dial; dragging it visibly banks the mesh & colliders together.
Banking a tight curve keeps a fast marble on track through it.