Trio v0.8.0
Trio 0.8.0 
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
SiteChangeevent 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)
- OmniBLE — brings in
pod-keep-alive(LoopKit/OmniBLE#165) - MedtrumKit — includes 6 upstream fixes (#115, #116, #117, #118, #121, #122)
- DanaKit — upstream improvements (bastiaanv/DanaKit#38, #39)
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 |