Repository navigation
Releases
🏃 Miles — Release v1.1.6
⚠️ Warning
A local build of the MILES fitness tracker, compiled from source.
🆕 New in v1.1.6
- 🐛 The workout HUD's map layer button now really switches the map. The button cycled state, but the map only read its tile source on first composition — so Street → Satellite → Terrain → Dark never actually happened. It now drives a controlled tile source, and the in-map layer button keeps that state in sync. (Bug found in a code review of v1.1.5.)
- 🧭 "Course Heading Up" panning follows your finger correctly. The gesture handler launches once and had captured the compass course from when the screen opened, so after you turned a corner, drags went in the wrong direction. It now reads the heading live.
- 🗺️ "Course Heading Up" no longer leaves blank corners. The rotated map content is oversized by 1.5× while rotated, so the viewport corners stay covered at every angle. North-up (the default) keeps the exact previous layout.
- 📊 The speed heatmap works on phones that never report speed. Many devices leave
Location.speedempty; the engine already derived per-leg speed for the stats but stored the raw point, so the breadcrumb gradient stayed flat cyan. Stored points now carry the derived speed. - 🗺️ Two more settings reach the route planner. The breadcrumb colour style and the heading rotation mode now also apply to the route builder screen, not just the workout HUD and activity details.
- 🧹 Removed the "HR Zones" breadcrumb colour option from Settings — GPS points carry no heart rate, so it could never render zones and silently fell back to cyan (the v1.1.5 notes already said it wasn't offered; the menu now matches).
🔒 Privacy
- No Google Play Services.
- No Firebase.
- No tracker libraries.
- Health Connect is optional and only reads steps and exercise sessions. Nothing is uploaded.
- Wear LAN discovery only starts after the user chooses to pair a watch, and only with the local-network permission granted.
🗺️ Maps
Satellite imagery is provided by Esri World Imagery with attribution to Esri, Maxar, Earthstar Geographics, and the GIS User Community. Street maps continue to use OpenStreetMap and other configured open tile sources. The dark layer uses CARTO-hosted tiles (© CARTO / OpenStreetMap contributors).
📦 Assets
| File | Description |
|---|---|
| miles-v1.1.6.apk | Signed release APK |
| miles-v1.1.6.sha256 | SHA-256 checksum |
| miles-build-v1.1.6.log | Release build log |
🔐 SHA-256
bbd31c6fe964173c05429690f1cf7777ef90e1fbc39f3e6717e0cdc57199bd47
📲 Installation
adb install miles-v1.1.6.apk
Verify:
sha256sum -c miles-v1.1.6.sha256
📄 License
GPL-3.0-only
📦 File sizes
| File | Bytes | Size |
|---|---|---|
miles-v1.1.6.apk |
3,215,776 | 3.07 MB |
miles-v1.1.6.sha256 |
83 | 83 B |
miles-build-v1.1.6.log |
8,193 | 8.00 KB |
🔄 Changes since v1.1.5
- 🐛
PrimaryHudPagenow passes a controlledcurrentTileSource(derived from the layer button'sMapStyleMode) plusonTileSourceChanged, instead of aninitialTileSourcethatremember{}ignored after first composition. - 🧭
RealOsmMapViewalso re-appliesinitialTileSourceviaLaunchedEffectwhen it changes (for maps that don't control it, e.g. activity detail). - 🧭 The pan gesture reads the course through
rememberUpdatedState(headingDeg)— the un-rotation is always the current bearing, not the one captured at launch. - 🗺️ The rotated content box is centered and grown by 1.5× while heading-up (needed: |cosθ|+|sinθ| ≤ √2), with tile/
geoToPixel/crosshair anchors moved to the content-box dimensions; 1.0× (unchanged) when north-up. - 📊
SmartTrackingEngine.appendValidatedPoint()backfills derived per-leg speed onto storedGpsPoints when the device never populatedLocation.speed. - 🗺️ Route builder honours
mapPolylineColorModeandmapHeadingRotationModefrom MainActivity. - 🧹 "HR Zones" chip removed from the Maps settings card.
- 🔢 Bumped to versionCode 13.
⚠️ Known limitations
- Heading-up rotation pivots on the screen centre rather than the user's position, so when the map is panned away from you the rotation can feel offset until you re-centre.
- "HR Zones" breadcrumb colouring stays impossible until GPS points carry a heart rate; only the speed heatmap and solid colours are available.
- The fixes above are code-review + build verified, but not yet re-run on hardware — @junkerderprovinz, @GlassOnTin and @ianrosswilliams are invited to retest.
🏃 Miles — Release v1.1.5
⚠️ Warning
A local build of the MILES fitness tracker, compiled from source.
🆕 New in v1.1.5
- 🧭 The navigation banner now shows real data. The route builder's live turn-by-turn banner was invented text ("In 150m, Turn Right", "Onto Pine Ridge Trail") driven by a counter that never changed. It now reads the tracking engine's live navigation state: distance to the next point, the actual waypoint name, remaining distance, and a real off-route warning with the cross-track error. The turn icon comes from the bearing difference between the route and your current course.
- 🗺️ Maps settings finally work outside the Settings screen. The default map layer, auto-centering, keep-screen-on during a workout, the breadcrumb colour style, the heading rotation mode and the GPS accuracy filter were all write-only before — they were saved but never read. Every one of them is now honoured by the map and the engine.
- 🌑 The AMOLED/Dark map layer actually goes dark. "AMOLED Dark" now loads CARTO's dark tiles instead of silently staying on OpenStreetMap, and the HUD's layer button drives the real tile source too.
- 🧭 "Course Heading Up" now rotates the map. The map content rotates around the screen centre while pan gestures are un-rotated so the map still tracks your finger. "Fixed North Up" is unchanged.
- 📏 The GPS outlier filter slider works. It now feeds the engine's stationary-noise deadband (default ±25 m) instead of being ignored.
- 📱 The map layer chips scroll instead of squeezing. The "Satellite" chip (and its neighbours) no longer gets squeezed off the edge on narrow screens — the row scrolls horizontally.
🔒 Privacy
- No Google Play Services.
- No Firebase.
- No tracker libraries.
- Health Connect is optional and only reads steps and exercise sessions. Nothing is uploaded.
- Wear LAN discovery only starts after the user chooses to pair a watch, and only with the local-network permission granted.
🗺️ Maps
Satellite imagery is provided by Esri World Imagery with attribution to Esri, Maxar, Earthstar Geographics, and the GIS User Community. Street maps continue to use OpenStreetMap and other configured open tile sources. The dark layer uses CARTO-hosted tiles (© CARTO / OpenStreetMap contributors).
📦 Assets
| File | Description |
|---|---|
| miles-v1.1.5.apk | Signed release APK |
| miles-v1.1.5.sha256 | SHA-256 checksum |
| miles-build-v1.1.5.log | Release build log |
🔐 SHA-256
bbd5e6e5079385b4b8e05671c54c3ee4bbc59518918f4dfcf4a4eec63d3c70da
📲 Installation
adb install miles-v1.1.5.apk
Verify:
sha256sum -c miles-v1.1.5.sha256
📄 License
GPL-3.0-only
📦 File sizes
| File | Bytes | Size |
|---|---|---|
miles-v1.1.5.apk |
3,215,776 | 3.07 MB |
miles-v1.1.5.sha256 |
83 | 83 B |
miles-build-v1.1.5.log |
8,893 | 8.68 KB |
🔄 Changes since v1.1.4
- 🧭 Navigation banner reads
LiveWorkoutStats(distance to next point, waypoint name, remaining distance, off-route error, bearing-derived turn icon); the deadnavStepIndexcounter was removed. - 🗺️
mapLayerToTileSource()maps thedefaultMapLayerpreference to a real tile source at every map call site (workout HUD, activity detail, route builder). - 📱
WorkoutHudScreen/PrimaryHudPageacceptinitialTileSource,mapAutoFollow,mapKeepScreenOn,polylineColorModeandheadingRotationModefromMainActivity. - 🌑 HUD
MapStyleMode.AMOLED_DARK/TERRAIN/SATELLITEnow selectCARTO_DARK/OPEN_TOPO/SATELLITEtiles instead of being ignored. - 🖥️
FLAG_KEEP_SCREEN_ONapplied during the workout HUD whenmapKeepScreenOnis on, cleared on dispose. - 🎨 Breadcrumb polyline honours
mapPolylineColorMode(speed heatmap segments whenSPEED_GRADIENT, cyan otherwise). - 🧭
RealOsmMapViewrotates its content Box by the course heading inHEADING_UPmode and inverse-rotates drag deltas. - 📏 Engine reads
min_gps_acc_filterfrommiles_settingsfor the stationary-noise deadband (was hard-coded 70 m). - 📱 Map renderer chips row is horizontally scrollable.
- 🔢 Bumped to versionCode 12.
⚠️ Known limitations
- Heading-up rotation pivots on the screen centre rather than the user's position, so when the map is panned away from you the rotation can feel offset until you re-centre.
- The HR-zone breadcrumb option is not offered: GPS points carry no heart rate, so only the speed heatmap and solid colours are available.
- The fixes above are built with R8 and code-reviewed but not yet re-run on hardware — @junkerderprovinz, @GlassOnTin and @ianrosswilliams are invited to retest.
🏃 Miles — Release v1.1.4
⚠️ Warning
A local build of the MILES fitness tracker, compiled from source.
🆕 New in v1.1.4
- 🐛 Fixed the crash that made MILES unopenable. With location denied but activity recognition allowed,
TrackingForegroundServicestill asked for thelocationforeground type, so Android threwSecurityExceptionon every start. The type is now built from the permissions actually granted. - 📡 Added the Android 17 local-network permission. Android 17 (target SDK 37) blocks local-network access by default, which would have broken the opt-in Wear OS pairing. MILES now declares and requests
ACCESS_LOCAL_NETWORK, and skips the LAN silently if it was denied. - ⏱️ Fixed a recovered workout's clock after Resume. The timer and recovery saves now restart on Resume, and time spent in the background counts as paused — no more frozen clock while distance grew (reported: 1.22 km in 1m 41s, 43.5 km/h), and a second force-stop no longer loses data.
- 🧭 The route builder's Navigate button now works. It hands the route to the tracking engine instead of only flipping on the hard-coded banner.
- 📱 Package id changed to
com.anshlabs.miles(wascom.aistudio.miles.track). This installs as a fresh app — see Known limitations below. - 📍 The dashboard GPS chip now says "Location denied" instead of always claiming "GPS Ready".
- 📏 The distance unit setting now applies to the Journal, Trends and activity details, not just the dashboard.
- 🔋 "Not Now" on the battery optimisation dialog is remembered instead of returning on every launch and rotation.
- 🧹 R8 and resource shrinking remain enabled.
🔒 Privacy
- No Google Play Services.
- No Firebase.
- No tracker libraries.
- Health Connect is optional and only reads steps and exercise sessions. Nothing is uploaded.
- Wear LAN discovery only starts after the user chooses to pair a watch, and only with the local-network permission granted.
🗺️ Maps
Satellite imagery is provided by Esri World Imagery with attribution to Esri, Maxar, Earthstar Geographics, and the GIS User Community. Street maps continue to use OpenStreetMap and other configured open tile sources.
📦 Assets
| File | Description |
|---|---|
| miles-v1.1.4.apk | Signed release APK |
| miles-v1.1.4.sha256 | SHA-256 checksum |
| miles-build-v1.1.4.log | Release build log |
🔐 SHA-256
96507e0251704f6a6a40a0204e609d410d3825b3afa299d7a62ca2d3092da8d2
📲 Installation
adb install miles-v1.1.4.apk
Verify:
sha256sum -c miles-v1.1.4.sha256
📄 License
GPL-3.0-only
📦 File sizes
| File | Bytes | Size |
|---|---|---|
miles-v1.1.4.apk |
3,199,392 | 3.05 MB |
miles-v1.1.4.sha256 |
83 | 83 B |
miles-build-v1.1.4.log |
8,302 | 8.11 KB |
🔄 Changes since v1.1.3
- 🐛 Foreground service builds its type from granted permissions, fixing the unopenable-app crash when location is denied.
- 📡
ACCESS_LOCAL_NETWORKdeclared in the manifest and requested at runtime for Android 17's local-network enforcement. - ⏱️
resumeTracking()restarts the timer and telemetry loops; restored workouts book downtime as paused time. - 🧭 Both route builder Navigate buttons invoke
onStartNavigation. - 📍 GPS chip reports the real location permission state.
- 📏
DistanceUnitthreaded through Journal, Trends and activity detail screens. - 🔋 Battery prompt decline persisted in
MilesPreferences. - 📱 Application id
com.aistudio.miles.track→com.anshlabs.miles. - 🔢 Bumped to versionCode 11.
- 🧹 R8 minification and resource shrinking remain enabled.
⚠️ Known limitations
- The package id changed, so this is not an in-place upgrade: it installs as a new app alongside the old one, and data from
com.aistudio.miles.trackis not carried over. Export amiles.backupfrom the old install first if you need your history. ACCESS_LOCAL_NETWORKfollows the Android 17 guidance (manifest + runtime request,NEARBY_DEVICESgroup), but could not be tested on an Android 17 device yet.- The tester-reported fixes above are code-reviewed and built with R8, but not yet re-run on hardware — @junkerderprovinz and @GlassOnTin are invited to retest.
🏃 Miles — Release v1.1.3
⚠️ Warning
A local build of the MILES fitness tracker, compiled from source.
🆕 New in v1.1.3
- 📱 Targets API 37 (Android 17).
compileSdkandtargetSdkmove from 36 to 37, so MILES is built against the Android 17 SDK and installs and runs cleanly on the latest release.minSdkstays at 26, so Android 8.0 and newer are still supported. - 🧹 R8 and resource shrinking remain enabled.
⚠️ Signing key changed
This build is signed with a new release key. Android only allows an update over an app signed with the same key, so it cannot be installed on top of v1.1.2 or earlier (INSTALL_FAILED_UPDATE_INCOMPATIBLE). To move to v1.1.3:
- 🗄️ Back up your data first: in MILES use Export /
miles.backupso your activities, routes, privacy zones, goals and preferences are saved. - 🗑️ Uninstall the old MILES build (v1.1.2 or earlier).
- 📥 Install v1.1.3 fresh with the command below.
Your data is stored on-device and is not carried across the uninstall unless you restore the backup exported above.
🔒 Privacy
- No Google Play Services.
- No Firebase.
- No tracker libraries.
- Health Connect is optional and only reads steps and exercise sessions. Nothing is uploaded.
🗺️ Maps
Street maps continue to use OpenStreetMap and other configured open tile sources. Satellite imagery is provided by Esri World Imagery with attribution to Esri, Maxar, Earthstar Geographics, and the GIS User Community.
📦 Assets
| File | Description |
|---|---|
| miles-v1.1.3.apk | Signed release APK |
| miles-v1.1.3.sha256 | SHA-256 checksum |
| miles-build-v1.1.3.log | Release build log |
🔐 SHA-256
ec7051fbadc3a960d765e7dd3dac71cf1c5ac5ec7f53e995bfcd8ee02b22c551
📲 Installation
Back up your data, uninstall the old build, then:
adb install miles-v1.1.3.apk
Verify:
sha256sum -c miles-v1.1.3.sha256
📄 License
GPL-3.0-only
📦 File sizes
| File | Bytes | Size |
|---|---|---|
miles-v1.1.3.apk |
3,199,392 | 3.05 MB |
miles-v1.1.3.sha256 |
104 | 104 B |
miles-build-v1.1.3.log |
10,411 | 10.17 KB |
🔄 Changes since v1.1.2
- 📱 Bumped
compileSdkandtargetSdkfrom 36 to 37 (Android 17). - 🔢 Bumped to versionCode 10, versionName 1.1.3.
- 🔐 Signed with a new release key (see the signing-key notice above).
- 🧹 R8 minification and resource shrinking remain enabled.
⚠️ Known limitations
- Because the signing key changed, this build cannot be installed as an in-place update over v1.1.2. Uninstall the old build first (after backing up your data).
- Targets API 37; no behavior changes are expected on older systems, but it has been built and signature-verified locally rather than confirmed on a physical device.
🏃 Miles — Release v1.1.2
⚠️ Warning
A local build of the MILES fitness tracker, compiled from source.
📦 Files
miles-v1.1.2.apk— 3,211,873 bytes (3.06 MiB), signed (v2/v3), R8 + resource shrinkingmiles-v1.1.2.sha256— 4d3e8565a540e569673c3f4ad37d595dc2bc2da504355c8ee29c38a05c6b0af8miles-build-v1.1.2.log— full Gradle build log
Source: tag v1.1.2 → commit 32bb05cc400d5b06de84fd602f429c7d8edba207
🆕 New in v1.1.2
Reported by a tester on the F-Droid build of v1.1.1:
- ❤️ Fixed heart rate on Android 16. Apps targeting SDK 36 can no longer read
Sensor.TYPE_HEART_RATEwithBODY_SENSORS— Android moved it to the granularandroid.permission.health.READ_HEART_RATE. MILES now declares and requests the right one for the system it is running on (BODY_SENSORSstays, capped atmaxSdkVersion="35", for Android 15 and older), so the phone's optical sensor actually reports. - 🔁 The sensor registers as soon as you grant it. Previously the first attempt ran before the permission dialog had been answered, so a grant did nothing until the app was restarted.
- 🩺 Honest wording on the Biometrics tab. Instead of always claiming "No HRM sensor connected", it now distinguishes permission needed, waiting for a reading, and no sensor in this device.
- ⏱️ Pace seconds are padded everywhere. 4:03 now reads
4'03"/kminstead of4'3"/km. All seven screens share one formatter, and an unknown pace reads--:--rather than a meaningless0'00".
🔒 Privacy
- No Google Play Services.
- No Firebase.
- No tracker libraries.
- No fabricated metrics: every number shown or saved comes from a real sensor or the real recorded track.
🗺️ Maps
- Esri World Imagery. No
mt1.google.com.
✍️ Signing
Signed with the project's release key (alias miles), v2 + v3 schemes. Verify with:
sha256sum -c miles-v1.1.2.sha256
🏃 Miles — Release v1.1.1
⚠️ Warning
A local build of the MILES fitness tracker, compiled from source.
📦 Files
miles-v1.1.1.apk— 3,211,873 bytes (3.06 MiB), signed (v2/v3), R8 + resource shrinkingmiles-v1.1.1.sha256— 669b1464b457875b7095b541640269ed69c549cb5c7bd0c0f75b197bcf060478miles-build-v1.1.1.log— full Gradle build log
Source: tag v1.1.1 → commit fcfdb98fe35f6fbaca86443cf938f80b3692611f
🆕 New in v1.1.1
Reported by a tester on the F-Droid build of v1.1.0:
- 🚶 Steps are now the step sensor's count only. Distance is no longer turned into steps, so a device without a step sensor shows 0 instead of a made-up number, and a ride no longer reports ~1900 "steps".
- 📤 Activity export actually writes a file. GPX, TCX, KML, GeoJSON and JSON exports used to show a toast with a character count. They now save a real file through Android's file picker, so you can open or share it.
- 🔄 A recovered workout keeps its numbers. Speed, pace and elevation are recomputed from the saved track instead of restarting at 0.0 km/h and 0 m.
- 📈 Max speed and best pace are measured, not guessed. They are derived from the recorded track instead of being set to 1.35× and 0.9× the average.
- ❤️ Heart-rate average and peak come from real samples only. With no sensor there is no average and no peak — the old code invented a peak of "current + 20 bpm".
- 📟 The phone's own heart-rate sensor is read now, which is what the BODY_SENSORS permission is for. The permission is only requested on devices that actually have heart-rate hardware.
- ✅ New unit tests cover steps, speed, elevation, best pace and heart-rate accounting (62 tests passing).
🔒 Privacy
- No Google Play Services.
- No Firebase.
- No tracker libraries.
- No fabricated metrics: every number shown or saved comes from a real sensor or the real recorded track.
🗺️ Maps
- Esri World Imagery. No
mt1.google.com.
✍️ Signing
Signed with the project's release key (alias miles), v2 + v3 schemes. Verify with:
sha256sum -c miles-v1.1.1.sha256
🏃 Miles — Release v1.1.0
⚠️ Warning
A local build of the MILES fitness tracker, compiled from source.
🆕 New in v1.1.0
- 🩺 Added the Health Connect permissions rationale screen. Android 14+ requires it, and without it the Health Connect prompt could silently fail to appear. MILES now explains exactly what it reads (steps and exercise sessions) before handing off to the system sheet.
- 🧭 Fixed CSV import: parsing, map route points, steps, calories, timestamps and activity names.
- 💾 Fixed
miles.backuprestore for activities, routes, privacy zones, goals and preferences. - 🐛 Fixed a crash when saving a workout, caused by restored numeric preferences being read with the wrong type.
- 🛰️ Replaced undocumented Google satellite tiles with Esri World Imagery.
- 🧾 Corrected satellite-map attribution.
- 🌦️ Online weather is now opt-in and off by default.
- ⌚ Wear LAN discovery is now opt-in instead of starting on every launch.
- 🔧 Added the missing boot-completed permission for widget updates.
- 📦 Added the missing changelog files for builds 5 and 6.
- 🧹 R8 and resource shrinking remain enabled.
🔒 Privacy
- No Google Play Services.
- No Firebase.
- No tracker libraries.
- Weather location requests are disabled unless explicitly enabled in Settings.
- Wear discovery only starts after the user chooses to pair/discover a watch.
- Health Connect is optional and only reads steps and exercise sessions. Nothing is uploaded.
🗺️ Maps
Satellite imagery is provided by Esri World Imagery with attribution to Esri, Maxar, Earthstar Geographics, and the GIS User Community. Street maps continue to use OpenStreetMap and other configured open tile sources.
📦 Assets
| File | Description |
|---|---|
| miles-v1.1.0.apk | Signed release APK |
| miles-v1.1.0.sha256 | SHA-256 checksum |
| miles-build-v1.1.0.log | Release build log |
🔐 SHA-256
6ce384b0a5f5841c3d62b388a967393cd616e856235834efd043b78717c9af05
📲 Installation
adb install -r miles-v1.1.0.apk
Verify:
sha256sum -c miles-v1.1.0.sha256
📄 License
GPL-3.0-only
📦 File sizes
| File | Bytes | Size |
|---|---|---|
miles-v1.1.0.apk |
3,211,873 | 3.06 MB |
miles-v1.1.0.sha256 |
83 | 83 B |
miles-build-v1.1.0.log |
4,430 | 4.33 KB |
🔄 Changes since v1.0.9
- 🩺 Added the Health Connect permissions rationale screen required by Android 14+.
- 🧭 Fixed CSV import parsing, map points, steps, calories, timestamps and names.
- 💾 Fixed
miles.backuprestore for activities, routes, zones, goals and preferences. - 🐛 Fixed the workout-save crash caused by restored numeric preferences.
- 📦 Added fastlane changelogs for builds 5, 6 and 7.
- 🔢 Bumped to versionCode 7 so this release no longer shares a version code with the v1.0.9 tag.
- 🧹 R8 minification and resource shrinking remain enabled.
⚠️ Known limitations
- The Health Connect rationale activity was verified in the built APK manifest (
VIEW_PERMISSION_USAGEandACTION_SHOW_PERMISSIONS_RATIONALEare present), but the permission prompt has not been confirmed on a physical device yet. - Esri World Imagery is a proprietary service with its own terms. It is used for the optional satellite layer only.
MILES v1.0.9
🏃 Miles — Release v1.0.9
A local build of the MILES fitness tracker, compiled from source.
🆕 New in v1.0.9
- 🛰️ Replaced undocumented Google satellite tiles with Esri World Imagery.
- 🧾 Corrected satellite-map attribution.
- 🌦️ Online weather is now opt-in and off by default.
- ⌚ Wear LAN discovery is now opt-in instead of starting on every launch.
- 🩺 Health Connect requests only the records MILES actually reads.
- 📦 Added the missing v1.0.8 changelog file.
- 🔧 Added the missing boot-completed permission for widget updates.
🔒 Privacy
- No Google Play Services.
- No Firebase.
- No tracker libraries.
- Weather location requests are disabled unless explicitly enabled in Settings.
- Wear discovery only starts after the user chooses to pair/discover a watch.
🗺️ Maps
Satellite imagery is provided by Esri World Imagery with attribution to Esri, Maxar, Earthstar Geographics, and the GIS User Community. Street maps continue to use OpenStreetMap and other configured open tile sources.
📦 Assets
| File | Description |
|---|---|
miles-v1.0.9.apk |
Signed release APK |
miles-v1.0.9.sha256 |
SHA-256 checksum |
miles-build-v1.0.9.log |
Release build log |
🔐 SHA-256
4949710bd58d7cecd7e0a8744fd6243c45801bcfd802ed4aa38705d5aa6ea374
📲 Installation
adb install -r miles-v1.0.9.apkVerify:
sha256sum -c miles-v1.0.9.sha256📄 License
GPL-3.0-only
📦 File sizes
| File | Bytes | Size |
|---|---|---|
miles-v1.0.9.apk |
3,220,065 | 3.07 MB |
miles-v1.0.9.sha256 |
83 | 83 B |
miles-build-v1.0.9.log |
7,777 | 7.6 KB |
🔄 Changes since v1.0.8
- 🛰️ Replaced undocumented Google satellite tiles with Esri World Imagery.
- 🧾 Corrected satellite-map attribution.
- 🌦️ Weather is now opt-in and off by default.
- ⌚ Wear LAN discovery is now opt-in.
- 🩺 Health Connect permissions now match the records the app reads.
- 📦 Added the missing v1.0.8 changelog file.
- 🔧 Added the missing boot-completed permission.
- 🧭 Fixed CSV import parsing, map points, steps, calories, timestamps, and names.
- 💾 Fixed
miles.backuprestore for activities, routes, zones, goals, and preferences. - 🐛 Fixed the workout-save crash caused by restored numeric preferences.
- 🧹 R8 and resource shrinking remain enabled.
v1.0.8
🏃 Miles — Release v1.0.8
A local build of the Miles fitness tracker, compiled from source. 🎯
✨ What's inside
👟 Step & activity tracking — hardware step counter with software fallback.
🏋️ Workout tracking — calories, duration, distance, pace, live stats, and post-workout summary.
❤️ Heart-rate support — Bluetooth LE heart-rate straps and Wear OS heart-rate detection.
📡 BLE sensor discovery — heart-rate straps, cycling sensors, foot pods, and external GNSS devices.
⌚ Watch sync — GMS-free local WiFi sync with MILES Wear OS.
🗺️ Maps — OpenStreetMap view for location-aware activities.
📜 History screen — past activities with type, distance, duration, and calories.
🔐 Permissions handled properly — denied permissions never crash Settings and can be reviewed in Android app settings.
🆕 New in v1.0.8
🐛 Fixed
- Fixed the crash that happened when scrolling to the bottom of Settings.
- Replaced the empty About-card logo resource with the real MILES logo.
- Added a Permission not granted — Open app settings button.
- Prevented the Android permission dialog and Health Connect dialog from launching at the same time.
- The About card now reads the real app version automatically.
- The Source Code button now opens
https://github.com/anshlabs716/miles.
📦 Improved
- Bumped the app to version 1.0.8 (build 4).
- Enabled R8 minification.
- Enabled resource shrinking.
- Removed the unnecessary Foojay toolchain resolver from the build.
📉 APK size reduction
R8 and resource shrinking reduce the release APK substantially compared with the earlier unoptimized build.
| Build | APK size |
|---|---|
| Previous unoptimized build | ~23 MB |
| v1.0.8 optimized build | 3.04 MB |
That is approximately an 86% reduction in APK size.
🛠️ Technical details
- 📦 Package:
com.aistudio.miles.track - 🔢 Version:
1.0.8 - 🔧 Build:
4 - 🛡️ Signing: verified APK Signature Scheme v2, self-signed release key
- 🏗️ Built with: Gradle 9.7.1, Kotlin, Jetpack Compose, Room
📦 Assets
| File | Bytes | Size | Description |
|---|---|---|---|
miles-v1.0.8.apk |
3,183,428 | 3.04 MB | The installable APK |
miles-v1.0.8.apk.sha256 |
94 | 94 B | SHA-256 checksum |
miles-v1.0.8.log |
20,880 | 20.4 KB | Combined build log |
Verify the download:
sha256sum -c miles-v1.0.8.apk.sha256Or manually:
sha256sum miles-v1.0.8.apkCompare the output against the value inside miles-v1.0.8.apk.sha256.
📲 Installation
- Download
miles-v1.0.8.apk. - Open it on your phone or install over USB:
adb install -r miles-v1.0.8.apk- Allow Install unknown apps when Android asks.
- Open MILES and grant only the permissions you want to use.
⚠️ Known limitations
- This is a self-signed FOSS build, not a Play Store build.
- No Google Play Services or Firebase are required.
- Map tiles require a network connection.
- Historical active minutes depend on what Android exposes.
- Deprecation warnings remain for older Bluetooth, Compose, and location APIs.
🔄 Changes since v1.0.7
- Fixed the Settings crash at the bottom of the screen.
- Added a permission-not-granted settings button.
- Fixed simultaneous permission dialog launching.
- About now shows the real version instead of a hardcoded old version.
- Fixed the Source Code repository link.
- Enabled R8 and resource shrinking.
- Removed the unnecessary Foojay toolchain resolver.
- Bumped version to 1.0.8 (build 4).
🧪 Tests
✅ Existing calorie, distance, streak, and activity logic tests remain covered.
📄 License
GPLv3
Real data. Real tracking. Your wrist. Your data.
Android + Linux only.
v1.0.7
🏃 Miles — Release v1.0.7
A local build of the Miles fitness tracker, compiled from source. 🎯
✨ What's inside
👟 Step & activity tracking — built-in hardware step counter/detector with a software fallback when the phone lacks one.
🏋️ Workout tracking — calories, duration, distance, pace, live stats, and a post-workout summary.
❤️ Heart-rate support — via Bluetooth LE Heart Rate Service (0x180D) from any standard HR strap, plus Wear OS heart-rate capability detection.
📡 BLE sensor discovery — scans for and connects to:
- 💓 Heart-rate straps and watches
- 🚴 Cycling speed/cadence sensors (0x1816)
- 👟 Running foot pods / stride sensors (0x1814)
- 🛰️ External GNSS / GPS units
⌚ Watch sync — pairs with a Wear OS device and syncs activity records, live workout status, heart rate, and battery percentage. Queues records offline and flushes them when the watch reconnects.
🖼️ Home-screen widgets — rings widget (calories / steps / active minutes) plus heart rate and watch-connection state, updated in real time.
🗺️ Maps — OpenStreetMap view for location-aware activities.
📜 History screen — past activities with type, distance, duration, calories.
🚀 Onboarding — first-run setup flow with goal configuration.
🔐 Permissions handled properly — Bluetooth scan/connect permissions gated on Android 12+ (BLUETOOTH_SCAN, BLUETOOTH_CONNECT).
🆕 New in this release
📊 Real metrics — the dashboard was lying
- 🔥 Calories were always 0. The dashboard only counted workouts you'd already saved, and ignored everyday walking. Now it counts saved workouts + the workout in progress + everyday steps — with no double counting.
- 📏 Distance was 0.00 km for the same reason. Now calculated from your real steps using a stride estimate based on your real profile height.
- ⏱️ Active time was 0 min. Now measured from real step events. Since Android's step counter keeps no history, it starts from now — until then it shows an estimate from your real steps, clearly labelled "min est".
- ⚖️ Calories were calculated assuming everyone weighs 70 kg. Now uses your real "Weight (kg)" profile setting.
🏆 Real goals & streaks
- 🚫 Removed a hardcoded fake streak. The dashboard literally displayed
🔥 5 Day Streakno matter what you did. It now shows your real streak: consecutive days where you actually hit your step goal. Today being incomplete never breaks it. - ➕ Added an Active Minutes goal row to the Daily Goals card (it only had Steps and Calories).
- 🔁 The Statistics screen had its own duplicate streak logic that counted any day you recorded something. Both screens now share the same real logic and your real step goal.
🗺️ Removed fake route data
- ⏳ Route ETA was a literal
14 minand speed a literal5.2 km/h— written into the code, identical for every route. Both now come from your real route distance and your own real recorded average speed, labelled "ETA (est)". - 📍 The saved-places list started with four made-up San Francisco places (
Home,Work,Golden Gate Park,Twin Peakspointing at random coordinates). It now starts empty and only holds pins you actually drop.
📡 GMS-free watch sync
- ⌚ The watch integration is now real instead of simulated, and Google Play Services were never added — the watch is found over your local WiFi (UDP discovery + TCP), with live workout metrics, remote control, watch HR/cadence streaming and offline queue sync.
🧹 Also included
- 🖼️ Home screen widget no longer shows fake data
- 🧭 Corrected the turn-by-turn navigation behaviour (reverted a bad change that made it pretend)
🧪 Tests
✅ 30/30 passing — 22 new tests written for the calorie, distance and streak logic.
⚠️ Known gaps (honest)
- 🗺️ The phone app has no routing engine yet, so route ETAs are estimates from your own history, not real road routing.
- ⏱️ Historical active minutes for past days can't be read from Android — only counted from when the app starts observing.
- 🩺 Health Connect 1.1.0 exposes no active-minutes record, so that route isn't available.
🛠️ Technical details
- 📦 Package:
com.example.miles - 🔢 Version:
1.0.7 - 🔧 Build type:
debug - 🏗️ Built with: Gradle 9.7.1, Android Gradle Plugin, Kotlin, Jetpack Compose, Room, Kotlin Coroutines / Flow
- ✍️ Signing: debug keystore — sideload only, not for Play Store distribution
📦 Assets
| File | Bytes | Size | Description |
|---|---|---|---|
miles-v1.0.7.apk |
23,272,070 | 23 MB | The installable APK |
miles-v1.0.7.apk.sha256 |
83 | 83 B | SHA-256 checksum of the APK |
miles-build-v1.0.7.log |
2,199 | 2.2 KB | Build log showing how it was compiled |
Verify the download:
sha256sum -c miles-v1.0.7.apk.sha256Or manually:
sha256sum miles-v1.0.7.apkCompare the output against the value inside miles-v1.0.7.apk.sha256.
📲 Installation
- ⬇️ Download
miles-v1.0.7.apk. - 📂 On your phone, open it with your file manager, or install over USB:
adb install -r miles-v1.0.7.apk- ✅ When Android prompts, allow "Install unknown apps" for the app opening the file.
- 🎉 Tap Install.
If you already have a higher version installed, Android will refuse to downgrade. Use:
adb install -r -d miles-v1.0.7.apkor uninstall the existing app first.
⚠️ Known limitations
- 🐞 Non-Play-Store build only. Do not upload to the Play Store.
- 📶 BLE device support is Wear OS only. Tizen OS might work if you get lucky.
- ⌚ Watch sync is one-directional — queued records flush phone → watch; deep two-way protocol work is not implemented.
- 🔥 No Google Services / Firebase. The
google-servicesandsecretsplugins are declared in the version catalog but not applied to any module. - 📡
MilesWidgetSyncReceiverrisk — if the manifest entry and the receiver class drift, you get a runtime crash, not a build error. - 🗺️ Map tiles require a network connection — OSM raster tiles are not cached offline.
- ⚡ Deprecation warnings remain — old Compose icons (
Icons.Filled.*vsIcons.AutoMirrored.Filled.*),BluetoothGattCharacteristic.getIntValue,LocationManager.requestSingleUpdate. Functional for now; will need attention before Gradle 10.
🔄 Changes since v1.0.6
Fixed
- 📊 Calories, distance and active time were always zero on the dashboard — now computed from real saved workouts + in-progress workout + everyday steps
- ⚖️ Calorie estimates no longer assume a fixed 70 kg body weight — they use your real profile weight
- 🏆 Fake
🔥 5 Day Streakbadge removed; streak is now real (consecutive step-goal days, today never breaks it) - 🧮 Statistics screen no longer has its own duplicate streak logic — shares the dashboard's real logic
- ⏳ Route ETA (
14 min) and speed (5.2 km/h) hardcoded values removed — now derived from real route distance and your real average speed - 📍 Saved-places list no longer seeded with fake San Francisco pins — starts empty
- 🖼️ Home screen widget no longer shows fake data
- 🧭 Turn-by-turn navigation no longer pretends — reverted a bad change
Added
- ➕ Active Minutes goal row in the Daily Goals card
- 📶 Real GMS-free watch sync over local WiFi (UDP discovery + TCP)
- 🧪 22 new unit tests for calorie, distance and streak logic
Removed
- 🚫 Hardcoded streak value on the dashboard
- 📍 Hardcoded San Francisco saved places
- ⏳ Hardcoded route ETA / speed values
🗺️ Roadmap
- Phone-side routing engine for real road-based ETAs
- Historical active minutes where Android can expose them
- Health Connect active-minutes support when the API offers it
- More sensor support
- Better GPS filtering and route smoothing
- Continued MILES Studio development
📄 License
GPLv3
Real data. Real tracking. Your wrist. Your data.
Made by AnshLabs716.
Android + Linux only.