A heads-up display overlay for iFIT 2.0 treadmills (NordicTrack, ProForm, Freemotion, etc.). Runs directly on the treadmill's built-in screen, and fully replaces built-in iFit app (Workout Player) for treadmill control. I strongly recommend disabling Workout Player app to avoid interference.
Displays real-time metrics, executes structured workouts with HR and Power-based trend aware auto-adjustment for pace or incline,and exports runs to Garmin-compatible FIT files.
Allows you to watch Netflix or any other video streaming service installed on the treadmill, while you are running.
Exposes your treadmill over FTMS both on Bluetooth and WiFi DirCon. Although in the end I found this rather useless, since Zwift and most other video like running apps don't use FTMS to adjust treadmill's speed or incline. I prefer watching videos while running.
Every line of code in this repo was written by Claude Code Opus 4.5 under my close supervision. It took about 5M tokens. At times this was a frustrating experience, but overall I am absolutely blown away by Claude's capabilities!
- Designed for and tested on a NordicTrack X24 treadmill with iFIT 2.0 (GlassOS-based)
- Other iFIT 2.0 equipment may work but is untested
- Requires privileged access to the treadmill's Android system
- Requires wireless debugging (ADB) enabled
- Fully replaces built-in iFit app (Workout Player) for treadmill control
- Current (adjusted) pace and raw treadmill speed
- Distance and elapsed time
- Elevation gain
- Heart rate with zone coloring (supports multiple simultaneous Bluetooth HR sensors)
- Calculated HR from RR intervals — for RR-capable HR sensors optionally computes heart rate directly from raw RR data as an independent, potentially more responsive alternative to the sensor's native BPM. Appears as a separate selectable sensor with configurable EMA smoothing, artifact filtering parameters. Parameters can be tuned retroactively during a paused run — changing settings replays all stored RR data through the filter with new parameters, instantly updating the chart
- Real-time DFA alpha1 from RR intervals — tracks aerobic (>0.75) and anaerobic (<0.5) thresholds with zone-colored HUD box. Supports per-sensor DFA computation when multiple RR-capable HR sensors are connected.
- Note1: use of Polar H10 sensor with ECG-gel is highely recommended
- Note2: Belching produces irregular chest wall movements that severely distort RR intervals, making DFA alpha1 readings meaningless for the duration of the analysis window. After a belch, wait for the configured window period (default 2 minutes) for the corrupted data to flush out before trusting the readings again
- Running power and cadence with zone coloring (when Stryd foot pod is connected)
- Stryd pace for comparison and treadmill speed calibration
- Configurable speed coefficient adjuster. In my tests with Stryd foot pods, your actual running speed is about 10% slower than what treadmill reports.
- Incline adjuster. Set to 1% to emulate flat outdoor running effort
- Speed, Incline, HR, and Power lines can be toggled on/off
- HR and Power lines are color coded with zone color
- Colored horizontal zone border lines for reference
- Visual workout steps structure with speed & incline target lines and HR/Power target ranges
- Three Y-axis zoom modes cycled via toggle button: Timeframe (configurable 1–60 min window), Main Phase (fits main workout only), Full (all data)
- Create custom interval workouts with the built-in editor
- Repeat blocks for intervals, which can contain any number of steps
- Time-based or distance-based step durations, with an option to keep going until Next button is pressed
- Pace and incline targets per step, with optional pace progression (gradual speed change from start to end pace within a step)
- Optional HR and Power target zones per step with pace/incline auto-adjustment
- Early step ending on HR reaching certain levels
- Full undo/redo support in editor
- Default Warmup and Cooldown templates — edit once, attach to any workout
- Each workout step can pick either HR or Power and define a target zone for it
- It also has to choose either pace or incline to be auto-adjusted in order to keep HR/Power in the target zone
- Trend-aware algorithm prevents overcorrection
- Auto-adjustment coefficient isolation between warmup/main/cooldown phases (HR auto-adjustments during warmup don't affect the main workout steps)
- Adjustment scope per workout. Either "All steps", which scales the entire phase uniformly (e.g., "I'm tired today"); or "One step", which keeps each step's coefficients independent, with repeat intervals sharing per step coefficients across repetitions
- Manual speed and incline adjustment buttons also adjust effort level according to the chosen scope
- Connect Stryd foot pod via Bluetooth
- Display running power, cadence and pace in real-time
- Power zone coloring
- Power reading is corrected for incline
- Control treadmill speed, incline, belt, and workout navigation from BLE remote controls (camera shutters, media remotes)
- Remotes pair with Android as HID keyboards — no special hardware required
- Configurable key bindings per remote with learn-mode key detection
- Adjustable increment values for speed (0.1–2.0 kph) and incline (0.5–5.0%)
- Two modes with a toggle button on the remote:
- Mode 1 (Take-over): Remote keys control tHUD (speed, incline, belt, workout steps)
- Mode 2 (Pass-through): Remote keys trigger Android actions (media play/pause, next/prev track, volume, mute, Back/Home/Recent Apps)
- Fallback: keys bound in only one mode work in both; keys bound in both modes follow mode priority
- Same physical key can be assigned different actions per mode
- HUD button with mode indicator and blink feedback on key press
- Requires enabling tHUD Accessibility Service in Android Settings
- Capture the full screenshot of the treadmill's screen
- When taking a screen while watching Netflix or other DRM-protected content, the resulting black background is nicely replaced with the Home wallpaper
- Toggle screenshot mode with the camera button in HUD
- Automatic screenshots on workout step transitions and pause
- Screenshots saved to Downloads/tHUD/screenshots/
- Filename matches FIT file naming for easy correlation
- The last screenshot of the run is auto-uploaded to Garmin Connect with the FIT file
- Automatic export when run ends
- Full Garmin Connect, Strava and Stryd PowerCenter compatibility
- Lap data for structured workouts
- Full incline/grade data
- Power and cadence from Stryd
- Multi-HR sensor data preserved as developer fields (per-sensor BPM traces + DFA alpha1 values)
- HRV data: RR intervals exported as FIT HrvMesg (message 78) for analysis in Runalyze, Kubios, Intervals.icu
- Multi-FIT file export: when multiple RR-capable HR sensors are connected, one FIT file per sensor is exported (identical workout data, sensor-specific HRV stream). Only the file that includes HRV data from the sensor selected as DFA-primary sensor is uploaded to Garmin Connect
- TSS (Training Stress Score) calculation with 3-tier fallback: Power → HR → Pace
- Files saved to Downloads/tHUD/
- Settings for device parameters in FIT Export tab
- IMPORTANT for Garmin Acute/Chronic Training Load calculation:
- Device serial in FIT settings MUST be different from your main Garmin watch (otherwise the watch won't sync the file - it thinks it already has it)
- After uploading the FIT file to Garmin Connect, sync your watch TWICE - first sync downloads the file to watch for processing, second sync uploads calculated metrics back
- IMPORTANT for Garmin Acute/Chronic Training Load calculation:
- Power data is written as Stryd developer fields so Stryd PowerCenter recognizes it automatically
- Automatic upload to Garmin Connect after FIT export (opt-in)
- Sign in via embedded Garmin SSO WebView (supports MFA)
- OAuth tokens stored securely in encrypted storage on-device
- Screenshot auto-attachment as activity photo
- Automatic token refresh (~1 hour OAuth2 lifecycle, ~1 year OAuth1)
- Re-authentication prompt on token expiry
- Run crash recovery with periodic auto-save
- Reconnection handling preserves run data
- Double-stop confirmation prevents accidental run endings
Your treadmill runs a locked-down Android system with iFIT/GlassOS. Before you can install tHUD, you need to:
- Gain privileged access to your treadmill
- Enable Developer Options
- Enable Wireless Debugging (ADB over WiFi)
This process varies by treadmill model. Search for guides specific to your model, or ask an AI assistant for step-by-step instructions.
You'll need Android SDK to build and install tHUD. The easiest way is to install Android Studio, which includes everything you need.
Once installed, clone and build tHUD:
git clone https://github.com/a-vikulin/thud.git
cd thud
./gradlew assembleDebug
The APK will be created at app/build/outputs/apk/debug/app-debug.apk
tHUD communicates with your treadmill's GlassOS service using mTLS authentication. You must extract certificates from the iFit app before tHUD can connect.
Follow the instructions at tHUD-certs to extract certificates from your treadmill's iFit APK, then push them to the treadmill:
# Connect to treadmill via ADB
adb connect <treadmill-ip>:<port>
# Create certs folder and push certificates
adb shell mkdir -p /sdcard/Android/data/io.github.avikulin.thud/files/certs/
adb push ca.crt /sdcard/Android/data/io.github.avikulin.thud/files/certs/
adb push client.crt /sdcard/Android/data/io.github.avikulin.thud/files/certs/
adb push client.key /sdcard/Android/data/io.github.avikulin.thud/files/certs/
Install the APK (reconnect with adb connect first if needed):
adb install app/build/outputs/apk/debug/app-debug.apk
- Launch tHUD from the app drawer
- Grant overlay permission when prompted
- Grant notification permission (required for foreground service)
- When first using the screenshot feature, grant screen recording permission when prompted (used for capturing screenshots only, not video)
- Open Settings (gear icon) to configure:
- Pace Coefficient: 1.0 is "same as treadmill". Adjust to match your Foot pod pace readings
- Incline Power Coefficient: 0.85 seems right to me
- Incline Adjustment - set to 1%, meaning when treadmill is at 1% the HUD will call that 0% and will calculate elevation gain based on 0% incline for saving in FIT files
- Set other parameters if you want to see realisting TSS load calculation
Set you Lactate threshold and FTP, plus HR/Power zones as percentages of LTHR and FTP
Verify that auto-adjustment parameters are sensible
- Tap the Bluetooth icon in the HUD
- Scan and select your device
- Device will auto-connect on future sessions
- Multiple HR sensors can be connected simultaneously — tap the HR box to switch between sensors or use the average of all
- Tap the "#" workout icon to open the editor
- Add steps using the + button
- Configure each step:
- Type (Warmup, Run, Recover, etc.)
- Duration (time or distance)
- Target pace (with optional progression checkbox ">" to set an end pace — speed changes gradually over the step duration)
- Target incline
- HR or Power targets (optional)
- Use Undo/Redo buttons if needed
- Optionally enable "Use Default Warmup" / "Use Default Cooldown" checkboxes to attach reusable templates
- Edit the Default Warmup or Default Cooldown workouts (pinned at top of the list) to customize them
- Workout is saved after every edit
- Tap Run to run the workout
- For a free run either use physical Start button or touch Pace HUD box and select desired pace/speed
- tHUD starts the run and sets incline to effective 0%
- Use physical Speed +/- buttons or a configured BLE remote to adjust speed, or use Pace box in the HUD to open popup menu with a list of paces
- Use physical Incline +/- buttons or a configured BLE remote to adjust incline, or use Incline box in the HUD to open popup menu with a list of inclines
- Tap Chart button in the HUD to show/hide Chart
- Tap X button in the HUD to hide all HUD panels
- To open HUD again use tHUD icon. Installing Taskbar is highly recommended for that
- Workout panel shows current step, progress and gives 3-2-1-GO! beep sequence between steps
- Tap the camera button to enable/disable auto-screenshots
- Use physical Stop button to pause your run
- When paused, press the physical Stop button again to end the run
- FIT file exports automatically
- Find your file in Downloads/tHUD/
Warning: Most cheap TikTok scrollers and camera shutter remotes found on Amazon/AliExpress do not work as BLE keyboards. They typically send swipe actions that tHUD cannot intercept as key events. tHUD requires a remote that pairs with Android as an HID keyboard device.
Recommended: 8BitDo Micro — a compact Bluetooth gamepad that works perfectly with tHUD. It pairs as an HID keyboard, has enough buttons for all essential actions across both modes, and is small enough to hold comfortably while running.
- Pair the remote with your treadmill via Android Settings → Bluetooth → Pair new device
- Restore the virtual keyboard (important!): When a Bluetooth HID device is paired, Android hides the on-screen keyboard system-wide. To fix this:
- Go to Settings → System → Languages & input → Physical keyboard
- Enable "Show on-screen keyboard"
- Without this, you won't be able to type in Netflix search, browser, or any other app
- Enable the Accessibility Service: Android Settings → Accessibility → tHUD
- Configure bindings in tHUD: Tap the remote (gamepad) icon in the HUD to open the config activity
- Tap "+ Add" and select your remote from the list (or use Auto-detect)
- For each action, tap the key button and press the corresponding button on your remote
- Adjust increment values with the spinners for speed/incline actions
- No telemetry or analytics
- FIT files are stored locally until you transfer them
- Garmin Connect auto-upload is opt-in and disabled by default. When enabled, FIT files and screenshots are sent to Garmin Connect using your Garmin account credentials, which are stored encrypted on the treadmill
GNU General Public License v3.0 - see LICENSE file
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Submit a pull request
For major changes, please open an issue first to discuss.
This software is provided as-is. Modifying your treadmill's software may void your warranty. Use at your own risk.






