Skip to content

Trio v0.8.0

Choose a tag to compare

@dnzxy dnzxy released this 24 May 22:28
· 72 commits to main since this release
c8a3f08

Trio 0.8.0 trio

This release brings a set of new features, safety improvements, integration upgrades, and bug fixes.

Important

Upgrading from 0.7.0? No onboarding wizard or settings reset is required. Your existing configuration, data, and connections carry over automatically. On first launch you'll see a one-time sheet to set your telemetry preference.

Upgrading from 0.2.x? Please read the 0.7.0 upgrade notes first — those still apply.


What's Changed At A Glance

  • Anonymous opt-out Telemetry: helps the team understand how Trio is used, backed by Apple App Attest
  • Therapy settings upload to Tidepool: Trio now pushes basal, CR, ISF, and target settings into Tidepool alongside treatment data
  • Delete glucose from Nightscout: glucose entries deleted in Trio now propagate to Nightscout
  • Override confirmation dialogs: optional confirmation step before activating an override or temporary target
  • Bolus progress in Treatments view: see the active bolus and cancel it without leaving the Treatments screen
  • Context menus on all swipeable history list items (long-press alternative to swipe)
  • Settings Search scroll-to and highlight: tapping a search result now scrolls to and briefly highlights the matched row
  • Bolus safety checks unified: Shortcut-driven boluses now get the same max-bolus, max-IOB, and recent-bolus validation as APNS remote boluses
  • Nightscout site change events corrected: fixed false positives for Medtronic, added a proper SiteChange event for Trio History
  • Glucose smoothing window fix: smoothing now correctly uses the newest 350 readings, not the oldest
  • Submodule updates: OmniBLE (pod keep-alive now part of main), DanaKit, MedtrumKit, CGMBLEKit

New Features

