Skip to content

Releases: psjostrom/strimma

v1.3.1-rc.1

14 Jun 22:03
1dd128c

Choose a tag to compare

v1.3.1-rc.1 Pre-release
Pre-release

Test plan & verification: #237


What's Changed

  • Updated Android build dependencies: Kotlin 2.4.0, Compose BOM 2026.05.01, KSP 2.3.9, and AndroidX Core 1.19.0.
  • Raised compile SDK to Android 17 while keeping target SDK on Android 16.
  • Added a temporary Hilt metadata classpath workaround so Hilt 2.59.2 can process Kotlin 2.4 metadata.

No intended user-facing behavior changes.

v1.3.0

18 May 08:58
v1.3.0
02d92c4

Choose a tag to compare

Strimma v1.3.0

The headline features: Workout Mode (raises alert thresholds + the in-range band while you exercise), user-controlled data retention (replaces the silent 30-day prune), Story month-by-month navigation (browse any past month, not just last), pause-all alerts (one tap to pause Low + High together), and a configurable foreground-notification action button (workout toggle, snooze, or none).

Alongside the new features, a stack of reliability fixes targeting CGM edge cases (CamAPS Attempting handling, stale-notification rejection, notification.when timestamping) and process-startup robustness (airplane-mode boot, AlertManager init order, SyncOrchestrator off the Main dispatcher).

Workout Mode

A new mode that raises BG alert thresholds and the in-range band on graphs while you're exercising. Defaults: low 6.0, urgent low 5.0, high 14.0, urgent high 16.0 mmol/L (vs. standard 4.0 / 3.0 / 10.0 / 13.0).

The intent is to match how BG actually moves during a run, ride, or workout: sharper drops at the low end mean an earlier low alert gives you time to fuel before going hypo; transient highs from adrenaline / catecholamines at the top mean a wider tolerance avoids false high alerts during normal exercise stress.

  • All four alert categories (urgent low / low / high / urgent high) AND the in-range band on graphs (BG hero color, widget, web server) use the workout thresholds while on. Predict-low / predict-high also use them.
  • Stale-sensor alerts are suppressed for the first 30 minutes of a session — sensor contact loss when you start moving is not uncommon. After 30 min they re-arm even while workout mode stays on.
  • Historical analysis is unaffected. Story / Stats always use your standard thresholds — opening Stats during a workout doesn't corrupt last month's report.
  • Toggle from the runner icon at the top-right of the main screen, the Workout pill in the BG header, or a Start workout / End workout action button on the foreground notification.
  • Auto-activates while a calendar event in your workout calendar is currently happening; manual OFF during an active calendar event sticks until that event ends.
  • Auto-off safety net (1–12 h, default 3 h) for "I forgot to flip it off." Calendar-driven sessions have no timeout — they end when the event ends.
  • Configure under Settings → Exercise → Workout mode.

See Workout Mode docs for full details.

User-controlled data retention

  • New Settings → General → Storage → Data retention dropdown lets you choose how long Strimma keeps glucose, treatments, and exercise sessions on your device. Options: 3 months / 6 months / 1 year / 5 years / Forever (default).
  • Replaces the old hidden 30-day reading prune that was silently deleting the first ~10 days of each month at month-end (visible in the Story view).
  • Picking a shorter window asks for confirmation before deleting — Nightscout, your CGM app, and Health Connect are never touched.
  • Changes apply within minutes, not 24 hours.

Story month-by-month navigation

  • Tap the ← / → arrows in the top-right of the Story screen to browse any past month with enough data, not just last month.
  • Bounded by the earliest reading on your device on one end and the last completed month on the other; backfilling history from Nightscout (Settings → Sharing → Pull readings) unlocks earlier months automatically.
  • Arrows visibly grey out at the data boundaries (no silent no-op clicks).
  • The "Your April Story is ready" snackbar no longer re-fires after restart if you've already viewed April but tapped ← to browse March or earlier.
  • Monthly story card persists in Stats in a muted style after viewing, so the story can be revisited.

