Shift-proof roll-off detection
Tap Record once and ride. The pull arms on the roll-on and ends itself about 2 seconds after you roll off. A one-second gear-shift dip won't cut it short, and a lazy partial lift still ends it.
FXR Archive Phone Dyno · Free beta
Mount it. Tap Record. Roll on. Phone GPS becomes a rear-wheel horsepower and torque curve, and every pull ends and trims itself.
Phone-app estimates from GPS, not a drum dyno. Free while in beta.

Real app footage: a Stroked FXR pull replayed in FXR Archive Phone Dyno.
Pull stacking
Phone GPS only updates speed about once a second, so a single pull is just a handful of dots. Stack a few pulls and the app pools all those dots into one dense, sharper curve.
Pro move: run your pulls both ways on the same road. Opposite runs cancel most of the wind and grade, and the app tells you when every pull ran the same way.
Why it's different
Tap Record once and ride. The pull arms on the roll-on and ends itself about 2 seconds after you roll off. A one-second gear-shift dip won't cut it short, and a lazy partial lift still ends it.
Every saved pull is cut to the roll-on to roll-off window by the same fixed rules, so the cruise lead-in and the slowdown never bend your curve.
A Dynojet-style drum never sees the rear tire's rolling loss and the front wheel doesn't turn. So the app counts only the front tire's rolling drag, and your numbers read like a drum-dyno sheet. SAE J1349 corrected with real weather.
Open it in Safari on an iPhone, tap Share, then Add to Home Screen. It launches full screen, keeps the screen awake, and stays on your bars. No login, no server storing your pulls.
Inside the app
Real screens from the Stroked FXR pull: its recorded GPS fixes replayed in the app.



Screens and footage show the app replaying the real recorded GPS fixes of that pull on a computer, not a capture from the phone. On-screen clock times are from the replay. Phone-app estimates, not a drum dyno.
Results
Two Evo FXRs, shown as the app computed them.
Evo stroker · 5th gear