Anonymous Telemetry (#1149)

Trio now sends an opt-out anonymous usage check-in to help the development team understand how the app is being used in the real world. No glucose, insulin, carb, or personal health data is ever transmitted — only coarse usage signals (e.g. which integrations are enabled, pump type).

Diagnostics consent now has three levels, configurable during Onboarding and in Settings → App Diagnostics:

Level What's shared
Full Sharing (default) Crash reports + anonymous usage telemetry
Crash Reports Only Crash reports only (previous behaviour)
Disabled Nothing

Existing users see a one-time migration sheet on first launch after updating. The telemetry client uses Apple App Attest (Secure Enclave-backed) to authenticate each check-in — no bearer tokens or accounts are involved. The backend runs on an EU-based provider. The Privacy Policy has been updated accordingly.


Therapy Settings Upload to Tidepool (#975)

Trio now uploads therapy settings to Tidepool alongside treatment data. This means your basal rate schedule, carb ratios, insulin sensitivity factors, and glucose targets are visible in Tidepool alongside your CGM and insulin data — giving clinicians and users a full picture in one place. Trio is now also officially recognizes as "Trio" on Tidepool Web. Thanks to our friends at Tidepool for collaborating on this.


Refactoring of Glucose Deletion from Nightscout (#980)

Glucose entries deleted in Trio's history view are now also deleted from Nightscout. Trio no longer pushes its internal _id to Nightscout (instead decoding it as a legacy reference), and the enteredBy field now correctly distinguishes locally-entered records from remotely-entered ones. Manual glucose upload handling was also corrected as part of this work.


Optional Override Confirmation Dialogs (#1111)

Overrides and temporary targets can now optionally require a confirmation step before activating. A new setting controls whether the confirmation dialog appears, Settings → Features → User Interface → Require Adjustments Confirmation.


Bolus Progress in Treatments View (#1130)

The Treatments screen now shows a live bolus progress card when a bolus is active — identical to the one on the Home screen. It displays remaining units, elapsed percentage, and an inline cancel button, so users can monitor or cancel a bolus without navigating back to the Home view when entering an insulin treatment while an SMB or long-lasting bolus is already active.

Closes #1003.


Context Menus for History List Items (#1120)

All swipeable rows in the history views (carbs, insulin, glucose) now also expose a long-press context menu. This gives an alternative to the swipe gesture — useful on small screens or for users who find swipe-to-delete too easy to trigger accidentally.


Settings Search: Scroll-to and Highlight (#1165 via #1051, #1094, #1096)

Settings search now does more than navigate to the right screen — it scrolls directly to the matched row and briefly highlights it.


History Module Refactor (#1127)

The History module has been refactored: its source files have been split for clarity, and confirmation dialogs are now used consistently across all delete and edit actions within the history views. This brings the history UI in line with the confirmation patterns introduced elsewhere in the app.


Safety

Unified Bolus Safety Checks for Shortcuts and Remote Commands (#1108)

A new shared BolusSafetyValidator centralises the safety checks that were previously only fully applied to remote (APNS / LoopFollow) boluses. Shortcut-driven boluses now receive the same complete set of checks:

  • Maximum bolus limit
  • Maximum IOB limit
  • 20% recent-bolus threshold (6-minute rolling window for Shortcuts; timestamp-anchored for APNS)

Remote bolus behaviour is unchanged — the checks are identical, just extracted into a single shared service so both paths stay in sync.

Closes #531.


Pump & Device

Fix Nightscout Site Change Events (#682)

Corrects when Trio uploads a Site Change event to Nightscout:

  • MiniMed: Previously, any prime (filling tubing or cannula) triggered a site change upload, which meant changing your reservoir reset both CAGE and IAGE for Nightscout. Now, only fixed-primes (cannula fills) will reset CAGE, so you can track cannula and insulin (reservoir) age separately in Nightscout. Steel cannula users who don't require a fixed prime when changing their cannula can prime a small amount into the air before inserting, or log the site change manually on Nightscout.
  • Medtrum: CAGE is now reset on Nightscout when a new patch is inserted.
  • All pumps: A site change event is now entered in Trio History when the cannula has been changed.

Addresses #677.

Submodule Sync: OmniBLE, DanaKit, MedtrumKit (#1113)

Submodule Sync: CGMBLEKit, DanaKit, OmniBLE, MedtrumKit (#1136)

A second submodule sync round updating CGMBLEKit, DanaKit, OmniBLE, and MedtrumKit to their latest upstream SHAs.


Algorithm & Data

Glucose Smoothing: Fix Window Direction (#1118)

The glucose fetch for the smoothing algorithm was using ascending: true with a fetchLimit: 350, which caused Core Data to return the oldest 350 readings rather than the newest. In normal use (≤288 readings/day) this didn't matter, but it produced stale smoothed values when more readings were present — for example, after backfilling from Nightscout or when running 1-minute CGM intervals. The fetch order is now corrected. Regression tests were added to guard this behaviour going forward.

Fix Glucose Date Encoding in Algorithm (#1124)

AlgorithmGlucose was encoding the reading timestamp as a String rather than an Int. This could cause silent parsing failures when the algorithm processed glucose data. The type is now correct.

Fix Temp Target enteredBy (#1050)

Temporary targets created via remote commands were not correctly tagged with their remote origin, causing them to appear as locally-entered in Nightscout and in Trio's history.

Closes #635.


Bug Fixes

Fix Basal Rounding for Fine-Grained Pumps (#1161)

Pumps that support basal steps smaller than 0.025 U/hr (e.g. certain Dana models) were displaying unexpected floating-point values in the basal rate settings view. Values are now correctly rounded to the pump's supported step size.

Closes #899.

Fix Empty Help Sheet on First Cold Tap (#1132)

Two help (i) buttons rendered a blank sheet on the first tap after a cold launch:

  • Algorithm → Dynamic Settings — section header info button
  • Nightscout — info button next to "Backfill Glucose"

Subsequent taps worked correctly. Root cause was a SwiftUI .sheet capturing its content before @State writes were observed. Fixed by switching to a .sheet(item:) binding with a stable identity.

Fix Help Buttons on Dynamic Settings Page (#1158)

The info/help buttons on the Dynamic ISF settings page were non-functional. They now correctly open their guidance sheets.

Fix Dynamic ISF Help Sheet Title (#1117)

Corrected a typo in the Dynamic ISF help sheet title.

Fix Apple Health Integration Flag for Telemetry (#1164)

The Apple Health enabled/disabled flag in the telemetry check-in was computed incorrectly. It now checks for the appropriate HealthKit sample type permission rather than a general authorization state.

Fix Delete Button Role in History Swipe Actions (#1123)

Using .role(.destructive) on the swipe-to-delete button caused SwiftUI to animate the row away immediately, taking the confirmation alert with it before the user could confirm. The role is now .none, consistent with the insulin and glucose swipe actions.

Fixes #1121.


Translations

Translation Updates (#1155)

Crowdin translation updates across all supported languages.


Chore / CI

Update Fastlane to 2.233.1 (#1133)

Bumps Fastlane to 2.233.1.


Upgrade Notes

From 0.7.0 (main)

  • No onboarding wizard required, no settings reset
  • On first launch you will see a one-time sheet to set your telemetry preference (defaults to Full Sharing — opt out in Settings → App Diagnostics if preferred)
  • No other breaking changes

From 0.6.0.x (dev)

  • You're already running this code — no action needed beyond switching to main

Contributors

Code

@dnzxy, @bastiaanv, @bjorkert,@marionbarker, @kingst, @MikePlante1, @mountrcg, @AndreasStokholm, @t1dude
Special thanks to first-time contributors @gordolio, @blalezarian, and @ryceg

Plus contributors to OmniBLE, DanaKit, MedtrumKit, and CGMBLEKit — see submodule PRs for full credit.


Full List of PRs Since 0.7.0

PR Title Author
#682 Fix Nightscout site change events (Medtronic + Omnipod) @MikePlante1
#975 Add therapy settings upload to Tidepool @blalezarian
#980 Fix: Delete glucose entries in Nightscout API @ryceg
#1050 Fix enteredBy handling: remote vs. local behavior @dnzxy
#1051 Add scroll-to and highlight for settings search (core) @gordolio
#1094 Add settingsHighlightScroll modifier to all settings sub-screens @gordolio
#1096 Add scroll targets and fix search index labels @gordolio
#1108 Shared BolusSafetyValidator for APNS and Shortcut boluses @bjorkert
#1111 Add optional override/adjustment confirmation dialogs @dnzxy
#1113 Sync submodules: OmniBLE, DanaKit, MedtrumKit @dnzxy
#1117 Fix typo in Dynamic ISF help sheet title @dnzxy
#1118 Smoothing: fix fetch to use newest 350 values @mountrcg
#1120 Add context menus for swipeable history list items @dnzxy
#1123 Fix delete button role in history swipe actions @MikePlante1
#1124 Fix glucose date encoding: use Int not String in AlgorithmGlucose @kingst
#1127 Refactor History module: split files; add confirmation dialogs @dnzxy
#1130 Show in-progress bolus on Treatments screen @dnzxy
#1132 Fix empty help sheet on first cold tap @bjorkert
#1133 Update Fastlane to 2.233.1 @bjorkert
#1136 Sync submodules: CGMBLEKit, DanaKit, OmniBLE, MedtrumKit @dnzxy
#1149 Add Anonymous Telemetry @dnzxy
#1155 Translation updates from Crowdin @t1dude
#1158 Fix help buttons on Dynamic Settings page @bjorkert
#1161 Fix basal rounding for small basal steps @bastiaanv
#1164 Fix Apple Health flag for telemetry @dnzxy
#1165 Settings Search with scroll-to and highlight (final integration) @gordolio
#1166 Linting fix @dnzxy