About MoveMyBikeFit

MoveMyBikeFit is an open-source gravel and road bike geometry comparison and fit tool. Select any two bikes to overlay their silhouettes at scale, enter your fit measurements to find stem and saddle combinations that match your position, and compare frame geometry side by side.

How it works

Geometry overlay

Bike frames are drawn from the published geometry table — stack, reach, head tube angle and length, seat tube angle and length, chainstay, BB drop, and wheelbase. All measurements are in the manufacturer's coordinate system with the bottom bracket at the origin.

Fit triangle

Three measurements define your riding position as a triangle between the bottom bracket, saddle, and hoods:

The calculator solves for the stem length and angle that places the hoods at the intersection of the saddle-distance circle and the BB-distance circle, accounting for spacers, stem height, bar reach, and hood length.

Fit suggestions

For each bike, the tool searches across all combinations of stem length (40–140 mm), stem angle (±17°), spacer stack (0–30 mm), and saddle setback (−10 to +35 mm), scoring each by how closely the resulting hood position matches your triangle measurements. The best matches are shown as a ranked table; clicking a row applies those values to the bike.

Measuring your inseam

Inseam height (also called pubic bone height or PBH) is the vertical distance from the floor to your crotch. This is not a trouser inseam — it is measured standing flat-footed, without shoes.

  1. Stand with your back against a wall, feet about 15 cm apart and flat on the floor.
  2. Slide a hardback book, spine upward, snugly between your legs — held level and pressed firmly up as a saddle would be.
  3. Have someone mark the wall at the top of the book spine.
  4. Measure from the floor to the mark. That is your inseam height.

To account for cycling shoe soles (typically 10–20 mm), add that amount before entering the value. The "show" checkbox next to the inseam field draws a horizontal guide on the canvas at your inseam height above the ground plane.

Standover clearance

Clearance is inseam − standover. If you enter your inseam, each size is checked against its standover height. Sizes with negative clearance (standover taller than inseam) are excluded from auto-size selection, and sizes below the minimum comfort clearance (default 30 mm, adjustable in Settings) are penalised in the scoring. The Clearance row in the geometry table shows the gap in mm, coloured green, yellow, or red accordingly.

Auto size

When "Auto" is selected in the size dropdown, the tool picks the size whose optimal stem length and angle are closest to a neutral position (90 mm stem, 0° angle). If inseam is set, sizes with insufficient standover clearance are excluded first.

BB height and trail

BB height and trail are derived values, not read from the geometry table directly. They depend on tire size — changing the tire width in Settings updates both figures. The formula used is:

Adding a bike

  1. Fork the repository on GitHub.
  2. Use the Add Bike page to generate a YAML file from the official geometry table.
  3. Drop the file in _data/bikes/ and open a pull request. Include the source URL (manufacturer geometry page) in the PR description.

All geometry values must come from official manufacturer pages. Community-sourced or estimated values are not accepted.

YAML schema

Each file in _data/bikes/ follows this structure (angles in degrees from horizontal, lengths in mm):

brand: Specialized
model: Crux
year: 2024
type: gravel        # gravel | road | cx | adventure
sizes:
  - label: "54"
    stack: 560
    reach: 388
    ht_length: 130
    ht_angle: 71.0
    st_length: 510
    st_angle: 74.0
    tt_length: 580   # effective top tube
    cs_length: 420
    bb_drop: 65
    wheelbase: 1004
    standover: 790   # optional but recommended
    front_center: 589
    fork_length: 374
    fork_offset: 47

Open source

MoveMyBikeFit is open source under the MIT licence. Contributions — new bikes, bug fixes, features — are welcome via pull request on GitHub.