diff --git a/.github/workflows/add_identifiers.yml b/.github/workflows/add_identifiers.yml
index 6661ba30c9..3f9e6b7638 100644
--- a/.github/workflows/add_identifiers.yml
+++ b/.github/workflows/add_identifiers.yml
@@ -12,11 +12,11 @@ jobs:
identifiers:
name: Add Identifiers
needs: validate
- runs-on: macos-15
+ runs-on: macos-26
steps:
# Checks-out the repo
- name: Checkout Repo
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
# Patch Fastlane Match to not print tables
- name: Patch Match Tables
diff --git a/.github/workflows/build_loop.yml b/.github/workflows/build_loop.yml
index db33b8991b..fab987e7b3 100644
--- a/.github/workflows/build_loop.yml
+++ b/.github/workflows/build_loop.yml
@@ -90,7 +90,7 @@ jobs:
if: |
steps.workflow-permission.outputs.has_permission == 'true' &&
(vars.SCHEDULED_BUILD != 'false' || vars.SCHEDULED_SYNC != 'false')
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
token: ${{ secrets.GH_PAT }}
@@ -100,7 +100,7 @@ jobs:
steps.workflow-permission.outputs.has_permission == 'true' &&
vars.SCHEDULED_SYNC != 'false' && github.repository_owner != 'LoopKit'
id: sync
- uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.1
+ uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.2
with:
target_sync_branch: ${{ env.TARGET_BRANCH }}
shallow_since: 6 months ago
@@ -165,7 +165,7 @@ jobs:
build:
name: Build
needs: [check_certs, check_status]
- runs-on: macos-15
+ runs-on: macos-26
permissions:
contents: write
if:
@@ -175,10 +175,10 @@ jobs:
(vars.SCHEDULED_SYNC != 'false' && needs.check_status.outputs.NEW_COMMITS == 'true' )
steps:
- name: Select Xcode version
- run: "sudo xcode-select --switch /Applications/Xcode_16.4.app/Contents/Developer"
+ run: "sudo xcode-select --switch /Applications/Xcode_26.2.app/Contents/Developer"
- name: Checkout Repo for building
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
token: ${{ secrets.GH_PAT }}
submodules: recursive
@@ -255,7 +255,7 @@ jobs:
# Upload Build artifacts
- name: Upload build log, IPA and Symbol artifacts
if: always()
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: build-artifacts
path: |
diff --git a/.github/workflows/create_certs.yml b/.github/workflows/create_certs.yml
index d20001b2ca..a3cc89e077 100644
--- a/.github/workflows/create_certs.yml
+++ b/.github/workflows/create_certs.yml
@@ -22,14 +22,14 @@ jobs:
create_certs:
name: Certificates
needs: validate
- runs-on: macos-15
+ runs-on: macos-26
outputs:
new_certificate_needed: ${{ steps.set_output.outputs.new_certificate_needed }}
steps:
# Checks-out the repo
- name: Checkout Repo
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
# Patch Fastlane Match to not print tables
- name: Patch Match Tables
@@ -63,7 +63,8 @@ jobs:
id: set_output
run: |
CERT_STATUS_FILE="${{ github.workspace }}/fastlane/new_certificate_needed.txt"
- ENABLE_NUKE_CERTS=${{ vars.ENABLE_NUKE_CERTS }}
+ ENABLE_NUKE_CERTS=$(echo "${{ vars.ENABLE_NUKE_CERTS }}" | tr '[:upper:]' '[:lower:]')
+ FORCE_NUKE_CERTS=$(echo "${{ vars.FORCE_NUKE_CERTS }}" | tr '[:upper:]' '[:lower:]')
if [ -f "$CERT_STATUS_FILE" ]; then
CERT_STATUS=$(cat "$CERT_STATUS_FILE" | tr -d '\n' | tr -d '\r') # Read file content and strip newlines
@@ -82,22 +83,22 @@ jobs:
echo "::error::❌ No valid distribution certificate found. Automated renewal of certificates was skipped because the repository variable ENABLE_NUKE_CERTS is not set to 'true'."
exit 1
fi
- # Check if vars.FORCE_NUKE_CERTS is not set to true
- if [ vars.FORCE_NUKE_CERTS = "true" ]; then
+ # Check if FORCE_NUKE_CERTS is set to true
+ if [ "$FORCE_NUKE_CERTS" = "true" ]; then
echo "::warning::‼️ Nuking of certificates was forced because the repository variable FORCE_NUKE_CERTS is set to 'true'."
fi
# Nuke Certs if needed, and if the repository variable ENABLE_NUKE_CERTS is set to 'true', or if FORCE_NUKE_CERTS is set to 'true', which will always force certs to be nuked
nuke_certs:
name: Nuke certificates
needs: [validate, create_certs]
- runs-on: macos-15
+ runs-on: macos-26
if: ${{ (needs.create_certs.outputs.new_certificate_needed == 'true' && vars.ENABLE_NUKE_CERTS == 'true') || vars.FORCE_NUKE_CERTS == 'true' }}
steps:
- name: Output from step id 'check_certs'
run: echo "new_certificate_needed=${{ needs.create_certs.outputs.new_certificate_needed }}"
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Install dependencies
run: bundle install
diff --git a/.github/workflows/validate_secrets.yml b/.github/workflows/validate_secrets.yml
index f8d97c4f48..ea150c0c53 100644
--- a/.github/workflows/validate_secrets.yml
+++ b/.github/workflows/validate_secrets.yml
@@ -105,7 +105,7 @@ jobs:
validate-fastlane-secrets:
name: Fastlane
needs: [validate-access-token]
- runs-on: macos-15
+ runs-on: macos-26
env:
GH_PAT: ${{ secrets.GH_PAT }}
GH_TOKEN: ${{ secrets.GH_PAT }}
@@ -116,7 +116,7 @@ jobs:
TEAMID: ${{ secrets.TEAMID }}
steps:
- name: Checkout Repo
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Install Project Dependencies
run: bundle install
diff --git a/.gitmodules b/.gitmodules
index 1308e60c03..c1fb407a91 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -58,3 +58,12 @@
[submodule "LibreTransmitter"]
path = LibreTransmitter
url = https://github.com/LoopKit/LibreTransmitter.git
+[submodule "EversenseKit"]
+ path = EversenseKit
+ url = https://github.com/loopandlearn/EversenseKit
+[submodule "MedtrumKit"]
+ path = MedtrumKit
+ url = https://github.com/loopandlearn/MedtrumKit.git
+[submodule "DanaKit"]
+ path = DanaKit
+ url = https://github.com/loopandlearn/DanaKit
diff --git a/DanaKit b/DanaKit
new file mode 160000
index 0000000000..5c676ada44
--- /dev/null
+++ b/DanaKit
@@ -0,0 +1 @@
+Subproject commit 5c676ada44a9c7a0bff54706d3242ceaa3986a10
diff --git a/EversenseKit b/EversenseKit
new file mode 160000
index 0000000000..cc4cc8f145
--- /dev/null
+++ b/EversenseKit
@@ -0,0 +1 @@
+Subproject commit cc4cc8f145c98805db797a308a5a39508d095ea0
diff --git a/LoopWorkspace.xcworkspace/contents.xcworkspacedata b/LoopWorkspace.xcworkspace/contents.xcworkspacedata
index a870f8b7c9..b042792973 100644
--- a/LoopWorkspace.xcworkspace/contents.xcworkspacedata
+++ b/LoopWorkspace.xcworkspace/contents.xcworkspacedata
@@ -108,12 +108,18 @@
+
+
+
+
@@ -132,4 +138,7 @@
+
+
diff --git a/LoopWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved b/LoopWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 85b387d04a..c9b09d9601 100644
--- a/LoopWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/LoopWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -1,5 +1,5 @@
{
- "originHash" : "7645108625333b4ec60e0e439db0c0dc8a91ad0942d36797c6b66208a9082ea2",
+ "originHash" : "23b19e660bb8e19ecae2e1186b6d2d4c2b64d16171c7a1658e596c8af3b90873",
"pins" : [
{
"identity" : "amplitude-ios",
diff --git a/LoopWorkspace.xcworkspace/xcshareddata/xcschemes/LoopWorkspace.xcscheme b/LoopWorkspace.xcworkspace/xcshareddata/xcschemes/LoopWorkspace.xcscheme
index e09bc55654..eb4fbe86ba 100644
--- a/LoopWorkspace.xcworkspace/xcshareddata/xcschemes/LoopWorkspace.xcscheme
+++ b/LoopWorkspace.xcworkspace/xcshareddata/xcschemes/LoopWorkspace.xcscheme
@@ -146,6 +146,20 @@
ReferencedContainer = "container:MinimedKit/MinimedKit.xcodeproj">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
As of 18 Feb 2026, the translations for these repositories are added to lokalise
+> * DanaKit
+> * EversenseKit
+> * MedtrumKit
+
+> In order to manage those localization strings, the translation work will be done in the feat/eversense branch, which includes those 3 repositories.
+
+> The Scripts needed to handle these new repositories are found on in this branch (for now).
+
Translations for Loop are performed by volunteers at [lokalise](https://app.lokalise.com/projects).
Several scripts were added to assist in bringing those translations into the repositories and updating keys when strings are added or modified.
diff --git a/Scripts/define_common.sh b/Scripts/define_common.sh
index 0c75a998e0..acd5ac9e00 100755
--- a/Scripts/define_common.sh
+++ b/Scripts/define_common.sh
@@ -61,6 +61,9 @@ LANGUAGES=(en \
)
# define the PROJECTS used by the translation scripts
+# Note that although loopandlearn is the address used for .gitmodules for
+# DanaKit, EversenseKit, and MedtrumKit,
+# the upstream repositories are used here so that the appropriate pr can be generated
PROJECTS=( \
LoopKit:AmplitudeService:dev \
LoopKit:CGMBLEKit:dev \
@@ -79,6 +82,9 @@ PROJECTS=( \
LoopKit:OmniKit:main \
LoopKit:RileyLinkKit:dev \
LoopKit:TidepoolService:dev \
+ bastiaanv:DanaKit:dev \
+ bastiaanv:EversenseKit:dev \
+ jbr7rr:MedtrumKit:dev \
)
function section_divider() {
diff --git a/Scripts/open_selected_url.sh b/Scripts/open_selected_url.sh
new file mode 100755
index 0000000000..7a94c8cccb
--- /dev/null
+++ b/Scripts/open_selected_url.sh
@@ -0,0 +1,46 @@
+#!/bin/zsh
+
+# The purpose of this script is to open forks on GitHub in browser that require manual evaluation.
+
+source Scripts/define_common.sh
+
+section_divider
+echo "You are running ${0}"
+echo
+echo " This automatically opens forks that need to be manually managed in your browser so you"
+echo " can handle the process at GitHub."
+
+# There are repositories that use loopandlearn in .gitmodules but the upstream forks come
+# from the original authors. They are handled maually for both Loop and Trio.
+# These URL are the same for Loop and Trio.
+# At the moment, LoopKit/LoopKit has commits used by Trio that require manual sync
+# so it is added to the SPECIAL_PROJECT_FORKS list. (This is here for convenience.)
+DOWNSTREAM_GITHUB_NAME="loopandlearn"
+
+SPECIAL_PROJECT_FORKS=( \
+ loopandlearn:LoopKit:dev:trio \
+ bastiaanv:DanaKit:dev:dev \
+ bastiaanv:EversenseKit:dev:dev \
+ jbr7rr:MedtrumKit:dev:dev \
+)
+
+section_divider
+echo " ////////////// Use Browser for next step ////////////"
+echo
+echo " Manually update these downstream repositories at ${DOWNSTREAM_GITHUB_NAME}"
+echo " Each URL will automatically open"
+echo
+for project in ${SPECIAL_PROJECT_FORKS}; do
+ IFS=":" read user dir branch downstream_branch <<< "$project"
+ echo " Manually sync ${DOWNSTREAM_GITHUB_NAME}/$dir:$downstream_branch with $user/$dir:$branch"
+ open https://github.com/${DOWNSTREAM_GITHUB_NAME}/$dir/tree/$downstream_branch
+done
+
+section_divider
+echo " ////////////// WARNING ////////////"
+echo
+echo " If any updates were made by manual sync at GitHub,"
+echo " follow up by running:"
+echo " ./Scripts/update_submodule_refs.sh"
+echo " This ensures the submodules used in your local clone are up to date"
+section_divider
diff --git a/Scripts/update_loopandlearn_forks.sh b/Scripts/update_loopandlearn_forks.sh
new file mode 100755
index 0000000000..627fee076a
--- /dev/null
+++ b/Scripts/update_loopandlearn_forks.sh
@@ -0,0 +1,69 @@
+#!/bin/zsh
+
+# The purpose of this script is to update the loopandlearn forks to match the upstream repositories
+# The script can only be run by someone with push privileges to the loopandlearn forks.
+
+source Scripts/define_common.sh
+
+section_divider
+echo "You are running ${0}"
+echo
+echo " This automatically updates the downstream loopandlearn forks at GitHub"
+echo " to match their upstream LoopKit counterparts."
+echo " Next, the forks that need to be manually managed will be opened so you"
+echo " can handle the process at GitHub."
+echo
+echo " The automated process only works with push privileges to loopandlearn."
+echo " Running the script without privileges yields error messages; no harm occurs."
+
+continue_or_quit ${0}
+
+
+# define the TRIO_PROJECT_FORKS to be updated
+# these branches in loopandlearn should match the branches in the upstream repositories
+
+# note that the OmniBLE pod-keep-alive branch is a temporary addition and must come
+# before the nominal OmniBLE dev branch in the list below
+TRIO_PROJECT_FORKS=( \
+ LoopKit:OmniBLE:pod-keep-alive \
+ LoopKit:CGMBLEKit:dev \
+ LoopKit:dexcom-share-client-swift:dev \
+ LoopKit:G7SensorKit:main \
+ LoopKit:LibreTransmitter:main \
+ LoopKit:MinimedKit:main \
+ LoopKit:OmniBLE:dev \
+ LoopKit:OmniKit:main \
+ LoopKit:RileyLinkKit:dev \
+ LoopKit:TidepoolService:dev \
+)
+
+# This script uses remotes with the indicated nickname for the downstream repository
+# If the proper remotes are not yet configured, they will be added later
+DOWNSTREAM_GITHUB_NAME="loopandlearn"
+DOWNSTREAM_NICKNAME="lal"
+
+section_divider
+echo " ////////////// Automatically push updates from LoopKit to loopandlearn ////////////"
+echo
+for project in ${TRIO_PROJECT_FORKS}; do
+ IFS=":" read user dir branch <<< "$project"
+ echo " Make sure $branch for $dir is up to date"
+ cd $dir
+ git switch $branch
+ git pull
+ # Ensure remote is configured
+ if ! git remote get-url ${DOWNSTREAM_NICKNAME} &>/dev/null; then
+ echo " Adding remote ${DOWNSTREAM_NICKNAME} for $dir"
+ git remote add ${DOWNSTREAM_NICKNAME} https://github.com/${DOWNSTREAM_GITHUB_NAME}/$dir
+ fi
+
+ echo " Push this update downstream to ${DOWNSTREAM_GITHUB_NAME}/$dir:$branch"
+ git push ${DOWNSTREAM_NICKNAME} $branch
+ echo ""
+ cd -
+done
+
+# The next script is called automatically to enable manual evaluation for
+# additional pump and cgm manager repositories.
+
+source Scripts/open_selected_url.sh
\ No newline at end of file
diff --git a/Scripts/update_submodule_refs.sh b/Scripts/update_submodule_refs.sh
index b9edba347a..3fb71658a0 100755
--- a/Scripts/update_submodule_refs.sh
+++ b/Scripts/update_submodule_refs.sh
@@ -2,13 +2,24 @@
source Scripts/define_common.sh
+section_divider
+echo "You are running ${0}"
+echo
+echo " This modifies your local clone, in whatever branch is currently selected,"
+echo " so that every submodule is at the tip of the appropriate branch."
+echo
+current_branch=$(git branch --show-current 2>/dev/null)
+echo " The current LoopWorkspace branch is $current_branch"
+
+continue_or_quit ${0}
+
for project in ${PROJECTS}; do
+ echo
echo "Updating to $project"
IFS=":" read user dir branch <<< "$project"
echo "Updating to $branch on $user/$project"
cd $dir
git checkout $branch
- #git branch -D tidepool-sync
git pull
cd -
done
diff --git a/VersionOverride.xcconfig b/VersionOverride.xcconfig
index 6089e279b2..b17045813b 100644
--- a/VersionOverride.xcconfig
+++ b/VersionOverride.xcconfig
@@ -8,5 +8,5 @@
// Version [for DIY Loop]
// configure the version number in LoopWorkspace
-LOOP_MARKETING_VERSION = 3.12.0
+LOOP_MARKETING_VERSION = 3.13.1
CURRENT_PROJECT_VERSION = 57