Pause All alerts

  • New All alerts row at the top of the pause sheet — one tap pauses Low and High together with the same five duration chips (30m / 1h / 1.5h / 2h / 3h).
  • When both categories share the same expiry, the BG header collapses to a single coral All alerts paused · X pill instead of two redundant pills.
  • The pause-alerts bell icon in the header dims the moment any pause expires, including unified pauses.

Configurable notification action button

The foreground notification's tap-target action used to be hardcoded to the workout toggle. Now configurable under Settings → Notifications → Action Button:

  • None — no button shown
  • Workout (default — preserves existing behaviour) — toggles workout mode on/off
  • Snooze — pauses alerts for a chosen category (All / High / Low) and duration (15m / 30m / 1h / 2h / 3h). Button label reflects the choice (e.g. "Snooze all 1h").

The notification rebuilds the moment you change the setting (no longer waits for the next CGM reading). When alerts are paused — via the in-app sheet or the new Snooze button — the foreground notification's subtitle shows e.g. "All alerts paused 47m" / "High alerts paused 2h" / "Low alerts paused 15m" so confirmation is in-context.

Reliability fixes

CGM ingestion correctness

  • Stale CGM notifications dropped at the parser layer. When CamAPS FX loses sensor connection it switches its persistent notification from "On" to "Attempting" and reposts the last known glucose value every minute. Strimma now drops these reposts at the parser. (Late fix: rc.5 narrowed this so genuine fresh BG that arrives during pump-only "Attempting" — pump Bluetooth off but sensor still delivering — is no longer wrongly rejected.)
  • Reading timestamps bind to notification.when instead of currentTimeMillis() at parse time. A notification rebind (settings change in the source app, OS reposting on theme switch) no longer re-stamps an old reading.

Foreground notification + widget freshness

  • "Xm" since-text advances every minute on both the foreground notification and the home-screen widget. Previously they could sit at "0m" indefinitely between readings — most visible during a CamAPS disconnect.
  • Workout-mode elapsed counter, IOB countdown, and alert-pause countdown all tick every minute on the foreground notification.

Process robustness

  • No more crash on boot in airplane mode.
  • AlertManager init order fixed (regression fix from the pause-all work).
  • SyncOrchestrator moved off Dispatchers.Main onto a dedicated IO scope — eliminates UI jank during background follower / Tidepool sync.

Push behaviour

  • Stale unpushed glucose readings can no longer block fresh BG from reaching Nightscout — newest data always pushes first.
  • Treatments and readings tables are now indexed (createdAt, pushed) so reads stay fast as history grows.
  • Treatment manual-pull options updated to 30 / 90 / 365 days (was 30 / 60 / 90).

Under the hood

  • Room schema 4 → 5 with auto-migration (existing data is preserved).
  • Retention loop survives transient DataStore errors and reacts immediately to setting changes.
  • Story screen survives process death — you land on the same month after Android kills the app.
  • Settings backup now round-trips the notification action button config (action type, snooze category, snooze duration).
  • Dependency updates (Compose BOM, Kotlin, AGP, KSP, Ktor, Navigation minor/patch bumps; gradle-wrapper).

Requirements

  • Android 13+ (API 33)
  • A glucose data source (CGM app, LibreLinkUp, or Nightscout server)

v1.3.0-rc.5

14 May 15:57
v1.3.0-rc.5
a5cfcb0

Choose a tag to compare

v1.3.0-rc.5 Pre-release
Pre-release

Test plan & verification: #232


Fixed

  • Live BG no longer disappears when CamAPS FX shows "Attempting" mode. The previous build wrongly rejected every CamAPS notification carrying the "Attempting" status word, blanking out Strimma during routine pump connection issues even though the sensor was still delivering. Verified against the CamAPS FX user manual: numeric value displayed = current sensor reading; "---" = no current data (already handled by the parser).

