Help
What the app does, how to set it up, and what to do when it doesn’t.
The Indore iOS app connects to your smart trainer, controls resistance, and records your ride. A desktop HUD floats on top of whatever you’re doing on your computer — metrics visible when you glance, invisible when you don’t. The default ride is open-ended endurance — no plan, no pressure, just pedal.
What you need
- iPhone running iOS 17 or later
- A smart trainer (Wahoo KICKR, Tacx NEO, Elite Direto, most trainers made after 2018)
- Optionally: a separate power meter (pedals or crank-based)
- Your FTP in watts — if you don’t know it, 200W is a reasonable starting point
Getting set up
- Install the app. You’ll get a TestFlight invitation link (apply here). Open it on your iPhone, install TestFlight if prompted, then install Indore.
- Sign in. Open the app and sign in with Google. Use the same account for the desktop HUD.
- Enter your FTP. On the Settings screen, tap the FTP field and enter your value. All power targets are based on this number. You can change it anytime.
- Connect your trainer. Tap the Trainer slot on Settings. The app scans for nearby Bluetooth devices — your trainer should appear within a few seconds. Tap it to connect. The slot turns green when connected.
- Install the desktop HUD. Download the HUD app for your computer from indoreride.com. Sign in with the same Google account. The HUD appears automatically when you start a ride and disappears when you stop.
Google permissions
Signing in only uses your email. Google won’t ask for anything else. No passwords are stored — authentication is handled entirely through Google’s OAuth flow.
The five screens
Swipe left and right on the iPhone to move between them. The dots at the top show where you are.
- Settings (leftmost)
- Devices, FTP, ride zone, warmup and cooldown duration, resistance increment. Most settings are locked while a ride is active to prevent accidental changes.
- Metrics (second)
- Live numbers: elapsed time, interval countdown, current power vs. target, cadence, heart rate, plus running averages for power and heart rate. Small sparkline charts trace your power and heart rate history on the interval graph. These same metrics also appear on the desktop HUD. Power text changes color based on how close you are to the target — green within 5W, yellow within 15W, red if you’re further off.
- Controls (third)
- HARDER and EASIER buttons for manual resistance adjustment, plus pause/resume. Also shows connection details and the 4-digit pairing code for the desktop HUD.
- Routes (fourth)
- Your imported routes. Tap one to see the map preview and ride it. Import routes from GPX files or directly from Strava. Each route shows distance, elevation, and a difficulty rating.
- Sessions (rightmost)
- Your saved sessions. Tap one to expand and see the interval graph, description, and a Ride button. Tap + to create a new one. To delete a session, expand it and tap the trash icon.
Settings reference
- FTP 1–500W
- Functional Threshold Power. The wattage you can sustain for about an hour. All zones and voice interval targets are percentages of this number.
- FTHR 1–250 BPM
- Functional Threshold Heart Rate. The heart rate you can sustain for about an hour. When set, the heart rate line on the ride graph is scaled so that FTHR sits exactly on the FTP line — one reference line for both thresholds. Leave it empty and the heart rate line keeps its own scale.
- Warmup 0–10 minutes
- A gentle ramp from 45% to 55% FTP before the main ride starts. Set to 0 to skip it.
- Default ride zone
- Which power zone to ride in when you start without a structured session. Options are Recovery through VO2max. Default is Endurance (Z2).
- Variance
- When on, power targets vary across the full zone range — small undulations that keep things interesting. When off, power stays at a single steady value within the zone, which you can adjust with the slider that appears.
- Cool down 0–10 minutes
- When you end a ride, you get the option to cool down first — a power ramp down to recovery pace. Set to 0 to remove this option.
- Resistance increment 1–25W
- How much the HARDER / EASIER buttons (and voice commands) change your target power. Default is 10W.
- Powermatch
- When you have both a trainer and a separate power meter connected, Powermatch compensates for the difference between the two. It uses your power meter’s reading as the source of truth and adjusts what it tells the trainer so the numbers line up. Takes about 10 seconds to settle after connecting.
Connecting devices
- Smart trainer (required)
- Most modern trainers work: Wahoo KICKR, Tacx NEO, Elite Direto, Saris H3, etc. The app controls the resistance and reads your power and cadence from the trainer.
- Power meter (optional)
- Optional. If you have power meter pedals or a crank arm, connect it in the Power Meter slot on Settings. Enable Powermatch to use the power meter for accuracy while the app still controls the trainer.
- Heart rate strap (optional)
- Optional. Bluetooth heart rate straps (Garmin, Polar, Wahoo) connect through the heart rate slot. Heart rate appears on the Metrics screen during a ride.
- Treadmill (optional)
- Optional. A Bluetooth (FTMS) treadmill connects through the Treadmill slot and turns the Run page on. Speed, incline, distance and calories come from the treadmill; heart rate still comes from your strap.
The app remembers your devices after the first pairing. Previously connected devices appear at the top of the scan list. To forget a device, go to Preferences → Manage Devices.
Starting and ending a ride
Start
Tap START RIDE at the top of the screen. The app switches to the Metrics screen, keeps the screen on, activates the desktop HUD, and starts controlling your trainer. The default ride runs in your chosen zone for as long as you keep pedaling.
End
Tap END RIDE at the top of any screen. A dialog gives you three options:
- End Ride — stops immediately, saves and uploads the ride
- Cool Down — runs a power ramp down, then stops automatically (only shown if you’ve configured a cooldown duration in settings)
- End Without Saving — stops immediately and discards all ride data. Useful for false starts or test rides you don’t want to keep.
- Cancel — back to riding
After a ride ends, the phone shows a completion screen with a short AI-generated analysis of how the ride went — power consistency, cadence patterns, that kind of thing. The analysis is saved with the ride for future reference.
Interval countdown
During the last 3 seconds of each interval, you’ll hear a 3-2-1 beep and see a full-screen countdown on the phone and desktop HUD — along with the name of the upcoming interval. The next interval starts exactly when the current one ends.
Pause
Tap the pause icon on the Controls screen. The interval timer freezes. Tap play to resume.
Voice commands
On the Metrics or Controls screen, press and hold anywhere to activate the microphone. Speak your command, then release.
Quick commands
These work instantly, even without internet.
| Say | Also works | What happens |
|---|---|---|
| harder | hard, more, up | Increases target by resistance increment |
| easier | easy, less, down | Decreases target by resistance increment |
| reset | original | Clears offset, returns to ride target |
| skip | next, next interval | Jumps to the next interval |
| cool down | end ride, wind down, wrap up | Starts cooldown (or ends ride) |
Interval commands
These require internet.
Anything that isn’t a quick command gets interpreted as an interval. Speak a duration and an intensity:
- “5 minutes at threshold”
- “3 min at 95%”
- “10 at 250 watts”
- “2 minutes sweet spot”
The interval gets injected into your current ride. Once it finishes, the original ride resumes where it left off.
Zone names
| Zone | Say | % FTP |
|---|---|---|
| Recovery | recovery, z1 | 45% |
| Endurance | endurance, z2 | 65% |
| Tempo | tempo, z3 | 83% |
| Sweet Spot | sweet spot | 90% |
| Threshold | threshold, ftp, z4 | 100% |
| VO2max | vo2max, vo2, z5 | 112% |
| Anaerobic | anaerobic, z6 | 135% |
| Sprint | sprint, z7 | 160% |
You can also say a percentage (“95%”) or absolute watts (“250 watts”).
Sessions
By default, Indore runs a simple Zone 2 ride — no intervals, no pressure. If you want structure, you can create sessions.
Creating a session
Go to the Sessions tab on the phone and tap +. Describe what you want in plain language:
- “45 minute endurance ride”
- “4x4 VO2max intervals with 3 min recovery”
- “Easy hour with a few tempo blocks”
- “30 min sweet spot”
Indore builds the intervals from your description. If it’s too vague, it’ll ask a follow-up question. Once you’re happy with the preview, save it.
Importing from other apps
You can import .zwo files (the Zwift format) from the Sessions tab. Tap +, then choose Import to select a file.
Starting a session
On the Sessions tab, expand a session and tap RIDE. Then tap START RIDE. Sessions skip the default Z2 warmup since they typically include their own.
If you start a ride without selecting a session, you get the default Zone 2 ride with your warmup preference applied.
How the connection works
The desktop HUD connects to your phone through the internet — both devices just need to be signed into the same account. No local network pairing required.
When you start a ride on the phone, the HUD appears automatically on your computer. When you stop, it disappears.
Route rides
Instead of a flat power-based ride, you can ride a real-world route. Your trainer simulates the terrain — resistance changes with the grade, so climbs feel like climbs and descents let you spin easy.
Importing routes
On the Routes tab, tap the import button. Two options:
- Import GPX File — pick a .gpx file from your phone. Works with files exported from Strava, Komoot, RideWithGPS, or any other app.
- Import from Strava — browse your saved Strava routes and import directly. Requires Strava to be connected (you’ll be prompted if it isn’t).
Difficulty rating
Each route gets a difficulty rating based on average elevation gain per kilometer — a simple measure of how hilly the route is.
| Rating | Elevation gain per km | What it means |
|---|---|---|
| Easy | < 6 m/km | Mostly flat or gently rolling |
| Moderate | 6–12 m/km | Some climbs mixed in |
| Hard | 12–20 m/km | Significant climbing |
| Brutal | > 20 m/km | Mountain pass territory |
Starting a route ride
On the Routes tab, expand a route and tap RIDE. Then tap START RIDE. The elevation profile appears at the bottom of the Metrics screen with a scrubber showing your position. The desktop HUD shows the same profile and a map of the route with your live position.
Route map
Both the phone and the desktop HUD show an overhead map of the route with your current position as a white dot. Town and city names appear on the map for orientation — pulled from OpenStreetMap when you import the route. Small directional arrows along the line show which way the route goes.
Segments
Some routes have named segments — climbs and sprints from well-known cycling roads. These show up as teal bands on the elevation profile. During the ride, you’ll get a notification when approaching a segment and a progress indicator while riding through it.
Runs
Indore keeps the record on a treadmill too. Connect one in the Treadmill slot on Settings, swipe to the Run page and press Start. The treadmill sets the speed and incline; the app reads them and writes everything down. Any Bluetooth (FTMS) treadmill should work. It was built on the Technogym MyRun.
The run screen shows the whole run across the top (time, distance, calories), the lap in progress in the middle (pace, heart rate, time, distance) and the laps you’ve done below. The square button ends the run. Lap cuts a lap. Hold Lap for two seconds to switch auto-lap on or off mid-run.
Auto-lap cuts a lap every kilometre, or every mile if Distance units in Settings is set to miles. Switch it off on the Run page if you’d rather cut laps yourself.
Heart rate comes from your strap, the same one you ride with. The treadmill sends none. Pace is worked out from belt speed, so it holds steady when you do.
Runs sit in History next to your rides, with distance, pace, laps and a pace chart. With Strava connected they upload as virtual runs.
Graph scrubbing
During a ride, drag the graph at the bottom of the Metrics screen to scrub the timeline. Works on both the interval graph (sessions) and the elevation profile (route rides).
While your finger is down, the scrubber follows your touch without changing anything. When you lift your finger, the ride jumps to that position — the interval or route distance updates accordingly.
Scrubbing is disabled during group rides since the timeline is shared between participants.
Strava
Connect Strava from Settings on the phone (or during onboarding when you first sign in). Once connected, rides upload to Strava automatically when they finish — no extra steps.
With Strava connected, you can also import your saved routes directly into Indore from the Routes tab.
Indore uploads the .fit file directly, so Strava gets your full power, cadence, and heart rate data. Structured rides include interval boundaries so Strava can render the interval details graph. The ride name and description come from the AI-generated analysis.
Group rides include participant names in the Strava title and description automatically.
Desktop HUD
A transparent overlay app for macOS and Windows that shows your ride data on your computer screen — power, cadence, heart rate, interval timer, countdown, and an interval graph. It floats on top of whatever you’re doing — watching something, working, browsing.
The HUD appears automatically when you start a ride and disappears when you stop. It’s click-through — your mouse passes right through it.
The desktop app streams data through the internet, so it doesn’t need to be on the same network as your phone — just signed in with the same account. No pairing code needed.
Troubleshooting
Trainer doesn’t appear when scanning
- Wake the trainer by pedaling a few strokes first
- Check that Bluetooth is on in iPhone Settings
- Make sure the trainer isn’t connected to another app (Wahoo, Zwift, etc.)
- Move the phone closer — Bluetooth range is about 10 meters
- Force-quit Indore and reopen if the scan seems stuck
Desktop HUD doesn’t show ride data
- Make sure you’re signed in with the same Google account on both devices
- A ride must be active on the phone — the HUD only appears while you’re riding
- Check that both devices have an internet connection
- After an app update, try signing out and back in. Authentication can quietly go stale across versions — on either the iOS app or the desktop HUD. If the HUD still doesn’t appear after a desktop relogin, do the same on iOS. This is the most common cause when everything else looks fine.
Voice command says “Could not understand”
- Quick commands (harder, easier, skip, etc.) work offline. If one of those fails, make sure you’re saying the exact word.
- Interval commands (“5 min at threshold”) need an internet connection. Check that you have cell service or WiFi.
- Speak clearly and wait a beat after pressing and holding before you start talking.
Power reading seems inaccurate
- Smart trainers can drift — especially when cold. Ride for 10 minutes to warm up the resistance unit.
- If you have a separate power meter, enable Powermatch in Settings to use the power meter’s reading instead.
- Make sure your trainer firmware is up to date (use the manufacturer’s app).
Phone screen keeps turning off during a ride
The app keeps the screen on automatically during a ride. If it’s still going dark, check iPhone Settings → Display & Brightness → Auto-Lock. Low Power Mode can sometimes interfere.
Phone died or app crashed during a ride
Your ride data is saved continuously during the ride. When you reopen the app, it automatically detects the interrupted ride, reconstructs it from the saved data, and uploads it. No action needed — just open the app and it handles the rest.
Computer falls asleep during a ride
The desktop HUD prevents your Mac from sleeping while a ride is active. If the screensaver or sleep still triggers, check System Settings → Lock Screen and make sure no energy-saving overrides are active.
History
Your rides and runs are on the phone’s History page (swipe left from Settings). Once you have run, a Rides / Runs switch at the top keeps the two apart. A ride shows duration, average power, normalized power, TSS and the ride analysis. A run shows distance, average pace and heart rate.
Tap an entry to see the chart (power for a ride, pace for a run) and the full breakdown.
To delete an entry, touch and hold it. Deletion removes it and its data permanently.
Invitations
Indore is currently invite-only. You got access because someone shared their invite link with you, or you were whitelisted directly.
As you ride more, you’ll unlock invite codes of your own — up to 3 total, at 10, 25, and 50 hours of riding. Find them in Settings in the app. Generate a code, share the link, and someone can claim a spot.
When you cross one of those milestones, we’ll email you to let you know a fresh invitation is waiting in Settings.
Your data
- Ride recordings are stored locally on your phone.
- Google account — Indore stores your email for sign-in. No passwords are stored — authentication is handled through Google’s OAuth flow.
- Telemetry — Indore can share anonymous data about how your trainer responds to power changes, to help improve compatibility with different trainers. No personal information is included. You can opt out in Preferences → Data.