1340 Evo · 4th gear
RWHP (SAE J1349)Torque ft-lb (SAE J1349)Fit pointsStock Evo (dashed)
Single pulls on phone GPS, not validated against a roller dyno yet: expect about 5 to 15% difference from a drum dyno. A peak at the end of a pull is where the run stopped, not necessarily the engine's peak. Dashed stock Evo: Cycle World's rear-wheel run of a stock 1994 Road King (Cycle World, May 1994).
Free beta
The Phone Dyno is a free beta, and access is by request while it's being tested. Tell us a little about you and your bike. Requests are reviewed by hand; if yours is approved, you'll get a personal access link by email that works on your phone and in the installed app.
What you send (name, email, bikes and your note) is used only to handle your request and run the beta. It is never sold or shared. See Privacy, and ask us to delete it any time through the Contact page.
A note from FXR Archive
The FXR deserves to be remembered. Riders still love it decades after the last one was built, but much of what people know about it is scattered across old magazines, manuals, forums and garages. I built FXR Archive to memorialize the FXR and to gather as much FXR information as possible in one place, as an archive. The Phone Dyno is one part of that. Period road tests show what these bikes made when they were new. The dyno helps riders see what their FXRs make today, so that knowledge stays together with everything else here.
The app reads GPS speed about once a second. Each pair of back-to-back readings becomes one data point: the change in speed divided by the time between them gives acceleration, at the average of the two speeds. The force at the rear tire is total weight (bike, rider, cargo) times that acceleration, plus air drag from the bike preset's drag area, plus the front tire's rolling drag, which rises with speed. Force times speed gives rear-wheel horsepower. Engine rpm comes from road speed, tire size and the gear you pick, and torque is horsepower × 5,252 ÷ rpm. Results are corrected to SAE J1349 using weather looked up automatically.
Tap Record pull and roll on. The pull arms once acceleration stays up for two readings, then auto-ends on roll-off: about 2 seconds of low acceleration while speed stops rising and the bike clearly slows. A quick gear change doesn't end it. Automatic trim then keeps only the rising part, from where acceleration climbs above 60% of the pull's peak to the first sustained drop below 30%, so cruising and coasting can't bend the curve.
Only the front tire's rolling drag is counted because a drum dyno such as a Dynojet never sees the rear tire's loss and the front wheel doesn't turn. So the numbers read like a drum-dyno sheet.
Stacking lines up several pulls of the same bike and gear by rpm, pools their points and drops ones that disagree. Pulls run both ways on the same road cancel most wind and grade.
Limits: each pull assumes a level road and still air, and drag and tire values are estimates. Expect about 5 to 15% agreement with a drum dyno. One reading a second can't catch quick changes, and the curve is smoothed over roughly ±200 rpm.
The FXR Archive Phone Dyno is a web app for your phone. It estimates rear-wheel horsepower and torque, corrected to SAE J1349 standard conditions (SAE J1349), from GPS speed and a physics model of the loads on the bike.
A roller dyno is still the best way to measure power, and this is not meant to replace one. The idea is a repeatable, low-effort way to see a power curve on the road, compare before and after a change, and learn something about your bike between dyno sessions.
It is not an app-store app. You open it in Safari on an iPhone, tap Share, then tap Add to Home Screen. After that it launches from its own icon, runs full screen, keeps the screen awake, and updates itself when you reopen it. Once it is installed it works without a signal. Only the weather lookup needs a connection, and the app tells you when it has to do without one.
Each bike preset carries the gearing (primary, transmission and final drive), the rear tire size, an estimated drag area (CdA), a rolling-resistance base (Crr) and an estimated share of weight on the front wheel. You can edit total weight and tire radius in Settings; drag area and rolling resistance come from the preset. The beta ships with a small set of presets, including two Evo FXRs and a few modern touring and sport-touring bikes. There is no custom-bike option yet.
The app asks iOS for high-accuracy location with no cached fixes, reads the Doppler speed the GPS chip reports, and falls back to distance between fixes divided by time when a fix has no speed. Every fix is placed at its own timestamp, not at the moment it happened to arrive in the app. That matters, because acceleration comes from speed changes over time, and arrival times can be uneven.
Earlier test versions also read the phone's motion sensors and had a coastdown mode for measuring drag. Both were removed. There is no accelerometer and no calibration step: you mount the phone and ride. Drag and rolling numbers always come from the bike preset, so every pull on a given bike is computed on the same basis.
The number most riders know is the one on a sheet from a drum (inertia) dyno such as a Dynojet, so the app is built to produce a number on that same footing.
On a drum dyno the rear tire's rolling loss happens before the power reaches the drum, so the drum never sees it, and the front wheel does not turn at all. On the road both tires roll. Counting both would report more power than a drum dyno shows for the same bike, so the app counts only the front tire's rolling drag. In the words of the source code: to match a drum dyno, the road-to-wheel force counts ONLY the front tire's rolling resistance.
You tap Record pull once. Recording never starts from motion alone. After that tap the app does the rest:
A 30 second limit and a Stop button are always there as backstops. The point is safety and consistency: you should not be looking at or tapping a phone during a full-throttle run, and a detector that uses the same rules every time gives more repeatable pulls than a thumb on a screen.
Power at the rear wheel is the force needed to push the bike down the road times the road speed. The app adds that force up from four parts:
F = m × a + aero drag + front-tire rolling drag + grade
power = F × speedCrr(mph) = base Crr × (0.01632 + 0.0000018625 × mph²) / 0.020That speed shape was fitted to tire research values of 0.018 at 30 mph, 0.029 at 82.5 mph and 0.035 at 101.5 mph. The research was on bias-ply tires, so for radial-tired bikes the shape is an estimate. There is no allowance for rotating inertia (wheels, driveline) in the model.
RWHP = force (lbf) × mph / 375 (same as N × m/s ÷ 745.7)GPS knows road speed, not engine speed, so the app works rpm out from the tire and the gearing:
wheel rpm = speed ÷ (2π × effective tire radius) × 60
overall = primary × gear × final drive
engine rpm = wheel rpm × overallThe effective radius is 0.97 × the unloaded radius from the tire size, to allow for squat under load. You pick the gear for each pull in the analysis (4th by default on five-speeds). On a dual-clutch bike you have to hold it in manual mode, because an automatic upshift mid-pull breaks the rpm math.
Torque follows the usual dyno-sheet convention, torque (ft-lb) = RWHP × 5252 ÷ rpm. When the curve is drawn, horsepower is re-derived from the fitted torque curve, so the two curves always agree.
Engines make less power in hot, humid or thin air. To compare pulls from different days, every pull is corrected to the J1349 reference day of 77 °F, 29.23 inHg of dry-air pressure and 0% humidity:
CF = 1.18 × (29.23 / Pd) × √((T°F + 459.4) / 536.4) − 0.18
Pd = station pressure − water vapor pressure (inHg)
corrected HP = raw HP × CF; corrected torque = raw torque × CFWhen you open a pull, the app asks Open-Meteo for temperature, humidity and station pressure at the pull's start location and hour. If station pressure is missing, it derives it from sea-level pressure and an elevation chosen automatically. Offline, or if the lookup fails, it uses the J1349 standard day (CF 1.00) and says so. All the weather fields stay editable, and the analysis also shows density altitude.
The live screen gets its own correction factor from current conditions, refreshed every 30 minutes. Without one, the big tile says Unadjusted Raw HP
, and the MAX HP tile resets whenever the basis changes, so corrected and raw numbers are never mixed.
| Rule | Value | What it does |
|---|---|---|
| Arm | above 0.05 g for 2 intervals in a row | Detects the roll-on (about three fixes at 1 Hz) |
| Minimum pull | 3 s armed, 0.08 g peak, 5 mph gained | Keeps GPS noise while cruising from ending anything |
| Low | below 30% of the peak so far, or negative | Starts timing a possible roll-off |
| End | low for 1.8 s, speed not rising, latest interval below −0.08 g | A real roll-off |
| Backstop | low for 3.8 s | Ends a lazy partial roll-off |
| Bad gap | fix spacing outside 0.2 to 3.5 s | Ignored, and counts start over |
After you tap Record, every raw fix goes into a small state machine. Acceleration is the speed change since the previous fix divided by the time between their own timestamps. The pull arms on the roll-on, keeps track of the highest acceleration so far, and watches for a low stretch. The pull ends only when it has been armed for at least 3 s, has reached a real peak and speed gain, and then either passes all three end tests or stays low for 3.8 s.
A quick shift makes acceleration dip for about a second, but speed is rising again by the next fix, so the low stretch resets before it can pass the not rising
and clearly decelerating
tests. As the code comment puts it: A gear-shift dip (~1 s) recovers in the next interval, so it doesn't meet all three; a roll-off does.
A shift still breaks the rpm calculation, because the analysis assumes one gear, so shifting mid-pull isn't recommended; the detector just won't cut the recording short because of it.
If you only roll part of the way off, the bike may not slow hard enough for the −0.08 g test. The 3.8 s rule covers that case. If the pull never arms, it records to the 30 s limit, and Stop always works. Each saved pull records why it stopped: roll-off, the 30 s limit, or the rider.
A recording includes some cruising before the roll-on and some slowing after the roll-off. Those parts would bend the ends of the curve, so the analysis trims them automatically:
The window needs at least 5 samples. If there is no clear run, the app says so (need about 4+ seconds of steady throttle
) and offers two sliders to pick the window by hand. A manual trim is saved with the pull, and Reset to auto
goes back to the automatic one.
Inside the window, each pair of consecutive fixes gives one point: the speed change over the time between them, placed at the average of the two speeds. At one fix per second that is 1 s of averaging, with no separate speed smoother. A point is kept only if its rpm is higher than every point before it, so the curve can never fold back, and at least 4 points are needed.
Corrected torque is then fitted against rpm with a local weighted fit (LOESS): a window of about ±200 rpm, widened where needed to take in at least 4 points, nearby points weighted most, a lean toward a straight line at the one-sided ends so they don't hook on one noisy point, values held within the points' range plus 10%, and nothing drawn past the first or last point. The individual points are drawn as faint dots behind the curves, so you can see the scatter. Horsepower and torque always share one y-scale.
Phone GPS gives about one speed reading a second, so a single pull has only a few points, often 150 to 300 rpm apart. Stacking combines several pulls of the same bike in the same gear into one result, so the points from one pull fill the gaps between the points of another.
The result also says whether the pulls ran in both directions. Pulls run both ways on the same road cancel most of the wind and grade; if every pull ran the same way, a steady wind or a slope is baked into the result. A stack can be named and saved on the phone (it keeps its own copy of the pulls) and shared as a PDF or Excel file.
Automatic start and stop is not new in itself, and it's fair to say so. Other phone apps have it too: True Power starts a timed run automatically when its trigger detects movement (True Power (Google Play)), and Clockwatts has an automatic measurement mode that can end a run without input (Clockwatts). What the Phone Dyno does better is the combination:
Two pulls on Evo FXRs, shown as the app computed them. Bike details are kept general on purpose.
Estimates from a phone, not validated against a roller dyno. Peaks at the end of a pull are where the run stopped, not necessarily the engine's peak.
The dashed stock Evo reference is Cycle World's rear-wheel dyno run of a bone-stock 1994 Road King with the 1340 Evo, digitized from the published chart (Cycle World, May 1994). It is a reference to eyeball against, not a calibration, and it came from a CV-carb engine.
The roll-off rules were tuned on a physics simulator that uses the same road-load model as the app: about one GPS fix per second with timestamp jitter, Doppler speed noise of 0.08 to 0.2 m/s, optional receiver lag of 0.6 s, a cruise lead-in, gear shifts and partial lifts, across three different bike models.
| Scenario (240 runs each) | Ended | Early ends | Delay after roll-off |
|---|---|---|---|
| Normal pull | 240/240 | 0 | median 2.0 s, 90th percentile 2.6 s, max 3.25 s |
| Pull with a 1 s gear shift | 240/240 | 2 | median 1.9 s |
| Partial lift | 240/240 | 0 | median 2.3 s, 90th percentile 4.1 s |
| Cruising only, no pull | 0/240 false ends | n/a | 8/240 armed by noise at 0.30 m/s noise and ran to the 30 s limit |
The two early ends both came in runs with a gear shift, and both ended shortly before the simulated roll-off (by about 0.1 s and 1.8 s), not at the shift itself.
The curve method was tested the same way. With 0.12 m/s of simulated GPS noise it recovered 95.8% of a known torque dip when points were about 160 rpm apart, but only 45.2% when they were about 280 rpm apart, and it read peak horsepower about 3.8% high (median). Those are simulation results, and a fair picture of what 1 Hz GPS can and can't resolve.
This is the most important limit. The app has been tested in simulation and sanity-checked against published stock data, but it has not been compared head to head with a roller dyno yet. Treat every number it gives as an estimate.
armed.
There is no account, no login and no server that stores your pulls. Settings live in the phone's local storage and pulls in its built-in database. Up to 20 pulls are kept; when a new pull would make 21, the oldest pull that isn't starred is deleted. Starred pulls are never deleted automatically.
Apart from loading and updating its own files, the only network call the app makes is the weather lookup. To get the weather it sends Open-Meteo the location and time of the pull. Nothing else leaves the phone unless you share an export.
Each pull can be shared through the iPhone share sheet as a PDF dyno sheet or an Excel workbook (summary, raw GPS data, calculated points and chart). Privacy tip: exports include location. The PDF shows the pull's start location and the workbook has every fix's latitude and longitude, so think before posting a raw export in public.
Full bibliography and image credits: Sources & Credits. Magazine pages are linked, never copied or hosted here. Spot an error? Tell us.