v1.3.0-rc.4

12 May 10:38
v1.3.0-rc.4
ba3c18f

Choose a tag to compare

v1.3.0-rc.4 Pre-release
Pre-release

Test plan & verification: #229


What's new since rc.3

Story screen fixes

  • The "Your April Story is ready" snackbar no longer re-fires after restart when you've already viewed April but tapped ← to browse March or earlier. The viewed-month marker now monotonically advances and is enforced atomically in the storage layer (no future caller can downgrade it accidentally).
  • The ← / → arrows on the Story screen now visibly grey out at the data boundaries, instead of looking enabled while clicks were silently no-ops.
  • The back button uses the same control-color pattern for consistency.

v1.3.0-rc.3

12 May 09:27
v1.3.0-rc.3
7490c5d

Choose a tag to compare

v1.3.0-rc.3 Pre-release
Pre-release

Test plan & verification: #227


What's new

Data retention is now user-controlled

  • New Settings > General > Storage > Data retention dropdown lets you choose how long Strimma keeps glucose, treatments, and exercise sessions on your device. Options: 3 months / 6 months / 1 year / 5 years / Forever (default).
  • Replaces the old hidden 30-day reading prune that was silently deleting the first ~10 days of each month at month-end (visible in the Story view).
  • Picking a shorter window asks for confirmation before deleting — Nightscout, your CGM app, and Health Connect are never touched.
  • Changes apply within minutes, not 24 hours.

Story view: scroll through every past month

  • Tap the ← / → arrows in the top-right of the Story screen to browse any past month with enough data, not just last month.
  • Bounded by the earliest reading on your device on one end and the last completed month on the other; backfilling history from Nightscout (Settings > Sharing > Pull readings) unlocks earlier months automatically.

Reliability & performance

  • Stale unpushed glucose readings can no longer block fresh BG from reaching Nightscout — newest data always pushes first.
  • Treatments and readings tables are now indexed (createdAt, pushed) so reads stay fast as history grows.
  • Treatment manual-pull options updated to 30 / 90 / 365 days (was 30 / 60 / 90).

Under the hood

  • Room schema 4 → 5 with auto-migration (existing data is preserved).
  • Retention loop survives transient DataStore errors and reacts immediately to setting changes.
  • Story screen survives process death — you land on the same month after Android kills the app.

v1.3.0-rc.2

11 May 14:12
v1.3.0-rc.2
bcd9341

Choose a tag to compare

v1.3.0-rc.2 Pre-release
Pre-release

v1.3.0-rc.2 — second release candidate for v1.3.0

Six reliability fixes since rc.1, all targeting CGM edge-case behavior and process-startup robustness.

What's new in rc.2 (since rc.1)

