← MENU

Open the hood. Pixel Watts turns your watts into speed with real steady-state cycling physics — the same equations a power-meter calculator uses, not a game fudge. This page runs that live ride model (solveSpeedKmh + gearing) across a grade×power grid, five routes, a gear/cadence ladder and a standing-start acceleration table, then audits working points against independent cycling calculators. Every number is reproducible — tweak the equipment, air, wind and surface and watch it react, or copy the whole audit out. The competitive targets are built on this too: each leaderboard's par time (Time-Trial medals + the OutRide Arcade Rating) is this same solveSpeedKmh model run for a reference rider of your W/kg class — so a flat sprint and a mountain climb are compared on honest physics, not a lookup table.

EQUIPMENT — “our values”

CALIBRATED DEFAULTS

ENVIRONMENT — air, wind & surface

Air density ρ1.225 kg/m³ (derived)
Rolling Crr0.0050 (derived)

ρ is computed from altitude + temperature (barometric formula); Crr comes from the surface. Thinner air up high = faster on the flat; a headwind or gravel = slower. Wind feeds the grade×power matrix and the routes; the audit + acceleration stay at the windless calibration.

GAME ROAD SURFACES — the story-ride consequence · docs/fable/48

Each story-ride road surface carries a REAL rolling-resistance cost, not just a texture. The speed multiplier below is derived from THIS page's own solver at a reference operating point (200 W, flat, reference rider) — the same watts cover this fraction of the ground on that surface vs. smooth asphalt, so a muddy or cobbled sector is felt as lost distance, never a faked watt. Soft ground (dirt/snow/mud/sand) bites harder on climbs (the tyre sinks — a term the steady-state balance alone misses); the last column shows the total at an 8% climb.

SurfaceRolling CrrFlat speed ×At 8% climb ×
asphalt0.00501.0001.000
dirt0.01000.9280.905
cobbles0.01100.9130.913
snow0.01400.8710.829
mud0.01600.8430.783
desert0.01700.8300.776
regolith0.00600.9850.985
marsdust0.00700.9710.971
racetrack0.00401.0151.015
chocolate0.00501.0001.000
rainbow0.00501.0001.000

VALIDATION AUDIT — vs independent calculators · reference rider, sea level / 15 °C

8/8 PASS
Working pointPowerGradeExpectedOursΔΔ%Reference implies
Endurance, flat
physics.ts / bikecalculator
200 W0%30.0 ±2.532.1+2.1+7%CdA 0.450
ours 0.36
PASS
Easy spin, flat
bikecalculator
100 W0%24.0 ±324.4+0.4+2%CdA 0.382
ours 0.36
PASS
Threshold, flat
bikecalculator
300 W0%35.5 ±337.4+1.9+5%CdA 0.426
ours 0.36
PASS
Sprint power, flat
bikecalculator
450 W0%41.5 ±3.543.4+1.9+5%CdA 0.414
ours 0.36
PASS
Endurance, 5 % climb
physics.ts / bikecalculator
200 W5%14.0 ±1.514.3+0.3+2%86.4 kg
ours 84.5 kg
PASS
Threshold, 8 % climb
Gribble
300 W8%13.5 ±1.814.2+0.7+5%89.6 kg
ours 84.5 kg
PASS
Steady, 10 % wall
Gribble
250 W10%9.2 ±1.59.9+0.7+7%91.2 kg
ours 84.5 kg
PASS
Coasting, −5 % descent
terminal velocity (Gribble)
0 W-5%44.0 ±546.8+2.8+6%CdA 0.407
ours 0.36
PASS

Run at the reference rider — 84.5 kg · CdA 0.36 · Crr 0.005 · ρ 1.225 · η 0.97, sea level / 15 °C. Fixed on purpose: the sliders above move every other table on this page, but they must not be able to paint this one green. The two flat/5 %-climb anchors are the ones already cited in lib/physics.ts.

We sit high on all 8 of them8/8 fast, mean +5.0 %. That is an offset, not scatter, so here is where it comes from rather than an average that hides it. The references were not all taken at one setup: hold everything else and ask what single value would make our own solver land exactly on each published speed — the last column. Where air resistance sets the speed they imply CdA 0.380.45; where gravity does, 8691 kg total. Ours is a 0.36 m² hoods/tops position at 84.5 kg — more aero and lighter than what those numbers describe, which is the whole gap. Feed a rider back in at roughly CdA 0.41 / 89 kg and the deltas scatter either side of zero instead of stacking up. So the offset is a difference in who is riding, not in the physics: 8/8 land inside a tolerance band that was set before any of this was measured.

SPEED MATRIX — km/h (grade × power)

grade \ W100150200250300350400
-8%63.064.265.366.467.568.569.5
-4%46.348.450.251.953.454.956.2
-2%36.139.041.543.745.647.449.0
0%24.428.832.135.037.439.641.6
+2%14.419.323.326.629.532.034.3
+4%9.013.016.619.922.725.427.7
+6%6.49.512.415.117.720.122.4
+8%4.97.49.712.014.216.318.4
+10%4.06.08.09.911.813.615.4
+12%3.45.16.78.410.011.613.2
+15%2.74.15.56.88.29.510.8

