Conversation
- Point all 18 submodule URLs to https://github.com/loopkitdev/* forks - Minizip and TrueTime.swift retain LoopKit origin (no forks) - Add docs/tidepool-sync-2026-03-10.md (Tidepool sync documentation)
…ce docs - Update all 17 submodule commit pointers to reflect rewritten history (filter-branch changed SHAs when fixing author to LoopKit Developer) - Add Loop build fix commit (LoopDataManager init ordering) - Add LOOPKIT_SYNC_PROCESS.md, SYNC_PROGRESS.md, sync-docs/
Catches the superproject up to all submodule work that has accumulated
on tidepool-sync/2026-03-10 since the initial sync commit, including:
- Loop: restore manual dose entry "+" button on insulin delivery screen
- LoopKit, NightscoutService, TidepoolService, LibreTransmitter:
string catalog updates from Xcode build
- OmniKit: fix reentrant lock crash in isSignalLost
- Various submodules: merge upstream/{dev,main} into tidepool-sync branch
Parallel fix to OmniKit 924f10d — OmniBLE had the identical bug where isSignalLost() read state.lastPumpDataReportDate from inside a lockedState.mutate closure, causing recursive lock acquisition.
Tier 1 - LoopKit: bd30c463 (409 commits from tidepool/dev; 18 source conflicts + 19 pbxproj regions resolved; DIY divergence preserved at BasalRateScheduleEditor) - Loop: 76b6b1e3 (14 commits from tidepool/dev; 3 pbxproj regions) Tier 3 - CGM drivers - CGMBLEKit: 69562e7 - G7SensorKit: d024513 - dexcom-share-client-swift: 541de2f - NightscoutRemoteCGM: b1ea9ee - LibreTransmitter: c99daf1 Tier 3 - Pump drivers - RileyLinkKit: 19f5ae8 - OmniKit: b3b6080 (preserves reentrant lock fix; adopts mutateState) - OmniBLE: 645e0fc (preserves reentrant lock fix and Pod Keep Alive suspend special case; adopts mutateState) - MinimedKit: f994d6e (preserves CAGE/IAGE tracking) Tier 3 - Services - TidepoolService: 5f6a064 (incl. DoseEntry dedupe follow-up) - NightscoutService: 1b5cded (preserves APNS response feature) - AmplitudeService: 77dae3e - LogglyService: 8e18081 - MixpanelService: unchanged (already up to date with tidepool) Tier 3 - Support/Onboarding - LoopSupport: a312dfb - LoopOnboarding: fd7e410 Package.resolved - LoopAlgorithm: tidepool-org/LoopAlgorithm bd1a879 (4 test-only commits)
docs/tidepool-sync-2026-05-11.md describes the merge, conflicts, and divergences. SYNC_PROGRESS.md updated to reflect the new branch and the divergences carried forward.
Pulls in 3 small origin/dev updates that landed after this sync started: - Loop: PR #2410 Live activity plot fixes (manual merge to preserve our post-Tidepool-sync API: kept async/await sample fetch + LoopUnit signature, adopted upstream's presetStart<=presetEnd guard and the adjustedChartStart/End helpers) - CGMBLEKit: PR #211 handle inactive CGM sensor sessions (clean merge) - OmniBLE: Lokalise translation update (clean merge)
Pulls in the new loopkitdev/LibreLoop repo (initial scaffold at 55b65d6), registers its xcodeproj in the workspace, and adds LibreLoopPlugin to the LoopWorkspace scheme so copy-plugins.sh embeds the .loopplugin bundle into Loop.app/Frameworks. With this in place Loop's CGM picker surfaces a "FreeStyle Libre 3" entry and runs the plugin's onboarding flow. No changes to Loop or LoopKit are required — discovery is purely via PluginManager's Info.plist scan.
Bumps the LibreLoop submodule pointer to the head of main, covering: - onboarding restructure (Apply -> Scan) - LibreCRKit SwiftPM dep + vendored phone_cert_162b - candidate Phase 5 handshake - BLE PIN persisted before BLE auth - in-session glucose streaming + monitor - redesigned status screen, lifecycle bar, last-N readings table - always-retrying reconnect + per-attempt scan timeout - post-pair backfill via PatchControlCommand - adopted upstream Libre3GlucoseQualityAssessment API - Pair-new-sensor flow, persisted latestSample - BLE state restoration via shared scanner + retrievePeripherals
…k mark is shown (#472)
* Merge pull request #461 from daghaian-loop-org/add-build-autotrigger feat: create new build_loop_auto file to prevent disabling by GitHub * improve clarity: when build is skipped, run is canceled no green check mark is shown (#472) * update to fastlane 2.236.1 * update fastlane to 2.237.0 --------- Co-authored-by: David Aghaian <16483722+daghaian@users.noreply.github.com>
… wording (#6) Expired Libre 3 sensors now show 'Expired' (not 'Sensor failed'), surface a prominent Pair New Sensor button, and the expiry alerts set the warmup-gap expectation instead of implying a gap can be avoided by replacing early.
Carb screen and favorite-food insights now compute carb absorption with the same mid-absorption ISF model as the algorithm, so their COB agrees with the home screen (fixes the carb-screen-vs-home discrepancy under an ISF-changing override).
Advances OmnipodKit next-dev d3a55a4 -> 4b84508. Headline is #123, which stops a stale fresh-discovery fallback timer from cancelling a live connection and spinning a connect -> cancel -> "reconnecting after drop" loop. Also pulls the other OmnipodKit next-dev commits since our last pin: heartbeat stale-target fix, MIT license, README updates.
…ix (#601) Regenerated golden fixtures to match LoopAlgorithm's continuousDeliveryInsulinOnBoard midpoint-integration change; values-only, time grid unchanged. Clears the next-dev CI failure introduced with the LoopAlgorithm bump.
Third and final InsulinMathTests fixture affected by the LoopAlgorithm basal-ripple IOB change; full InsulinMathTests suite passes. Completes the next-dev CI fix.
… Glass (#2464) Advances Loop next-dev 48f8a921 -> c4d89c03.
The workspace build consumes LibreCRKit via the local 'group:LibreCRKit' package override (not LibreLoop's remote pin), so bumping the submodule gitlink is what lands the change in next-dev builds. a86b92f reworks the system NFC scan prompt to 'Hold the TOP of your iPhone very close to the Sensor' (+ a CustomStringConvertible addition in bbfa2f1).
Fixes a re-entrant managerQueue deadlock when surfacing a pod alert from an advert.
Picks up the display-only forward throttle (#7, e5c159f). With the experimental "Send every reading" toggle off, display-only samples -- a new sensor's warmup readings, for instance -- bypassed the ~5 minute throttle and streamed to Loop at about one per minute, against what the toggle promises. The fix drops the isActionable requirement from the throttle guard and advances the throttle clock on every forward.
OmnipodKit 4763ce6 -> 366380d eager connect watchdog (#133) LoopKit c4a8f64 -> 011a3db persistent store (#606), override loop (#608) G7SensorKit 468eefc -> fb87aa9 suspected session end grace (#63) Loop c4d89c0 -> 3ab37d5 CarbMath preconditionFailure (#2489) LibreTransmitter a38975d -> c192a2f device manufacturer field (#41), configurable glucose smoothing LOOP_MARKETING_VERSION 3.15.1 -> 3.15.2. CURRENT_PROJECT_VERSION left at 58.
Picks up "Xcode 27 Fix" (#605): isDurationPickerExpanded in CreatePresetNameAndScheduledEdit is declared without an inline initial value, which Xcode 27 requires here.
Building with Xcode 27 (27A5237l) failed before reaching any of our code: TrueTime.xcodeproj: error: The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 12.0, but the range of supported deployment target versions is 15.0 to 27.0.x. (in target 'TrueTime-iOS') Upstream fixed this in "bump deployment (#3)", which raises the target from 12.0 to 15.0 and changes nothing else. Testers already building with Xcode 27 are on that commit. Xcode 26 was unaffected, which is why this went unnoticed.
Picks up #609: LoopKitTests now declares its dependency on LoopKitUI. Test-target wiring only, 15 lines of project file, no source or product change.
OmnipodKit 366380d -> d58b11f InPlay connection strings (#140) LibreTransmitter c192a2f -> 6058dd2 glucose smoothing and every-minute reading strings (#50) Both were added by earlier work but never had the regenerated catalog committed, so the strings had not reached translation. Raised by @marionbarker in review. Catalog content only, no source change.
LibreLoop e4a4642 -> 9e5c3fc 18 new keys plus a one-time serialiser
normalisation (#10)
Loop 3ab37d5 -> bc4d79ff two removed pre-meal strings marked stale
(#2500)
Completes the catalog cleanup @marionbarker raised. All four submodules
now regenerate clean: a rebuild after these bumps leaves no catalog
dirty.
Picks up #16: shouldConnect(to:) and connectingCount read autoConnectIDs from the main thread while centralQueue mutates it, which tore the Set and crashed with "unrecognized selector sent to instance 0x8000000000000000" when a RileyLink switch was toggled repeatedly (LoopKit/Loop#2462). The property is now backed by a lock. Affects MinimedKit, OmniKit and OmnipodKit with Omnipod Classic, which share the provider.
Pod Keep Alive mode switch bug fix and cleanup (#138) Improved dose handling on faults for more consistent state (#139) Always display updated informational text at start of Omnipod 5 Setup (#136) Pump manager and setup UI only; the Bluetooth layer is untouched, so the eager connect work in this bump is unaffected. The string catalog stays clean after a rebuild.
Bump submodules and version to 3.15.2
Scan help now says to hold the TOP of the phone against the sensor, not the back. The NFC antenna is at the top, so the old instruction did not work, and it contradicted the sibling screen which already said "top" (#11, reported by Mike Plante). Also enables Swift string extraction on the LibreLoop and LibreLoopUI targets, matching MinimedKit and OmnipodKit. LibreLoop already declared LocalizedString as an extractable macro and preferred string catalogs but never switched extraction on, so new strings did not reach the catalog. The first build after enabling it harvested 15 strings that had never been available for translation, from the stream debug view and the chart labels.
Bump LibreLoop to 1eeb710
OmnipodKit 6106c1c -> d9b5966 Don't fail commands on background disconnect (#147). enterBackground() cancelled the peripheral connection with no notion of whether a command exchange was in flight, so backgrounding mid-command killed the pending write and reported a failure for work the pod had already done -- the ACK is written only after the response is received and parsed. Seen in the field as "Unable To Clear Alert / Message IO Exception ... PeripheralManagerError.timeout" seconds before a reconnect advertised the alert already cleared. Pod comms errors also now read in plain English rather than as raw type names. Stale pairing connect teardown and BLE heartbeat for direct-BLE DASH pods (#155). Removes the zombie-connect heuristic, which could not tell an abandoned connect from one issued moments earlier and so cancelled in-flight pairing connects on any phone where the eager-connect watchdog does not arm, looping pairing at the advert interval without completing. Also fixes setBLEHeartbeatRequest branching on mayUseRileyLink, which is true for DASH as well as Eros: a DASH pod on direct BLE with Pod Keep Alive off took the RileyLink branch and never had provideHeartbeat set, leaving no background wake source when the CGM cannot supply one. Loop bc4d79f -> e22334d Replace icon with liquid glass variant (#2434). LibreLoop 1eeb710 -> 415b799 Capture sensor firmware version and surface it in device info (#12). Retract alerts when the CGM is deleted (#13). Delete CGM went straight to notifyDelegateOfDeletion and never reached the manager's delete, so scheduled expiry alerts stayed in Loop's AlertStore and launch-time playback re-presented them on every launch -- a user who had switched back to a G7 still got "sensor about to expire" a week later. Same change also removes the stuck-value detector, since the realtime frame log already carries the raw fields, and renames the plugin to "FreeStyle Libre 3 / 3+" in the Add CGM picker and settings row. LibreCRKit a86b92f -> c562170 Add the Libre by Abbott account-ID receiver derivation (#5), and localize user-facing NFC and Bluetooth strings into de, es, fr, it, ja, nl, pl, ru and zh-Hans (#4).
Bump OmnipodKit, Loop, LibreLoop and LibreCRKit
Loop e22334d -> 35f992f0 Normalize the tab bar icon assets (#2510). ActionTabBar scales each icon to a common 28pt height, but scaledToFit works on the asset canvas, and the canvases padded their artwork by very different amounts -- bolus and settings rendered about 30% larger than carbs and presets beside them. Takes the normalized 40x40 artwork from #2504 for the three assets this bar uses, which brings all four into line with no code change. Allow querying for the Dexcom G7, ONE+ and Stelo app URL schemes (#2512). Show bolus progress for automatic boluses, and offer an issue report when one is stopped (#2511). The progress reporter was created only for manual boluses, so an automatic bolus displayed nothing on the status row -- and since that row is also the stop target, there was no way to stop an automatic bolus from the status screen at all. The canceled row now also carries an info button explaining why Loop bolused, offering to open the issue report screen. G7SensorKit fb87aa9 -> 8862288 Merge main into next-dev (#68), a clean fast-forward from the pin. Two code changes: the sensor lifecycle progress now shows remaining lifetime from 48 hours rather than 24, warning only inside the last 24 (#58); and CBManagerState.poweredOn stringified as "poweredOff", which made device logs misreport the radio as off whenever it was on. The rest is translation catalog updates, the ko/ce/hi language list change, and the MIT license file.
Bump Loop and G7SensorKit
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This branch is a holding ground for the next major set of features to land in dev.
It includes the Tidepool Sync (#450) and OmnipodKit, and new Libre 3 integration.