WorldRide Virtual · ANT+ companion

This package targets your Windows computer and Dynastream ANT USB-m stick (USB ID 0fcf:1009). It includes the ride app with 165 courses across 30 cities: 20 Reykjavík courses and five mapped courses in each of 29 more cities. USB hardware pairing has not been tested on your computer.

First ride

  1. Extract the ZIP using Extract All. Run from the extracted folder, not inside the ZIP.
  2. Plug in your ANT+ stick. Close Zwift, Garmin Express, and other apps that may be using the stick.
  3. Double-click Start-Reykjavik-Ride.bat. 64-bit Python 3.10 or newer is required; if it is missing, the launcher opens the official Python download page. Python 3.12 64-bit is a suitable option.
  4. The first launch installs its bundled dependencies into a private .venv folder. No dependency download is needed. Internet access is needed for online map tiles and, if missing, the initial Python download.
  5. The companion opens the app at http://127.0.0.1:8765/?ant=1. Open this address in Chrome or Edge if a different default browser opens. Click Connect ANT+ if it has not connected automatically.
  6. Pedal the IC8 and enable its ANT+ transmission/training mode. Wake your heart rate monitor. The panel lists received measurements and ANT device IDs.
  7. Check that the sensor IDs and readings match your bike and belt. Choose a route, then Start ride. Keep the companion window and ride tab open.
  8. Finish the ride, download the FIT, upload it at Strava upload, and check that it is classified as Virtual Ride; do not apply the Indoor Cycling tag.

Using the hosted app

You can also open the hosted WorldRide Virtual app and click Connect ANT+ while the companion is running. Chrome or Edge may ask to access your local network; allow it for this app. If that connection is blocked, use the locally opened app, which is served by the companion itself.

How measurements work

Virtual ride speed always uses measured power, rider height/weight and route gradient. Cadence and heart rate are recorded when available. Bike speed is optional and never drives virtual speed. Resistance stays manual. Routes repeat until you finish, and Lap marks intervals.

City routes and your library

Choose a city, save favourite routes or import your own GPX. Reykjavík includes 20 courses. Paris, London, Copenhagen, Amsterdam and Berlin each include five preloaded courses. Search the catalogue by city or route name and filter by length. Only cities with courses are offered. Live worldwide generation is deferred; imports remain available.

Pairing with specific sensors

A zero ID in bridge-config.json pairs each profile to the first matching nearby transmitter. For a home setup with multiple sensors, replace zero with the correct ID displayed in the ANT+ panel, then restart the companion. Profiles can come from different devices; verify IDs before recording. Use the IC8 console’s documented wheel-equivalent circumference if you want its reported speed to match. Change wheel_mm in the configuration and restart.

If connection fails

What was verified

Profile parsing, revolution rollover, sentinel values, duplicate-event handling, bridge response format, origin restrictions, browser integration, background timing and stale-data handling, and FIT generation were checked using synthetic data. Real USB access, IC8 pairing, Windows launcher execution, and physical sensor values still need a test on your PC.

Hill model reference

The simplified model uses the gravity, rolling resistance, aerodynamic drag and inertia approach described by Martin et al. (1998), Validation of a Mathematical Model for Road Cycling Power. Assumptions: no wind or drafting, 10 kg bike, air density 1.225 kg/m³, drag area 0.32 m² at 175 cm height, scaled with height squared, rolling coefficient 0.004, 97% drivetrain efficiency. Uphill and downhill results are simulation estimates; height-based drag scaling is a simple app-specific estimate.

Privacy and operation

The companion binds only to this computer (127.0.0.1). It accepts read requests from its local page and the exact hosted app origin. It does not send control commands to the bike, expose your computer to your LAN, or upload workouts automatically. Map tiles load from OpenStreetMap. Sessions and imported routes remain in this browser until you export them. The local and hosted pages have separate browser storage, so finish and export in the same page where you began.

Dependencies

OpenANT (MIT), PyUSB, libusb-package, and importlib_resources are installed from PyPI. Their licenses remain in the installed packages. ANT+ parsing is a best-effort implementation, not an ANT+ certification. This is a Python companion package, not a compiled Windows executable.