Free heart rate running coach for the cardio days of Huberman's Foundational Fitness week (Long, Medium and Brief runs). Runs entirely on your phone: no account, no server, no sync, no AI.
See the codeA free heart rate running coach for building your aerobic base. It runs entirely on your phone.
BaseMile covers the cardio days of the Foundational Fitness week that Andrew Huberman describes in his book Protocols: the Long, Medium and Brief runs. Its sibling app, PlateClimb, covers the lifting days.
BaseMile pairs with a Bluetooth chest strap, keeps you in the right heart rate zone with a spoken coach, and turns your runs into clear trends: MAF pace, aerobic decoupling, training load and more. It is fully local: no account, no server, no sync, no AI. Your data stays on your phone. No subscription, no ads, no tracking.
Android: download BaseMile-<version>.apk from the
latest release and open
it on your phone. Allow installs from your browser when Android asks. It needs
Android 7.0 or newer.
An APK signed with the BaseMile release key is the official build. The certificate SHA-256 fingerprint of that key is:
95:82:76:81:F9:2F:94:85:BD:93:01:CF:C3:B2:99:37:9C:D3:AD:FA:A0:F2:A4:9F:A2:C0:15:9A:DB:B6:8A:64
Check it with apksigner verify --print-certs BaseMile-<version>.apk.
iPhone: there is no App Store build. Build it from source with Xcode, see Quick start.
I built BaseMile for my own training, and I think software like this should be free. Your heart rate, your routes and your habits are some of the most personal data you have. They should not sit behind a subscription or feed someone's ad model. So the code is open, the app needs no account and no server, and anyone can read it, change it and share it under the GPL.
If it helps you run better, that is the whole point.
Gabriel, Likwiid
BaseMile uses native modules (Bluetooth, maps, a foreground service), so it does not run in Expo Go. You build a development client once.
Requirements: Node 20 and npm, plus the Android SDK and a phone or emulator (or Xcode for iOS).
git clone https://github.com/likwiid/basemile.git
cd basemile
npm ci
Check that everything is in order:
npm run typecheck
npm run lint
npm test
Plug in a phone with USB debugging on, then:
npm run android # generates the native project, builds and installs the dev client
npm start # starts Metro for the dev client on later sessions
npm run ios
The iOS project is configured (Bluetooth, background location and audio) but gets far less testing than Android. Reports and fixes are welcome.
In a development build, turn on Mock HR source in Settings, Data & developer to feed the app a simulated heart rate.
BaseMile reads the standard Bluetooth Heart Rate profile, so any chest strap or armband that broadcasts heart rate over Bluetooth Low Energy should work. The Garmin HRM-Dual is the strap it is tested with.
Not supported: Apple Watch and other watches that do not broadcast heart rate as a standard Bluetooth sensor, and ANT+ only devices.
Resting HRV needs a strap that sends RR intervals (the HRM-Dual does).
BaseMile is fully local. There is no account, no BaseMile server and no sync: runs, heart rate, routes, profile and settings live only in the app's storage on your phone. Android's cloud backup is switched off for the app, and there is no export of the whole history, so uninstalling the app or resetting the phone deletes them. The only network use is two public third-party services:
api.open-meteo.com): when a run starts, its coordinates
are sent to fetch the current weather; after a run, its GPS points are sent
to look up terrain elevation. You can turn both off in Settings, Data &
developer, Weather and elevation. Without them, runs keep GPS altitude
and show no weather.tiles.openfreemap.org): map tiles and label fonts load
from OpenFreeMap's servers, so OpenFreeMap sees which map areas you view. You
can point the app at another tile provider with EXPO_PUBLIC_MAP_TILE_URL.The coach speaks with your phone's built-in text-to-speech engine; BaseMile calls no voice service. Nothing else is sent anywhere. A run only leaves the phone when you share it yourself as a JSON or GPX file.
The map uses OpenFreeMap's dark style, which needs no key, no account and no setup. The style ships inside the app, so the map background and your run track still show with no network.
To use another tile provider instead, copy .env.example to .env.local and
set EXPO_PUBLIC_MAP_TILE_URL (an https {z}/{x}/{y} raster template) and
EXPO_PUBLIC_MAP_ATTRIBUTION. Both are read at build time. These are the only
build variables BaseMile has.
BaseMile is an Expo SDK 55 / React Native app in strict TypeScript: expo-router screens, Zustand stores, SQLite history, react-native-ble-plx for the strap, MapLibre for maps and hand-written SVG charts. The coach engine and the metrics are pure modules with unit tests.
app/ screens (Run, History, Routes, Settings, run and route detail)
components/ UI by feature
lib/ ble, coach, metrics, run, route, elevation, storage, export
types/ shared type contract
docs/adr/ architecture decision records
See ARCHITECTURE.md for the full map, the heart rate pipeline and the data model, and docs/coach-spec.md for how the coach picks its cues.
Ideas, not promises. Issues and pull requests are welcome.
Read CONTRIBUTING.md and the Code of Conduct. Security issues go to the address in SECURITY.md, not to public issues. Changes are listed in CHANGELOG.md.
BaseMile is free software: you can redistribute it and modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version (GPL-3.0-or-later). See LICENSE for the full text.
Each source file carries the SPDX identifier GPL-3.0-or-later.
As an additional permission under GPL section 7, BaseMile may also be distributed through app stores such as the App Store and Google Play, as long as the source stays available. See APP-STORE-EXCEPTION.md.
Copyright (C) 2026 Gabriel Ghoussoub.
BaseMile builds on published training methods and open data. Thank you to:
BaseMile is an independent project and is not affiliated with or endorsed by Andrew Huberman or Huberman Lab. Nor is it affiliated with or endorsed by any other person, organisation or service credited above.
Not medical advice. BaseMile gives heart rate targets and training feedback for general fitness only. Talk to a doctor before starting a new training programme, especially if you have a heart condition or take medication that affects heart rate. Stop exercising and seek help if you feel chest pain, dizziness or unusual breathlessness. Readings from straps and phone sensors can be wrong.
BaseMile is built and maintained by Likwiid.
Free heart rate running coach for the cardio days of Huberman's Foundational Fitness week (Long, Medium and Brief runs). Runs entirely on your phone: no account, no server, no sync, no AI.
See the codeA free heart rate running coach for building your aerobic base. It runs entirely on your phone.
BaseMile covers the cardio days of the Foundational Fitness week that Andrew Huberman describes in his book Protocols: the Long, Medium and Brief runs. Its sibling app, PlateClimb, covers the lifting days.
BaseMile pairs with a Bluetooth chest strap, keeps you in the right heart rate zone with a spoken coach, and turns your runs into clear trends: MAF pace, aerobic decoupling, training load and more. It is fully local: no account, no server, no sync, no AI. Your data stays on your phone. No subscription, no ads, no tracking.
Android: download BaseMile-<version>.apk from the
latest release and open
it on your phone. Allow installs from your browser when Android asks. It needs
Android 7.0 or newer.
An APK signed with the BaseMile release key is the official build. The certificate SHA-256 fingerprint of that key is:
95:82:76:81:F9:2F:94:85:BD:93:01:CF:C3:B2:99:37:9C:D3:AD:FA:A0:F2:A4:9F:A2:C0:15:9A:DB:B6:8A:64
Check it with apksigner verify --print-certs BaseMile-<version>.apk.
iPhone: there is no App Store build. Build it from source with Xcode, see Quick start.
I built BaseMile for my own training, and I think software like this should be free. Your heart rate, your routes and your habits are some of the most personal data you have. They should not sit behind a subscription or feed someone's ad model. So the code is open, the app needs no account and no server, and anyone can read it, change it and share it under the GPL.
If it helps you run better, that is the whole point.
Gabriel, Likwiid
BaseMile uses native modules (Bluetooth, maps, a foreground service), so it does not run in Expo Go. You build a development client once.
Requirements: Node 20 and npm, plus the Android SDK and a phone or emulator (or Xcode for iOS).
git clone https://github.com/likwiid/basemile.git
cd basemile
npm ci
Check that everything is in order:
npm run typecheck
npm run lint
npm test
Plug in a phone with USB debugging on, then:
npm run android # generates the native project, builds and installs the dev client
npm start # starts Metro for the dev client on later sessions
npm run ios
The iOS project is configured (Bluetooth, background location and audio) but gets far less testing than Android. Reports and fixes are welcome.
In a development build, turn on Mock HR source in Settings, Data & developer to feed the app a simulated heart rate.
BaseMile reads the standard Bluetooth Heart Rate profile, so any chest strap or armband that broadcasts heart rate over Bluetooth Low Energy should work. The Garmin HRM-Dual is the strap it is tested with.
Not supported: Apple Watch and other watches that do not broadcast heart rate as a standard Bluetooth sensor, and ANT+ only devices.
Resting HRV needs a strap that sends RR intervals (the HRM-Dual does).
BaseMile is fully local. There is no account, no BaseMile server and no sync: runs, heart rate, routes, profile and settings live only in the app's storage on your phone. Android's cloud backup is switched off for the app, and there is no export of the whole history, so uninstalling the app or resetting the phone deletes them. The only network use is two public third-party services:
api.open-meteo.com): when a run starts, its coordinates
are sent to fetch the current weather; after a run, its GPS points are sent
to look up terrain elevation. You can turn both off in Settings, Data &
developer, Weather and elevation. Without them, runs keep GPS altitude
and show no weather.tiles.openfreemap.org): map tiles and label fonts load
from OpenFreeMap's servers, so OpenFreeMap sees which map areas you view. You
can point the app at another tile provider with EXPO_PUBLIC_MAP_TILE_URL.The coach speaks with your phone's built-in text-to-speech engine; BaseMile calls no voice service. Nothing else is sent anywhere. A run only leaves the phone when you share it yourself as a JSON or GPX file.
The map uses OpenFreeMap's dark style, which needs no key, no account and no setup. The style ships inside the app, so the map background and your run track still show with no network.
To use another tile provider instead, copy .env.example to .env.local and
set EXPO_PUBLIC_MAP_TILE_URL (an https {z}/{x}/{y} raster template) and
EXPO_PUBLIC_MAP_ATTRIBUTION. Both are read at build time. These are the only
build variables BaseMile has.
BaseMile is an Expo SDK 55 / React Native app in strict TypeScript: expo-router screens, Zustand stores, SQLite history, react-native-ble-plx for the strap, MapLibre for maps and hand-written SVG charts. The coach engine and the metrics are pure modules with unit tests.
app/ screens (Run, History, Routes, Settings, run and route detail)
components/ UI by feature
lib/ ble, coach, metrics, run, route, elevation, storage, export
types/ shared type contract
docs/adr/ architecture decision records
See ARCHITECTURE.md for the full map, the heart rate pipeline and the data model, and docs/coach-spec.md for how the coach picks its cues.
Ideas, not promises. Issues and pull requests are welcome.
Read CONTRIBUTING.md and the Code of Conduct. Security issues go to the address in SECURITY.md, not to public issues. Changes are listed in CHANGELOG.md.
BaseMile is free software: you can redistribute it and modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version (GPL-3.0-or-later). See LICENSE for the full text.
Each source file carries the SPDX identifier GPL-3.0-or-later.
As an additional permission under GPL section 7, BaseMile may also be distributed through app stores such as the App Store and Google Play, as long as the source stays available. See APP-STORE-EXCEPTION.md.
Copyright (C) 2026 Gabriel Ghoussoub.
BaseMile builds on published training methods and open data. Thank you to:
BaseMile is an independent project and is not affiliated with or endorsed by Andrew Huberman or Huberman Lab. Nor is it affiliated with or endorsed by any other person, organisation or service credited above.
Not medical advice. BaseMile gives heart rate targets and training feedback for general fitness only. Talk to a doctor before starting a new training programme, especially if you have a heart condition or take medication that affects heart rate. Stop exercising and seek help if you feel chest pain, dizziness or unusual breathlessness. Readings from straps and phone sensors can be wrong.
BaseMile is built and maintained by Likwiid.