PAIesque
org.ojrandom.paiesque
Zapstore _@zapstore.dev Republished from GitHub / F-Droid by the Zapstore main account.
Sats Received
Underlying data available via MCP: app_zaps, app_releases.
Zap Count
Underlying data available via MCP: app_zaps, app_releases.
Releases
- Sep 28, 2026 109# v109 - Brings sharing between the app and the browser **Summary.** Both sides now agree on device identity and on what counts as "live", so a group with the same password on both sides sees the same peers. The browser distinguishes a public share link from an encrypted group session, and no longer mixes the two. ### Two kinds of share The browser decides at startup which of two channels it is in, and does not mix them. - **A public share link** shows public recordings and live tracks. No password prompt, no Share panel, no encrypted peers. - **An encrypted group session** shows encrypted devices and browser peers. No public devices.
More…
### Sharing between the app and the browser The app and the browser disagreed about device identity and about what counts as "live". A share that worked on one side could be invisible on the other. Both sides now use the same identity and the same liveness rules. Other changes in this area: - A device that stops publishing stays on the map for 24 hours, drawn muted. It returns to colour when the sender resumes. - All live devices in the group are drawn on the map, not only the selected one. - A browser peer that shares only its location appears in the app, and the app appears in the browser. ### Group member cap If your API key allows up to N group members, the browser shows at most N. The others remain on the server, and members with a different key may see a different subset. The Group status line says when this is happening and suggests asking the server admin for a higher limit. ### Under the hood - The browser sends ETag/If-None-Match on listing and stats requests. An unchanged response returns 304. - Key derivation uses PBKDF2 with the derived key cached in the browser. Payloads written with a different iteration count still decrypt. - The browser page sets a Content Security Policy. - Sep 22, 2026 108# v108 focuses on web viewer improvements ### Added - **Download tracks** — the selected device's CSV and GPX files can be saved. Live downloads are a snapshot at the moment of the click. - **Elapsed time axis** — the chart can show elapsed time since the start of the recording. - **Compressed gap rendering** — long pauses in a track (more than 90 seconds between samples) no longer stretch the chart horizontally. . ### Fixed - Bug fixes and small UI improvements across the viewer.
More…
## Server ### Changed - **Refined logging** — every log line now carries a per-request id, the client IP, the endpoint, the method, and the API key prefix, so a single request can be traced end to end. Log levels are used consistently: `LOG_LEVEL=INFO` produces one line per request, `LOG_LEVEL=VERBOSE` a full trace for one request. - **Refined stats** — server statistics now report private shares (the Android app's store) and public shares (the browser-visible store) separately, and are regenerated at most once every 15 minutes regardless of how many clients request them. - Sep 21, 2026 107# v107 - The browser viewer is here PAIesque public shares can now be opened directly in a web browser. The viewer does two things: 1. **Displays recordings shared by the Android app** — live or historic — with the same charts, map, summary and TRIMP values you see in the Android app. 2. **Lets browser users join a group and share their own location** — even if no Android app is involved. ## Viewing Android app recordings The browser viewer opens Android app shares and presents them in the same way the Android app does:
More…
- **Charts** — heart rate, speed, altitude, distance, HRV. - **Map** — the track coloured by heart-rate zone, with peer markers. - **Summary** — TRIMP, time in zones, distance, ascent and other session metrics. - **Live view** — while a recording is in progress, the browser follows along and updates the map, chart and summary as new data arrives. ## Sharing your own location from the browser The browser can join a group and publish its own location through the same public share server: - **Join a group** — enter the group name and password. - **Share your location** — the browser encrypts and uploads its position to the group. - **See other members** — browser and Android members appear on the same map. - Sep 15, 2026 106v106 - clearer handling of version mismatches When a self-hosted server rejects the app because its version is not in the server's allowlist, the app now tells you so. Previously it reported a generic "HTTP 403" in the connection test, and continued polling the server in the background. - The "Test connection" button in Sharing Settings now shows an "Incompatible app version" dialog with a suggestion to update the app or to ask the server operator to add the version.
More…
- Background polling and sync stop while a version mismatch is known. The check resets automatically on the next successful request, on an app process restart, or when you press "Test connection". - A redundant device reload at activity startup has been removed. - Sep 15, 2026 105# v105 brings End-to-End Encryption for Group Sharing ## Summary Group sharing is now private by design. Heart rate, HRV, location, speed, distance, altitude, your display name, and your device name are all encrypted on your phone before they leave. The server that relays your data can no longer read any of it. The encryption key is derived from your group name. Set up sharing as before: pick a group name, tell the other members the same name. No keys to manage, no passphrases to remember, no login. ---
More…
## Why this was changed Group sharing previously sent your data as plain text. The server stored readable files on disk. That was fine for a small group on a trusted server, but it meant the server operator could see everything. Three concerns drove the change: - **The server operator.** Even a friendly operator sees everything. Encryption removes the trust requirement entirely. - **Accounts and passwords.** A login system would have meant password resets, a password database, and a new class of bugs. Reusing the group name as the source of the key avoids all of that. - **Simple server.** With all intelligence on the client, the server becomes a dumb blob store. It never parses CSV, never reads status content, and never needs to know what it relays. That is much harder to get wrong. Encryption protects the content of what you share. To also hide where you are connecting from, the app can reach the server over TOR — using Orbot on Android, for example. When it does, the server only sees an anonymous TOR exit node; it has no knowledge of the coarse location that would otherwise be derivable from your IP address. This works even if your server is a normal HTTPS endpoint and not a `.onion` service. - Sep 13, 2026 104v104 — Stability fixes ## Summary This release fixes several crashes and a few silent data-loss issues. If you were affected by a force-close on the recording screen, the Trends screen, or the Analysis map, this update addresses it. --- ## Fixed: app crashes
More…
- **Recording screen.** Several force-closes could occur while a Bluetooth heart-rate sensor was connected, while scanning for devices, while stopping a recording quickly, or while the sensor's device information was being read. - **Trends screen.** The app could crash right after opening the screen or when changing the TRIMP method before the initial load had finished. - **Analysis map.** With "Show tracks for all devices" enabled, the map could crash while updating additional tracks. ## Fixed: silent data loss - **Live view.** The first batch of samples could be lost when opening a live view during a recording. - **Uploads.** The same upload could be sent to your server twice. - **Database.** In rare cases the local database could be opened twice, leaking a connection and making recent writes briefly invisible. ## What you may notice Nothing changes visually. The crashes and the losses are gone. On very large recordings the chart may take one extra frame to appear. Local recordings, shared tracks, the Trends screen, the map, the backup format, and the sharing server are unaffected. - Sep 12, 2026 102v102 - This release focuses on the recording notification, corrects documentation that did not match the app, cleans up the overflow menus, and removes dead theme code. No metric formulas change and no data changes, but the recording notification now behaves as a proper control surface rather than a static placeholder. ## Recording notification - **The Recording screen now asks for the notification permission on Android 13+.** The app already requested it when downloading an offline map, but not when starting a recording. A user who never downloaded a map got a silent recording with no Pause/Stop action in the shade. Denying it does not block the recording.- **The notification updates every second.** It used to be created once and never refreshed. - **The notification shows all active devices.** Heart rate was always shown as `---` because the lookup used the wrong key; that is fixed. GPS-only recordings now show `GPS only`. - **Pause and Resume actions added.** Stop remains and saves. Discard is not exposed because it is irreversible and the app guards it with a confirmation dialog. - **Notification actions now update the app.** Tapping Pause, Resume, or Stop in the shade previously left the recording screen unchanged. ## Documentation
More…
- **HRV data origin is now stated:** the app computes RMSSD itself only on the live BLE path; on the Health Connect path it consumes values from the source device. - **EWMA label split:** `[Peer-reviewed]` for the method, `[Convention]` for its RHR/HRV application. - **CSV import checkbox corrected:** the import writes both HR and HRV, not just HR. - **HRV plausibility filter documented:** unlike RHR, HRV has none. - **HRV Settings dialog documented** in the help page and formula reference. ## Menus Fake separators, redundant `▶` prefixes, and Holo-era icons removed from the three overflow menus. Sentence case, import before export. Item IDs unchanged. ## Cleanup Three unused styles and an orphaned calendar layout removed. No visible effect. - Sep 11, 2026 101v101 - This release makes the app's science transparent (evidence labels everywhere), makes the manual physiological profile authoritative, unifies lactate-threshold estimation, aligns PAI values, and fixes the remote Summary tab. ## What's new - **Evidence labels:** Every metric in legend and help is labelled peer-reviewed, convention, heuristic, app-defined, or proprietary-inspired. Help includes a full formula reference. - **Manual profile is authoritative:** Entered lab values (RHR, HRmax, VT1/VT2, lactate) override fitness-based estimates in TRIMP, zones, and charts. - **Continuous LT estimation:** Lactate threshold is interpolated smoothly from fitness (65%→92% HRmax). LT, zones, and TRIMP may change. - **PAI-like values aligned:** Rolling PAI is a 7-day simple sum; PAI chart no longer multiplies by 100. - **Remote Summary tab fixed:** Uses the remote user's complete profile, no flicker, shows `--` if incomplete. - **Legend improvements:** Inline chart-style samples, theme-aware colours, precise wording.
More…
- **Sleep Settings:** Choose RHR method (sustained low or percentile) and recovery data source (training device or all devices). - **Database migration:** EWMA columns renamed to `*_ACUTE` / `*_CHRONIC`; existing data migrates automatically. - Sep 10, 2026 100v100 - **Track import/export, unified device naming, and a Health Connect round-trip fix** ## New features - **Import GPX and CSV tracks** from Analysis: choose a file, pick or type a device name, optionally write heart rate to Health Connect, optionally overwrite overlapping samples. Imported tracks behave exactly like recordings made in the app — same map, chart, TRIMP card, and zone calculations.
More…
- **Export the visible chart range** as GPX and CSV: zoom and pan the chart, then export only what you see. Useful for sharing a race segment, an interval, or a field test without exposing the whole recording. - **Self-hosted group sharing** is now described in the app help. Tracks, live locations, TRIMP values, and intensity zones can be exchanged directly between training partners without a manufacturer cloud. ## Improvements - **Unified device naming across the app.** A sensor like the Amazfit Helio Strap now appears as *Helio Strap* in the Record screen, the Analysis spinner, the exported files, and the Trends screen — instead of *Amazfit Helio Strap* in some places and *Helio Strap* in others. The physical BLE advertising name is used as the primary source of truth; numeric DIS models (for example the Garmin HRM 600 reports `4607`) are ignored. - **Virtual phone recordings** now carry the phone manufacturer (Google, Samsung, …) alongside the model, so they look like proper devices in exports and Health Connect. - **Import dialog** shows existing devices by their canonical name, and the user-typed name is authoritative — it is stored verbatim in the recording database and used as the Health Connect model, so it survives the round trip through Health Connect into Trends. - **GPX track names** no longer contain internal database IDs. ## Bug fixes - Crash in `ChartViewController.updateDeviceId` when the chart was created before the first data load completed. - iTRIMP fitness mapping and threshold defaults corrected (higher endurance fitness now gives a *lower* b coefficient, iTRIMP threshold defaults to resting HR). ## Documentation - README and help updated: iTRIMP and LT-TRIMP formulas, PAI calibration defaults, track import/export, and self-hosted group sharing. - Sep 8, 2026 99v98 fixes an issue where the Analysis chart and summary could appear empty after returning to the screen or after reopening the app. It also significantly reduces the time needed for daily training metrics recalculations and clarifies the progress messages shown during calculations. ### Changes for Users - **Analysis tabs now load correctly after returning to the screen or restarting the app** Previously, switching to Record and back to Analysis, or reopening Analysis after it had already been loaded once, could leave the Chart and Summary tabs empty even though the map still showed the track. The app now reloads session data properly in these situations. - **Much faster daily recalculations** After a normal Health Connect sync with new heart rate data, the training metrics update now processes only the most recent 7 days instead of the entire history. This reduces the calculation time from about 13 seconds (for 2200 days) to under half a second for typical daily updates.
More…
- **Clearer progress messages** The progress bar now explicitly states when it is reading heart rate data and calculating TRIMP, and when it is calculating training metrics. This removes ambiguity about which phase is currently running. - Sep 7, 2026 98## v98 - Improved Resting Heart Rate Calculation and Faster Recalculations ### Summary This update improves how the app calculates resting heart rate (RHR) and reduces the time required for full recalculations. It also cleans up the altitude settings flow and updates in-app documentation to match the new behavior. ### Changes for Users - **New RHR calculation method (default): "Sustained low"** The app now finds the lowest sustained heart rate period during sleep using an adaptive moving median. This is more robust against occasional outliers and better reflects a period of consistently low heart rate.
More…
- **Configurable RHR method** In **Menu → Sleep Settings**, you can now choose between: - **Sustained low** (recommended) - **Percentile** (the previous method) - **Percentile method adjusted** If you select the legacy percentile method, it now uses lower percentiles (3rd–10th instead of 5th–15th), making it closer to the absolute minimum while still providing some outlier robustness. - **Faster full recalculations** Training metrics recalculation is now faster for most users (coupled ACWR), reducing the waiting time after settings changes or data imports. - **Altitude settings simplified** The extra “Altitude options” dialog was removed. Long-pressing the altitude display (or using the menu) now opens the ascent dead-band threshold settings directly. - **Improved explanations** In-app help and documentation now describe the new RHR methods with precise parameters and scientific references. - Sep 6, 2026 97v97 Performance and Logging Improvements ### Summary This update significantly reduces the time required for full recalculations and provides better visibility into long-running operations. The main performance gain comes from switching heart rate, RHR, and HRV streaming to use primitive arrays instead of allocating a separate object per sample. Additional database indexes and a covering index eliminate full table scans and sorts. Progress messages now accurately reflect the current phase, and all persisted timestamps now use a consistent unit (seconds). ### Performance Improvements | Phase | Before | After | Improvement | |-------|--------|-------|-------------|
More…
| Heart rate streaming | ~59.0 s | ~11.6 s | ~5× faster | | RHR calculation | ~16.8 s | ~5.1 s | ~3.3× faster | | HRV calculation | ~0.9 s | ~0.8 s | ~1.2× faster | | Full calculation (MERGED_ALL) | ~106.9 s | ~42.6 s | ~2.5× faster | *Measured on a debug build with 1,293,568 heart rate samples and 97,373 HRV samples across 583 days.* ### Other Changes - **Performance logging:** Added a new `TimingLogger` utility and unified performance logs under the `Perf` tag. Detailed breakdowns now appear for sync, calculations, database inserts, and streaming operations. - **Timestamp unit unification:** `health_connect_last_sync` is now stored in seconds (like all other persisted timestamps), with automatic migration for existing installs. - **Database indexes:** Added composite and covering indexes on `heart_rate_samples` and `hrv_samples` to support streaming queries without sorting or table lookups. - **UI progress messages:** TRIMP, RHR, and HRV loading steps now show accurate messages such as "Loading heart rate data…" instead of misleading "processed" counts. Training metrics calculation now reports progress per method (LT-TRIMP, Banister, iTRIMP, PAI) every 20 days. - **Primitive streaming:** Introduced `HeartRateDay` and `HrvDay` primitive holders and new streaming methods that avoid per‑sample object creation. ### Compatibility Existing `List`‑based calculation methods remain available for callers like `SessionMetricsCalculator`. The new primitive‑based methods are additive and do not change existing behavior. - Sep 4, 2026 95v95 aims to improve stability and usability ### Summary - visual progress feedback for offline map downloads, including parallel downloads, cancellation, and background continuation - improved Health Connect sync reliability - adjusted PAI calibration defaults - warnings for outdated app versions. ---
More…
### New Features - **Offline map download progress** The map settings dialog now shows live progress bars for each map being downloaded. You can start multiple downloads in parallel, cancel individual downloads, and the downloads continue even if you switch apps or turn off the screen. A notification is shown while downloads are active. ### Improvements - **Clearer outdated app version warning** If the sharing server rejects the app version, a more prominent warning icon and message are now displayed. ### Bug Fixes - **PAI calibration defaults adjusted** Default calibration values have been fine‑tuned so that 7‑day PAI totals are in a realistic range. - **Health Connect sync reliability** Fixed an issue where a failed read from Health Connect could be incorrectly marked as successful, which prevented re‑importing missing data. The app now shows a dialog advising you to keep it in the foreground during sync, and errors are properly reported so the next sync retries the missing records. - Sep 3, 2026 94v94 fixes ui freezes aims to improves stability **Summary:** This update resolves several stability and performance issues in the Analysis tab, including UI freezes and crashes. The most important fix prevents the app from becoming unresponsive when viewing heart rate charts and maps. **What’s new / fixed:** - **Fixed UI freezes and ANRs in the Analysis tab** The app could stop responding when viewing recorded activities.
More…
- **Complete map tracks** Previously, some parts of your route could be missing on the map. The app now preserves the full shape of your track, even for longer recordings, while still keeping performance under control. - **Respects the “Max total points” setting** The track display setting now works consistently. The selected track is always shown first, and additional device tracks share the remaining point budget without cutting off parts of the route. - **Fixed offline map loading errors** Some users experienced crashes when returning to the Analysis tab with offline maps. The app now loads offline maps correctly and only when needed. - **Improved database connection handling** Internal database connections are now closed properly, preventing leaks that could cause slowdowns or crashes over time. - **General performance and stability improvements** Various background tasks were optimized, reducing unnecessary work and improving overall responsiveness. - Sep 1, 2026 93v93 aims to improves stability, accuracy, and reliability. Stability - Fixed app freezes by moving data operations to the background. - Fixed a crash when opening the Analysis screen. Health Connect - Added missing permission checks. - Removed unnecessary history re-downloads after CSV import. - Stopped unnecessary sync resets after backup import.
More…
PAI Calculation - Updated to the official 7-day total method but is not scaled yet - Existing values recalculated automatically. Backup & Import - Improved progress feedback. - Fixed duplicate progress messages. Other - Prevented database errors after device migration. - Added safety checks for chart display. Known Issues - The app may still freeze when loading very long recordings in the Analysis tab. - Sep 1, 2026 92# v92 - Simplified Device Identification ## Summary We changed how Paiesque identifies devices. The logic is now simpler and more consistent across different data sources (Health Connect, BLE recording, CSV import/export). On first launch after the update, Paiesque performs a one-time data migration. Please keep the app open until the migration finishes. ---
More…
## Old vs. New Device Naming | Metadata from Health Connect / import | Old display name | New display name | |-----------------------------------------------------------|-----------------------------------|-------------------------| | Name: Unknown, Manufacturer: Unknown, Package: `com.huami.watch.hmwatchmanager` | `Unknown` | `Huami Watch` | | Name: Unknown, Manufacturer: `xiaomi`, Model: Unknown, Package: `com.xiaomi.wearable` | `xiaomi Unknown` | `Xiaomi` | | Name: `Smart Band 10`, Manufacturer: `Xiaomi`, Model: `Smart Band 10` | `Xiaomi Smart Band 10` | `Smart Band 10` | | Name: `GTR 3 Pro`, Manufacturer: `Amazfit`, Model: `GTR 3 Pro` | `Amazfit GTR 3 Pro` | `GTR 3 Pro` | The new name is chosen from the first available value in this order: 1. Device name (if not “Unknown”) 2. Manufacturer (if not “Unknown”) 3. Model (if not “Unknown”) 4. Friendly package name (e.g., “Huami Watch”) 5. `Unknown Device` This makes the device list cleaner and easier to understand. --- ## What Changed for You ### Simpler Device List - Devices are now identified by a single canonical name. - Duplicate entries for the same device are merged automatically. - The UI shows only the canonical name – no more “Unknown” combinations. ### One-Time Data Migration - On first launch after the update, you will see a progress screen: “Migrating database…” - This process reorganises existing data and merges duplicate devices. - **Please keep the app open and wait until it finishes.** The time depends on how much data you have. ### CSV Export Change - The CSV column that identifies your device has been renamed from `device_display_name` to `device_identifier`. - This makes it clearer which column is used as the device ID when re-importing data. - Aug 12, 2026 91v91 improves map performance with zoom‑based track simplification, moves heavy operations off the main thread to prevent ANRs, and fixes several map and recording issues. ## Map Performance - Tracks are simplified using the current zoom level via a new `PolylineSimplifier` utility. Points closer than one screen pixel are removed before rendering, keeping the map responsive without visible quality loss.
More…
- Heavy operations – track simplification, fit‑to‑track, offline map file loading, chart segment building – now run on background threads. ## Analysis Screen Responsiveness - The analysis screen now opens with a single day of data to avoid startup delays on large datasets. Users can later expand the date range as needed. ## Fixes - The date‑range selection dialog is now scrollable, making the buttons always reachable. - The offline map now waits for valid dimensions before drawing the track, so the full route is visible immediately. - Switching offline maps while a recording is active no longer hides the live track – it is refreshed instantly. - A damaged offline map file no longer causes a secondary crash. - Jul 14, 2026 90# Release Notes – v90 This update makes BLE reconnection automatic, and ensures all group members appear in the device list—even without uploaded recordings. ### Sharing - Stale recording flags are reset when a remote user stops recording. - Group members who have never uploaded a recording now appear in the device list and on the map. - The "recording ended" status includes the last known location, keeping a marker visible after a session ends. ### Recording
More…
- Periodic BLE reconnection (every 15 s) recovers from temporary out‑of‑range disconnections. - Default recording interval is now 5 s (was 1 s). - Jul 5, 2026 86# Release Notes – v86 These release notes cover all changes since the last public version, grouped by functional area. Most improvements are under the hood, but some directly affect the user experience. ### Recording Reliability (Long Sessions & Screen Off) - **GPS thread leak fixed** – a background thread was accidentally re‑created every time GPS restarted, potentially wasting resources during very long recordings. The thread is now reused, keeping the app stable even after hours with the screen off. - **BLE heart‑rate reconnect** – if you toggle Bluetooth off during a recording, all heart‑rate sensors now automatically reconnect when Bluetooth is turned back on. The recording continues (GPS only) while Bluetooth is off, and heart‑rate data resumes without any manual intervention. - **Stale HRV values prevented** – if a sensor briefly disconnects, HRV and RR intervals are no longer incorrectly recorded as the last known values. They are simply omitted until the sensor reconnects. - **Recording UI no longer shows stale readings** – when a new recording starts while previous BLE sensors are out of range, the heart‑rate, HRV, and battery displays now reset to placeholder values instead of showing the last known numbers from the old session.
More…
- **BLE connection priority** – after connecting to a heart‑rate sensor, the app now requests the fastest possible update rate, reducing the chance of dropped RR‑intervals and improving HRV accuracy. - **Background task cleanup** – the internal timer that collects samples now shuts down cleanly when recordings stop, avoiding rare cases where two timers could run simultaneously. ### Map & Analysis - **Map zoom now behaves predictably** – the map zooms exactly once when you select a device, open the activity, or switch between online/offline maps. After that, it only pans to follow the device, never overriding your manual zoom again. This replaces a complex and sometimes unpredictable zoom system. - **Track‑fitting fixed for online maps** – when a track is loaded in history mode, the map now always shows the whole route. Previously, online maps sometimes zoomed to a small portion. - **Chart display settings** – a new menu item "Chart display settings" lets you set a time threshold (days) and maximum displayed samples. If the chosen date range is longer than the threshold, the app shows only the most recent part to keep the chart responsive. The TRIMP summary is always calculated for the visible time range. - **Heart‑rate zones** – duplicated code for computing zone boundaries has been consolidated, ensuring consistent colours and thresholds everywhere. ### Sharing & Uploads - **Failed uploads are now retried** – if a status update or recording CSV fails to reach the server (e.g. temporary network loss), it is queued and retried with exponential backoff. The queue survives app restarts, so no data is lost. - **Remote devices hidden when sharing disabled** – the device spinner in both live and history mode no longer shows other users' devices while sharing is turned off. Toggling sharing on/off immediately updates the list. - **Startup retry** – any pending uploads are automatically retried when the app launches, without waiting for a new recording. ### User Interface - **Recording indicator redesigned** – the "Record" button in the bottom navigation no longer turns solid red while recording. Instead, a small red dot appears next to the label. This is less distracting but still clearly shows that a recording is active, regardless of which tab you're on. - **Navigation unified** – all three activities (Trends, Record, Analysis) now share the same navigation controller, so the red dot and button states are consistent everywhere. ### Under the Hood (for developers & curious users) - **Heavy refactoring** – `RecordingService` was split into dedicated helpers (`SampleCollector`, `SessionExporter`, `HealthConnectUploader`, `SharingUploader`, `UploadQueueManager`), making the code easier to maintain. - **Thread safety** – database batch writes now happen on a dedicated background thread, avoiding delays on the main thread. - **CSV import** – parsing and insertion of shared recordings is now offloaded to a background thread, keeping the UI responsive. - **HRV calculation log** – the verbose HRV log line was downgraded to `VERBOSE` level, reducing log noise during long recordings. - **`TimeAgoFormatter` utility** – eliminates duplicated time‑formatting code. - **`ZoneThresholds` utility** – centralises heart‑rate zone calculation. ### Notable Bug Fixes - Barometric altitude calibration now works correctly **before** a recording starts (the sensor was accidentally moved to a short‑lived object). - The live‑location cursor (red marker) now appears immediately when entering live mode, for both online and offline maps. - Remote device selection is now preserved when you return to the analysis activity during a recording. - Recording after a crash now offers a "Save or Discard" dialog, preventing data loss. **Summary** This release brings major stability improvements for long recordings, predictable map behaviour, a more subtle recording indicator, and full retry logic for sharing uploads. Under the hood, a large refactoring makes the code cleaner and more maintainable without changing the user experience. - Jun 12, 2026 82# Release Notes – v82 **Sharing & Device Names** - Shared recordings now include the original device display name directly in the file, ensuring correct names (e.g. "HRM 600" instead of "HRM_600") appear in group member lists and the device spinner. - The server correctly reads device names from the new CSV column, and accepts arbitrary BLE advertising names via URL encoding. - Status updates now only upload for actively recording devices, preventing stale data from idle sensors. **Map & Remote Users** - Remote user markers no longer disappear intermittently; they remain visible and can now be tapped on offline maps to view the user's live status. - The Summary tab automatically clears when switching to a remote user without summary data, avoiding display of stale values from a previous user.
More…
- The map smoothly follows a selected remote user without changing the current zoom level. **Performance & Stability** - Offline map loading has been made more robust: duplicate map loads are avoided, and the renderer pauses when the analysis activity is in the background, preventing rare crashes and file‑access errors. - Unused database table (`groups`) has been removed. **Identity & Data Management** - Generating a new identity now reliably deletes all local and shared data, even if the database file was previously modified. - Jun 7, 2026 78# Release Notes – v78 - Group Sharing & Analysis Redesign This update introduces **group sharing** (initial release) and a completely revamped **Analysis screen** with tabbed layout. Note: The sharing feature is still being consolidated – expect further refinements and polish in upcoming releases. --- ## New: Group Sharing (beta) Train together, analyse together. Share your live status and recorded sessions with other PAIesque users in the same group.
More…
Your data stays on a simple PHP server you control – no accounts, no database. ### Features - Live sharing – while recording, your heart rate, location, speed, altitude, and device name are sent to the server (only when sharing is enabled). - See your group on the map – open the Analysis screen in live mode to see every member’s position. Tap a remote user in the device spinner to centre the map on them. - Share past recordings – when you save a session, the full CSV is uploaded. Group members can download and view your history directly in the Analysis screen. - Deterministic group IDs – all users who enter the same group name automatically join the same group (UUID derived from the name). ### Server setup (admin) 1. Copy all PHP files (`config.php`, `auth.php`, `status.php`, `upload.php`, `list.php`, `group.php`, `cleanup.php`, `logger.php`) and `.htaccess` to your web server. 2. Ensure the directory is writable – `data/` and `logs/` will be created. 3. Generate a strong API key: ```bash openssl rand -hex 32 ``` 4. Compute its SHA-256 hash and add it to `$VALID_API_KEYS` in `config.php`. 5. Give the raw key to your group members (never share the hash). A test server is available at `https://jfellow.net/paiesque/` (API key `guest`). ### Automatic data cleanup All uploaded files (status snapshots and recording CSVs) are automatically deleted after a configurable number of days. The default retention period is **30 days**, but the server administrator can change `MAX_FILE_AGE_DAYS` in `config.php`. Empty user directories are removed at the same time. ### App setup (user) - Recording screen -> overflow menu -> Sharing settings Enable sharing, then enter your display name, group name, server URL, API key, and update interval. Privacy note – Remote recordings are stored in a separate database on your device and are never written to Google Health Connect. --- ## Analysis screen redesigned (Chart / Live / Summary tabs) The analysis view now uses a tabbed bottom panel for much clearer organisation: - Chart – the familiar session chart (HR, speed, altitude, HRV, distance). Works in both history and live modes. - Live – real-time metrics for the selected device (heart rate, speed, altitude, distance, HRV). When you select a remote group member, this tab shows their latest live data and the time of the last update. - Summary – the TRIMP summary card (total TRIMP, time in zones, extra metrics like average/max HR, distance, ascent). Tabs are automatically enabled/disabled depending on whether you are in live mode, history mode, or viewing a remote user. --- ## Map improvements for group sharing - Remote group members appear as red markers on both online (MapLibre) and offline (Mapsforge) maps. - Selecting a remote user centres the map on their position and follows them as they move. - The map also shows real-time remote markers for all active group members. --- ## How to update - Install the new APK – existing data remains untouched. - Server admins: deploy the updated PHP files (see `webservice/` folder). - Try the test server first to verify the workflow. --- ## Feedback The group sharing feature and the UI is still being consolidated. Enjoy sharing your training! - Jun 3, 2026 76# Release Notes – v76 - BLE Reliability & Battery Fixes ## What’s new in this release This update significantly improves the stability and accuracy of heart rate sensor communication, especially in crowded environments (sports events, gyms, etc.). ### Battery status now reliable - The battery level is fetched **immediately** after connecting, not only when the sensor decides to notify. - If a sensor doesn’t expose the Battery Service, a placeholder (`● --`) is shown instead of an empty label.
More…
### Robust reconnection & resource management - Reconnection attempts are now limited to **10 tries** to prevent endless retries and save battery. - Disconnected Bluetooth resources are properly released, avoiding “connection failed” errors after many reconnect cycles. - All Bluetooth commands are serialised to avoid hitting Android’s internal limit and causing connection drops (especially important at busy sports events). ### Smarter background timers - Health Connect uploads and recording timers no longer run indefinitely, preventing memory leaks and unnecessary CPU usage. ### Crash fixes - Delayed UI updates are cancelled when the activity is destroyed, eliminating rare crashes. - Listeners are cleaned up in `onDestroy`, stopping memory leaks and background callbacks after the app is closed. ### Better handling of different heart rate sensors - Devices that only support reading (not notifications) for the battery level now work out‑of‑the‑box. - The app requests a larger MTU (251 bytes) for better RR‑interval data whenever the sensor supports it. --- ## Why these changes matter ### 1. BLE devices are not all the same Different heart rate sensors expose the same standard services (Heart Rate, Battery, Device Information) but behave very differently. Some send battery updates spontaneously, others only respond to an explicit read request. Some allow 247 bytes per packet, others only 23. **The app must handle all of these gracefully**, without assuming that what works with one brand will work with another. ### 2. Battery level: notifications vs. reads The Battery Service characteristic (`0x2A19`) can support **notifications** (the sensor pushes updates when the level changes) or **reads** (the app asks for the value). Many sensors support both, but some only support reads. Our original implementation only enabled notifications, so if the sensor never sent one, the battery would stay empty for minutes or forever. **Now we perform an explicit read right after connection**, and also show any previously cached value when the UI is built. ### 3. MTU and RR‑interval data The MTU (Maximum Transmission Unit) defines how many bytes a BLE notification can hold. With the default MTU of 23 bytes, a heart rate packet can carry at most **9 RR intervals**. That’s usually enough at moderate heart rates, but at very high intensities (e.g., 200 bpm) more RR intervals are generated between two notifications. If the buffer is too small, some intervals are dropped → RMSSD (HRV) calculations become less accurate. The app now requests an MTU of **251 bytes** (the maximum for BLE 4.2+). If the sensor accepts, up to ~120 RR intervals can fit in a single packet, eliminating data loss. If the sensor only supports 23 bytes (like the Garmin HRM 600), the app still works; the HRM 600 compensates with a very fast connection interval (36 ms), so nothing is lost in practice. ### 4. Avoiding Android’s BLE “pending operation” limit Android’s BLE stack allows only a handful of pending GATT operations (reads, writes, descriptor writes) at the same time – typically around 10. When you have many sensors, or when you try to read many characteristics in parallel, you can hit this limit. New operations fail with status **133** (GATT_ERROR). The fix **serialises all GATT commands through a single background handler**, so only one operation is active at a time. This completely eliminates 133 errors without any noticeable slowdown for heart rate sensors. ### 5. Memory and battery leaks are invisible… until they aren’t - A timer that never stops will keep a reference to the service and activity alive, preventing garbage collection. - Continuous BLE scanning while already connected wastes energy. - Endless reconnection attempts after a sensor is turned off drain the phone battery. All of these have been addressed in this release. ### 6. Think about the real world Your users will use the app in gyms, in crowded races, with dozens of BLE devices around. They’ll forget to turn off their sensor, switch sensors often, and expect the battery percentage to appear instantly. **Robust BLE code must handle all these edge cases silently**, without the user ever noticing a problem. This update moves the app much closer to that goal. - Jun 3, 2026 75# Paiesque Chart – Major Update - **Interactive Chart** – Pinch‑to‑zoom to change the visible day range, pan horizontally to scroll through your entire training history, double‑tap to reset to the last 28 days. - **Dynamic Grouping** – Days are automatically grouped when the chart becomes too dense, with a subtle label indicating the group size. - **Direct Drawing** – The chart is now rendered directly on a Canvas, giving you instant visual feedback during zoom and pan gestures. Text size can be adjusted with the `+`/`−` buttons. - **Full Data Access** – All historical data is loaded and instantly available; no more date‑range dialogs. - **Improved Theme Support** – All text, lines, and labels respect your device’s light/dark theme. - **Toolbar Record Button** – The recording button has been moved to the toolbar for persistent visibility. - **Many Visual Fixes** – Restored original appearance of EWMA lines, polarized points, RHR/HRV colours, gap handling, axis labels, and more. - **Performance & Cleanup** – Removed SVG export and unused UI elements, resulting in a simpler and more responsive interface.
- Jun 2, 2026 74# Release Notes – v74 - Maintenance & Bugfix Release ### New Features & Improvements - **Pre‑recording altitude calibration** The app now performs a one‑time, pre‑recording calibration using a median offset from up to 10 GPS/barometer samples (minimum 3). A 🛰️ icon indicates when calibration is pending; it disappears once a stable offset is available. This provides more accurate barometric altitude without the need for continuous correction. - **Recalibration during recording** Long‑pressing the altitude text while recording opens a dialog to recalibrate. The app collects up to 5 valid GPS/barometer samples (over 5 seconds) and applies the median offset. A progress dialog keeps the user informed, and the altitude jumps only after successful recalibration.
More…
- **Better altitude feedback** The altitude displayed on the recording screen now prefers `calibratedAltitude` (barometer + GPS offset) when available, falling back to GPS altitude. This matches the data exported to GPX and CSV. - **GPX/CSV altitude export** CSV files now write calibrated altitude (when available), matching GPX and on‑screen display. - May 31, 2026 72# Release Notes – v72 ## Overview This update introduces a completely redesigned recording system, improves live activity analysis, adds barometric altitude support, and enhances device management. The app now stores recordings directly in a local database, providing better performance, crash recovery, and seamless integration with the analysis screen. --- ## New Features ### Completely Revamped Recording System
More…
- **Robust database storage** – All recordings are now stored in a local SQLite database (`recordings.db`) instead of temporary files. This ensures data integrity and enables faster access. - **Crash recovery** – If the app crashes while recording, you’ll be prompted to save, discard, or resume the unfinished session. - **Per‑user & per‑device tracking** – Recordings are linked to a persistent user UUID and device IDs, making it easy to switch between multiple devices or users. This is a preparation for a planned sharing functionality. ### Live Analysis Screen (Beta) - **Real‑time map & chart** – While a recording is active, you can open the Analysis screen to see your route and heart rate chart updating live. - **Live heart rate** – Displays the current heart rate from your selected device with zone‑based coloring. - **Automatic centering** – The map follows your last known position and zooms to the first valid GPS fix. ### Offline Map Improvements - **Better offline map handling** – Offline maps (`.map` files) are now copied to internal storage, remain selected across app restarts, and can be deleted directly from the settings dialog. - **Improved zoom & centering** – The map correctly zooms to the recorded track and centers on your current location when in offline mode. ### Altitude from Barometer (Hybrid) - If your phone has a barometer, the app now uses a hybrid altitude (barometer calibrated by GPS) for much more accurate elevation data. - A calibration helper continuously refines the barometer offset based on GPS altitude when the signal is good. ### Device Selection & BLE Bonding - **Simpler device selection** – The device picker now shows discovered BLE sensors with signal strength (RSSI) and automatically persists your choice. - **Bond state indicators** – Icons show whether a device is bonded (lock), bonding (hourglass), or not bonded. - **Automatic reconnection** – If a sensor disconnects, the app retries up to 3 times every 5 seconds, then switches to a 30‑second interval – no user action needed. ### CSV Import Improvements - **Supports barometer columns** – CSV import now understands `raw_pressure`, `filtered_pressure`, `calibrated_altitude`, and `altitude_source`. - **Device matching** – Uses `short_id` (or `device_uuid`) to map imported samples to existing devices. --- ## Improvements ### Performance & Stability - **Reduced memory usage** – The new recording repository batches writes (50 samples or 5 seconds) and uses a dedicated background thread. - **Faster chart loading** – The analysis screen no longer re‑parses GPX/CSV files on every load; it queries the database directly. - **No more orphaned cache files** – Removed the old `analysis_cache.db` and `session_cache.json` in favour of the central database. ### User Interface - **Clearer recording controls** – The recording screen now has a single prominent START/PAUSE/RESUME button, with separate SAVE and DISCARD buttons that appear only when recording. - **Live HR zone bar** – Each connected device shows a coloured zone indicator that moves with your heart rate. - **Elapsed time & GPS status** – Improved readability and theming for dark/light mode. ### Chart & Legend - **Expanded legend** – The legend now includes detailed explanations for each active layer (TRIMP, 7‑day, ACWR/POL, RHR, HRV) with clickable links to the relevant settings. - **Zone achievement lines** – In the 7‑day view, you’ll see coloured lines showing how much of your low/moderate/high zone targets you’re achieving. --- ## Bug Fixes - **Fixed crash on device rotation** – The chart controller no longer leaks the Activity context. - **Fixed missing timestamps after CSV import** – The app now correctly resets the calculation tracker, forcing a full recalculation. - **Fixed “no devices” after backup import** – The device list is reloaded immediately after a successful import. - **Fixed overnight sleep window validation** – The sleep settings dialog now rejects windows that cross midnight (e.g., 23:00 – 00:06) and enforces a minimum duration of 3 hours. - **Fixed bond state not showing** – The recording screen now correctly displays the bond state (lock / hourglass) for each connected sensor. - **Fixed rare crash when deleting heart rate samples** – The operation now runs on a background thread and properly resets the merged device (`-1`) timestamps. --- ## Breaking Changes / Migration Notes - **Existing recordings are not migrated** – This version uses a completely new database schema for recordings. Recordings made with previous versions will **not** appear in the analysis screen. Please keep any important GPX/CSV exports from the old version before updating. - **Removed `AnalysisCacheDbHelper` and `SessionCacheManager`** – All file‑based caches are gone. The app now reads recordings directly from the new database. - **Removed `DeviceRegistry` and `PaiesqueDevice`** – Device management is now based on the new `RecordingRepository` and uses long integer IDs instead of UUIDs for internal references. This only affects code; user data is migrated automatically. --- ## Known Issues - **Live analysis map may not zoom to track on first load** – Refreshing the analysis screen or moving the map manually usually fixes this. - **Barometer calibration requires GPS lock** – The hybrid altitude works best after you have a few seconds of GPS fix. - May 19, 2026 71# Experimental Update **Important:** This version adds new features that are still experimental and not yet fully tested. Some things may not work as expected. --- ## What's New (Try at Your Own Risk) ### Live Session Analysis
More…
You can now open the **Analysis** screen while a recording is in progress. This lets you watch your heart rate, speed, and route on the map in real time. The chart also updates as new data arrives. This feature is very new – performance may vary depending on your device and the number of connected sensors. ### Better Device Recognition The app now remembers your heart rate devices more reliably. Even if the device name changes slightly, Paiesque should still recognise it as the same device. This means your recorded sessions will stay grouped correctly. Behind the scenes, the app now uses a unique identifier (UUID) for each device instead of just the name. ### Improved Date Selection When choosing a date range for old recordings, you now get two separate calendars – one for the start date and one for the end date. Days that have recordings are marked with a dot. This should make it easier to find the sessions you want. ### Offline Map Enhancements If you use offline maps (`.map` files), the map can now show your current location (a blue circle with accuracy radius). The map view (zoom and position) is also remembered when you close the app. ### Other Small Improvements - The chart now recalculates training load (TRIMP) automatically when you zoom or pan. - CSV files with European decimal format (comma instead of dot) are now read correctly. - GPX files exported from the app now include a device ID inside the file, so they match up better when imported again later. --- ## What Has Changed - The **Analysis** screen has been redesigned. You now select a device from a spinner and choose a date range with a dedicated button. - The **Recording** screen now has a toolbar button that takes you directly to the Analysis screen. - Some internal database files have been updated. Old cache files will be upgraded automatically, but it is recommended to keep a backup. --- ## Known Issues / Experimental Notes - Live analysis may cause higher battery usage. - Switching between live mode and history mode may occasionally show stale data – a refresh usually fixes it. - The device registry (new device memory) might not yet handle all edge cases, especially if you use many different sensors. - Offline map location tracking requires location permission and works best with a GPS fix. Please treat this update as a **beta** release. If you rely on stable behaviour, consider waiting for the next version. --- ## Feedback If you find bugs or have suggestions, please report them on our issue tracker (link in the app menu under "Report Bug"). Thank you for testing! - May 15, 2026 70## Fixes ### TRIMP calculation in compressed chart mode - **Problem:** With "Compress gaps" enabled, the TRIMP card sometimes showed zero moderate minutes even though the chart displayed moderate heart rates. The visible time range was incorrectly derived from x‑axis labels. - **Solution:** The chart now records the timestamps of the first and last drawn heart rate sample during drawing. After pan/zoom, a stable callback (800ms) sends this exact range to the calculation logic. Raw GPX samples are filtered by this range, ensuring the TRIMP card matches what you see on screen. ### Distance and average speed calculation - **Problem:** Distance was approximated using a coarse Euclidean method (degrees to kilometres), which was inaccurate over long or curved tracks. - **Solution:** Distance is now always computed from consecutive GPS coordinates using the Haversine formula, which accounts for Earth's curvature. Average speed (`distance / time`) is now more accurate.
More…
## Improvements - Removed dependency on cumulative distance from CSV – distance is purely GPS‑based. - Removed obsolete touch‑based debounce code and label‑based timestamps for the visible range. ## Upgrade notes - After updating, the TRIMP card will correctly update when you pan/zoom (even with “Compress gaps” enabled). - Average speed values may differ slightly from previous versions because they are now based on Haversine distances. - May 15, 2026 69# Map Overhaul & Session Analysis Enhancements ## Completely reworked map engine - Switched from osmdroid to MapLibre + Mapsforge – smoother zoom/pan, better performance, and proper offline map support. - Online tile server selection – choose between OpenStreetMap Standard, OpenTopoMap (hiking), CyclOSM (cycling), or add your own custom tile servers (with API key and custom headers). - Offline maps – import .map files directly from your device or download pre-built regional maps from the new built-in catalog (Bavaria, Bremen, Austria). - Offline mode – once an offline map is selected, the map automatically switches to offline mode; no internet connection required. - Track rendering – route now shows a gray sub-threshold segment (activity threshold) plus green/yellow/red zones based on heart rate. - Chart options now include "Compress gaps" to hide long idle periods (default on).
More…
## Dynamic TRIMP card in analysis view - The TRIMP summary card now updates automatically when you scroll, zoom, or pan the chart, showing the total training load and zone distribution for the currently visible time window – not just the whole session. - This makes it easy to analyse hard intervals, climbs, or recovery periods without manual time selection. ## Improved session file handling - New SessionCacheManager – faster and more reliable caching of GPX/CSV files, with automatic cache trimming to avoid storage bloat. - Better device name detection – device names are now correctly parsed from the <cmt> or <name> fields in GPX files. - MediaStore fallback – if you skip folder access, the app still finds recent recordings via Android's MediaStore. ## Recording screen redesign - Save / Discard buttons replaced the old single Stop button: - Save – exports GPX and CSV files to Documents/Paiesque/Recordings and ends the recording. - Discard – throws away the current recording (requires long-press to avoid accidental data loss). - Start / Pause / Resume now uses a single prominent button with clear visual states. ## Fixes & minor improvements - Zone colours in offline map overlay now match the main chart (green/yellow/red + gray for sub-threshold). - Fixed a crash when importing an offline map from a file picker. - Bonded BLE devices now correctly show the lock icon even after reconnection. - Many internal performance and memory optimisations. - May 9, 2026 68**Recording & GPS** - The app now detects poor or lost GPS signal more intelligently, showing “Searching…” or a clear weak‑signal warning. No more frozen distance or speed values indoors or in dead zones. - You can now record a pure GPS track without any heart rate device – great for mapping a route, tracking a hike, or just logging your ride. - The Stop button dialog is now safer: it only offers “Save” and “Cancel”, so you won’t accidentally discard a recording. To delete a recording, just long‑press the Stop button. **Analysis & Performance** - Load your past sessions much faster – the app keeps parsed track points ready so you can jump right into the map and charts without waiting. - Searching the in‑app help is now possible directly from the help screen toolbar.
More…
**Training & Education** - The Settings screen now shows your estimated lactate threshold heart rate, updated live as you change fitness level or max heart rate. - A new educational card (and help section) explains how to perform a 30‑minute time trial to measure your personal lactate threshold. This test, used by coaches and athletes worldwide, helps you train more precisely. **Under the hood** - Various small fixes to distance tracking and GPS behaviour ensure your recordings are accurate and consistent. - May 8, 2026 67## Recording (BLE + GPS) - Replaced the three‑button layout with a two‑button layout: Pause/Resume and Stop. - Stop shows a confirmation dialog (Save / Discard). Long‑press on Stop discards immediately. - Pause/Resume button toggles between outlined and filled style to clearly indicate the paused state. - Distance accumulation now only adds distance when smoothed speed ≥ 1 km/h and the GPS accuracy is within the user‑configured threshold. - Speed display shows 0.0 km/h when speed < 1 km/h. - Reordered GPS metrics: Speed, Altitude (48 sp), Distance, Time (24 sp). - HRV text now uses the theme‑aware secondary color (same as device name). - Speed and GPS status fields now require a long‑press to open their settings dialogs.
More…
- Default speed source for new installations is now "GPS chip". - The recording activity stays open after stopping or discarding a recording. - Added a `SettingsManager` method to persist the user‑configured GPS accuracy threshold; the threshold is passed to `GpsTracker` and used to filter low‑accuracy locations. ## Analysis chart - Draw every sample as a filled circle (radius 3.5 px) in addition to the connecting line, so curves remain visible at all zoom levels and while panning. - Replaced the fixed 20× zoom limit with a dynamic maximum scale based on total recording duration: `maxScale = totalDurationMs / 60_000`. This allows zooming in to approximately one minute of data for any recording length. - Time‑gap detection breaks the line when the interval between two samples exceeds 1.5 × the maximum recording interval. ## BLE connection & device naming - `createBond()` is now called on the main looper every time a BLE connection is established, ensuring encryption is reliably activated for secure‑mode sensors (e.g. Garmin HRM‑600). - The full device name is captured from the BLE advertisement scan record and saved permanently, so it is immediately available even after a data wipe. - Stale heart rate values are cleared when a device disconnects, preventing frozen readings in the UI. - The bond icon (🔐) is only shown when a device is actually connected, not just bonded. - Service discovery is delayed until the bond state reaches `BOND_BONDED`, triggered by the existing `BondStateReceiver`. - May 7, 2026 66## New: Session Analysis (Map + Chart) - Access via **Analyse Recordings** in the main menu, or long‑press the record button on the home screen. - Browse recorded sessions by device and date. - Route shown on OpenStreetMap with colour‑coded segments by heart rate zone (green / yellow / red). - Interactive chart with zoom, pan, cursor, and up to two metrics (HR, Speed, HRV, Altitude, Distance). - Toggle elapsed vs. wall‑clock time and show/hide a TRIMP summary card. ## Recording – Speed Smoothing & Source - Tap the speed value on the recording screen to switch between location‑based speed (calculated from GPS positions) and the built‑in GPS chip speed. - Adjust smoothing strength: Smooth, Balanced, Instant, or Off.
More…
- Full description added to the in‑app help. ## Improved Help Content - Detailed explanation of how heart rate data is received (BLE flags, 8/16‑bit values) and how 1‑minute RMSSD is computed from RR‑intervals, with scientific references. ## UI & Stability - Record button now turns red during recording; uses theme‑aware tint when idle. - Fixed potential `WindowLeaked` crash when dismissing the device spinner. - Sleep settings screen now shows real‑time validation feedback for the sleep window. ## CSV Changes - Exported CSV files now include an `rr_interval_ms` column. - The RMSSD column header is renamed to `rmssd_1min_ms`. - May 3, 2026 65## BLE Secure Connection (Bonding) Support Heart rate monitors like the Garmin HRM600 can operate in a *secure connection* mode (two green LED flashes) that requires BLE bonding (pairing) before streaming data. The app now supports both open and secure BLE connections out of the box. - **Automatic bonding** – Bonding is initiated on every connection using “Just Works” pairing (no PIN, no user interaction). Service discovery is delayed until the bond is confirmed. - **Robust reconnection** – On any disconnection (link loss, timeout, bond-related drops), the app keeps trying to reconnect as long as the recording is active, with a 5 s / 30 s backoff. - **Bond state icons** – A small icon appears next to the device name on the recording screen: 🔐 when bonded, ⏳ while bonding, and hidden when not bonded. - **Standard compliance** – Uses the Bluetooth LE Secure Connections standard; tested with a Garmin HRM600 (open and secure modes) and an Amazfit Helio Strap. - **Help & documentation** – The built-in help now includes chapters on BLE bonding, troubleshooting (clearing stale bonds), and recording file formats / HRV / speed smoothing.
More…
## Improved Logging Log messages in the recording pipeline (BLE, sample insertion, Health Connect writes, UI updates) now include the device name or short address, allowing filtering by device (e.g., "HRM 600"). ## Documentation Updates The help page has been extended with: - A new chapter “Recording – GPX, CSV, HRV & Speed Smoothing” explaining exported file formats, 1‑minute RMSSD calculation (with scientific references), and adaptive speed smoothing. - A new chapter “BLE Device Connection & Bonding” covering BLE basics, bonding, reconnection, and troubleshooting. - May 2, 2026 64**What's new** - **Interrupted recordings** If the app is force‑closed during a recording, you can now choose **Save** to keep the recorded data as GPX/CSV files, **Keep Data** to continue later, or **Discard**. Previously only Discard was available. - **Speed display** The speed shown during recording now adapts to the quality of the GPS signal. The app reads the speed accuracy provided by your device (since Android 8) and applies stronger smoothing when the signal is uncertain—for example when you’re indoors or surrounded by tall buildings. This keeps the displayed speed stable and readable even in poor conditions, while still reacting quickly once the signal improves. Older devices without speed‑accuracy info use position accuracy as a fallback, so everyone benefits from a cleaner speed trace. - **Battery & connections** The BLE scanner now stops when you switch to another app, saving battery. Returning to the activity will no longer disturb active heart‑rate streams. Device names are always shown correctly (e.g. “Garmin HRM600” instead of just “HRM600”).
More…
- **Recording reliability** All recorded samples are now written directly to storage, protecting your data even if the app crashes unexpectedly. - May 1, 2026 63fix: BLE device dialog always shows all discovered devices Previously, if a device had been selected in a prior recording session, its manufacturer info was stored. The discovery listener then filtered out any device for which that stored info already existed. This meant deselecting all devices made the dialog permanently empty – no device, known or unknown, would ever reappear. Now the discovery listener adds every discovered device to the
More…
list, without checking stored manufacturer data. Device names are enriched later via GATT reads, so no functionality is lost. - Apr 28, 2026 61## What's New – Live Heart Rate Recording You can now record your workouts directly in the app using your Bluetooth heart rate monitors. The new recording screen lets you: - **Connect to multiple heart rate sensors** at once and see live values in huge text – easy to read during training, even without glasses. - **Track GPS speed, distance, altitude, and elapsed time.** - **Start, pause, resume, or stop recordings** – the session continues in the background even if you leave the screen. - **Save your route and heart rate data** in standard GPX format, compatible with OSMand and other mapping apps. Heart rate values are displayed correctly in OSMand. - **Automatically write your heart rate data to Google Health Connect.** - **Customise how often heart rate data is recorded** and set a minimum GPS accuracy to keep your tracks clean.
More…
- **Pick up right where you left off** if the recording is interrupted. A new **record button** on the main screen quickly opens the recording activity and lights up in red when a recording is active. See the notification from your phone's notification bar to pause or stop recording at any time. All data stays on your device, as always. - Apr 24, 2026 60**What's New** - **Reliable calculations on large data sets** Resting heart rate (RHR) and heart rate variability (HRV) can now be processed for years of data without risking out-of-memory crashes. The app reads your raw measurements day‑by‑day and only keeps the final daily values in memory. - **Correct metrics after each sync** Training load metrics (EWMA, ACWR, rolling scores) are now always up‑to‑date, no matter how many incremental syncs you perform. After every Health Connect refresh, all derived values are recalculated from scratch – no more stale or incorrect numbers. - **Cleaner internal architecture** The calculation engine has been reorganised so that business logic remains in dedicated components. This makes the app easier to maintain and reduces the chance of regressions in future updates.
- Apr 23, 2026 59## What's New ### 1. Training scores stay consistent Changing the activity threshold for one load‑tracking method no longer affects the scores of your other methods. Each method now uses its own settings independently. ### 2. Faster sync Pull‑to‑refresh is now instant when Health Connect has no new data. The app no longer performs an unnecessary full recalculation, saving you seconds on every swipe. ### 3. Stable imports Importing large CSV files or backup databases no longer risks running out of memory, even with years of heart‑rate data. Records are now processed in small batches, keeping the app responsive.
More…
### 4. Smoother daily records Fixed a database error on rest days that could cause disruptions when storing your training metrics. EWMA trends now update correctly even on inactive days. ### 5. Clearer logs Timestamps in the app logs are now shown in a human‑readable format (your local date and time) alongside the technical numbers, making troubleshooting easier. Thank you for your feedback and bug reports! - Apr 20, 2026 58What's New in This Update - Fixed crashes when syncing large amounts of heart rate data from Health Connect. The app now processes data smoothly regardless of how many years of history you have. - Improved memory usage during calculations. If you wear your device 24/7 or have long training sessions with second-by-second recording, the app will no longer run out of memory. - Fixed an issue where "No heart rate data available" would sometimes appear incorrectly after a successful sync.
More…
- Sync progress is now more responsive and won't block other app functions. - Apr 19, 2026 57## What's New ### Fixed: Charts Now Show Your Recovery Data Immediately Previously, if you only had one day of Resting Heart Rate (RHR) or Heart Rate Variability (HRV) data, the charts would appear empty even though the data was there. This is now fixed - your recovery metrics will show up right away, even with just a single day of measurements. ### Fixed: Historical Sync No Longer Times Out Some users with large amounts of historical heart rate data experienced sync failures when first connecting to Health Connect. The app would sometimes give up too early if there was a pause between data pages. We've removed this artificial time limit - the sync will now patiently wait for all your historical data to load, no matter how long it takes. Your complete training history will import successfully.
More…
### Also in this update: - Improved logging to help diagnose any future sync issues - More consistent progress reporting during data import Thank you for using PAIesque! If you encounter any issues, please report them via the in-app bug reporter. - Apr 18, 2026 56Fixed: Stale Recovery Values After Settings Changes What Was Happening When you changed certain settings (like your sleep window or fitness level), the app would correctly mark your data for recalculation. However, old RHR and HRV values sometimes stuck around for days that no longer had enough valid heart rate readings. This meant you might see:
More…
- RHR values on the chart for days when you didn't wear your device - Resting heart rates that didn't match your current settings - Inconsistent data between what the logs showed and what appeared in exports What We Fixed The app now completely clears all calculated RHR, HRV, and TRIMP data whenever a full recalculation is triggered. This ensures: - Every recalculation starts from a clean slate - Days with insufficient data show as gaps (not ghost values) - Your charts always reflect your current settings - CSV exports match what you actually see in the app When This Matters - After changing your sleep window in Settings → Sleep Settings - After adjusting your fitness level or max heart rate - After importing a backup or deleting old heart rate data - Any time the app says "Recalculating..." - Apr 14, 2026 53Release Notes - PAIesque ## Chart Improvements - **Enhanced visibility of polarized zone achievement points:** Points for low, moderate, and high zones now use standard bar colors with a theme-aware background outline, making them clearly visible against the chart bars in both light and dark themes - **Unified point sizing:** All chart points (blue score line and colored zone achievements) now share identical dimensions for visual consistency - **Smart point positioning:** Zone achievement points are now slightly offset horizontally (low: left, moderate: center, high: right) to prevent overlapping when values coincide on the same day - **Stronger visual contrast:** Point outlines are now thicker (2.5px) and use the theme's surface color for maximum visibility regardless of theme ## Bug Fixes - **Fixed premature sync checkpoint updates:** Resolved an issue where Health Connect sync would incorrectly advance the sync checkpoint when receiving zero records initially, even though paginated data pages were still arriving moments later. The checkpoint now only advances after actual data has been received and stored, ensuring no data is silently skipped during incremental syncs
More…
- **Removed unnecessary lower bound filtering in RHR calculations:** Simplified resting heart rate calculation by removing an artificial lower bound filter that could incorrectly exclude valid low RHR values for fit individuals (e.g., elite athletes with RHR below 40 bpm). RHR filtering now properly uses only an upper bound and sleep window time range - Apr 11, 2026 52## Release Notes - Version 52 ### Breaking Change: Database Schema Updated The device identification system has been completely redesigned to prevent duplicate entries. The app now identifies devices by manufacturer and model rather than a constructed identifier string. An automatic migration runs on first launch, preserving all your existing data. No manual action is required. ### Fixed: Duplicate Devices in Device Selector (#30) Devices could appear multiple times with slightly different names (e.g., "Garmin Fenix 7 Pro" and "Garmin Fenix 7 Pro"). This occurred when different apps writing to Health Connect provided device metadata with inconsistent whitespace formatting.
More…
- Devices are now identified by normalized manufacturer and model - String normalization trims whitespace and collapses multiple spaces - The database now enforces uniqueness at the schema level ### Fixed: Health Connect Sync Reliability After CSV Import (#29) Several issues with Health Connect sync after importing CSV files have been resolved: - CSV import now resets the sync checkpoint, ensuring the next Health Connect sync performs a full sync rather than missing older data - Failed syncs no longer incorrectly update the sync checkpoint, allowing retries of missed time ranges - Device identifier format is now consistent between extraction and batch processing ### Improved: Diagnostic Logging for Health Connect Sync Added detailed logging to help diagnose missing data issues: - Pagination details (page count, records per page) - Time range of each heart rate record received - Gap detection (warns when gaps > 10 minutes are found) - Overall time range coverage This information helps identify whether missing data is due to Health Connect not returning records, pagination issues, or concurrent writes during sync. - Apr 10, 2026 51## Release Notes - Version 51 ### Bug Fixes **Fixed duplicate device entries in device selector (#30)** Devices could appear twice in the device list with slightly different names (e.g., "Garmin Fenix 7 Pro" and "Garmin Fenix 7 Pro"). This occurred when different apps writing to Health Connect (such as Gadgetbridge and Garmin Connect) provided device metadata with inconsistent whitespace formatting. The issue might have also be caused by an update of an app. - Fixed by normalizing manufacturer and model strings (trimming whitespace, collapsing multiple spaces) when creating device identifiers - Applied same normalization when searching for existing devices
More…
- This prevents future duplicates; existing duplicate entries remain but won't multiply ### Maintenance - Renamed screenshot files to resolve F-Droid metadata caching issue - Apr 9, 2026 50## Release Notes v50 ### Recovery Metrics Improvements This update focuses on improving the accuracy and transparency of Resting Heart Rate (RHR) and Heart Rate Variability (HRV) calculations. **Fixed: Inconsistent RHR values when switching Recovery Data Source** Previously, switching between "Same as training" and "Always all" data sources could produce different RHR results, even with only one device. This was caused by using stale or empty historical baselines during full recalculations. The app now uses a consistent, permissive baseline when recalculating from day one, ensuring stable and comparable results regardless of the selected mode.
More…
**Fixed: Misleading "No heart rate data" message** The app no longer incorrectly reports "No heart rate data available" when RHR or HRV calculations successfully process new data but TRIMP data is unchanged. **Enhanced: Detailed diagnostic logging for missing values** When RHR or HRV cannot be calculated for a specific day, the app now logs detailed information in the Log Viewer, including: - Sleep window used - Number of valid vs. total heart rate readings - Baseline filter range - Count of readings filtered out (with average values) This helps users understand why a value is missing—whether due to insufficient data, readings outside the expected range, or sleep window misalignment. --- ### Documentation Updates - Clarified sleep time window configuration - Expanded ACWR documentation with sport-specific research findings (rugby, Australian football, soccer) - Improved explanations of EWMA (Exponentially Weighted Moving Average) calculations - Apr 7, 2026 49# Release Notes ### Documentation Overhaul This release focuses on improving documentation for both users and developers, with major updates to the README and F-Droid store description. #### README Improvements - **Three-step logic introduction** - Clearly communicates the app's core workflow: TRIMP measurement → temporal analysis → recovery monitoring - **Scientific credibility enhanced** - Added participant numbers and study context to key research citations:
More…
- EWMA study: 59 elite Australian footballers over 2 seasons (AUC 0.71 vs 0.64) - ACWR injury risk: 53 elite rugby league players (ACWR ≥2.11 = 16.7% injury risk) - Sport-specific windows: 129,448 training loads across 13 professional rugby clubs - Polarized training: Recreational runner study (5% vs 3.6% 10km improvement) - PAI/HUNT Study: >1 million person-years, 26.2 years follow-up - **Technical correction** - Fixed LT-TRIMP formula in mermaid diagram (β coefficient 0.04-0.11 instead of b=1.92/1.67) #### F-Droid Store Description (fastlane) - Complete rewrite with three-step logic and unique selling proposition - Added paragraph distinguishing PAIesque from commercial fitness apps (Garmin, Whoop, Polar) - Scientific citations moved inline to each method/feature - Added Creative Use Cases section (coach analysis, research, archiving, athlete switching) - German translation of store description - Clarified LT-TRIMP uses β coefficient (0.04-0.11) ### Bug Fixes: - Fix TRIMP range log to avoid Double.MAX_VALUE when no data - Apr 4, 2026 48Improved Chart Labels The chart now shows clearer unit labels to help you understand what the numbers mean: - Heart Rate Variability (HRV) chart now shows "ms" (milliseconds) on the right side - Resting Heart Rate (RHR) chart now shows "bpm" (beats per minute) on the left side - Training time (bottom chart) now shows "min" for minutes or "h" for hours near the top of the axis - 7-day rolling time labels no longer show "h" on every tick - just a single "h" label at the top
- Mar 31, 2026 47## Release Notes - v1.0.0 (March 30, 2026) ### Performance Improvements **Incremental EWMA/ACWR Calculation** - Implemented true incremental calculation for EWMA and ACWR metrics using stored database state - Previously recalculated from scratch using all historical TRIMP data - Now only loads and processes new data since last calculation - Performance gain: 866 days -> 1 day of TRIMP data loaded for daily syncs - Includes fallback to full recalculation when state is unavailable
More…
### Bug Fixes **Settings Activities Now Trigger Immediate Chart Updates** - Fixed issue where method-specific settings changes (Banister, iTRIMP, LT-TRIMP, PAI, Polarized, ACWR) weren't triggering immediate recalculation - Users no longer need to wait for manual sync to see chart updates after changing settings - Added setResult(RESULT_OK) to save methods in all six settings activities **Code Quality** - Resolved warnings from static code analysis ### Technical Details - Modified TrainingMetricsCalculator.calculateEWMA_ACWR() to support incremental calculation with start date and initial state parameters - Added TrimpRepository.loadTrimpScoresFrom() for efficient data loading - Updated DataManager.calculateTrainingMetrics() with state-aware incremental logic - Separate state variables for training load EWMA (2-element) and rolling score EWMA (3-element) to prevent array index errors --- **Note:** This release focuses on improving calculation performance and fixing immediate feedback issues when modifying training metrics settings. - Mar 30, 2026 46### Faster syncing for long‑time users When you sync new heart rate data, the app now updates your charts much faster—especially if you’ve been tracking for months or years. Previously, every sync recalculated everything from scratch. Now, only the days that actually changed are processed. For example, syncing a single day’s new data now takes about 0.1 seconds instead of several seconds. You won’t notice any difference in your charts or numbers—they remain just as accurate. The only change is that syncing feels snappier, especially if you have a large history. _(Under the hood: EWMA, ACWR, and polarized scores now calculate incrementally, just like TRIMP scores already did.)_
More…
Fixes #25 - Mar 27, 2026 44Release Notes - v44 ## Improvements ### Incremental Calculation Detection The app now correctly detects when new heart rate data is available and only recalculates when necessary. This eliminates unnecessary full recalculations after every Health Connect sync, significantly reducing CPU usage and battery consumption. ### Global Settings UI - Converted "How Fitness Level Affects Calculations" and "Interpreting RHR and HRV Together" sections to expandable cards (collapsed by default) - Cleaned up section headers by removing decorative icons (📊, 🔬, ℹ️, ⓘ)
More…
- Applied consistent styling across all expandable sections - Added polarized zones explanation to the fitness section ### Database & Performance - Migrated calculation tracking from date-based to timestamp-based system - Table names consolidated and simplified - Automatic migration for existing databases preserves user data - Reduced recalculation time from ~4 seconds to ~1ms when no new data is present ## Technical Notes - All settings, sliders, and radio buttons remain unchanged - Existing user data is preserved through automatic database migration - Calculation tracking now properly separates TRIMP, RHR, and HRV processing - Mar 24, 2026 42# Release Notes — Versions 37–42 ## Health Connect Integration & Complete Rewrite (v37) PAIesque was completely rewritten to integrate with Google Health Connect, eliminating manual file imports. Heart rate data now syncs automatically after granting permissions. **New Capabilities:** - Multiple training load methods: Banister TRIMP, iTRIMP, LT-TRIMP, and PAI-esque calculations - Recovery metrics: Resting Heart Rate (RHR) and Heart Rate Variability (HRV) with EWMA trends - Advanced analytics: ACWR (Acute:Chronic Workload Ratio) and Polarized Training Score
More…
- Interactive charts with toggleable layers, custom date ranges, zoom, and SVG/PNG export - Individual settings screens for each TRIMP method with live preview charts *Requires Android device with Health Connect installed (included in GrapheneOS by default)* --- ## Documentation & Educational Content (v38–v42) The app's educational mission was significantly expanded across multiple releases: **Comprehensive Help System (v38)** - Complete help covering app philosophy (local-first, no tracking), scientific foundations of TRIMP methods, EWMA/ACWR, RHR/HRV, and polarized training - Transparency section explains why metrics like aerobic/anaerobic scores and EPOC are not included, with evidence from peer-reviewed research (Jung et al., 2021) - CSV documentation with export/import guides and device-first requirement - 20+ scientific references formatted consistently **Scientific Transparency (v42)** - Legend and global settings now explain how fitness level estimates iTRIMP b coefficient, LT-TRIMP parameters, and lactate values, clarifying these are heuristics based on published ranges - iTRIMP: expandable section explaining b coefficient physiological meaning (1.5-2.5 endurance, 3.5-4.0 power/sprint) - LT-TRIMP: "Why 0.5?" section explaining the mathematical continuity factor at lactate threshold - All parameter estimation includes source citations (Mader et al., 1976; Stagno et al., 2007; Gaesser & Poole, 1986; Cheng et al., 1992) - README rewritten with transparent science focus and Gadgetbridge context --- ## Technical Improvements (v38–v42) **EWMA Line Continuity (v41)** EWMA lines now display continuous decay during rest periods instead of breaking. The chart shows smooth transitions when no heart rate data is recorded, with gaps appearing only when EWMA decays to zero. **Performance & Stability (v38–v40)** - Charts load automatically after Health Connect sync - Settings changes now properly update charts - Smoother device switching and data loading - Fixed freezing with long date ranges - Faster Health Connect sync with no duplicates - EWMA rolling scores fixed in 7Day chart layer - ACWR background zones now correctly hide when PAI method is selected - Help page follows system theme - Performance tracking added - Calculation triggers smarter — only run when data changes, not when returning from non-destructive activities - Mar 15, 2026 37# Release Notes - PAIesque v37 **IMPORTANT: This is a complete rewrite of the app. You MUST uninstall any previous version before installing this update. Due to fundamental changes in how data is sourced and stored, in-app upgrades are not supported.** We are thrilled to announce a monumental update to PAIesque! This release represents a complete reimagining of the app, transforming it from a single-purpose PAI-inspired tracker into a comprehensive, science-based training load and recovery monitoring platform. ## Major New Features ### 1. Google Health Connect Integration The app has completely migrated from manual Gadgetbridge database imports to Google Health Connect, the modern Android standard for health data. This means:
More…
- No more manual file selection - simply grant permissions and your data syncs automatically - Support for both Heart Rate and Heart Rate Variability (HRV) data ### 2. Multiple Training Load Methods Choose from four scientifically-validated TRIMP (Training Impulse) models: - Banister TRIMP - The original exponential model with sex-specific coefficients [Banister, 1991] - iTRIMP - Individualized TRIMP with customizable b coefficient [Stagno et al., 2007] - LT-TRIMP - Lactate Threshold-based model with linear/exponential breakpoint [Cheng et al., 1992] - PAI-esque - Our PAI-inspired metric (now with clear disclosure that this is not the official algorithm) ### 3. Advanced Recovery Metrics - Resting Heart Rate (RHR) - Low-percentile calculation during your defined sleep window - Heart Rate Variability (HRV) - Daily RMSSD averages during sleep - EWMA trends for both RHR and HRV with configurable acute/chronic windows - Warning thresholds - RHR +5 bpm, HRV -10% from baseline ### 4. Training Load Analytics - EWMA ACWR (Acute:Chronic Workload Ratio) - Monitor injury risk with customizable windows (7:28 day default, adjustable 3-9 day acute / 14-35 day chronic) - Polarized Training Score - 0-100 score measuring how closely your training matches your intensity distribution targets - Zone target achievements - Track how well you're meeting your low/moderate/high zone goals ## Completely Redesigned Interface ### Interactive Chart System - Layer-based visualization - Toggle between TRIMP, 7-day rolling, ACWR/Polarized, RHR, and HRV layers - Custom date ranges - New dual-slider dialog for selecting any date range - Zoom controls - Zoom in/out for detailed analysis - Save charts - Export as SVG or PNG to your device ### Dynamic Educational Legend An expandable panel that: - Automatically generates explanations based on your active layers - Provides scientific citations and interpretation guidance - Includes clickable links to relevant settings pages - Explains what each chart element represents ### Comprehensive Settings Redesign Individual settings screens for each TRIMP method, plus: - Global Profile - Age, gender, fitness level, HRmax formulas (Shargal, Tanaka, HUNT, Fox) - ACWR Settings - Configure acute/chronic windows and coupling mode - Polarized Targets - Set your ideal intensity distribution (70/10/20 defaults) - Live preview charts - See your load curves change in real-time ## Database & Data Management - Expanded schema - Now stores all TRIMP scores, zone times, EWMA values, ACWR, polarized scores, and zone achievements - Unified timestamp tracking - Single table manages calculation checkpoints - Enhanced device metadata - Stores manufacturer, model, type, and package name from Health Connect - CSV Export/Import - Full data portability with CSV files for all tables - Backup & Restore - Complete database backup functionality ## Scientific Foundation Every feature now includes citations to peer-reviewed research: - Banister EWMA model [Banister, 1991; Morton et al., 1990] - iTRIMP validation in elite athletes [Stagno et al., 2007; Akubat et al., 2012] - Lactate threshold science [Mader et al., 1976; Gaesser and Poole, 1986] - Polarized training research [Seiler and Tønnessen, 2009; Stöggl and Sperlich, 2014] - ACWR and injury risk [Murray et al., 2017; Griffin et al., 2021] - HRV monitoring guidelines [Task Force, 1996; Plews et al., 2013; Buchheit, 2014] ## Technical Improvements - Complete migration to Android Health Connect API - New TrimpCalculator class with optimized O(1) cache lookups - Dynamic SVG chart generation with zoom and layer support - Robust EWMA calculations with proper decay for missing days - Unified timestamp repository for all calculation types - Kotlin helper classes for Health Connect integration ## Important Notes - This is a MAJOR update - First launch will require re-granting permissions and re-syncing data - PAI Disclosure - Our PAI implementation is NOT the official commercial algorithm; it uses EWMA and scaled TRIMP values - Gadgetbridge Support Removed - The app now exclusively uses Google Health Connect; existing Gadgetbridge users will need to migrate their data through Health Connect - HRV requires RMSSD data - Ensure your device supports HRV recording in Health Connect --- Download the update now and experience the future of training load monitoring! - Feb 15, 2026 36DEINSTALL existing version prior 35 before using this version! What's New - Bring back dialog to set measuring times to calculate RHR from. - Changed scaling factor of TRIMP calculation (iTRIMP) to better match PAI values of commercial products.
- Feb 14, 2026 35DEINSTALL existing version before using this version! What's New - BREAKING existing app versions: data is now read from Health Connect instead of Gadgetbridge.db - This version is work in progress. Still much to do: * Add more TRIMP calculations along with PAI-like * Help and documentation
- Dec 23, 2025 34What's New - Expanded device compatibility: Added support for generic/unrecognized fitness devices - Heart rate data from more wearables can now be synchronized (until they get official support by Gadgetbridge)