CGM ingestion correctness

  • Stale CGM notifications dropped at the parser layer (#222) — when CamAPS FX loses sensor connection it switches its persistent notification from "On" to "Attempting" and keeps reposting the last known glucose value every minute. Strimma was ingesting these as fresh readings, suppressing the No Data alert and corrupting the graph until the sensor reconnected. A per-package, status-keyword filter in GlucoseParser now rejects the notification before any value extraction. Currently configured for the five CamDiab variants; the map is structured so adding new packages or status words is a one-line change once we capture logs from another app.
  • Reading timestamps bind to notification.when (#219) — reading timestamps now use the source app's notification.when field instead of currentTimeMillis() at parse time. A notification rebind (settings change in the source app, OS reposting on theme switch) no longer re-stamps an old reading with the wrong "now".

Foreground notification + widget freshness

  • "Xm" since-text advances every minute on both surfaces (#223) — the foreground notification's "Xm" since-text + IOB countdown + alert-pause countdown + workout-mode "0:42" elapsed, AND the home-screen widget's "Xm" / "now" freshness label, now refresh on every 60s tick. The previous gate (refresh only on stale-state transitions or workout-mode changes) left both surfaces showing "0m" continuously between readings — most visible during the CamAPS disconnect that #222 fixes.

Process robustness

  • No more crash on boot in airplane mode (#218) — Strimma now starts cleanly when the device boots with no network.
  • AlertManager init order fixed (#221) — expiryClearJobs is now declared before pauseExpiryFlows so Kotlin field-init order produces no NPE on first construction (regression from #211).
  • SyncOrchestrator off Dispatchers.Main (#220) — moved to a dedicated IO scope. Eliminates UI jank during background follower / Tidepool sync.

v1.3.0 scope summary (everything since v1.2.0)

Workout mode (#213)

A new mode that raises BG alert thresholds and the in-range band on graphs while you're exercising. Defaults: low 6.0, urgent low 5.0, high 14.0, urgent high 16.0 mmol/L (vs. standard 4.0 / 3.0 / 10.0 / 13.0). All four alert categories AND the in-range band on graphs (BG hero color, widget, web server) use the workout thresholds while on. Predict-low / predict-high also use them, so fewer false alarms during the rapid swings of exercise. Stale-sensor alerts suppressed for the first 30 minutes; after 30 min they re-arm even while workout mode stays on. Historical analysis (Story / Stats) always uses standard thresholds, never workout thresholds. Toggle from the runner icon at the top-right of the main screen, the Workout pill in the BG header, or a Start workout / End workout action button on the foreground notification. Auto-activates while a workout-calendar event is happening; manual OFF during an event sticks until event end. Auto-off safety net (1–12 h, default 3 h) for "I forgot to flip it off." Calendar-driven sessions have no timeout. Configure under Settings → Exercise → Workout mode. See Workout Mode docs.

Pause-all alerts (#211, #212)

  • New All alerts row at the top of the pause sheet — one tap pauses Low and High together with the same five duration chips (30m / 1h / 1.5h / 2h / 3h).
  • When both categories share the same expiry, the BG header collapses to a single coral All alerts paused · X pill instead of two redundant pills.
  • The pause-alerts bell icon in the header now dims the moment any pause expires, including unified pauses (previously it stayed cyan after expiry, and never lit at all for unified pauses).

Configurable notification action button (#216)

The foreground notification's tap-target action used to be hardcoded to the workout toggle. Now configurable under Settings → Notifications → Action Button:

  • None — no button shown
  • Workout (default — preserves existing behaviour) — toggles workout mode on/off
  • Snooze — pauses alerts for a chosen category (All / High / Low) and duration (15m / 30m / 1h / 2h / 3h). Button label reflects the choice (e.g. "Snooze all 1h"); tapping pauses via the same mechanism as the in-app pause sheet.

The notification rebuilds the moment you change the setting (no longer waits for the next CGM reading). When alerts are paused — via the in-app sheet OR the new Snooze button — the foreground notification's subtitle shows e.g. "All alerts paused 47m" / "High alerts paused 2h" / "Low alerts paused 15m" so confirmation is in-context, not just the in-app pill.

Other improvements

  • Monthly story stays accessible after viewing. The Stats card no longer vanishes once you open last month's story — it persists in a muted style so the story can be revisited.
  • Settings backup now round-trips the notification action button config. Previously the action type, snooze category, and snooze duration were silently dropped on import.

Toolchain

  • Dependency updates (Compose BOM, Kotlin, AGP, KSP, Ktor, Navigation minor/patch bumps).

Testing plan

Install rc.2 over rc.1 (or v1.2.0). Walk through each section. Each ✅ should pass before tagging v1.3.0 final.

Process robustness (rc.2)

  • Airplane-mode boot — toggle airplane mode ON, force-stop Strimma, reboot the device with airplane mode still ON. Strimma starts its foreground notification without crashing. Toggle airplane mode OFF; follower / pusher resumes.
  • AlertManager init — kill the process (Settings → Apps → Strimma → Force stop) then re-open. No crash, foreground notification appears, pause state restored.
  • SyncOrchestrator no UI jank — trigger a manual sync (Settings → Sharing → Tidepool / Nightscout follower → Sync now) while scrolling the main screen and Stats. Scrolling remains smooth, no dropped frames.

CGM ingestion correctness (rc.2)

  • CamAPS Attempting filter — at the next CamAPS sensor disconnect (or simulate by briefly removing the sensor), confirm Strimma stops storing readings the moment the CamAPS notification status switches to "Attempting" / "---". The graph stops accumulating points; the foreground "Xm" begins counting up; the No Data alert fires at the 10-min mark.
  • Other CGM apps unaffected — confirm Dexcom / Libre / Juggluco / xDrip+ readings continue to land. The filter is per-package and currently only configured for CamDiab variants.
  • notification.when correctness — change a setting inside the CGM source app (e.g. CamAPS theme toggle) that triggers a notification rebind. The reading timestamp in Strimma should NOT shift to the rebind moment; it remains the original reading time.

Foreground notification + widget freshness (rc.2)

  • Notification "Xm" advances every minute — note the value in the foreground notification, wait 1 minute without a new reading, confirm "Xm" incremented by 1. Across 5 minutes: 1m → 2m → 3m → 4m → 5m.
  • Widget "Xm" advances every minute — add the home-screen widget if not already present. Note the value, wait 1 minute, confirm increment.
  • Workout-mode elapsed counter advances — start workout mode manually, confirm the notification shows Workout 0:010:020:03 each minute even with no new readings.
  • Alert-paused countdown advances — pause All alerts for 30m, confirm the notification subtitle All alerts paused 30m decrements each minute.
  • IOB countdown advances — log a bolus via Scout, confirm the foreground "IOB 1.2" / "IOB 0.9" decreases each minute as the IOB curve decays.

Workout mode (rc.1)

  • Threshold switch — with workout mode OFF, confirm low alert at 4.0, high alert at 10.0. Toggle workout mode ON, confirm low alert moves to 6.0, high alert to 14.0. Graph in-range band visually shifts to the wider workout band.
  • Toggle entry points — verify all three entry points work: runner icon (top-right of main screen), Workout pill in BG header, Start workout / End workout action on the notification.
  • Calendar auto-activate — create a calendar event in the configured workout calendar starting in 1 minute. After event start, workout mode auto-activates. Manually toggling OFF during the event sticks until event end.
  • Stale-sensor suppression first 30 min — enable workout mode, then simulate a sensor disconnect (or remove the source app's notification access for >10 min). Stale alert should NOT fire in the first 30 min of the workout. After 30 min, stale alert re-arms.
  • Auto-off — set auto-off to 1 hour, enable workout mode, wait 1 hour (no calendar event active). Workout mode auto-disables.
  • Calendar exempt from auto-off — start a 4h calendar event, workout mode auto-activates. After 1h (default auto-off), workout mode stays ON because a calendar event is driving it. Workout mode ends at event end.
  • Stats untouched by workout mode — open Stats while workout mode is ON. TIR, Story, Meals all use standard thresholds (10.0 high, 4.0 low), not workout thresholds.
  • Widget reflects workout band — confirm the widget's color-coded BG hero (when enabled) uses workout thresholds while ON; reverts to standard while OFF.

Pause-all alerts (rc.1)

  • One tap pauses both categories — open the pause sheet, tap All alerts → 1h. Both Low and High show paused for 1h. Header pill shows single coral "All alerts paused · 1h".
  • Single pill collapse — pause Low and High separately to the same expiry. Header collapses to one pill.
  • [...
Read more

v1.3.0-rc.1

10 May 10:26
v1.3.0-rc.1
58c2a32

Choose a tag to compare

v1.3.0-rc.1 Pre-release
Pre-release

v1.3.0-rc.1 — first release candidate for v1.3.0

Workout mode

A new mode that raises BG alert thresholds and the in-range band on graphs while you're exercising. Defaults: low 6.0, urgent low 5.0, high 14.0, urgent high 16.0 mmol/L (vs. standard 4.0 / 3.0 / 10.0 / 13.0).

The intent is to match how BG actually moves during a run, ride, or workout: sharper drops at the low end mean an earlier low alert gives you time to fuel before going hypo; transient highs from adrenaline / catecholamines at the top mean a wider tolerance avoids false high alerts during normal exercise stress.

  • All four alert categories (urgent low / low / high / urgent high) AND the in-range band on graphs (BG hero color, widget, web server) use the workout thresholds while on. Predict-low / predict-high also use them, so fewer false alarms during the rapid swings of exercise.
  • Stale-sensor alerts are suppressed for the first 30 minutes of a session — sensor contact loss when you start moving is expected. After 30 min they re-arm even while workout mode stays on, so a sensor that died mid-marathon still alerts you.
  • Historical analysis is unaffected. Story / Stats always use your standard thresholds, never workout thresholds — opening Stats during a workout doesn't corrupt last month's report.
  • Toggle from the new runner icon at the top-right of the main screen, the Workout pill in the BG header, or a Start workout / End workout action button on the foreground notification.
  • Auto-activates while a calendar event in your workout calendar is currently happening; manual OFF during an active calendar event sticks until that event ends.
  • Auto-off safety net (1–12 h, default 3 h) for "I forgot to flip it off." Bump it before long events (marathons, ultras, all-day rides). Calendar-driven sessions have no timeout — they end when the event ends.
  • Configure under Settings → Exercise → Workout mode (4 threshold inputs + auto-off slider + reset to defaults).

See Workout Mode docs for full details.

Pause All Alerts

  • New All alerts row at the top of the pause sheet — one tap pauses Low and High together with the same five duration chips (30m / 1h / 1.5h / 2h / 3h).
  • When both categories share the same expiry, the BG header collapses to a single coral All alerts paused · X pill instead of two redundant pills.
  • The pause-alerts bell icon in the header now dims the moment any pause expires, including unified pauses (previously it stayed cyan after expiry, and never lit at all for unified pauses).

Configurable notification action button

The foreground notification's tap-target action used to be hardcoded to the workout toggle. Now configurable under Settings → Notifications → Action Button:

  • None — no button shown
  • Workout (default — preserves existing behaviour) — toggles workout mode on/off
  • Snooze — pauses alerts for a chosen category (All / High / Low) and duration (15m / 30m / 1h / 2h / 3h). The button label reflects the choice (e.g. "Snooze all 1h"). Tapping the button applies the pause via the same mechanism as the in-app pause sheet.

The notification rebuilds the moment you change the setting (no longer waits for the next CGM reading). When alerts are paused — via the in-app sheet or the new Snooze button — the foreground notification's subtitle now shows e.g. "All alerts paused 47m" / "High alerts paused 2h" / "Low alerts paused 15m" so you have an in-context confirmation, not just the in-app pill.

Other improvements

  • Monthly story stays accessible after viewing. The Stats card no longer vanishes once you open last month's story — it persists in a muted style so the story can be revisited.
  • Settings backup now round-trips the notification action button config. Previously the action type, snooze category, and snooze duration were silently dropped on import.

Toolchain

  • Dependency updates (Compose BOM, Kotlin, AGP, KSP, Ktor, Navigation minor/patch bumps).

v1.2.0

02 May 18:45
v1.2.0
2559266

Choose a tag to compare

Highlights

  • Eversense notification spam fixed. CGM apps that re-fire the same foreground-service notification multiple times per minute (Eversense in particular) no longer create duplicate readings, duplicate Nightscout pushes, or duplicate alerts. Readings are now bucketed by the source's actual sample period — sensor-bound apps (Dexcom, Libre 3, Eversense, Medtronic, Aidex, Diabox) get their real periods; sensor-agnostic middleware (CamAPS FX, Juggluco, xDrip+, AAPS) defaults to 1 min.
  • Update Available dialog renders markdown. Release notes shown in the in-app update dialog now render headings, lists, code blocks, links, bold/italic, blockquotes, and horizontal rules properly — no more raw ##, **, or [text](url) characters leaking through.

Reliability fixes

Nightscout follower

  • Backfill no longer stops early on filtered-empty pages. A full Nightscout page that filtered to zero valid SGV entries (duplicates, out-of-range) was being treated as end-of-data, silently dropping later valid readings. Pagination now terminates only when Nightscout returns a short raw page.
  • Treatment fetch failures are no longer masked. HTTP 5xx, parse errors, and IO failures on the treatments endpoint now propagate as real errors instead of returning an empty list. 404 (server doesn't expose treatments) is still treated as "no treatments" without throwing.

Nightscout history import

  • One-year imports are seconds, not minutes. Restored fast batched inserts in the manual history puller. Per-entry direction/delta recomputation remains in the follower, where it's capped to 7-day backfills.

Tidepool

  • Rate limiting now applies to failures. Failed upload attempts (HTTP 500, network errors) used to be retried immediately, ignoring the 20-minute throttle. The throttle is now stamped before the network call, and concurrent retry triggers are serialized so they can't stampede.
  • Tidepool now uploads from follower modes. Nightscout-follower and LibreLinkUp readings were silently being skipped by the Tidepool uploader. Both follower paths now correctly trigger uploads.

Dependencies

Compose BOM, Kotlin, AGP, KSP, Ktor, and Navigation bumped to current minor/patch versions.

Internal

  • Release workflow extracts notes from the merged release PR body (this fenced markdown block) instead of auto-generating from PR titles.
  • Documentation refreshed: Nightscout follower, settings, API reference, troubleshooting, and the Statistics screenshot.

v1.2.0-rc.3

29 Apr 14:42
v1.2.0-rc.3
59b8196

Choose a tag to compare

v1.2.0-rc.3 Pre-release
Pre-release

What's Changed

  • fix(ingestion): bucket CGM notifications by source sample period (#192) by @psjostrom in #206
  • chore(release): bump versionName to 1.2.0-rc.3 by @psjostrom in #207

Full Changelog: v1.2.0-rc.2...v1.2.0-rc.3

v1.2.0-rc.2

27 Apr 13:01
v1.2.0-rc.2
c197e0c

Choose a tag to compare

v1.2.0-rc.2 Pre-release
Pre-release

v1.2.0-rc.2 — second release candidate for v1.2.0

Bug fixes

  • Update Available dialog now renders release notes as formatted markdown — headings, bullets, bold, italic, inline code, code blocks, links, strikethrough — instead of showing raw markdown characters.

Includes everything from v1.2.0-rc.1

  • Nightscout follower no longer stops backfilling when a page contains only invalid entries (e.g. all calibrations or duplicates). Backfill now continues until the server returns a short page.
  • Manual Nightscout history pulls are fast again. One year of history imports in ~10–20 seconds instead of 5–10 minutes; server-provided direction and delta are preserved on the manual path.
  • Tidepool uploads correctly throttle after a real failure and serialize concurrent Force Upload Now taps. A cancelled force upload (e.g. you rotate the screen) no longer blocks the next background attempt.
  • Treatment sync errors are no longer silently masked — a real Nightscout treatments failure now surfaces in the sync status and debug log. Servers that do not expose /api/v1/treatments.json (HTTP 404) are still treated as "treatments not supported".
  • Bumped Android Gradle Plugin to 9.2, Kotlin to 2.3.21, and Compose BOM to 2026.04 (with related minor/patch bumps).
  • Locale reads inside composables now go through LocalConfiguration so screen content recomposes when the system locale changes.