Each cell is solveSpeedKmh(power, grade, rider) — the exact value the ride uses. Read down a column and you can see the balance tip: At 250 W the flat is aero-dominated, the 8 % climb is gravity-dominated.

ROUTE SIMULATIONS

RouteDistTimeAvgMinMaxAscentDescentGear @avgrpmClimb gear
Pancake Flat
10 km dead flat — the aero/rolling baseline.
10 km17:0335.235.235.20 m0 m54/1788
Rolling Hills
12 km of ±3 % rollers — punchy, never steep.
12 km23:0031.323.248.0180 m180 m39/1489141 rpm @ 3%
Alpine Climb
8 km at a steady 7 % — a real mountain pass.
8 km35:1613.613.613.6560 m0 m39/308383 rpm @ 7%
Fast Descent
6 km at −6 % — coasting / pedalling downhill.
6 km6:0359.659.659.60 m360 m54/1196
Mixed Classic
4 km @ 5 % up · 4 km @ −5 % down · 4 km flat.
12 km24:5129.017.555.9200 m200 m54/2189106 rpm @ 5%

Each route integrates the steady-state speed segment-by-segment at a constant 3.0 W/kg. “rpm” is the cadence in the gear closest to 90 — yellow means no gear in the All-round (54/39 × 11-30) drivetrain keeps you in the 80–100 band at that speed.

LEADERBOARD PAR — “the target you race”

The OutRide Arcade Rating + Time-Trial medals rank you against a par time, not raw speed — so a flat sprint and a mountain climb compare fairly. Each par below is stageTargetSec = this same solveSpeedKmh model run for a reference rider of that W/kg class (equipment-neutral, 90% of class FTP). Notice steep climbs cost a weak (E) rider far more than a lookup table would ever guess — that's gravity, done honestly.

StageA
4.3 W/kg
B
3.6 W/kg
C
2.9 W/kg
D
2.1 W/kg
E
1.5 W/kg
1 km · flat1:371:441:542:072:27
1 km · rolling +2.5%2:072:222:443:194:20
1 km · hilly +4.5%2:413:043:424:426:28
1 km · climb +7%3:334:095:076:429:25
1 km · descent −3%1:151:181:211:261:31
5 km · flat8:078:419:3010:3812:20

Ride under your class's par → positive Arcade Rating (1000 = par). Because it's par-relative, no single fork line is a “farm” — every route rewards the same relative effort equally.

ROLLING PENALTY — “same average, not the same time”

A 10 km course that averages 2.0% is not one time — how the climb is distributed changes it a lot. profileTimeSec integrates the same solveSpeedKmhfoot-by-foot over the real elevation profile — the honest way to time a course, and the model behind profile-aware ghost + par times. Rolling terrain is genuinely slower: the time lost grinding steep pitches dwarfs the time won on the descents (drag caps downhill speed), so a “Rollers” course with 30% descent is the slowest of all, not the fastest. All at 3.0 W/kg.

ProfileGrade rangeDescentTime (10 km)vs constant
Constant2.02.0%0%22:20
Front-load0.04.0%0%22:43+23s (+1.7%)
Back-load0.04.0%0%22:42+23s (+1.7%)
Wave0.04.0%0%22:54+34s (+2.6%)
Plateau0.83.2%0%23:34+75s (+5.6%)
Rollers-1.65.6%31%24:04+104s (+7.8%)
Valley-1.45.4%30%23:53+94s (+7.0%)

At 0% average every shape is identical (nothing to distribute). The penalty grows with the average grade and the “peakiness” of the profile — which is exactly why a naive average-grade lookup would hand out unfair targets on a hilly course. Same physics, done honestly.

ACCELERATION — standing start (real F = m·a)

ScenarioPowerGradeTerminal0 → 30 km/h→ 90 % terminalDistance
Easy roll-out150 W0%28.8 km/h29.2 s149 m
Endurance flat250 W0%35.0 km/h20.2 s24.5 s154 m
Sprint jump600 W0%48.1 km/h6.3 s18.2 s160 m
Tempo, 4 % climb250 W4%19.9 km/h14.6 s50 m
Attack, 8 % climb350 W8%16.3 km/h8.7 s23 m

Driven by the actual ride integrator step() from a standstill. The terminal speed is identical to the solver — only the wind-up is now Newtonian, so a 84.5 kg rider on this equipment shows real launch lag and a sprint has punch. Heavier mass or less power = slower to wind up.

GEAR / CADENCE LADDER — All-round (54/39 × 11-30)

SpeedEasiest gear rpmHardest gear rpm80–100 band reachable?
12 km/h7319 no gear in band
18 km/h11029 yes
24 km/h14639 yes
30 km/h18348 yes
36 km/h21958 yes
42 km/h25668 yes
48 km/h29277 yes
54 km/h32987 yes

A row marked has a gear that holds the target cadence band at that speed; at the top and bottom of the range you’d spin out or grind — exactly what a real drivetrain does.