diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index d1accf40c55..26616473004 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -17,14 +17,14 @@ jobs:
contents: write
if: github.repository_owner == 'LoopKit'
steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v5
+ - uses: actions/checkout@v5
+ - uses: actions/setup-python@v6.2.0
with:
- python-version: 3.x
+ python-version: ">=3.9"
- run: pip install -r requirements.txt
- run: mkdocs build
- - uses: JamesIves/github-pages-deploy-action@v4
+ - uses: JamesIves/github-pages-deploy-action@v4.8.0
with:
branch: gh-pages
folder: site
diff --git a/README.md b/README.md
index fe1ce23baef..672ea74af21 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@ This repository contains the source files for [Loop's](https://github.com/LoopKi
- [**Requirements**](https://loopkit.github.io/loopdocs/intro/requirements/)
- [Build Loop](https://loopkit.github.io/loopdocs/intro/requirements/#two-loop-build-methods)
- [Configuration](https://loopkit.github.io/loopdocs/loop-3/loop-3-overview/)
-- [Usage](https://loopkit.github.io/loopdocs/operation/loop/open-loop/)
+- [Usage](https://loopkit.github.io/loopdocs/operation/loop/close-loop/)
- [Troubleshooting](https://loopkit.github.io/loopdocs/troubleshooting/overview/)
- Remote monitoring and commands with [*Nightscout*](https://loopkit.github.io/loopdocs/nightscout/overview/)
- [FAQs](https://loopkit.github.io/loopdocs/faqs/overview-faqs/)
@@ -48,11 +48,12 @@ If it is a more substantive change and you want to [install LoopDocs locally](#i
# Run the next line **each time** you start a new shell window/tab
source venv/bin/activate
```
-- Install the project's required *Python* packages
+- **Install** the **dependencies** (that is the project's required *Python* packages)
```shell
- cd loopdocs # Make sure you are in the folder where you cloned this repository
+ cd loopdocs # where you cloned the loopdocs repository
- python -m pip install -r requirements.txt
+ python -m pip install -r dev-requirements.txt
+ python -m pip install -r requirements.txt
```
## Run
@@ -310,7 +311,7 @@ To prevent a name from being automatically translated, such as a **product** nam
Name | Markdown Input | Rendered Output
--- |--- |---
Project Name | The `*Loop*` pill | The *Loop* pill
-Product Name | require a `*RileyLink*` compatible device [...]
Visit `*Nightscout*` documentation [...]
using `*Omnipod DASH*` [...]
the `*Tidepool Mobile*` uploader [...]| require a *RileyLink* compatible device [...]
Visit *Nighscout* documentation [...]
using *Omnipod DASH* [...]
the *Tidepool Mobile* uploader [...]
+Product Name | require a `*RileyLink*` compatible device [...]
Visit `*Nightscout*` documentation [...]
using `*Omnipod DASH*` [...]
the `*Tidepool Mobile*` uploader [...]| require a *RileyLink* compatible device [...]
Visit *Nightscout* documentation [...]
using *Omnipod DASH* [...]
the *Tidepool Mobile* uploader [...]
Brand Name | on some `*Medtronic*` pumps | on some *Medtronic* pumps
If the `text` you do not want to translate is neither an [Entity](#entity) nor a [Name](#name), read on.
@@ -564,9 +565,9 @@ where:
- `.copy` shows the copy-to-clipboard button when present (hidden otherwise)
- `title=“title of this code block”` adds a title to the code (none when absent)
-Do note that:
-- There is a space before **and** after the opening curly brace ` { `.
-- There is space before the closing curly brace `}`.
+> [!NOTE]
+> - There is a space **before and after** the **opening** curly brace ` { `.
+> - There is space **before** the **closing** curly brace `}`.
[Source](https://squidfunk.github.io/mkdocs-material/reference/code-blocks/?h=copy+clipboard#code-copy-button)
@@ -611,3 +612,63 @@ The website uses the Markdown page of the glossary.
> [!IMPORTANT]
> Remember to commit these two files.
+### Add a Package
+
+> [!NOTE]
+> In this section:
+>
+> - the terms Python **package** and **dependency** refer to the same thing.
+> - `XXX` denotes the name of the package to add
+
+- **Create** a feature **branch** (aka. topic branch)
+ ```shell
+ git switch main
+ git switch -c feature/add_dependency_XXX
+ ```
+- **Add** the pinned version of the new **package** to the **`requirements.in`** file
+ ```shell
+ MY_FAVORITE_EDITOR_HERE requirements.in
+
+ # Add the pinned version of the package to `requirements.in
+ XXX_PACKAGE_NAME_HERE==XXX_PACKAGE_VERSION_HERE
+ ```
+ For example, to add the `mkdocs-exporter` package version `6.1.1`, I added the following line to the `requirements.in` file:
+ ```text
+ mkdocs-exporter==6.1.1
+ ```
+- Generate **`requirements.txt`**
+ ```shell
+ cd loopdocs
+
+ # IMPORTANT: The project's virtual environment MUST be activated first
+ source venv/bin/activate
+
+ # Remove the already installed packages in case you need to start from a blank slate
+ # python -m pip freeze --exclude-editable | xargs python -m pip uninstall -y
+
+ # Install the development packages
+ # (among which `pip-tools` that contains `pip-compile`)
+ pip install -r dev-requirements.txt
+
+ # Install the direct dependencies (listed in `requirements.in`
+ # This also installs the indirect dependencies that these packages depend upon.
+ pip install -r requirements.in
+
+ # Add code/doc using this package and test until it is ready.
+
+ # Generate the `requirements.txt` file from `requirements.in`
+ # This can be slow, be patient
+ pip-compile requirements.in
+
+ # Commit the changes (where XXX denotes the package name)
+ git add requirements.in requirements.txt
+ git commit -m "➕ Add dependency: XXX"
+
+ # Push your feature branch to your `origin` repository
+ git push -u origin feature/add_dependency_XXX
+ ```
+- [**Create a Pull Request**](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request) with your changes:
+ - Open your clone repository of `trio-docs` on *GitHub* (`https://github.com/YOUR_USERNAME/trio-docs`)
+ - Click the `Pull Requests` tab
+ - Click "`Compare & pull request`" in the yellow banner next to your branch name
+
diff --git a/dev-requirements.in b/dev-requirements.in
new file mode 100644
index 00000000000..2c2a9f38416
--- /dev/null
+++ b/dev-requirements.in
@@ -0,0 +1 @@
+pip-tools
diff --git a/dev-requirements.txt b/dev-requirements.txt
new file mode 100644
index 00000000000..1cb9c20d35c
--- /dev/null
+++ b/dev-requirements.txt
@@ -0,0 +1,26 @@
+#
+# This file is autogenerated by pip-compile with Python 3.13
+# by the following command:
+#
+# pip-compile dev-requirements.in
+#
+build==1.4.0
+ # via pip-tools
+click==8.3.1
+ # via pip-tools
+packaging==26.0
+ # via
+ # build
+ # wheel
+pip-tools==7.5.2
+ # via -r dev-requirements.in
+pyproject-hooks==1.2.0
+ # via
+ # build
+ # pip-tools
+wheel==0.46.3
+ # via pip-tools
+
+# The following packages are considered to be unsafe in a requirements file:
+# pip
+# setuptools
diff --git a/docs/browser/automatic.md b/docs/browser/automatic.md
index eb8f105b4a0..2c3fa7a7c84 100644
--- a/docs/browser/automatic.md
+++ b/docs/browser/automatic.md
@@ -4,7 +4,16 @@ The instructions provided for building with a browser include settings to automa
## Manual Action for Automatic Build
-!!! important "Automatic Build Requires Manual Action"
+!!! warning "Browser Build for *Loop* Disabled?"
+ We do not know why, but GitHub is disabling the Build Loop Action for LoopWorkspace even though the repository is not stale.
+
+ If this is happening to you, see [What Manual Action is Required?](#what-manual-action-is-required).
+
+ * The automatic build actions should occur every Sunday
+ * The automatic build using the same code works for all OS-AID apps except for *Loop*
+ * See this [GitHub Discussion topic for details](https://github.com/orgs/community/discussions/181236)
+
+??? tip "Stale Repositoriy Always Requires Manual Action (Click to Open Close)"
*GitHub* automatically **disables actions** that run according to a schedule if the repository in question is **inactive**.
What does that mean?
@@ -14,12 +23,13 @@ The instructions provided for building with a browser include settings to automa
### What Manual Action is Required?
-For any repository that is stable, like the *Loop* app, you may need to take manual action to keep automatic builds flowing every month.
+For any repository that shows the build action disabled, you should enable the action and do a manual build.
-* Put a calendar reminder to check every month on the 2nd day of the month (or later)
+* Put a calendar reminder to check every month on the 15th day of the month (or later)
* Check that *TestFlight* has a new build of the *Loop* (or other) app
* If not, go to your repository to see if the build action is disabled
* If necessary, enable the build action at your repository as shown in the graphic below and then launch a manual build
+* If you are building any branch other than the default branch for your `fork`, don't forget to select that branch as part of Step 5 in the graphic below

@@ -27,6 +37,10 @@ This keeps the most recent version of your app available in *TestFlight* for you
> Builds in *TestFlight* are good for 90 days before they [expire](../operation/features/notifications.md#loop-app-expiration-notification){: target="_blank" }.
+Your build may fail for other reasons - most common is forgetting to sign your updated license agreement or not adding the variable needed to get automatic annual certification renewal.
+
+* Head over to [Errors with Browser](bb-errors.md){: target="_blank" }
+
## What is Automatic
These events are automatically scheduled:
@@ -50,11 +64,51 @@ You still need to **take these actions** to ensure a recent build of the *Loop*
* Check your *GitHub* action if you ever get an email saying an automatic action failed
* Look at your *TestFlight* app on the second of every month to make sure a new build is available for you to install when you are ready
+### Modified Design for Build Action
+
+The modified design for the build action found in `Loop v3.8.2` and newer is documented in this section.
+
+#### Updated Build Features
+
+The code that controls the build process was streamlined and enhanced. It runs every Sunday at a time when *GitHub* is not impacted. The portion of the action that decides whether to build or not completes in a few seconds.
+
+**Build when**
+
+* updates are detected
+* it is the second Sunday of the month
+
+**Other features**
+
+* remove the concept of alive branches
+* remove the requirement that your fork name match the upstream repository name
+* enable any branch in your fork to be updated if the upstream repository has the same branch
+ * if you choose to have a special branch in your fork set to default, the automatic check for updates works for that special branch
+
+
+??? question "Do you want to know more? (Click to open/close)"
+ **Build Action Redesign**
+
+ When GitHub allowed the use of alive branches with automatic addition of commits to the branch, there were extra steps in the build yml file and limitations to which branches would be updated.
+
+ * These steps kept your fork from getting stale
+ * GitHub will disable your build actions if no commits have been added for 60 days
+
+ Because this trick is no longer allowed, the creation and use of alive branches was removed. That opened the door to streamline and enhance the build action capabilities.
+
+ If you want to follow the detailed design steps taken to reach this new version, see the following LoopFollow PR. (Most people do not need to know this).
+
+ * [LoopFollow PR 465: Shift GitHub to check for updates every Sunday and build 2nd Saturday of each month](https://github.com/loopandlearn/LoopFollow/pull/465)
+ * [LoopFollow PR 470: Update the GitHub build schedule to every Sunday](https://github.com/loopandlearn/LoopFollow/pull/470)
+ * [LoopFollow PR 477: Revise Browser Build to Remove Alive Branches](https://github.com/loopandlearn/LoopFollow/pull/477)
+ * [LoopFollow PR 480: Expand and streamline build action](https://github.com/loopandlearn/LoopFollow/pull/480)
+
### Successful Weekly Action
-Normally, you will see a successful `build action` once a week. This happens every Wednesday.
+Normally, you will see a successful `build action` once a week. This happens every Sunday (as soon as your version is 3.8.2 or newer).
-If there are no updates to the `main` branch, your actions show a very short, successful `build action` as shown in the graphic below. It only takes about a minute because the logic says - no update then skip the build.
+> Previously the build action would run every Wed or the first of the month, when GitHub resources were impacted.
+
+If there are no updates to the `main` branch, your actions show a very short, successful `build action` as shown in the graphic below. It only takes a few seconds because the logic says - if no update was detected and it is not the second Sunday, then skip checking the certificates and skip the build.

@@ -64,7 +118,9 @@ In that case, you should check your favorite information site to find out what t
### Successful Monthly Action
-On the first day of every month, you will see a successful `build action`. The purpose of this build is to provide a recent version of the app in *TestFlight* so you are never in a situation where you have no app on your phone.
+On the second Sunday of every month, you will see a longer `build action`. The purpose of this build is to provide a recent version of the app in *TestFlight* so you are never in a situation where you have no app on your phone.
+
+> Previously the build action would run every Wed or the first of the month, when GitHub resources were impacted.
!!! important "You Get No Warning if Repository Build Action is Disabled"
If your build action is disabled, no build actually happens, no warning email is sent and a green checkmark (✅) appears beside a very short build action in which the actual build was skipped.
@@ -75,35 +131,16 @@ You start getting [Notifications](../operation/features/notifications.md#loop-ap
### What are the `alive branches`?
-The automatic update and build feature is embedded in the build_loop.yml code and uses the GitHub scheduling feature to trigger actions to run automatically.
-
-One or more branches are added to your repository that start with the name `alive`. Don't worry about these. They are automatically created so GitHub will keep building your app automatically.
-
-* GitHub keeps track of repositories
-* If there is no activity in a given repository in 60 days, GitHub disables Actions
-* If your Actions are disabled, you don't get automatic builds
-* Clever people developed a work around for this
-
-You may see branches called `alive`, `alive-dev` or `alive-main` in your repository.
+In April 2025, GitHub disallowed using the build action to automatically add commits to `alive branches`. This trick was previously used to keep your fork active even when the upstream repository was stable.
-The `alive` branches are there so at least one commit per month is added to an `alive` branch in your repository. That keeps your repository active to allow the automatic update and build process.
+Once you update to v3.8.2 or newer, references to `alive branches` are removed from the build action.
-The `alive` branches are only used for the keep-alive functions. Do not build using an `alive` branch. Most people will build using the default branch of `main`.
-
-#### Automatic Creation of `alive branch`
-
-The `alive` branch you need is created automatically when you run the `Build Loop` action.
-
-!!! warning "I got an error regarding a branch with `alive` in the name"
- * Sometimes you get an error about an `alive` branch
- * If you do get an error, simply delete the branch and run the `Build Loop` action again
- * Use this [GitHub link](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-and-deleting-branches-within-your-repository#deleting-a-branch){: target="_blank" } or ask for help when deleting a branch
- * You can delete every branch that starts with the name `alive`
- * Leave the other branches alone unless a mentor directs you to take action
+> * If you have alive branches (`alive`, `alive-dev` or `alive-main`) you may delete them if you choose
+* Only delete alive branches after your default branch is updated to the new version
## Automatic Certificates
-Automatic renewal of certificates is included in `Loop 3.6.0`.
+Automatic renewal of certificates is included in `Loop 3.6.0` and newer versions.
### Requirements
@@ -124,7 +161,7 @@ You must have the `ENABLE_NUKE_CERTS` variable set to `true` for your *GitHub* o
### Automatic Certificate Renewal
-Some Open-Source apps, in particular `Trio`, `LoopCaregiver`, `LoopFollow` and `Loop` have automatic certificate renewal.
+Some Open-Source apps, in particular `Trio`, `LoopCaregiver`, `LoopFollow`, `Loop` and `iAPS` have automatic certificate renewal.
* If your signing credentials for the app being built are invalid and `ENABLE_NUKE_CERTS` is `true`, then signing credentials will be cleared from your `Match-Secrets` repository, a new `Distribution` certificate will be created at *Apple* and signing credentials for the current app will be generated and stored in `Match-Secrets`.
@@ -134,20 +171,51 @@ Some Open-Source apps, in particular `Trio`, `LoopCaregiver`, `LoopFollow` and `
### Open-Source App Schedule
-Each Open-Source App has a schedule for when the automatic build happens. This determines when the automatic check for certificate status happens.
+With the release of `Loop 3.8.2` and newer, the build schedule is updated.
+
+**New schedule - there will be one automatic run of the build action each week on Sunday.**
+
+* If no updated code is detected, the build will be skipped unless it is the **second Sunday** of the month
+* If updated code is detected, the new version of the app will be built and uploaded to TestFlight
-The times are shifted to make sure only one Open-Source app performs a `nuke` action. Any other app building later that same day will just create new signing credentials; it will not need to `nuke` all credentials. This only happens once a year, but we wanted to be sure there are no conflicts. Even if an app doesn't have automatic certificates implemented yet, they are added to the table as suggested values to use when this capability gets added. All times are UTC. If other apps decide to add this feature, please make a pull request to LoopDocs so we can add those times to the deconfliction table.
+The table below indicates **planned** time for the automatic build schedule. GitHub will start the build action no earlier than the stated time but it can be delayed depending on activity at GitHub.
-| Open-Source App | AutoCerts? | Wed
UTC | 1st of Month
UTC |
+> For apps not yet changed to the new method, the weekly runs are on Wednesday and the monthly runs are on the 1st of each month.
+
+| Open-Source App | AutoCerts? | Weekly
UTC | Once a Month
UTC |
|:--|:-:|:-:|:-:|
-| Loop | ✅ | 09:00 | 07:00 |
-| LoopCaregiver | ✅ | 13:00 | 11:00 |
-| LoopFollow | ✅ | 12:00 | 10:00 |
-| LoopFollow_Second | ✅ | 12:20 | 10:20 |
-| LoopFollow_Third | ✅ | 12:40 | 10:40 |
-| Trio | ✅ | 08:00 | 06:00 |
-| xDrip4iOS | ❌ | 16:00 | 14:00 |
+| Loop | ✅ | 07:33 | same |
+| LoopCaregiver | ✅ | 13:33 | 11:33 |
+| LoopFollow | ✅ | 10:17 | same |
+| LoopFollow_Second | ✅ | 10:27 | same |
+| LoopFollow_Third | ✅ | 10:40 | same |
+| Trio | ✅ | 06:43 | same |
+| xDrip4iOS | ❌ | 16:43 | 14:43 |
+| iAPS | ✅ | 03:00 daily | n/a |
+
+> The *iAPS* app uses a different system to trigger updates
+
+> * daily check for updates
+> * autobuild when updates detected (if user opts in)
+
+!!! question "Why are the Hour and Minute staggered?"
+ There are 2 reasons:
+
+ 1. You only want one action to `nuke` profiles and build credentials associated with an expired certificate
+ 2. The *GitHub* resources are more likely to be busy at the beginning of each hour
+
+ ??? abstract "Do you want to know more? (Click to Open/Close)"
+
+ This build schedule determines when the automatic check for certificate status happens. The times are shifted to make sure only one Open-Source app performs a `nuke` action. Any other app building later that same day will just create new signing credentials; it will not need to `nuke`. This only happens once a year, but we wanted to be sure there are no conflicts.
+
+ Starting in 2025 May, some people were getting messages that "no runners" were available to perform their build. (Remember, this is a **free** service we are using.)
+ Initially, all builds started at the "top of the hour" (HH:00), but it turns out that is when *GitHub* has the most activity.
+ In an attempt to minimize build failures due to resource limitations, the minute of the hour for all the apps is gradually being shifted.
+
+ When the first of the month and Wednesday came on the same day, there were many failed builds. This triggered us to redesign the timing. The new design is for only one run of a build action per week, on Sunday, and inside that build action there is logic to decide if it is the second Sunday of the month. If so, the build is always run and not skipped.
+
+Even if an app doesn't have automatic certificates implemented yet, they are added to the table as suggested values to use when this capability gets added. All times are UTC. If other apps decide to add this feature, please make a pull request to LoopDocs so we can add those times to the deconfliction table.
## Modify Automatic Building
@@ -169,7 +237,7 @@ This is an optional step. If you are happy with the automatic sync and update, y
Note that the weekly and monthly `Build Loop` actions will continue, but the actions are modified if one or more of these variables is set to false. **A successful Action Log will still appear, even if no automatic activity happens**.
- * If you want to manually decide when to update your repository to the latest commit, but you want the monthly builds and keep-alive to continue:
+ * If you want to manually decide when to update your repository to the latest commit, but you want the monthly builds to continue:
* create the variable `SCHEDULED_SYNC` and set it to false
* either do not create the variable `SCHEDULED_BUILD` or set it to true
* If you are building the `dev branch` at a time when there is a lot of activity in that branch, you may want this configuration
@@ -181,10 +249,10 @@ This is an optional step. If you are happy with the automatic sync and update, y
|
Secrets Error
This is the first step. If you have not succeeded (✅) with this action - STOP.
-* No other action will work - because all the other actions repeat Validate Secrets as the first step of the action
-* Be sure to [Look at the Annotation](#look-at-the-annotation)
+* No other action will work - because all the other actions repeat Validate Secrets as the first step of the action
+* Be sure to [Look at the Annotation](#look-at-the-annotation) (click on the link to the right of the :octicons-x-circle-fill-16:{: .failed })
* You can [ask a mentor for help](#where-to-get-help-with-browser-build)
If you want to try to solve it yourself, refer back to these section in the documentation:
-* [Collect Secrets](secrets.md){: target="_blank" }
-* [Enter the Secrets](prepare-fork.md#enter-the-secrets){: target="_blank" }
+* [Collect Secrets](secrets.md){: target="_blank" }
+* [Enter the Secrets](prepare-fork.md#enter-the-secrets){: target="_blank" }
### New Builder: Add Identifiers Error
-If you succeeded with Validate Secrets, this should also succeed. If it does not, please skip ahead to [Error: `missing a required attribute`](#error-missing-a-required-attribute).
+If you succeeded with Validate Secrets, this should also succeed. If it does not, please skip ahead to [Action: `Add Identifiers` Error`](#action-add-identifiers-errors).
Do not hesitate to [ask a mentor for help](#where-to-get-help-with-browser-build).
### New Builder: Create Certificates Error
+New builders should skip the separate `Create Certificates` step. It is run when you `Build Loop`.
+
+!!! tip "Successful Certificate, Failed Build"
+ The create certificate step simply creates certificates based on how you configured your Identifiers. You can have a successful certificate step but still fail with the build if you made a mistake when you configured the Identifiers.
+
+#### New Builder with a Successful `Create Certificates` but a Failed Build
+
This is one of the hardest ones to solve. If you are getting this, don't be afraid to [ask a mentor for help](#where-to-get-help-with-browser-build). If you want to solve it yourself, a link is coming your way but first read this:
#### This is NOT Your Error
-When you start this action, GitHub starts a cloud computer to run your job for you. It doesn't have any information about you or your secrets - yet.
+When you start this action, GitHub starts a cloud computer to run your job for you. It doesn't have any information about you or your Secrets - yet.
Early in the log file you will see two phrases in red font:
@@ -142,53 +151,32 @@ Common errors are:
All of these solutions are found in [Action: Build Loop Errors](#action-build-loop-errors). The mentors can pick out the exact solution quickly if you [ask a mentor for help](#where-to-get-help-with-browser-build).
-An example annotation for skipping one of the Identifiers is shown in the graphic below. The App Group for `Loop-Intent-Extension` was deliberately removed to provoke that error.
+An example annotation for skipping adding the App Group one of the Identifiers is shown in the graphic below. The App Group for `Loop-Intent-Extension` was deliberately removed to provoke that error.
-{width="800"}
-{align="center"}
-
-Ignore the warnings - this does not affect the build.
+> Unfortunatley, the automatic annotation seen here is no longer provided by the tool we use. We may get it added back later. In the meantime, you will need to search for the phrase `::error` in the log file. We'll explain that in the detailed howto section.
+{width="800"}
+{align="center"}
## Rebuild Errors: Quick Reference
-### `Check Upstream and Keep Alive` Error
-
-!!! important "`Check Upstream and Keep Alive` Error"
- **Error**: Your Browser Build fails and when you click on the link, you see
-
- * **`Check Upstream and Keep Alive`** failed
-
- **Consequence**: any required sync of your fork is skipped and build is skipped
-
- **Solution**:
-
- * Manually sync your fork of the repository: [Update `Fork`](bb-update.md#update-fork){: target="_blank" }
- * Manually start your build: [Build](bb-update.md#build-the-app){: target="_blank" }
-
- **Details about what happened**:
-
- On 21 April 2025, *GitHub* removed one of the third-party repositories that we used to keep automatic building going without action on your part. The repository was removed because it was in violation of the *GitHub* terms of service. *GitHub* disables automatic actions for repositories that have been inactive (no commits added in 60 days). For stable apps, like the *Loop* app, this third-party repository enabled a workaround to keep the builds happening.
-
- This affected all the Open-Source apps in our community - Loop, LoopFollow, LoopCaregiver, Trio, iAPS and xDrip4iOS. The developers in our community have restored the ability to build using the Browser Build method. Stay tuned for updates to required actions in the documentation over the next few months, before we hit the 60 day limit.
-
### Manual Enable for Build Action May be Required
-The automatic build actions continue to happen on schedule, but starting May 2025, you may find your build action disabled by *GitHub*. (This might happen every 60 days, but it might happen sooner.) In that case, no build actually happens, no warning email is sent and a green checkmark (✅) appears beside a very short build action in which the actual build was skipped.
+The automatic build actions should occur every Sunday. They do for all OS-AID apps except for *Loop*. ([We do not know why.](https://github.com/orgs/community/discussions/181236))
-If necessary, enable the build action at your repository as shown in the graphic below and then launch a manual build.
+If your build action is being disabled, you need to manually enable the action at your repository as shown in the graphic below and then launch a manual build.

### Rebuild: Create Certificates Error
-With `Loop 3.6.0`, these should be a thing of the past - but you must first manually update (sync) your repository in order to get this feature added and you must do this new step [Add Variable](prepare-fork.md#add-variable){: target="_blank" }
+These should be a thing of the past - but you must do this step [Add Variable](prepare-fork.md#add-variable){: target="_blank" }.
> Caveat - your Apple Developer account must be in good standing with a valid credit card attached and all agreements signed.
### Rebuild: Build Error
-After you update to `Loop 3.6.0`, the Create Certificates Action is incorporated into the Build Action. So for rebuilders, if you completed the manual sync and added the new variable, you should not get an error when building.
+The Create Certificates Action is incorporated into the Build Action. So for rebuilders, if you completed the manual sync and added the new variable, you should not get an error when building.
> Caveat - your Apple Developer account must be in good standing with a valid credit card attached and all agreements signed.
@@ -198,11 +186,11 @@ There are, however, a few intermittent errors that can happen when *GitHub* and
If you get an error when building with a browser, you can use this page to figure out what to do - but don't be afraid to [ask for help](#help-with-errors).
-!!! important "Certificate is missing"
- If you get this build error message: `No code signing identity found and can not create a new one because you enabled`, you do not have certificates needed to run the build.
-
- * With `Loop 3.6.0` and newer, this should not happen. Make sure you [Add Variable](prepare-fork.md#add-variable){: target="_blank" } to automatically renew certificates.
-
+!!! important "Build Credentials are Invalid"
+ If you are a repeat builder and you get this build error message: `No code signing identity found and`. The phrase ends with `can not create a new one because you enabled readonly` but the `readonly` has backquotes around it. Sometimes, the phrase uses `cannot` and in other cases `can not`.
+
+ You need to delete your Distribution Certificate(s) and try again. See [Revoke Distribution Certificate](bb-errors.md#revoke-distribution-certificate){: target="_blank" }.
+
These are some of the most common errors to date.
1. You made a spelling error when adding Secrets
@@ -217,9 +205,6 @@ These are some of the most common errors to date.
1. You skipped running one of the actions
1. You need to sign a program license agreement or update a credit card at Apple Developer
* Be sure to read [Misleading Error Message](#misleading-error-message)
-1. You got an error regarding a branch with `alive` in the name
- * You can delete any branch that starts with the name `alive` and try again
- * See [Automatic Creation of `alive branch`](automatic.md#automatic-creation-of-alive-branch){: target="_blank" }
## Examine Annotation
@@ -258,11 +243,11 @@ This is an example of a message that is not terribly descriptive - which is why
### Missing Certificates
-> With `Loop 3.6.0` or newer, certificates are automatically renewed if your developer account is up to date, all agreements are signed and you completed the new [Add Variable](prepare-fork.md#add-variable){: target="_blank" } step.
+> Certificates are automatically renewed if your developer account is up to date, all agreements are signed and you completed the new [Add Variable](prepare-fork.md#add-variable){: target="_blank" } step.
-If your certificates have expired, you will see this error when you try to build. It does not have a clear annotation. The error string starts with: `No code signing identity found and can not create a new one because you enabled`.
+If your certificates expired and you do not have the `ENABLE_NUKE_VARIABLE` configured, you might see this error when you try to build. It does not have a clear annotation. The error string starts with: `No code signing identity found and`. The phrase ends with `can not create a new one because you enabled readonly` but the `readonly` has backquotes around it. Sometimes, the phrase uses `cannot` and in other cases `can not`.
-> The first automatic build when Loop 3.6.0 is released will update the files required for automatic certificate creation. The next automatic build will use the new files. So if the first attempt with Loop 3.6.0 fails, try again.
+Please follow the directions in [Revoke Distribution Certificate](#revoke-distribution-certificate) and build again.
{width="800"}
{align="center"}
@@ -293,12 +278,12 @@ This section is required when you need to search for a string to diagnose and er
If there are *Apple* Developer agreements you have not accepted, you may get errors when you try to Build that indicate your *Apple* Secrets are incorrect even if they are not.
* The misleading message tells you that one or more of these: FASTLANE_ISSUER_ID, FASTLANE_KEY_ID or FASTLANE_KEY is not correct
- * Once `Loop 3.6.0` or newer is available, this should no longer appear unless you have a mistake in one of those
+ * With `Loop 3.6.0` or newer, this should no longer appear unless you have a mistake in one of those
* Check your *Apple* Developer account for agreements first, before trying to fix those `Secrets`
* If you previously built successfully - it is almost certainly the agreement
* It can take 15 minutes to an hour after the agreement is signed before it can be used
-If you need detailed instructions, click on this [Apple Program License Agreement Help Page](https://support.pushpay.com/s/article/Accepting-the-Apple-Program-License-Agreement){: target="_blank" }.
+If you need detailed instructions, click on this [Apple Program License Agreement Help Page](https://support.pushpay.com/s/article/Accepting-the-Apple-Program-License-Agreement).
You can also get this message if the credit card used to purchase the Developer account is not current, e.g., no longer valid or credit card expiration date, as entered at *Apple*, has passed.
@@ -306,6 +291,12 @@ You can also get this message if the credit card used to purchase the Developer
At this point, it may be faster to [ask a mentor for help](#where-to-get-help-with-browser-build). But if you want to dig into the details of the log and find the error yourself, the information is here.
+!!! tip "General Search for the Error"
+ * Click on the link to the right of the :octicons-x-circle-fill-16:{: .failed }
+ * In upper right, there is a search box
+ * Enter `::error` in the search box to find your specific error
+ * If the search is empty, search for `error` and look at the first one
+
There is a separate section for each step in the process. First, you must follow the [Examine Annotation](#examine-annotation) instructions to view the record of the failed action. Then go to the section for the Action you were trying to complete to look for possible error strings to copy into the search box. For each section there are possible strings to paste to search the log.
* Paste in a possible error string (copy it exactly); repeat until you find a match
@@ -343,51 +334,22 @@ For Version 3.4 and later - use [Examine Annotation](#examine-annotation) and re
## Action: `Add Identifiers` Errors
-### Error: `missing a required attribute`
-
-This happens if your `FASTLANE_KEY` is invalid. You may have copied it incorrectly or there may be some other reason why the value that you correctly copied from your `p8` file is not working.
-
-Copy the words on the line below and paste them into the search function for your action log.
-
-> ``` { .text .copy }
-> The provided entity is missing a required attribute - You must provide a value for the attribute
-> ```
-
-There were a number of cases recently where the solution was to revoke your `FASTLANE_KEY`, create a new one and then update these two secrets in your organzation, or in every repository if you are using a personal *GitHub* account to build.
-
-* `FASTLANE_KEY`
-* `FASTLANE_KEY_ID`
+We used to be able to say that if `Validate Secrets` worked then so did `Add Identifiers`. That is still typically true for new builders. But we are finding many experienced builders have to revoke their old `FastLane API Key` and generate a new one to be able to continue building. We don't know why, but it is happening a lot. If you are one of those experienced builders, head over to the [Handle the `FastLane API Key` Error](#handle-the-fastlane-api-key-error).
-Before revoking your key, first make sure that when you saved them to your Secrets Reference file, there was not a mistake. Make sure you are NOT using a smart editor; that can change a small letter to a capital letter. Make sure you did NOT insert or remove a line break and that you copied from the first hyphen to the last hyphen. The 2 keys should look like this:
+If you are new builder who gets an error at `Add Identifiers`, please [ask a mentor for help](#where-to-get-help-with-browser-build).
-```
-FASTLANE_KEY_ID
-MATCH_PASSWORD in your repository Secrets, go and fix it now and try again.
-Otherwise, you need to follow the steps to [Reset Match-Secrets](#reset-match-secrets).
+Otherwise, you need to follow the steps to [Delete Match-Secrets](#delete-match-secrets).
### Error: Could not create
@@ -537,35 +503,18 @@ The full error message is:
> `Could not create another Distribution certificate, reached the maximum number of available Distribution certificates`
-#### New with `Loop 3.6.0`
-
-> If you just updated to 3.6.0, you might not have added the new variable, `ENABLE_NUKE_CERTS`. Go do that now and then try again. It will take care of renewing your certificates automatically. See [Add Variable](prepare-fork.md#add-variable){: target="_blank" }.
-
-These steps are only needed to make room for a `Certificate` when running versions earlier than 3.6.0 if you choose not to add the `ENABLE_NUKE_CERTS` variable:
+These steps are required to make room for a `Certificate` if you have two Certificates or if you tried to create a new certificate in the May/Jun 2025 time frame when the Browser Build actions were "broken", before `Loop 3.6.1` was released.
-1. Delete an old `Distribution Certificate`
- * *Apple* limits you to two `Distribution Certificates`
- * Use this link to view your [Apple Developer Certificates](https://developer.apple.com/account/resources/certificates/list){: target="_blank" }
- * Carefully examine the `Type` column - do **not** delete a `Development` `Certificate`
- * If you accidentally delete a `Development` `Type` certificate associated with an Xcode build for your Loop app - it will stop working and you will be very sad
- * Click on the oldest `Distribution` `Certificate` and revoke it
- * You will get an email informing you the certificate was revoked
-1. To create a new `Certificate`:
- * Return to *GitHub* and your fork
- * Run the `Action`: `Create Certificates`
-1. You are now ready to run the `Action`: `Build Loop`
-
-!!! question "But what about *TestFlight* builds?"
- Previous builds using this method that are already in *TestFlight* are not affected by deleting the `Distribution Certificate`.
+* Follow the directions to [Revoke Distribution Certificate](#revoke-distribution-certificate)
## Action: `Build Loop` Errors
-This section is for people who have not successfully built the *Loop* app one time. If you are a repeat builder, please skip ahead to [Action: `Build Loop` Errors when Updating](#action-build-loop-errors-when-updating).
-
-!!! warning "Run `Create Certificates` First"
- When running a version earlier than `Loop 3.6.0`, you must run Action: `Create Certificates` before attempting to run Action: `Build Loop`
+!!! abstract "First Time Builders"
+ **📍 You are here:** You had a build error and have never built this app beforeMATCH_PASSWORD and want to build one of the [Other Apps](other-apps.md)
-* You thought you entered the correct MATCH_PASSWORD but you are getting [Error: Could not decrypt](#error-could-not-decrypt)
-* You are having trouble renewing your certificates after using Browser Build for a year
+The rest of this section has some steps that may be needed in the future. Do not follow any of these steps at this time unless a mentor has suggested it or you have a specific error case where one of these steps is recommended.
-These steps are needed to reset your `Match-Secrets`:
+> If you are building *xDrip4iOS*, or another app that does not automatically renew certificates, go ahead and try these steps. No need to check with a mentor first.
-1. Delete your `Match-Secrets` `Repository`
- * Instructions to delete a repository are found at [*GitHub* Docs](https://docs.github.com/en/repositories/creating-and-managing-repositories/deleting-a-repository){: target="_blank" }
-1. In your fork of LoopWorkspace:
- * This will automatically create a new `Match-Secrets` `Repository` for you
- * Run the `Action`: `Create Certificates`
- * If this fails, click on this link for the most likely [Error: Could not create](#error-could-not-create)
- * If that doesn't help, check all your Secrets and try again
-1. You are now ready to run the `Action`: `Build Loop`
+## Other Help Steps
+
+These help steps might be needed so the documentation is here.
+
+### Revoke Distribution Certificate
+
+Make sure you have the `ENABLE_NUKE_CERTS` variable added and set to `true`. See [Add Variable](prepare-fork.md#add-variable){: target="_blank" } for instructions.
+
+This step is done at the *Apple* Developer site; click on this [link](https://developer.apple.com/account/resources/certificates/list).
+
+> 
+
+If you have two Certificates that have the `Distribution` type, most people should delete both.
+
+* Carefully examine the Type column - do not delete a Development Certificate
+ * Click on a Distribution Certificate, select Revoke and confirm
+ * If you have two, revoke both (unless you are a developer who needs two)
+ * Other certificates (ignore these):
+ * Development Type certificates are associated with an Xcode build for your app; an app on a phone built with Xcode will stop working if you delete that
+ * Managed Distribution certificates are generated when you use another method to distribute an app, such as Diawi or uploading an Xcode build from a Mac to TestFlight
+
+
+You will get an email informing you the certificate was revoked.
+
+Run the Build action and a new Distribution Certificate will be created along with the profiles and build credentials needed.
-!!! important "Other Apps"
- All DIY iOS apps that have an associated *GitHub* Browser Build method require the same 6 Secrets.
+* This is true for Loop, LoopCaregiver, LoopFollow and Trio if you have the ENABLE_NUKE_CERTS variable set to true
- If you add an app to your *GitHub* username (by forking the repository and adding Secrets) and then build it, it encrypts your `Certificate` using `MATCH_PASSWORD`.
+!!! question "But my Build Action Failed Again"
+ - [x] Make sure you deleted all the Distribution Certificates as directed above.
- If you already have the other apps configured and then you delete `Match-Secrets` and add a new one, you will need to run `Create Certificates` for each app before the next time you build each app - go ahead and do that now so you don't forget.
+ - [x] Make sure you have the [`ENABLE_NUKE_CERTS` variable](prepare-fork.md#add-variable){: target="_blank" } set to true
+ - [x] Make sure you configured `ENABLE_NUKE_CERTS` as a variable
+ - [x] Make sure you spelled `ENABLE_NUKE_CERTS` correctly
+ - [x] Make sure you entered the value of `true` in little letters
+
+ - [ ] Then follow the link to delete your [Match Secrets repository](#delete-match-secrets); after that step, then run `Build Loop` again.
+
+!!! question "But what about *TestFlight* builds?"
+ Previous builds using this method that are already in *TestFlight* are not affected by deleting the `Distribution Certificate`.
+
+Do not continue to later sections on this page unless directed or for the following special case:
+
+!!! important "Building xDrip4iOS?"
+ For xDrip4iOS, the nuke certs capabality is not available (as of 2025-June).
+
+ For that case, or if you choose not to add the `ENABLE_NUKE_CERTS` variable, please take these additional steps:
+
+ 1. Revoke Distribution Certificate (this section)
+ 2. [Delete Invalid Profiles](#delete-invalid-profiles)
+ 3. [Delete Match-Secrets](#delete-match-secrets)
+ 4. Run the action Create Certificates
+ 5. Run the action Build
+
+### Navigate with Menu
+
+Once you open the *Apple* Developer site for Certificates: [link](https://developer.apple.com/account/resources/certificates/list), you can move around in the menu to get to Certificates, Identifiers, Keys and Profiles.
+
+You can navigate between these items by clicking on the links.
+
+* Certificates (previous section)
+* Identifiers (you used those when adding the App Group)
+* Keys
+ * Access to the *Apple* Push Notification Keys used by people to enable remote control using Nightscout, LoopCaregiver or LoopFollow
+ * The `FastLane API Key` is at the App Store Connect site - not at this site
+* Profiles (next section)
+
+### Delete Invalid Profiles
+
+You should not need to delete invalid profiles for Loop, LoopCaregiver, LoopFollow and Trio when you have the `ENABLE_NUKE_CERTS` variable set to true. If a mentor suggests you do this, follow these instructions.
+
+This step is done at the *Apple* Developer site; click on this [link](https://developer.apple.com/account/resources/profiles/list).
+
+Your profiles will be displayed. Under the `Expiration` column, you might see an expiration date, even if some of these are invalid because you just revoked a certificate, or you might see `Invalid`.
+
+1. Click on the `Edit` button to open a new window
+
+ > {width="500"}
+
+
+2. Select invalid profiles - if all are invalid, click all profiles at upper left
+3. Click on the `Delete` button to revoke selected profiles
+
+ > {width="500"}
+
+4. Review the profiles - note that in this view, the full name of each profile is visible - and then click on the `Delete` button
+
+ > {width="500"}
+
+### Delete `Match-Secrets`
+
+Make sure you really need to do this - please [ask a mentor for help](#where-to-get-help-with-browser-build).
+
+Make sure you only delete `Match-Secrets`. Do NOT delete the repository of the app you are trying to build.
+
+When building Loop, LoopCaregiver, LoopFollow or Trio:
+
+* If you just revoked a [Distrbution Certificate](#revoke-distribution-certificate) - try building first before you delete your `Match-Secrets`
+* Make sure you have `ENABLE_NUKE_CERTS` set to true
+* The next time you try to build, the information in Match-Secrets is used to remove invalid profiles
+ * A new Distribution Certificate and new profiles will be generated and your Match-Secrets will be updated
+
+When building apps that do not use `ENABLE_NUKE_CERTS`, like xDrip4iOS, you may need to manually delete your profiles and your Match-Secrets repository before trying to run Create Certs followed by Build.
+
+Open the *GitHub* website for your organization or personal account.
+
+``` {.text .copy title="If you use an organization" }
+https://github.com/my-name-org/Match-Secrets
+```
+
+``` { .text .copy title="If you do not use an organization" }
+https://github.com/my-name/Match-Secrets
+```
+
+1. Delete your `Match-Secrets` `Repository`
+ * Click on Settings
+ * Scroll to the bottom (into the Danger Zone)
+ * Choose `Delete this repository`
+ * Read and follow directions to delete
+2. The next action you run will automatically create a new Match-Secrets repository for you
### Delete Identifiers
@@ -835,7 +911,7 @@ These instructions are useful if:
The `Identifier` that is associated with the `Loop` identifier cannot be deleted if it is already in the *App Store* but all others can. If you attempt to delete the `XC` *Loop* identifier, you may be told it cannot be deleted because it is in use in the app store. That's OK. If a `Bundle ID` has ever been associated with an app in the *App Store*, you cannot delete the `Identifier`.
-* Open this link: [Certificates, Identifiers & Profiles: Identifiers List](https://developer.apple.com/account/resources/identifiers/list){: target="_blank" } on the *Apple Developer* site.
+* Open this link: [Certificates, Identifiers & Profiles: Identifiers List](https://developer.apple.com/account/resources/identifiers/list) on the *Apple Developer* site.
* Use the graphic below as a guide to removing identifiers
* Keep repeating the steps until you've removed all the identifiers you can (or want to) delete
* It is OK to delete an identifier even if it does have your correct `TEAMID`
@@ -848,7 +924,7 @@ The `Identifier` that is associated with the `Loop` identifier cannot be deleted
{width="700"}
{align="center"}
-If coming here because you enter the wrong `TEAMID` in `Secrets` - return to [Rerun Steps with Correct TEAMID](#rerun-steps-with-correct-teamid) when you've deleted as many identifiers as you can.
+If coming here because you entered the wrong `TEAMID` in Secrets - return to [Rerun Steps with Correct TEAMID](#rerun-steps-with-correct-teamid) when you've deleted as many identifiers as you can.
After you delete identifiers, you must add them back before you can build a given app. Configure them and build again.
@@ -858,9 +934,9 @@ You can use the same GitHub account with a new developer ID. This is an uncommon
Here are the steps:
-1. Update the 4 secrets that are associated with the Apple Account for each repository on the GitHub used for browser build:
+1. Update the 4 Secrets that are associated with the Apple Account for each repository on the GitHub used for browser build:
* TEAMID
* FASTLANE_ISSUER_ID
* FASTLANE_KEY_ID
* FASTLANE_KEY
-1. Once the Secrets are updated, start at the [Identifiers](identifiers.md){:target="_blank"} page and work through the process for each app
+1. Once the Secrets are updated, start at the [Identifiers](identifiers.md){:target="_blank"} page and work through the process for each app
diff --git a/docs/browser/bb-overview.md b/docs/browser/bb-overview.md
index 3aff607a497..6aa6fca792f 100644
--- a/docs/browser/bb-overview.md
+++ b/docs/browser/bb-overview.md
@@ -1,11 +1,27 @@
## Build with a Browser
-* Loop 3 can be built with a web browser using GitHub Actions
-* The app is then installed by you on your phone using the *TestFlight* app
-* If you prefer to use *Xcode* on your *Mac*, head over to [Build with *Mac*](../build/overview.md){: target="_blank" }
-* As long as you use the same *Apple Developer* account, the app you build is the same regardless of build method
+Loop 3 can be built with a web browser using GitHub Actions and installed on your phone using the *TestFlight* app. This method works on any device with a browser (PC, Mac, tablet, or iPad) - no Mac computer required.
+
+!!! success "Same App, Different Method"
+ * If you prefer to use *Xcode* on your *Mac*, see [Build with *Mac*](../build/overview.md){: target="_blank" }
+ * As long as you use the same *Apple Developer* account, the app you build is identical regardless of build method
* When you install the app on your phone, settings and history are preserved; pump and CGM remain attached; selected Services are maintained
+## Is This Method Right for You?
+
+**Choose Browser Build if:**
+
+- [x] You don't have a Mac or prefer not to use one
+- [x] You want automatic monthly builds (after initial setup)
+- [x] You're comfortable following step-by-step instructions with multiple accounts (Apple, GitHub)
+- [x] You can dedicate 2-4 hours for first-time setup (spread over several days)
+
+**Choose Mac Build if:**
+
+- [x] You already have an up-to-date Mac and are comfortable with Xcode
+- [x] You prefer building locally without cloud services
+- [x] See [Build with Mac](../build/overview.md){: target="_blank" } for Mac requirements
+
## Requirements
### Phone, CGM and Pump
@@ -24,23 +40,28 @@ To build the _Loop_ app using a browser, y
1. Free *GitHub* account: (instructions found at [New *GitHub* Account](secrets.md#new-github-account){: target="_blank" })
1. Paid *Apple* Developer account: ($99/year; instructions found at [*Apple* Developer Account](../build/apple-developer.md){: target="_blank" })
-## Instructions to Build with a Browser
+## Getting Started: Two Paths
+
+Choose the path that matches your experience level:
-### The Short Version
+### 🟢 Path 1: Detailed Step-by-Step (Recommended for First-Time Builders)
-Complete instructions are found at this link for those comfortable with using *GitHub* and navigating the *Apple Developer* and *Apple App Connect* pages.
+Follow the detailed instructions below with screenshots, explanations, and help at every step.
-* [Using GitHub Actions + FastLane to deploy to TestFlight](https://github.com/LoopKit/LoopWorkspace/blob/main/fastlane/testflight.md){: target="_blank" }
+**Start here:** [Introduction and Summary](intro-summary.md){: target="_blank" }
-### How-to Video to Build with a Browser
+### 🔵 Path 2: Quick Reference (For Experienced Users)
-In addition to the pages linked below in [Configure to use Browser](#configure-to-use-browser), there is a narrated video of each step needed to build using a browser. (This video shows build steps for version 3.2.3 or older. Some items are simplified for version 3.4.1 and newer.)
+If you're comfortable with GitHub and Apple Developer portals, use the condensed version:
-* [How to Build the *Loop* App With a Web Browser](https://www.youtube.com/watch?v=kiu5ho0MTW8){: target="_blank" }
+* **Documentation:** [Using GitHub Actions + FastLane to deploy to TestFlight](https://github.com/LoopKit/LoopWorkspace/blob/main/fastlane/testflight.md){: target="_blank" }
+* **Video Guide:** [How to Build Loop With a Web Browser](https://www.youtube.com/watch?v=kiu5ho0MTW8) (shows version 3.2.3; some steps simplified in 3.4.1+, others added when an *Apple* interface was changed))
-### Configure to use Browser
+---
-The steps on these pages must be completed for you to build an app using a browser:
+## Step-by-Step Build Process
+
+The following pages guide you through the complete browser build process:
1. [Introduction and Summary](intro-summary.md){: target="_blank" }
1. [Collect Secrets](secrets.md){: target="_blank" }
@@ -52,82 +73,89 @@ The steps on these pages must be completed for you to build an app using a brows
1. [Prepare *TestFlight* Group](tf-users.md){: target="_blank" }
1. [Build the *Loop* App](build-yml.md){: target="_blank" }
-The pages of instructions listed above give detailed steps on how to build the *Loop* app. If you are building a different app, you can follow the detailed instructions but will need to know the Fork, App Name, Identifiers and in some cases App Group for the App you intend to build. Once you build one app, subsequent apps are much easier to build.
+---
+
+## After Building: Next Steps
-* [Build Other Apps with Browser](other-apps.md){: target="_blank" }
+Once your build completes successfully:
-## Install on Phone
+1. **[Install on Phone](phone-install.md){: target="_blank" }** - Use TestFlight to install the app on your iPhone
+2. **[Update/Rebuild](bb-update.md){: target="_blank" }** - Learn how to update your app (much easier than initial build!)
+3. **[Build Other Apps](other-apps.md){: target="_blank" }** - Optional: Build LoopCaregiver, LoopFollow, or other apps using the same setup
-Instructions to install on a phone are found at:
+---
-* [Install on Phone](phone-install.md){: target="_blank" }
+## Need Help?
-## What if I get stuck?
+!!! question "Stuck? Don't Get Frustrated!"
+ First-time setup involves many steps across different websites. If something isn't working:
-!!! important "How to Ask for Help"
- First time setup should take several hours, but if you are having trouble:
+ **→ [Get Help from Mentors](bb-errors.md#help-with-errors){: target="_blank" }**
- * [Click here to find help](bb-errors.md#help-with-errors){: target="_blank" }.
+ Just provide your GitHub repository link and a brief description. Mentors can view your logs and guide you.
-If you want to solve it yourself, try to:
+**Common troubleshooting resources:**
-* Scroll back in the directions and see if you missed a paragraph or step
- * Be sure you are copying the exact **names** needed for each step or clicking on the **link** associated with a particular step - many pages look similar
-* Compare your display with the graphics in *LoopDocs*
- * Is something different or does yours have an error message?
- * Does the [Error](bb-errors.md){: target="_blank" } message guide you to the problem and solution?
- * Be aware that *GitHub* sometimes updates displayed names or locations for menu items - search for *GitHub* directions if your display looks different than our documentation
+* [Most Common Mistakes](bb-errors.md#most-common-mistakes){: target="_blank" }
+* [Complete Error Reference](bb-errors.md){: target="_blank" }
+* [How to Find Help](../intro/loopdocs-how-to.md#how-to-find-help)
-## Errors while Configuring and Building
+!!! warning "Please DON'T..."
+ * Search Google or ask ChatGPT about your error
+ * Spend hours frustrated
+ * Delete your repository or GitHub account
+ * Remove your app from App Store Connect
-If you get an error that you cannot figure out, reach out for help before you get frustrated or begin to delete things - let a mentor help you:
+ **→ Ask a mentor instead!** They can quickly diagnose issues from your repository link.
-* General instructions: [How to Find Help](../intro/loopdocs-how-to.md#how-to-find-help)
-* Browser Build instructions:
- * [Help with Errors](bb-errors.md#help-with-errors){: target="_blank" }
- * [Most Common Mistakes](bb-errors.md#most-common-mistakes){: target="_blank" }
- * With Browser Build, post your *GitHub* LoopWorkspace link and a brief description of your problem
+---
-* [Errors with Browser](bb-errors.md){: target="_blank" }
+## Additional Topics
-## Update the App
+### Automatic Updates
-Instructions to make updates are found at:
+!!! success "Check Status of Build Action Monthly"
+ The automatic build actions should occur every Sunday. They do for all OS-AID apps except for *Loop*, and even for *Loop*, some people are getting automatic builds. ([We do not know why.](https://github.com/orgs/community/discussions/181236))
-* [Update with Browser](bb-update.md){: target="_blank" }
+ * Keep your Apple Developer account active
+ * Install updates from TestFlight when ready
+ * **Note:** Starting May 2025, you may need to [manually trigger builds](automatic.md#manual-action-for-automatic-build){: target="_blank" } every 60 days
-There is also a helpful video for this process. Once again, this was prepared for an earlier version 3.2.3 or older. With version 3.4.1 and newer, the update and build is automatic if your *Apple* Developer account is active, agreements are signed and certificates are valid:
+ Learn more: [Automatic Update & Build](automatic.md){: target="_blank" }
-* [How to Update and Rebuild DIY Loop with a Web Browser](https://www.youtube.com/watch?v=0ipTsiqbbrQ){: target="_blank" }
+### Customization
-> With `Loop 3.6.0`, certificates are automatically created and renewed. You no longer need to renew certificates as a separate step.
+Want to customize your Loop app? Both methods are supported:
-## Other Topics
+* [Customize using Browser](custom-browser.md){: target="_blank" } - Configuration changes
+* [Custom Edits with Browser](edit-browser.md){: target="_blank" } - Code modifications
-### Building the Development Version of the App
+### Development Version
-For experienced and/or advanced users who want to build the development version of the app, there is additional information at the link below. If you have not built using the browser build method before, it is suggested you first build the released version. Once you have a successful build, then follow the steps for the development version. Building the app is independent of installing the app on your phone from *TestFlight*.
+For advanced users who want cutting-edge features before official release:
* [Build Development Version](build-dev-browser.md){: target="_blank" }
-### Mac vs Browser
-
-These considerations were prepared when most people were using a Mac computer to build the *Loop* app.
-
-* *Mac* computer is not required to build or install the app
- * Anything with a browser works to build the *Loop* app: PC, Tablet, Mac or iPad
- * The *TestFlight* app is used to install the *Loop* app on your iPhone
-* Compatible version of *Xcode* is provided by *GitHub*
- * The time required for the initial setup to build with a browser may take less time than one *macOS* and *Xcode* version update for those using [Build with *Mac*](../build/overview.md)
-* Automatic Updates are loaded into *TestFlight*
- * With version 3.4 and newer, builds are automatically prepared at least once a month
- * You choose when to install the new app from TestFlight onto your phone
- * **WARNING:** starting May 2025, [Manual Action for Automatic Build](automatic.md#manual-action-for-automatic-build){: target="_blank" } may be required - be sure to check monthly to see if you need to start a build manually
-* Manual Updates are easy
- * Starting an update takes a few minutes of your time; it can be done from your phone; the rest is automatic and is done in about an hour
-* After the *GitHub* Build starts, your app is ready to install on your *iPhone* in about an hour
-* The app is delivered to your phone via *TestFlight*
- * The app is considered "Beta" by *Apple* and expires after 90 days
- * Loop 3.4 and newer versions provide automatic build as the default
-* Customization methods are documented at [Customize with Browser](custom-browser.md){: target="_blank" }
+!!! tip "Build Stable First"
+ We recommend building the stable release version first. Once successful, you can switch to the development version.
+
+### Comparison: Browser vs Mac Build
+
+| Feature | Browser Build | Mac Build |
+|---------|--------------|-----------|
+| **Device Required** | Any device with browser | Mac with recent macOS |
+| **Xcode Required** | No (GitHub provides) | Yes (must update regularly) |
+| **Initial Setup Time** | 2-4 hours over several days | 1-2 hours (if Mac is ready) |
+| **Monthly Updates** | Automatic orSecrets are incorrect - that is very unlikely. You may also need to update your credit card information if it has changed, for example, if there is a new expiration date.
+Sign in to your [Apple Developer account](https://developer.apple.com/account). If there are agreements you have not accepted, you will get errors when you try to Build that indicate your *Apple* Secrets are incorrect - that is very unlikely. You may also need to update your credit card information if it has changed, for example, if there is a new expiration date.
* For an update, you do not need to modify the FASTLANE_ISSUER_ID, FASTLANE_KEY_ID or FASTLANE_KEY
* Check your *Apple* Developer account for agreements, then continue
-If you need detailed instructions, click on this [Apple Program License Agreement Help Page](https://support.pushpay.com/s/article/Accepting-the-Apple-Program-License-Agreement){: target="_blank" }.
+If you need detailed instructions, click on this [Apple Program License Agreement Help Page](https://support.pushpay.com/s/article/Accepting-the-Apple-Program-License-Agreement).
* Accept the `Apple Program License Agreement` (only)
* You do NOT need to accept anything related to the `Paid Applications Schedule Agreement`
@@ -117,6 +117,97 @@ Digital Service Act Compliance
Open your *GitHub* account and select your LoopWorkspace repository from your repositories list.
+### Update from 3.2.x to 3.4
+
+This should only be necessary if you are changing from an older, Mac-Xcode build of version 3.2.x to a Browser Build of 3.6.x. Most people are updating from 3.4.x to 3.6.x and should skip ahead to [Special Instructions for 3.6.0](#special-instructions-for-360).
+
+For the update from 3.2.x to 3.6, you must do more than "just" build. If you skip this step - the build will fail.
+
+* The `Identifier` for the "`widget`" changed from "`SmallStatusWidget`" to the more descriptive "`LoopWidgetExtension`"
+
+> If you built version 3.3.0 (the `dev branch` before release of version 3.4) or newer, you can skip ahead to [Special Instructions for 3.6.0](#special-instructions-for-360).
+
+You will (1) run [`Add Identifiers`](#add-identifiers), (2) [add the `App Group`](#add-app-group-to-new-identifier) to the new identifier, (3) run [`Create Certificates`](#create-certificates) and then (4) run [`Build Loop`](#build-the-app).
+
+#### Add Identifiers
+
+In your fork of LoopWorkspace:
+
+* Run the Action: `Add Identifier`
+* Wait for it to succeed
+
+??? tip "Detailed instructions for `Add Identifier` (Click to open/close)"
+ Refer to the graphic below for the numbered steps:
+
+ 1. Click on the `Actions` tab of your LoopWorkspace repository
+ 1. On the left side, click on 2. Add Identifiers
+ 1. On the right side, click `Run Workflow` to show a dropdown menu
+ * You will see your default branch (typically this is `main`)
+ 1. Tap the green button that says `Run workflow`.
+
+ {width="700"}
+ {align="center"}
+
+ The `Add Identifiers` Action should succeed or fail in a few minutes. Do not continue to the next step until this one succeeds.
+
+ * If you see the green check (:octicons-check-circle-fill-16:{: .passed }) continue to the next section
+ * If you see the red `X` (:octicons-x-circle-fill-16:{: .failed }):
+ * [Action: Add Identifiers Errors](bb-errors.md#action-add-identifiers-errors){: target="_blank" } tells you what to search for in the file
+ * Resolve the error and repeat `Add Identifiers`
+
+#### Add `App Group` to New `Identifier`
+
+Open the [Certificates, Identifiers & Profiles: Identifiers List](https://developer.apple.com/account/resources/identifiers/list){: target="_blank" } page.
+
+Click on the "`LoopWidgetExtension`" identifier to open the `Edit Your App ID Configuration` screen.
+
+| `NAME` | `IDENTIFIER` |
+|-------|------------|
+| `Loop Widget Extension` | `com.TEAMID.loopkit.Loop.LoopWidgetExtension` |
+
+The graphic below has numbered steps that match these directions:
+
+1. Looking at the `App Services` column, scroll down to the `App Groups` row and ensure the check box (under the `Capabilities column`) for `App Groups` is checked
+2. If the word `Configure` shows up, tap on it
+ * This opens the `App Group Assignment` screen
+ * If it said `Edit` instead of `Configure` - you can click to confirm you have the correct App Group but won't need to continue or save if it is correct
+3. Check the box by `Loop App Group` that uses your `TEAMID` in `group.com.TEAMID.loopkit.LoopGroup`
+ * Note that if you previously built with Xcode, the name may be different, i.e., `XC group com TEAMID loopkit LoopGroup`
+4. Tap `Continue`
+5. Tap `Save`
+
+{width="700"}
+{align="center"}
+
+If you did not need to make changes, the `Save` button will not be active.
+
+* Tap on the `< All Identifiers` link at the top left
+
+The full list of Identifiers should be displayed again.
+
+!!! note "Other Identifiers"
+ All other identifiers should be already set up.
+
+ * If they are not, refer to [Configure to Use Browser: Add App Group to Identifiers](prepare-app.md#add-app-group-to-identifiers){: target="_blank" }
+
+#### Create Certificates
+
+You must run the action `Create Certificates` again because the `Identifiers` were updated. Wait for this to succeed before trying to build.
+
+???+ tip "Detailed instructions (Click to open/close)"
+ Refer to the graphic below for the numbered steps:
+
+ 1. Click on the "Actions" tab of your LoopWorkspace repository
+ 1. On the left side, click on "`Create Certificates`"
+ 1. On the right side, click "`Run Workflow`" to show a dropdown menu
+ * You will see your default branch (typically `main`)
+ 1. Tap the green button that says "`Run workflow`".
+
+ {width="700"}
+ {align="center"}
+
+ 1. Wait a minute or two for the action to finish
+
### Special Instructions for 3.6.0
When updating to version 3.6.0, there are two "extra" things to do.
@@ -302,7 +393,7 @@ If your `Personal Access Token` has expired or has an expiration date, you can r
You can regenerate your *GitHub* `Personal Access Token` at any time by clicking on the link below. (it will open in a new browser tab.)
-* [Link to access your *GitHub* Personal Access Token](https://github.com/settings/tokens){: target="_blank" }
+* [Link to access your *GitHub* Personal Access Token](https://github.com/settings/tokens)
The `FastLane Access Token` is a clickable link.
@@ -352,7 +443,7 @@ Scroll all the way to the top of the screen and tap on your LoopWorkspace link.
### Add Test Details to *TestFlight*
-About half an hour after the build action completes, the new build will appear in the TestFlight screen at this link: [App Store Connect / Apps](https://appstoreconnect.apple.com/apps){: target="_blank" }
+About half an hour after the build action completes, the new build will appear in the TestFlight screen at this link: [App Store Connect / Apps](https://appstoreconnect.apple.com/apps)
* Log in if needed
* Select your *Loop* app
@@ -370,15 +461,6 @@ Click inside the box under **Test Details**. Insert the text you want to see on
In this example, the branch and commit number are included followed by an indication that this version includes the customizations preferred by this person. Your test details can be as simple as "Use this for Charlie".
-!!! tip "Commit Number"
- If your build includes customizations, your commit number will not match what the developer expects to see if you need to ask for help.
-
- Use this section [Customization and SHA-1](edit-browser.md#customization-and-sha-1) to determine the SHA-1 before customization.
-
-## No Longer Needed
-
-This section contains the old directions to manually renew certificates. It is no longer needed with the automatic certificate renewal method found in `Loop 3.6.0` and newer versions.
-
## Renew Certificate
Manual certificate renewal is not longer required if you added the `Variable` `ENABLE_NUKE_CERTS`. See [Add Variable](prepare-fork.md#add-variable){: target="_blank" }.
@@ -402,9 +484,11 @@ Manual certificate renewal is not longer required if you added the `Variable` `E
### Manual Steps to Renew Your `Distribution Certificate`
-Manual certificate renewal is not longer required if you added the `Variable` `ENABLE_NUKE_CERTS`. See [Add Variable](prepare-fork.md#add-variable){: target="_blank" }.
+> If you are coming here because you build an app, like *xDrip4iOS*, without automatic renewal, these steps will work for you.
+
+Manual certificate renewal is no longer required if you added the `Variable` `ENABLE_NUKE_CERTS`. See [Add Variable](prepare-fork.md#add-variable){: target="_blank" }.
-1. Use this link to view your [Apple Developer Certificates](https://developer.apple.com/account/resources/certificates/list){: target="_blank" }
+1. Use this link to view your [Apple Developer Certificates](https://developer.apple.com/account/resources/certificates/list)
* If your screen shows no Certificates and you see a message "Getting Started with Certificates", your certificate already expired and was removed by *Apple*; so skip ahead to Step 2: Navigate to your `Match-Secrets` Repository
* Carefully examine the `Type` column - do **not** delete a certificate with type of `Development`
* If you do not have any rows that say the type is `Distribution`, your certificate already expired and was removed by *Apple*; so skip ahead to Step 2
@@ -430,7 +514,7 @@ Manual certificate renewal is not longer required if you added the `Variable` `E
{align="center"}
!!! question "Deleting the certs/distribution folder did not work for me"
- Some people reported trouble with this step. The other option is to delete and create a new `Match-Secrets` repository: see [Reset `Match-Secrets`](bb-errors.md#reset-match-secrets){: target="_blank" }
+ Some people reported trouble with this step. The other option is to delete and create a new `Match-Secrets` repository: see [Delete `Match-Secrets`](bb-errors.md#delete-match-secrets){: target="_blank" }
1. While still within your *Github* account, navigate to your fork of LoopWorkspace.
* You can do this several ways, but one method is demonstrated by the GIF below
diff --git a/docs/browser/build-dev-browser.md b/docs/browser/build-dev-browser.md
index b28e7b2521f..74aeca1f409 100644
--- a/docs/browser/build-dev-browser.md
+++ b/docs/browser/build-dev-browser.md
@@ -1,6 +1,6 @@
## Overview
-**This page is only relevant when building the `dev` branch with a browser.**
+**This page is only relevant when building the `dev` (or a feature) branch with a browser.**
**For *Mac*, please see: [Build Loop `dev` with *Mac*](../build/build-dev-mac.md)**
@@ -28,7 +28,6 @@ The graphics on this page show the `dev` branch. If you want a different branch,
* You cannot just rename your existing branch to `dev` - you must get the `dev` branch from LoopKit
1. When you select the action `4. Build Loop` and then click on the `Run Workflow` dropdown, you must select `dev` there before clicking the green `Run workflow` button - see [Build `Branch`](#build-branch)
-
### Check Current `Branch`
Your `LoopWorkspace fork` is at `https://github.com/username/LoopWorkspace` where you substitute your actual *GitHub* `username`. You need to be logged into *GitHub*. Review the graphic below as you go through the steps.
@@ -36,19 +35,39 @@ Your `LoopWorkspace fork` is at `https://github.com/username/LoopWorkspace` wher
1. Click on the `branch` icon to display the `branches` as shown in the lower half of the graphic below:
* If the `branch` you want is not listed, then continue with Step 2
* Otherwise, skip ahead to [Update `Branch`](#update-branch)
-1. Click on the `New branch` button and follow the [Add `Branch`](#add-branch) steps
+1. Click on the `New branch` button
+ * To add the `dev` branch, go to the [Add `Branch`](#add-branch) instructions
+ * To add a feature branch, start with [Feature `Branch`](#feature-branch) before continuing with the add `branch` instructions
{width="700"}
{align="center"}
+### Feature `Branch`
+
+If you're building `dev`, you can skip ahead to [Add `Branch`](#add-branch). If you're building a feature branch, copy the branch name into your paste buffer to minimize typographical errors.
+
+
+``` { .bash .copy title="Add Dana and Medtrum pumps to dev branch" }
+feat/dev-dana-medtrum
+```
+
+``` { .bash .copy title="Add Dana and Medtrum pumps, Eversense CGM to dev branch" }
+feat/eversense
+```
+
+``` { .bash .copy title="Add Dana, Medtrum and All Omnipod Types, Eversense CGM to dev branch" }
+feat/omnipodkit
+```
+
### Add `Branch`
Each step in the list below matches with the number in the graphic. In the top half of the graphic, the left side shows the initial display and the right side shows the display after making the indicated selections:
1. Click on the drop down menu labeled 1 in the graphic and choose LoopKit/LoopWorkspace as show in the top right graphic
2. Click on the drop down menu labeled 2 in the graphic and choose `dev`
-3. Click on the `Branch` name box labeled 3 in the graphic and type `dev`
- * The branch name in your `fork` should always match the branch name you are adding; check that you type it correctly
+3. Click on the `Branch` name box labeled 3 in the graphic and type `dev` or paste the feature branch name from your paste buffer
+ * The branch name in your `fork` should always match the branch name you are adding - it is best to use a paste buffer (to minimize typographical errors)
+ * See [Feature Branch](#feature-branch) if you need to fill your paste buffer
4. Review the dialog items to make sure everything is correct and then tap on Create branch
{width="700"}
@@ -95,6 +114,10 @@ The [Automatic Update & Build](automatic.md){: target="_blank" } features are ap
Most people should keep `main` as default and make a considered decision when to launch a manual build of the `dev` branch. At that time, it will automatically update to the latest `dev` commit unless you have modified your settings with special `Variables`: [Modify Automatic Building](automatic.md#modify-automatic-building){: target="_blank" }.
+> The automatic build actions should occur every Sunday. They do for all OS-AID apps except for *Loop*. ([We do not know why.](https://github.com/orgs/community/discussions/181236))
+
+> See [Manual Enable for Build Action](bb-errors.md#manual-enable-for-build-action-may-be-required){: target="_blank" }
+
## Change Default `Branch`
> **We recommend most users leave their default branch as `main`.**
@@ -148,14 +171,14 @@ As soon as you build one version of the app from the `dev` branch, that version
Suppose you then return to using the `main` branch after your excursion to the `dev` branch.
-> *For this example, version 3.6.x is the released version from the `main` branch and version 3.7.0 is the development version you evaluated.*
+> *For this example, version 3.6.x is the released version from the `main` branch and version 3.7.x is the development version you evaluated.*
-Every time you open TestFlight on your phone and select the *Loop* app, it will offer the most recent 3.7.0 version to be installed if you just tap **Install**. You might be in a situation where that build is about to expire or you decide you don't want to test this on your looping phone.
+Every time you open TestFlight on your phone and select the *Loop* app, it will offer the most recent 3.7.x version to be installed if you just tap **Install**. You might be in a situation where that build is about to expire or you decide you don't want to test this on your looping phone.
You have your choice:
-* You can manually go into TestFlight each time `main` is automatically built, Select Previous Builds, then choose 3.6.x and install the top listing
-* You can log in at: [App Store Connect: Apps](https://appstoreconnect.apple.com/apps){: target="_blank" }
+* You can manually go into TestFlight on your phone each time `main` is automatically built, Select Previous Builds, then choose 3.6.x and install the top listing
+* You can log in at: [App Store Connect: Apps](https://appstoreconnect.apple.com/apps)
* Select your *Loop* app
* Click on the TestFlight tab
* For each 3.7 build, click on the row for a build
diff --git a/docs/browser/build-yml.md b/docs/browser/build-yml.md
index 5ae316404cc..94d6f91073f 100644
--- a/docs/browser/build-yml.md
+++ b/docs/browser/build-yml.md
@@ -1,3 +1,9 @@
+!!! abstract "Progress: Step 7 of 7"
+ **📍 You are here:** Build the Loop Appfork back to the original version that everyone uses. These changes are for you only. Ignore those prompts.
+ Of course, accidents happen. No worries.
+
+ * Just hit the Close button
+ * If you don't close the accidental PR yourself, it will be closed for you, but that takes time
+
## Overview
!!! info "Time Estimate"
@@ -43,7 +48,7 @@
* If there is an update (new release) and the customization applies with no errors, then you do NOT need to create an update
* It is a good idea to test each customization as soon as you install the new build on your phone
* LoopDocs: Decide on Modules to modify using the [Version: Custom Edits](../version/code-custom-edits.md){: target="_blank" } page
- * You only need to create your own customization if what you want is not provided at [Loop and Learn: Customization List](https://www.loopandlearn.org/custom-code#custom-list){: target="_blank" }
+ * You only need to create your own customization if what you want is not provided at [Loop and Learn: Customization List](https://www.loopandlearn.org/custom-code#custom-list)
* If there are customization not provided by the Customization List, then you need to make personalized edits
* This current page explains how to make the edits using a browser
* The [Version: Custom Edits](../version/code-custom-edits.md){: target="_blank" } gives instructions on identifying the Module, finding the file and editing the line(s)
@@ -81,11 +86,11 @@ Decide which [Version: Custom Edits](../version/code-custom-edits.md){: target="
* Do not get confused later: LoopKit is both a username and a Module name
* Refer to the [Module Table](#module-table) when directed
-For versions 3.4.x and newer, the customizations for `main` and `dev` are the same.
+> For versions 3.4.x, the customizations for `main` and `dev` are the same.
+
+> When moving from v3.4 to v3.6, several items that used to require customization are no longer needed. They are included in v3.6.
-* For more information, refer to [Not Stable List](../version/code-custom-edits.md#not-stable-list){: target="_blank" }
- * Glucose Guardrails
- * Adjust Future Carbs Time Interval
+> For versions 3.6.x and newer, the customizations for `main` and `dev` are the same.
## Outline of What Happens in the Module
@@ -115,7 +120,7 @@ This is fairly rare, but it can happen. A user got this error when editing a fil
{width="600"}
{align="center"}
-The solution was to make sure the email address in their GitHub profile was correct. See [GitHub Discussions](https://github.com/orgs/community/discussions/62507){: target="_blank" } for more information.
+The solution was to make sure the email address in their GitHub profile was correct. See [GitHub Discussions](https://github.com/orgs/community/discussions/62507) for more information.
## Create your `Fork` for Selected Module
@@ -155,10 +160,10 @@ This table lists all the modules referred to on the Code Customization page link
| Module | `Fork` From |
| --- | --- |
-| Loop | [https://github.com/LoopKit/Loop](https://github.com/LoopKit/Loop){: target="_blank" } |
-| LoopKit | [https://github.com/LoopKit/LoopKit](https://github.com/LoopKit/LoopKit){: target="_blank" } |
-| OmniBLE (for DASH) | [https://github.com/LoopKit/OmniBLE](https://github.com/LoopKit/OmniBLE){: target="_blank" } |
-| OmniKit (for Eros) | [https://github.com/LoopKit/OmniKit](https://github.com/LoopKit/OmniKit){: target="_blank" } |
+| Loop | [https://github.com/LoopKit/Loop](https://github.com/LoopKit/Loop) |
+| LoopKit | [https://github.com/LoopKit/LoopKit](https://github.com/LoopKit/LoopKit) |
+| OmniBLE (for DASH) | [https://github.com/LoopKit/OmniBLE](https://github.com/LoopKit/OmniBLE) |
+| OmniKit (for Eros) | [https://github.com/LoopKit/OmniKit](https://github.com/LoopKit/OmniKit) |
Remember - you can only have a single fork of a given GitHub repository. If you already have a fork, you don't need another one; but it must be a linked to the URL listed the [Module Table](#module-table).
@@ -176,49 +181,6 @@ When you "fork a repository", the default
| LoopKit/OmniBLE | dev |
| LoopKit/OmniKit | main |
-## Create `branch` if needed
-
-> With the release of version 3.4.x, this entire section can be skipped. It was needed when LoopWorkspace `dev` used submodules that were quite different from those used by `main`.
-
-??? abstract "Skip for Now (Click to open/close)"
-
- * If the customization you wish to prepare indicates Stable: Yes, you can skip ahead to [Personalized Customization for this Module](#personalized-customization-for-this-module)
- * If you are preparing a customization for the `dev` branch, regardless of the Stable notation, there is no need to create a special `branch`, simply update the default branch to the latest (sync it) and use the current version of the customization when you skip ahead to [Personalized Customization for this Module](#personalized-customization-for-this-module)
- * Otherwise, when you a preparing a customization where the file changed sufficiently between `main` and `dev` and you want to build the `main` branch, you need to create a branch for this Module that is consistent with the version you wish to customize.
-
- ??? abstract "Use only if directed (Click to Open/Close)"
- Open your browser to your https://github.com/my-name-org/Module URL. If you already created the `branch` you need, you do not need to create a new one.
-
- If you are customizing a released version, use the [Table of SHA-1](#table-of-sha-1) under your version number below. Copy the SHA-1 for your Module so you can paste it into the URL in Step 2 below. The suggested branch name is `v-#.#.#` where #.#.# corresponds to the version number for `main`. You will use this in Step 3.3 below.
-
- You should create a `branch` following the numbered steps and watching the GIF. Each Frame in the GIF corresponds to a numbered step below.
-
- 1. Click on URL line as indicated by the arrow
- 1. Add the text `/tree/SHA-1` where you change SHA-1 to be the value in the table below and hit return
- 1. Create a new branch in three steps
- * 3.1: Click on the dropdown under the `branch` icon
- * 3.2: Type the suggested new `branch` name in the blank space
- * 3.3: Click on the create `branch` button
- 1. You should see a screen similar to the example below
- * Do not click on the Create Pull Request button that is marked with a big X
-
- {width="600"}
- {align="center"}
-
- ### Table of SHA-1
-
- This will be updated with each release. You do not need this information now - it is only important when submodules that are modified as part of `dev` branch changes to LoopWorkspace are sufficiently different from the versions used for `main` branch.
-
- #### Version 3.4.1
-
- | Repository | SHA-1 |
- |:--|:-:|
- | `LoopWorkspace` | 8060718e78b44ef45797082817392c1c4b7a7dab |
- | `Loop` | 5c3b01f7e302dca9b8bbb12fd42fdd40ed52d2c1 |
- | `LoopKit` |873b3b7c406cfc982f9061afb5f5e27e88d9208d |
- | `OmniBLE` | 85fc3c6d4805d580acdf6592b220717b6e842558 |
- | `OmniKit` | a80e38b1b7f203014b461f8aff8cead2c067e39d |
-
## Personalized Customization for this Module
Navigate to the file you need to modify (using the instructions to find the lines from the [Version: Custom Edit](../version/code-custom-edits.md#instructions-for-finding-the-lines){: target="_blank" } page).
@@ -231,7 +193,9 @@ Navigate to the file you need to modify (using the instructions to find the line
The folder name is: ` OmniBLE/OmniBLE/OmnipodCommon`Code at upper left
- * If your `fork` is behind the `LoopKit` `repository`, consider updating your `fork`
- * Typically this can be done without changing your customization
- * Because you added customizations, your `fork` will be ahead of the `LoopKit` `repository`
- * An example is shown for the `main` branch in the graphic below - it is one commit ahead of LoopKit as indicated by the message highlighted by the red rectanglecommit history - the history is presented in reverse chronological order
-* Step 3: Look at the commit descriptions for your `fork`; several examples are shown below
- * The last commit made by the developers that is included in your `fork` is the one a mentor will recognize
- * The first example is for `main` with one customization
- * The row highlighted in red is the one a mentor will recognize
- * The 7-digit alpha-numeric identifier for the commit is highlighted in the blue rectangle
- * If you click on the copy icon beside it, the full SHA-1 is captured in your paste buffer but the first 7 characters are sufficient to identify your base version (before customization) to a mentorrepository - note that the SHA-1 here is specific to this repo and does not help a mentor identify the base version of your build
- * The row above the red rectangle is a customization made prior to the sync
- * The top row (above the blue rectangle) is a customizaiton made after the sync
-
- {width="600"}
- {align="center"}
-
-
## Special Cases
### Existing `Fork` for Module
@@ -531,7 +449,7 @@ What if you already have a fork of one of the modules?
* If you know this is a fork you do not care about, you can delete the repository.
* If you care about this fork, you are probably experienced enough to know how to solve the issue.
-Instructions to delete a repository are found at [*GitHub* Docs](https://docs.github.com/en/repositories/creating-and-managing-repositories/deleting-a-repository){: target="_blank" }
+Instructions to delete a repository are found at [*GitHub* Docs](https://docs.github.com/en/repositories/creating-and-managing-repositories/deleting-a-repository)
Once deleted, go to [Create Your `Fork` for Selected Module](#create-your-fork-for-selected-module).
diff --git a/docs/browser/identifiers.md b/docs/browser/identifiers.md
index aa4d253231a..53fa49b931b 100644
--- a/docs/browser/identifiers.md
+++ b/docs/browser/identifiers.md
@@ -1,3 +1,9 @@
+!!! abstract "Progress: Step 4 of 7"
+ **📍 You are here:** Prepare IdentifiersLoopWorkspace fork is an Actions tab. This section provides detailed directions to enable Actions.
@@ -101,6 +107,14 @@ The `Add Identifiers` Action should s
!!! important "Ask For Help Early"
Please if you are having trouble - [ask for help early by clicking on this link](bb-errors.md#help-with-errors){: target="_blank" }.
+---
+
## Next Step
-The next step is to [Prepare the App](prepare-app.md).
+Identifiers created successfully! Now configure them at Apple:
+
+**→ [Step 5: Prepare App](prepare-app.md)**
+
+---
+
+**Navigation:** [← Back: Prepare Fork](prepare-fork.md) | [Next: Prepare App →](prepare-app.md)
diff --git a/docs/browser/img/add-time-sensitive-notifications-loop-identifier.png b/docs/browser/img/add-time-sensitive-notifications-loop-identifier.png
new file mode 100644
index 00000000000..29f7bb441c1
Binary files /dev/null and b/docs/browser/img/add-time-sensitive-notifications-loop-identifier.png differ
diff --git a/docs/browser/img/add-variable.png b/docs/browser/img/add-variable.png
index b02acece24f..8ff8a430cbc 100644
Binary files a/docs/browser/img/add-variable.png and b/docs/browser/img/add-variable.png differ
diff --git a/docs/browser/img/api-key-generate.svg b/docs/browser/img/api-key-generate.svg
new file mode 100644
index 00000000000..0f2b6832b6d
--- /dev/null
+++ b/docs/browser/img/api-key-generate.svg
@@ -0,0 +1,236 @@
+
+
diff --git a/docs/browser/img/api-key-in-process-regen.svg b/docs/browser/img/api-key-in-process-regen.svg
new file mode 100644
index 00000000000..f45b8c4c200
--- /dev/null
+++ b/docs/browser/img/api-key-in-process-regen.svg
@@ -0,0 +1,235 @@
+
+
diff --git a/docs/browser/img/api-key-initial-screen.svg b/docs/browser/img/api-key-initial-screen.svg
index 35e02f3fca8..5c806a55e67 100644
--- a/docs/browser/img/api-key-initial-screen.svg
+++ b/docs/browser/img/api-key-initial-screen.svg
@@ -64,14 +64,14 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.639166"
- inkscape:cx="445.11129"
- inkscape:cy="371.57796"
+ inkscape:cx="446.67582"
+ inkscape:cy="373.1425"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
- inkscape:window-width="1786"
- inkscape:window-height="947"
+ inkscape:window-width="1440"
+ inkscape:window-height="777"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
@@ -133,374 +133,15 @@
width="737"
height="143"
preserveAspectRatio="none"
- xlink:href="data:image/png;base64,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
-7fud+g8227t/l/c/ZzCtagX+Of8LHFwB9QUh1J4AAABWZVhJZk1NACoAAAAIAAGHaQAEAAAAAQAA
-ABoAAAAAAAOShgAHAAAAEgAAAESgAgAEAAAAAQAAAuGgAwAEAAAAAQAAAI8AAAAAQVNDSUkAAABT
-Y3JlZW5zaG90UzZ0zQAAAdZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1s
-bnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDYuMC4wIj4KICAgPHJkZjpS
-REYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMj
-Ij4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6
-ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhl
-bFlEaW1lbnNpb24+MTQzPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4
-ZWxYRGltZW5zaW9uPjczNzwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlVz
-ZXJDb21tZW50PlNjcmVlbnNob3Q8L2V4aWY6VXNlckNvbW1lbnQ+CiAgICAgIDwvcmRmOkRlc2Ny
-aXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoSsYSPAABAAElEQVR4Ae2dB5gUxRZG
-CxEQARUBEQQFVMCcFXPOOWfFnLNPfYZnzjljxgiYFXNOmCOoiIhKDpJBBAR999RuDbXNzO6kXQb2
-v9+3Ox2qqqtPd8/8detWdZ1Jkyb962QiIAIiIAIiIAIiIAIiIAI1RmChGjuSDiQCIiACIiACIiAC
-IiACIuAJSITrRhABERABERABERABERCBGiYgEV7DwHU4ERABERABERABERABEZAI1z0gAiIgAiIg
-AiIgAiIgAjVMQCK8hoHrcCIgAiIgAiIgAiIgAiIgEa57QAREQAREQAREQAREQARqmIBEeA0D1+FE
-QAREQAREQAREQAREQCJc94AIiIAIiIAIiIAIiIAI1DABifAaBq7DiYAIiIAIiIAIiIAIiIBEuO4B
-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
-EAEREAEREAEREAEREIHcCEiE58ZLqUVABERABERABERABESgYAIS4QUjVAEiIAIiIAIiIAIiIAIi
-kBsBifDceCm1CIiACIiACIiACIiACBRMQCK8YIQqQAREQAREQAREQAREQARyI1DnX7Pcsii1CIiA
-CIiACIiACIiACIhAIQTkCS+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAI
-AYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQCC+EnvKKgAiIgAiI
-gAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9o
-yiICIiACIiACIiACIiAChRCQCC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiAC
-IlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQCC+EnvKKgAiI
-gAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAi
-PA9oyiICIiACIiACIiACIiAChRCQCC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiAC
-IiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQCC+EnvKK
-gAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjk
-QUAiPA9oyiICIiACIiACIiACIiAChRCQCC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiAC
-IiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQCC+E
-nvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiI
-gAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQCC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiAC
-IiACIiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQ
-CC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAIAYnwQugprwiIgAiIgAiI
-gAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQCC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYs
-IiACIiACIiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAC
-hRCQCC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAIgYULyVyMvEOHDnX3
-3HNPhaIOP/xwt+KKK1bYllzp0aOH++GHH1Kbl1pqKXfqqaem1rUw/xMYN26cu/nmmyucyPHHH+/a
-tGlTYVsuK48++qgbMGBAhSyUR7kyERABERABERABEagpAnX+Naupg6U7zpdffum22267CruefPJJ
-t80221TYllxBqPfu3Tu1uVOnTu6TTz5JrWth/icwaNAgt95661U4kbfeesutvfbaFbZluzJjxgzf
-uJs6dWqFLPXq1XP9+/d3Sy65ZIXtWhEBERABERABERCB6iKgcJTqIqtyS47AG2+84ZICnEr+/fff
-7sUXXyy5+qpCIiACIiACIiACCy4BifAF99rqzBIEnn766cSWOavPPPPMnBUtiYAIiIAIiIAIiEA1
-E5AIr2bAKr40COABxxMebIkllnCLLLJIWPWhTCNHjkyta0EEREAEREAEREAEqpPAPB+YWZ0nlyx7
-2LBhPvZ3scUWc6ussopr3LhxMkmV68OHD/cDQokjXmaZZdwKK6zgFlooc1tm9uzZFcqsW7euXyc+
-eeDAge6vv/5yq6++umvQoEGFdGGlGHUOZSU/x48f78+FOsKjRYsWySQV1jOdC4koixjuf/75x625
-5poZz6dCgeUrY8eOdUOGDHFclw4dOlTKM13+bLa99NJLDubBdt55Z1/nV1991W+i3s8995w78cQT
-Q5IqP//8809/ztwTiy66qGNcwtJLL11lvjhBMcqgvFzvy7gOLE+fPt0/G6NHj3YdO3Z07du3d3Xq
-1Ekmy7jOvcH1569t27a+jPr162dMrx0iIAIiIAIiUNsJLPAinJkwzjvvPPfNN9+4yZMnp643AmO5
-5ZZz22+/vbvkkksqFY2IxP/+97/unXfecRMmTEiVwQIzaxx22GHulFNOmauMMWPGuM6dO1dI369f
-P/fzzz97sYfgwV544QW36aabptIVo86pwhILo0aN8jy++OILl/T8MsPMBhts4K655hrXqlWrCjkz
-ncviiy/uTj/9dB9TPWvWLJ+HBgVC/LTTTnM77LBDhXLiFQZZXnvtte6rr75KbcY73bVrV3fBBRek
-thVjIRlustNOO1UQ4RyDNNmIcK7fLbfc4p5//nkvXuP6weOYY45xZ5xxhmvYsGG8q8JyMcrI974M
-FaHhceONNzoGQv/222++ARX2NWrUyK266qruf//7n9twww3D5rk+X375ZXf99df7GWfiRg6NVMT8
-EUcc4Y488si58mmDCIiACIiACNR2Agv07Cg9e/Z0Z511lvc2V3ah11prLffII494z3YyHSEMCOw/
-/vgjuavCOqLzsccec61bt05tTydc+/Tp4/bcc0/HvmCxCC9GnUO5yc/333/fHXvssVWeCx7x7t27
-VxBf6c7lu+++84I+eJOTx0OM9+rVy2222WbJXa5bt25eaGeanIcpKu+//363+eabV8ibz+woTHW4
-0korudBIQBzjscULTSMp9vDTOFl++eUrHDNeefbZZ/1UmNOmTYs3z7VML8kTTzzhVltttbn2FaOM
-Qu5LKsT9zL3APVGZIaavuOIK37CI0zGYlcbr3XffHW9Ou3zQQQd5sZ+ptydtJm0UAREQAREQgQWc
-QOY4ivn8xN977z3v1STcIxhhI2usscZcYRd4yQ888MCQLPXJPOQHH3zwXKIVL2EIKwmJv/32W+8R
-D0IvbE9+XnnllRUEeLy/GHWOy4uXf/nlF7f33nvPdS4Io2TYAQJt9913n2s+7bg8lq+66iqXSYCz
-H8/oIYcc4oLHn23Yxx9/7M4//3yXSYCThlCdCy+8kMWCjZlP4uuy9dZb+3jwZs2aec9/fAAEciZj
-CkyEa1UCnPyEh+ABRujHVowyinFfHnrooXMJcHjQII3DqxDb5557rsPjHRs9GEkBTi/GuuuuO1cP
-AI2RSy+9NM5e65b7jZrhnvthshs+6e9ad+7ZnvC7g6Z5Rn/PLps1d9SUWX792xHTsy1C6UqYwPUf
-jHOnvTjKzfpnns6KXMKEil+15DNV/CNkLnFeP7/z8twzU5l7zwIrwh966KEKZ0u8LkL03Xff9bGv
-zJQRi43vv//e/frrrxXyEIISe0nxkL722mu+657u+zvvvNPFca9ff/219/BWKCSx8sorr3gBTzgE
-IQvHHXecQ/xgxahz4nCpVc6X8INgnMtTTz3lz4Vzx9sZG6L13nvvjTfNtYyXG6/5CSec4F+4RNgP
-4RixMSDy888/jze5iy66qMI6K3ikCUHhZTqEMDRp0sR9+OGHc6XLZ0MyFIV48GDxMtuSaUM6xCgv
-9IkZcv9wzvRu4EG/+OKLK4Qk4W2n0RWsGGVQVqH35Y8//jjXNSG8hhCZt99+2/30009uxx13DNX2
-n8kpHJP3Kt5ungk89Jw3dYyN/JU1uuK0uSxf895Yt8tDQyr87f/EMHflO2PdsBISvPd/PsHt9eBQ
-98Hvc5wCuZxnsdPONKF704fj3Vq3/uoWvegnt8QlA9wmd//unvl+TshesY9ZVXknPDfSM5o0vex7
-6rOhf/n1Oz4ZX1XWkt//Uv+p/h69/4uJJV/X6qjgnzP/cee8MMrd9v4494Vd1wXJBo6d4a/trt2H
-uBGTy0Iy4/OjUXlIzxE+TU03KJPPVFyvfJd/nzDTHfn0CLf6LYNc/Qv6uxWu+8Ud9uRw99v4mRWK
-nNfPb3Wce4UTLNLKAhsTjhCIDZHAjBgY4mmrrbZyvPDn9ddfTyXDQ8vAQIztH330UWof4pKwkRBu
-wqBOvOeIMsJVghHWcvLJJ4fVuT7xPFPO+uuvP9e+Qus8V4HRhk8//TRVdzbfeuutbqONNvIpiP8m
-FprBi6QLFr+RNGyLP+GJuKKBE2zjjTd2u+66a1j1n/QShG2IctZja9euneeN8MYQxojA/fffv2Dh
-NmLEiAovcVp44YUrvByKxlAcf44QpVFCPHRsiFPe7hob3uCjjjoqtYkYeOK0aZwFe/PNN32PAevF
-KKMY92XyPoM7PT6hR6R58+busssuc3379k3x517gXufZYVxEcmwEHEK4CR5xxgnQYI17QWAb3yuB
-USGfnw75y738/ZS5injSTXKXvf2He+7Qtm6nzrkPwJ6rwAVoA57ILe4Z7D4ZZL00dZ1bscUibvqs
-f1wfW+/zy5/u9C2bu5t3abkAnfG8P5VfTbhwny7fLL/Byo3+95NrUn8hN+rCjvP+ZKqowXUmtP/7
-2mh3++5LuxO7lL0ArZHV/bxtm7vhJlLXXibzWJkqii7J3Ss2b+Aa1lvIPf3NJHecG+F6d122Qj0v
-N4fA419McNut3Nit2XrOjFwVEs0nK8//OMUdYE6OGX+VNZSbNF7YDRozww0aPcM9+tVE98xhbd1e
-qyw2n5xNaVRzgfWEJ2epQBwjsmNjUBqCK/wROhHss88+C4v+c9ttt60gYsNO4rtjbzjedv4yGV7e
-dAKc9IXWOdMx2c4gwnCefAYBHudJDqJMCq04LcvwSooqBvEh4mIjdjwYXtikR5RX0wcBHtLxxlSE
-YaHGjCfx8Tjvpk2bpoplcG5ScKfzhtNwio1rxYDcpNEg482bNNL4Q4QizLFilFGM+zI56HbKlCm+
-ocAMN8HoKWEQcbhnaJAiwDEapPH0jmy77rrrvAecZYxYchodIT+fyXulLGVx/j9uYnvilSu58Ves
-5HofvZzba83F3UzzqB7Uc7gLntXiHGn+L+XBLyd6Ab6SCYJhF3R0P/9neTfkvyu6z0/r4PhRveXd
-se7r4QoBKaUrPW3GbDfVvMnzg9HL8s/Mf10IKwp1vnqHlu6R/ZZxDRbOftalkLfUP7vt1cot1mRh
-91K/Ke6pfnN6kwhDu/zNMW7RRnVddzv3+dlGT53l9n2sTIB37dLU9T93RTf50k5uon3nnrNNC+ds
-Irj9Hh/u6BmQZU9ggfWEE/fLbCbB8P7tsssufuo1hCKvPueTAXvpjJjk2BCPeM7TGYJj5sw5XTF4
-TJm6MJ2ts8466Tb7bYXWOWPBiR0IQ0IO8EwivJg1hr9YLJMleEYT2VOr6c4FocZgyljIxnHRiLHY
-OEby1fRhf5cuXfxg17Cez2dcD/Lj+U4anve4XsSFMytIfP5J7zF147onjRlmMjXCilFGMe5LpqNs
-2bJlBS81DaG77rrLcV7EdXNtN9lkk7TTeHKN6UkitCoYHnr+iCnneob8ScEf0hf7s1H9Om7xRcoa
-Cbus1Njt0KmRa2ae3UkWV/zer3+63Vcu62WZaML8pf5T3BsDp7oZs/51Wy3fyO2xShPX0sRnbKR7
-+acp7h3zDI+fNtttsfyibudOi7kVms+55h8PnuYe/XqS22/1xd1KS9V3j9jyJ7Zt3TYNfZmrtEw/
-7Wh8HLrmX/l5qvt08F9ujdYN3HYrNHZbrdAoTlL0ZeqNHddlCbfM4nPOZ722Dd0d5r180bxd/OAG
-m22e8/ssjIJzGzF5tlt16QZuD+O5eYdFQxLX3bxgn1mvxIVbNXcIj2ctrGXwxL8dZZ63eTPXuIG5
-3MvtXwsJfmvgn6638R3752y39YqN3BHrlPVShjTJzwnmebvpw7GO7ny8iXuYt22dZSp6Fanna1Yu
-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
-xxYBERCBygikE+GVpdc+EZgXBN6x7vytLZyImW9es14I5qX/Zezf7qr3/vBe7T0szOi5SuZpnxd1
-1jFFoLYQKJmY8NoCXOcpAiIgAiIgAjVFYCuLIT+8yxI+xrbTNQN9fPS/NmYBW8vifO9MM5NFTdVN
-xxGB2k5AnvDafgfo/EVABPIiwHRiDEwj/CSfEJS8DqpMIpAngQ9s4N8H9pKdny22fjmLoV/L4vp3
-7tSk0jCIPA+lbCIgAlkSkAjPEpSSiYAIiIAIiIAIiIAIiECxCJT2iIVinaXKEQEREAEREAEREAER
-EIESIiARXkIXQ1URAREQAREQAREQARGoHQQkwmvHddZZioAIiIAIiIAIiIAIlBABifASuhiqigiI
-gAiIgAiIgAiIQO0gIBFeO66zzlIEREAEREAEREAERKCECEiEl9DFUFVEQAREQAREQAREQARqBwGJ
-8NpxnXWWIiACIiACIiACIiACJURAIryELoaqIgIiIAIiIAIiIAIiUDsISITXjuussxQBERABERAB
-ERABESghAhLhJXQxVBUREAEREAEREAEREIHaQWDheXmaAwYMmJeH17FFQAREQAREQAREQAREYJ4Q
-qPOv2Tw5sg4qAiIgAiIgAgs4gTpn/bCAn+H8c3r/3rjK/FNZ1bRWEJAIrxWXWScpAiIgAiIgAiIg
-AiJQSgQUE15KV0N1EQEREAEREAEREAERqBUEJMJrxWXWSYqACIiACIiACIiACJQSAYnwUroaqosI
-iIAIiIAIiIAIiECtICARXisus05SBERABERABERABESglAhIhJfS1VBdREAEREAEREAEREAEagUB
-ifBacZl1kiIgAiIgAiIgAiIgAqVEQCK8lK6G6iICIiACIiACIiACIlArCEiE14rLrJMUAREQAREQ
-AREQAREoJQIS4aV0NVQXERABERABERABERCBWkFAIrxWXGadpAiIgAiIgAiIgAiIQCkRkAgvpauh
-uoiACIiACIiACIiACNQKAhLhteIy6yRFQAREQAREQAREQARKiYBEeCldDdVFBERABERABERABESg
-VhD4P8xx2U7Ba2naAAAAAElFTkSuQmCC
-"
+ xlink:href="data:image/png;base64,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 7fud+g8227t/l/c/ZzCtagX+Of8LHFwB9QUh1J4AAABWZVhJZk1NACoAAAAIAAGHaQAEAAAAAQAA ABoAAAAAAAOShgAHAAAAEgAAAESgAgAEAAAAAQAAAuGgAwAEAAAAAQAAAI8AAAAAQVNDSUkAAABT Y3JlZW5zaG90UzZ0zQAAAdZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1s bnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDYuMC4wIj4KICAgPHJkZjpS REYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMj Ij4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6 ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhl bFlEaW1lbnNpb24+MTQzPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4 ZWxYRGltZW5zaW9uPjczNzwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlVz ZXJDb21tZW50PlNjcmVlbnNob3Q8L2V4aWY6VXNlckNvbW1lbnQ+CiAgICAgIDwvcmRmOkRlc2Ny aXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoSsYSPAABAAElEQVR4Ae2dB5gUxRZG CxEQARUBEQQFVMCcFXPOOWfFnLNPfYZnzjljxgiYFXNOmCOoiIhKDpJBBAR999RuDbXNzO6kXQb2 v9+3Ox2qqqtPd8/8detWdZ1Jkyb962QiIAIiIAIiIAIiIAIiIAI1RmChGjuSDiQCIiACIiACIiAC IiACIuAJSITrRhABERABERABERABERCBGiYgEV7DwHU4ERABERABERABERABEZAI1z0gAiIgAiIg AiIgAiIgAjVMQCK8hoHrcCIgAiIgAiIgAiIgAiIgEa57QAREQAREQAREQAREQARqmIBEeA0D1+FE QAREQAREQAREQAREQCJc94AIiIAIiIAIiIAIiIAI1DABifAaBq7DiYAIiIAIiIAIiIAIiIBEuO4B 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 EAEREAEREAEREAEREIHcCEiE58ZLqUVABERABERABERABESgYAIS4QUjVAEiIAIiIAIiIAIiIAIi kBsBifDceCm1CIiACIiACIiACIiACBRMQCK8YIQqQAREQAREQAREQAREQARyI1DnX7Pcsii1CIiA CIiACIiACIiACIhAIQTkCS+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAI AYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQCC+EnvKKgAiIgAiI gAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9o yiICIiACIiACIiACIiAChRCQCC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiAC IlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQCC+EnvKKgAiI gAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAi PA9oyiICIiACIiACIiACIiAChRCQCC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiAC IiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQCC+EnvKK gAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjk QUAiPA9oyiICIiACIiACIiACIiAChRCQCC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiAC IiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQCC+E nvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiI gAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQCC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiAC IiACIiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQ CC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAIAYnwQugprwiIgAiIgAiI gAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAChRCQCC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYs IiACIiACIiACIiACIlAIAYnwQugprwiIgAiIgAiIgAiIgAjkQUAiPA9oyiICIiACIiACIiACIiAC hRCQCC+EnvKKgAiIgAiIgAiIgAiIQB4EJMLzgKYsIiACIiACIiACIiACIlAIgYULyVyMvEOHDnX3 3HNPhaIOP/xwt+KKK1bYllzp0aOH++GHH1Kbl1pqKXfqqaem1rUw/xMYN26cu/nmmyucyPHHH+/a tGlTYVsuK48++qgbMGBAhSyUR7kyERABERABERABEagpAnX+Naupg6U7zpdffum22267CruefPJJ t80221TYllxBqPfu3Tu1uVOnTu6TTz5JrWth/icwaNAgt95661U4kbfeesutvfbaFbZluzJjxgzf uJs6dWqFLPXq1XP9+/d3Sy65ZIXtWhEBERABERABERCB6iKgcJTqIqtyS47AG2+84ZICnEr+/fff 7sUXXyy5+qpCIiACIiACIiACCy4BifAF99rqzBIEnn766cSWOavPPPPMnBUtiYAIiIAIiIAIiEA1 E5AIr2bAKr40COABxxMebIkllnCLLLJIWPWhTCNHjkyta0EEREAEREAEREAEqpPAPB+YWZ0nlyx7 2LBhPvZ3scUWc6ussopr3LhxMkmV68OHD/cDQokjXmaZZdwKK6zgFlooc1tm9uzZFcqsW7euXyc+ eeDAge6vv/5yq6++umvQoEGFdGGlGHUOZSU/x48f78+FOsKjRYsWySQV1jOdC4koixjuf/75x625 5poZz6dCgeUrY8eOdUOGDHFclw4dOlTKM13+bLa99NJLDubBdt55Z1/nV1991W+i3s8995w78cQT Q5IqP//8809/ztwTiy66qGNcwtJLL11lvjhBMcqgvFzvy7gOLE+fPt0/G6NHj3YdO3Z07du3d3Xq 1Ekmy7jOvcH1569t27a+jPr162dMrx0iIAIiIAIiUNsJLPAinJkwzjvvPPfNN9+4yZMnp643AmO5 5ZZz22+/vbvkkksqFY2IxP/+97/unXfecRMmTEiVwQIzaxx22GHulFNOmauMMWPGuM6dO1dI369f P/fzzz97sYfgwV544QW36aabptIVo86pwhILo0aN8jy++OILl/T8MsPMBhts4K655hrXqlWrCjkz ncviiy/uTj/9dB9TPWvWLJ+HBgVC/LTTTnM77LBDhXLiFQZZXnvtte6rr75KbcY73bVrV3fBBRek thVjIRlustNOO1UQ4RyDNNmIcK7fLbfc4p5//nkvXuP6weOYY45xZ5xxhmvYsGG8q8JyMcrI974M FaHhceONNzoGQv/222++ARX2NWrUyK266qruf//7n9twww3D5rk+X375ZXf99df7GWfiRg6NVMT8 EUcc4Y488si58mmDCIiACIiACNR2Agv07Cg9e/Z0Z511lvc2V3ah11prLffII494z3YyHSEMCOw/ /vgjuavCOqLzsccec61bt05tTydc+/Tp4/bcc0/HvmCxCC9GnUO5yc/333/fHXvssVWeCx7x7t27 VxBf6c7lu+++84I+eJOTx0OM9+rVy2222WbJXa5bt25eaGeanIcpKu+//363+eabV8ibz+woTHW4 0korudBIQBzjscULTSMp9vDTOFl++eUrHDNeefbZZ/1UmNOmTYs3z7VML8kTTzzhVltttbn2FaOM Qu5LKsT9zL3APVGZIaavuOIK37CI0zGYlcbr3XffHW9Ou3zQQQd5sZ+ptydtJm0UAREQAREQgQWc QOY4ivn8xN977z3v1STcIxhhI2usscZcYRd4yQ888MCQLPXJPOQHH3zwXKIVL2EIKwmJv/32W+8R D0IvbE9+XnnllRUEeLy/GHWOy4uXf/nlF7f33nvPdS4Io2TYAQJt9913n2s+7bg8lq+66iqXSYCz H8/oIYcc4oLHn23Yxx9/7M4//3yXSYCThlCdCy+8kMWCjZlP4uuy9dZb+3jwZs2aec9/fAAEciZj CkyEa1UCnPyEh+ABRujHVowyinFfHnrooXMJcHjQII3DqxDb5557rsPjHRs9GEkBTi/GuuuuO1cP AI2RSy+9NM5e65b7jZrhnvthshs+6e9ad+7ZnvC7g6Z5Rn/PLps1d9SUWX792xHTsy1C6UqYwPUf jHOnvTjKzfpnns6KXMKEil+15DNV/CNkLnFeP7/z8twzU5l7zwIrwh966KEKZ0u8LkL03Xff9bGv zJQRi43vv//e/frrrxXyEIISe0nxkL722mu+657u+zvvvNPFca9ff/219/BWKCSx8sorr3gBTzgE IQvHHXecQ/xgxahz4nCpVc6X8INgnMtTTz3lz4Vzx9sZG6L13nvvjTfNtYyXG6/5CSec4F+4RNgP 4RixMSDy888/jze5iy66qMI6K3ikCUHhZTqEMDRp0sR9+OGHc6XLZ0MyFIV48GDxMtuSaUM6xCgv 9IkZcv9wzvRu4EG/+OKLK4Qk4W2n0RWsGGVQVqH35Y8//jjXNSG8hhCZt99+2/30009uxx13DNX2 n8kpHJP3Kt5ungk89Jw3dYyN/JU1uuK0uSxf895Yt8tDQyr87f/EMHflO2PdsBISvPd/PsHt9eBQ 98Hvc5wCuZxnsdPONKF704fj3Vq3/uoWvegnt8QlA9wmd//unvl+TshesY9ZVXknPDfSM5o0vex7 6rOhf/n1Oz4ZX1XWkt//Uv+p/h69/4uJJV/X6qjgnzP/cee8MMrd9v4494Vd1wXJBo6d4a/trt2H uBGTy0Iy4/OjUXlIzxE+TU03KJPPVFyvfJd/nzDTHfn0CLf6LYNc/Qv6uxWu+8Ud9uRw99v4mRWK nNfPb3Wce4UTLNLKAhsTjhCIDZHAjBgY4mmrrbZyvPDn9ddfTyXDQ8vAQIztH330UWof4pKwkRBu wqBOvOeIMsJVghHWcvLJJ4fVuT7xPFPO+uuvP9e+Qus8V4HRhk8//TRVdzbfeuutbqONNvIpiP8m FprBi6QLFr+RNGyLP+GJuKKBE2zjjTd2u+66a1j1n/QShG2IctZja9euneeN8MYQxojA/fffv2Dh NmLEiAovcVp44YUrvByKxlAcf44QpVFCPHRsiFPe7hob3uCjjjoqtYkYeOK0aZwFe/PNN32PAevF KKMY92XyPoM7PT6hR6R58+busssuc3379k3x517gXufZYVxEcmwEHEK4CR5xxgnQYI17QWAb3yuB USGfnw75y738/ZS5injSTXKXvf2He+7Qtm6nzrkPwJ6rwAVoA57ILe4Z7D4ZZL00dZ1bscUibvqs f1wfW+/zy5/u9C2bu5t3abkAnfG8P5VfTbhwny7fLL/Byo3+95NrUn8hN+rCjvP+ZKqowXUmtP/7 2mh3++5LuxO7lL0ArZHV/bxtm7vhJlLXXibzWJkqii7J3Ss2b+Aa1lvIPf3NJHecG+F6d122Qj0v N4fA419McNut3Nit2XrOjFwVEs0nK8//OMUdYE6OGX+VNZSbNF7YDRozww0aPcM9+tVE98xhbd1e qyw2n5xNaVRzgfWEJ2epQBwjsmNjUBqCK/wROhHss88+C4v+c9ttt60gYsNO4rtjbzjedv4yGV7e dAKc9IXWOdMx2c4gwnCefAYBHudJDqJMCq04LcvwSooqBvEh4mIjdjwYXtikR5RX0wcBHtLxxlSE YaHGjCfx8Tjvpk2bpoplcG5ScKfzhtNwio1rxYDcpNEg482bNNL4Q4QizLFilFGM+zI56HbKlCm+ ocAMN8HoKWEQcbhnaJAiwDEapPH0jmy77rrrvAecZYxYchodIT+fyXulLGVx/j9uYnvilSu58Ves 5HofvZzba83F3UzzqB7Uc7gLntXiHGn+L+XBLyd6Ab6SCYJhF3R0P/9neTfkvyu6z0/r4PhRveXd se7r4QoBKaUrPW3GbDfVvMnzg9HL8s/Mf10IKwp1vnqHlu6R/ZZxDRbOftalkLfUP7vt1cot1mRh 91K/Ke6pfnN6kwhDu/zNMW7RRnVddzv3+dlGT53l9n2sTIB37dLU9T93RTf50k5uon3nnrNNC+ds Irj9Hh/u6BmQZU9ggfWEE/fLbCbB8P7tsssufuo1hCKvPueTAXvpjJjk2BCPeM7TGYJj5sw5XTF4 TJm6MJ2ts8466Tb7bYXWOWPBiR0IQ0IO8EwivJg1hr9YLJMleEYT2VOr6c4FocZgyljIxnHRiLHY OEby1fRhf5cuXfxg17Cez2dcD/Lj+U4anve4XsSFMytIfP5J7zF147onjRlmMjXCilFGMe5LpqNs 2bJlBS81DaG77rrLcV7EdXNtN9lkk7TTeHKN6UkitCoYHnr+iCnneob8ScEf0hf7s1H9Om7xRcoa Cbus1Njt0KmRa2ae3UkWV/zer3+63Vcu62WZaML8pf5T3BsDp7oZs/51Wy3fyO2xShPX0sRnbKR7 +acp7h3zDI+fNtttsfyibudOi7kVms+55h8PnuYe/XqS22/1xd1KS9V3j9jyJ7Zt3TYNfZmrtEw/ 7Wh8HLrmX/l5qvt08F9ujdYN3HYrNHZbrdAoTlL0ZeqNHddlCbfM4nPOZ722Dd0d5r180bxd/OAG m22e8/ssjIJzGzF5tlt16QZuD+O5eYdFQxLX3bxgn1mvxIVbNXcIj2ctrGXwxL8dZZ63eTPXuIG5 3MvtXwsJfmvgn6638R3752y39YqN3BHrlPVShjTJzwnmebvpw7GO7ny8iXuYt22dZSp6Fanna1Yu 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 xxYBERCBygikE+GVpdc+EZgXBN6x7vytLZyImW9es14I5qX/Zezf7qr3/vBe7T0szOi5SuZpnxd1 1jFFoLYQKJmY8NoCXOcpAiIgAiIgAjVFYCuLIT+8yxI+xrbTNQN9fPS/NmYBW8vifO9MM5NFTdVN xxGB2k5AnvDafgfo/EVABPIiwHRiDEwj/CSfEJS8DqpMIpAngQ9s4N8H9pKdny22fjmLoV/L4vp3 7tSk0jCIPA+lbCIgAlkSkAjPEpSSiYAIiIAIiIAIiIAIiECxCJT2iIVinaXKEQEREAEREAEREAER EIESIiARXkIXQ1URAREQAREQAREQARGoHQQkwmvHddZZioAIiIAIiIAIiIAIlBABifASuhiqigiI gAiIgAiIgAiIQO0gIBFeO66zzlIEREAEREAEREAERKCECEiEl9DFUFVEQAREQAREQAREQARqBwGJ 8NpxnXWWIiACIiACIiACIiACJURAIryELoaqIgIiIAIiIAIiIAIiUDsISITXjuussxQBERABERAB ERABESghAhLhJXQxVBUREAEREAEREAEREIHaQWDheXmaAwYMmJeH17FFQAREQAREQAREQAREYJ4Q qPOv2Tw5sg4qAiIgAiIgAgs4gTpn/bCAn+H8c3r/3rjK/FNZ1bRWEJAIrxWXWScpAiIgAiIgAiIg AiJQSgQUE15KV0N1EQEREAEREAEREAERqBUEJMJrxWXWSYqACIiACIiACIiACJQSAYnwUroaqosI iIAIiIAIiIAIiECtICARXisus05SBERABERABERABESglAhIhJfS1VBdREAEREAEREAEREAEagUB ifBacZl1kiIgAiIgAiIgAiIgAqVEQCK8lK6G6iICIiACIiACIiACIlArCEiE14rLrJMUAREQAREQ AREQAREoJQIS4aV0NVQXERABERABERABERCBWkFAIrxWXGadpAiIgAiIgAiIgAiIQCkRkAgvpauh uoiACIiACIiACIiACNQKAhLhteIy6yRFQAREQAREQAREQARKiYBEeCldDdVFBERABERABERABESg VhD4P8xx2U7Ba2naAAAAAElFTkSuQmCC "
id="image324"
x="623.60559"
- y="929.94916" />
+ y="929.94916" />Secrets
* These secrets enable your *GitHub* account to interface with *Apple* to create your app
* `Identifiers`: are required to build the *Loop* app with *GitHub* Browser Build (these are automatically generated for you) when you run `Add Identifiers`
-* [`App Store Connect`](https://appstoreconnect.apple.com){: target="_blank" }: a website available for *Apple Developer*s to review apps build with your *Apple Developer* account
+* [`App Store Connect`](https://appstoreconnect.apple.com): a website available for *Apple Developer*s to review apps build with your *Apple Developer* account
* Once you purchase an *Apple Developer* annual account, you are an *Apple Developer* and have access to this site
* Most Loopers will not have an App until using the *GitHub* Browser Build
* The instructions walk you through creating and naming your app: [Create Loop App in App Store Connect](prepare-app.md#create-loop-app-in-app-store-connect){: target="_blank" }
+---
+
## Next Step
-The next step is to [Collect and Save Secrets](secrets.md).
\ No newline at end of file
+Ready to begin? Proceed to:
+
+**→ [Step 2: Collect and Save Secrets](secrets.md)**
+
+---
+
+**Navigation:** [← Back to Overview](bb-overview.md) | [Next: Collect Secrets →](secrets.md)
\ No newline at end of file
diff --git a/docs/browser/other-apps.md b/docs/browser/other-apps.md
index bfa3b6dd446..643b8e1c2c2 100644
--- a/docs/browser/other-apps.md
+++ b/docs/browser/other-apps.md
@@ -1,11 +1,11 @@
## Build Other Apps using a Browser
-Once Loop 3 was released with the ability to build using a browser, a lot of other apps in the DIY universe added the same feature.
+Many apps in the Open Source Diabetes ecosystem can be built with the Browser Build method. The steps are similar for all apps with details varying for Identifiers and App Groups.
-**Only apps that are companions to _Loop_ are included on this page.**
+With the exception of the ***LoopCaregiver*** app, each app has their own set of detailed documentation.
-* _LoopCaregiver_
-* _LoopFollow_
+* _LoopFollow_ Browser Build instructions were moved to *LoopFollowDocs*
+ * [*LoopFollowDocs* Browser Build Instructions](https://loopfollowdocs.org/build/lf-browser-build/)
If you want to build another DIY app that is not included here, look for the file `fastlane/testflight.md` in the *GitHub* repository associated with that app and open it in a browser. The instructions for that app should be located in that file.
@@ -19,16 +19,6 @@ If you are coming to this page to update one of the other apps, follow the [How
> If you have not added the `Variable` `ENABLE_NUKE_CERTS`, do it now. See [Add Variable](prepare-fork.md#add-variable){: target="_blank" }.
-**WARNING: starting May 2025, [Manual Action for Automatic Build](automatic.md#manual-action-for-automatic-build){: target="_blank" } may be required - be sure to check monthly to see if you need to start a build manually.**
-
-### Multiple Copies of `LoopFollow`
-
-For the convenience of caregivers who use `LoopFollow` to monitor multiple people, updates were added in v2.1.2 to make this more convenient. This works regardless of the build method. (Build with Browser or [Build with *Mac*](https://www.loopandlearn.org/loop-follow#lf-script){: target="_blank" }).
-
-* Build up to three instances of `LoopFollow`
-* Customize the name of the app that appears on your phone
-* Display the custom name in the main `LoopFollow` screen
-
### Prerequisites
* If you have already built using the Browser Build method, it is easy to build other apps which use the same method. Skip ahead to [Fork and Add Secrets](#fork-and-add-secrets).
@@ -47,33 +37,14 @@ You will return to this page after reviewing (but not doing) this step [Configur
* Use the same method as that section, but `fork` the `repository` for the app you plan to build to your *GitHub* organization
* _LoopCaregiver_, expect the `dev branch`
-* _LoopFollow_, expect the `main branch`
+
### Table of App `Repositories`
| App | Fork from this Address | Documentation |
|---|---|---|
-| LoopCaregiver | [https://github.com/LoopKit/LoopCaregiver](https://github.com/LoopKit/LoopCaregiver){: target="_blank" } | [LoopDocs: LoopCaregiver](../nightscout/loop-caregiver.md) |
-| LoopFollow | [https://github.com/loopandlearn/LoopFollow](https://github.com/loopandlearn/LoopFollow){: target="_blank" } | [LoopFollow](https://www.loopandlearn.org/loop-follow){: target="_blank" }|
-
-??? tips "LoopFollow Builders: Display Name (Click to Open/Close)"
- * Would you like the name of your LoopFollow app to be personalized?
- * Do you have more than one Looper, so you are using LoopFollow_Second or LoopFollow_Third?
- * The 3 LoopFollow repositories enable you to customize the name shown on your phone
-
- After you `fork` your *LoopFollow* repository, find the file named: `LoopFollowDisplayNameConfig.xcconfig`
-
- * Open it in your browser
- * Follow the directions to change `display_name`
- * "Save the file" means commit the change to your `main` branch
- * It is recommended that you use LF_name, where name is the customized name - that way you can find it in an alphabetic list of apps
-
-The two repositories below are only if you need to follow a second or third looper. All others should use just the table above. The instructions for the second and third looper are otherwise identical to the first looper. Note that `LoopCaregiver` can follow multiple Loopers; you select the person inside the app.
+| LoopCaregiver | [https://github.com/LoopKit/LoopCaregiver](https://github.com/LoopKit/LoopCaregiver) | [LoopDocs: LoopCaregiver](../nightscout/loop-caregiver.md) |
-| Special Case | Fork from this Address |
-|---|---|
-| LoopFollow for a Second Looper | [https://github.com/loopandlearn/LoopFollow_Second](https://github.com/loopandlearn/LoopFollow_Second){: target="_blank" } |
-| LoopFollow for a Third Looper | [https://github.com/loopandlearn/LoopFollow_Third](https://github.com/loopandlearn/LoopFollow_Third){: target="_blank" } |
## Configure Secrets for this App
@@ -131,11 +102,10 @@ The workflows are now displayed: look at the list on the left side similar to th
This step validates most of your six Secrets and provides error messages if it detects an issue with one or more.
-1. Click on the "Actions" tab of your *LoopFollow* or *LoopCaregiver* repository and enable workflows if needed
+1. Click on the "Actions" tab of your *LoopCaregiver* repository and enable workflows if needed
1. On the left side, click on 1. Validate Secrets
1. On the right side, click `Run Workflow` to show a dropdown menu
- * You will see your default branch (`main` for LoopFollow, `dev` for LoopCaregiver)
- * You can select a different branch, but typically, you run the default
+ * You will see your default branch (`dev`)
1. Tap the green button that says `Run workflow`.
{width="700"}
@@ -161,8 +131,7 @@ Refer to the graphic below for the numbered steps:
1. Click on the "Actions" tab of your repository
1. On the left side, click on "Add Identifiers"
1. On the right side, click "Run Workflow" to show a dropdown menu
- * You will see your default branch (`main` for LoopFollow, `dev` for LoopCaregiver)
- * You can select a different branch, but typically, you run the default
+ * You will see your default branch (`dev`)
1. Tap the green button that says "Run workflow"
{width="700"}
@@ -184,13 +153,10 @@ After successfully performing the `Add Identifiers Action`, you will see the ide
| App Name | Name | Bundle ID |
| --- | --- | --- |
| LoopCaregiver | LoopCaregiver | com.TEAMID.loopkit.LoopCaregiver |
-| LoopFollow | LoopFollow | com.TEAMID.LoopFollow |
-> If you build from a second or third `repository` for `LoopFollow`, the Name will end in `Second` or `Third` and Bundle ID will have `.Second` or `.Third` at the end.
-The *LoopCaregiver* app requires updates to the `Identifiers` after they are generated.
+The *LoopCaregiver* app requires updates to the `Identifiers` after they are generated. Skip ahead to [Add `App Group` to `LoopCaregiver`](#add-app-group-to-identifiers).
-The *LoopFollow* app does not require this extra step. You can skip ahead to [Create App in App Store Connect](#create-app-in-app-store-connect).
## Add `App Group` to `LoopCaregiver`
@@ -232,6 +198,20 @@ If you do not see them, please sync your `LoopCaregiver` repository and then run
| `LoopCaregiverWatchWidgetExtension` | `com.TEAMID.loopkit.LoopCaregiver.watchkitapp.WidgetExtension` |
| `LoopCaregiverWidgetExtension` | `com.TEAMID.loopkit.LoopCaregiver.WidgetExtension` |
+The *LoopCaregiver* app requires capabilities be associated with the Identifiers. When Add Identifiers is working, this is handled for you. The annotation box below is only for the special case where you must configure Identifiers manually.
+
+??? abstract "Capabilities for Each LoopCaregiver Identifier (Click to open/close)"
+ When Action: Add Identifiers is working, you do not need this information. If you ever need to manually create the Identiers, the table below lists the required capabilities. For the App Group, you must first add that capability and update the Identifier and then modify the Identifier a second time to add the LoopCaregiver App Group as directed in the next section.
+
+ | NAME | IDENTIFIER | Capabilities |
+ |:--|:--|:--|
+ | `LoopCaregiver` | `com.TEAMID.loopkit.LoopCaregiver` | App GroupsAdd Identifiers *Action*, you will see the six items under **`NAME`**, in the [table](#table-with-name-and-identifier) below, with the associated **`IDENTIFIER`** information. Your `Developer ID` replaces the `TEAMID` in the identifier.
@@ -118,6 +144,18 @@ If you built previously using a Mac with Xcode, you may see the XCode version in
| `WatchApp` | XC Identifier | `com.TEAMID.loopkit.Loop.LoopWatch` |
| `WatchAppExtension` | XC Identifier | `com.TEAMID.loopkit.Loop.LoopWatch.watchkitextension` |
+??? abstract "Capabilities for Each Identifier (Click to open/close)"
+ When Action: Add Identifiers is working, you do not need this information. If you ever need to manually create the Identiers, the table below lists the required capabilities. For the App Group, you must first add that capability and update the Identifier and then modify the Identifier a second time to add the Loop App Group as directed in the next section.
+
+ | NAME | IDENTIFIER | Capabilities |
+ |:--|:--|:--|
+ | `Loop` | `com.TEAMID.loopkit.Loop` | App GroupsSecrets to each repository for each app. It is not hard but it can get tiresome.
+ **📖 Haven't decided?** Review [Create a Free GitHub Organization](secrets.md#create-a-free-github-organization) first, then come back here.
- If you make use of the organization option, you only enter the 6 Secrets one time for all your repositories. This is strongly recommended, but not required, for all Browser Builders.
+???+ tip "Changing Your Mind Later"
+ You can [switch to an organization later](#switch-to-a-github-organization) if needed, but it's easier to decide now.
???+ abstract "Section Summary (click to open/close)"
- Fork [https://github.com/LoopKit/LoopWorkspace](https://github.com/LoopKit/LoopWorkspace){: target="_blank" } into your account.
+ Fork [https://github.com/LoopKit/LoopWorkspace](https://github.com/LoopKit/LoopWorkspace) into your account.
[:material-skip-forward:](#configure-secrets) To skip the detailed instructions, click on [Configure Secrets](#configure-secrets)
@@ -17,7 +35,7 @@
### Create the `Fork`
-1. Click this link [https://github.com/LoopKit/LoopWorkspace](https://github.com/LoopKit/LoopWorkspace){: target="_blank" } to open the LoopWorkspace repository owned by `LoopKit`
+1. Click this link [https://github.com/LoopKit/LoopWorkspace](https://github.com/LoopKit/LoopWorkspace) to open the LoopWorkspace repository owned by `LoopKit`
1. At the upper right side of the screen, click on the word `Fork`
{width="700"}
@@ -70,7 +88,7 @@ If you decided to not to use a GitHub organization, skip ahead to [Personal Acco
You will be adding `Secrets` and `Variables` to your organization. This makes them available to any app you decide to build as long as you set up your free *GitHub* organization as the [owner of the fork](#create-the-fork).
-1. Tap on this [*GitHub* link](https://github.com/settings/organizations){: target="_blank" } to see your organizations. (If you don't see a screen similar to the graphic below - you are not logged in to *GitHub*).
+1. Tap on this [*GitHub* link](https://github.com/settings/organizations) to see your organizations. (If you don't see a screen similar to the graphic below - you are not logged in to *GitHub*).
{width="700"}
{align="center"}
@@ -198,7 +216,10 @@ Once you add all six Secrets, your screen should look similar to th
This is a new step required with `Loop 3.6.0` and newer versions. It provides automatic renewal of certificates, which expire once per year.
-1. While in the same screen where you enter the `Secrets`, click on the `Variables` tab to the right of the `Secrets` tab:
+1. While in the same screen where you enter the `Secrets`, click on the `Variables` tab to the right of the `Secrets` tab
+ * If you aren't at the screen:
+ * ***GitHub* organization account**: go to your organization page and select Settings; scroll down, select `Secret and Variable` and then select `Actions`
+ * ***GitHub* personal account**: go to your repository for the app you are building, select Settings; scroll down, select `Secret and Variable` and then select `Actions`
1. Select new variable and give it the name the `ENABLE_NUKE_CERTS` and enter `true` as the value
``` { .text .copy }
@@ -222,16 +243,24 @@ This graphic shows how to add the `ENABLE_NUKE_CERTS` to an organization. Be sur
{width="700"}
{align="center"}
+---
+
## Next Step
-The next step is to [Validate Secrets and Add Identifiers](identifiers.md).
+Secrets are configured! Now let's validate them:
+
+**→ [Step 4: Prepare Identifiers](identifiers.md)**
+
+---
+
+**Navigation:** [← Back: Collect Secrets](secrets.md) | [Next: Prepare Identifiers →](identifiers.md)
## Switch to a *GitHub* Organization
If you are someone who already has a lot of forks in your personal account and want to switch to using a *GitHub* organization. Here's how:
1. Follow the steps to create your organization
- * [Create a Free *GitHub* Organization](secrets.md#create-a-free-github-organization){: target="_blank" }
+ * [Create a Free *GitHub* Organization](secrets.md#create-a-free-github-organization)
1. Add the `Secrets` and the `Variable` to your *GitHub* organization as explained in [Prepare to Enter `Secrets`](#prepare-to-enter-secrets)
1. Fork all the repos you normally use, but this time, set your organization as the owner
1. For each repository in your organization:
@@ -245,7 +274,7 @@ If you are someone who already has a lot of forks in your personal account and w
* The one thing you might want to do is copy customizations from your personal account fork to the organization fork
4. Return to your private *GitHub* account
* Your choice: either delete the forks in your personal account or at least disable the building from your personal account
- * [Disable Building for Personal *GitHub* Account](other-apps.md#disable-building-for-personal-github-account){: target="_blank" }
+ * [Disable Building for Personal *GitHub* Account](other-apps.md#disable-building-for-personal-github-account)
**Important**
@@ -270,5 +299,5 @@ If your copy (`fork`) is from `LoopKit`:
If your fork is not from `LoopKit`:
* Delete your LoopWorkspace repository
- * Instructions to delete a repository are found at [*GitHub* Docs](https://docs.github.com/en/repositories/creating-and-managing-repositories/deleting-a-repository){: target="_blank" }
+ * Instructions to delete a repository are found at [*GitHub* Docs](https://docs.github.com/en/repositories/creating-and-managing-repositories/deleting-a-repository)
* Return to [Fork LoopWorkspace](#fork-loopworkspace) and follow all the instructions
diff --git a/docs/browser/secrets.md b/docs/browser/secrets.md
index a0232128bc8..f7c5b730ea1 100644
--- a/docs/browser/secrets.md
+++ b/docs/browser/secrets.md
@@ -1,8 +1,21 @@
+!!! abstract "Progress: Step 2 of 7"
+ **📍 You are here:** Collect SecretsSecrets (alphanumeric items) to use the *GitHub* Browser Build method and if you use the *GitHub* Browser Build method to build more than Loop, e.g., LoopFollow or LoopCaregiver, you **must** use the same 6 Secrets for each app you build with this method.
+!!! info "What You'll Collect"
+ You need 6 secrets (alphanumeric codes) to build with a browser. These same secrets work for any app you build (Loop, LoopFollow, LoopCaregiver, etc.).
+
+ **Secrets checklist:**
+
+ * ☐ 4 secrets from Apple Developer account
+ * ☐ 1 secret from GitHub account
+ * ☐ 1 password you create yourself
+??? abstract "Section Summary (click to open/close)"
Each secret is identified with `ALL_CAPITAL_LETTER_NAMES`.
* Four Secrets are from your *Apple* Account
@@ -47,13 +60,13 @@ You need to save your information digitally, so you can copy and paste. The info
??? abstract "Section Summary (click to open/close)"
You will be saving 4 Secrets from your *Apple* Account in this step.
- 1. Sign in to the [*Apple Developer* portal page](https://developer.apple.com/account){: target="_blank" }.
+ 1. Sign in to the [*Apple Developer* portal page](https://developer.apple.com/account).
1. If you need to accept a new agreement (happens about twice a year), be sure to do so now
* Need help? Look at this section on the update page: [Accept Agreements](bb-update.md#accept-agreements){: target="_blank" }
1. The first *Apple* `Secret` is your Team ID.
* Copy the [Team ID](#find-teamid) from the upper right of the screen. Record this as your `TEAMID`.
1. The final 3 *Apple* `Secrets` come from the creation of the "`FastLane API Key`".
- * Go to the [App Store Connect](https://appstoreconnect.apple.com/access/integrations/api){: target="_blank" } interface, click the "Integrations" tab, and create a new key with "Admin" access. Give it the name: ["`FastLane API Key`"](#generate-api-key).
+ * Go to the [App Store Connect](https://appstoreconnect.apple.com/access/integrations/api) interface, click the "Integrations" tab, and create a new key with "Admin" access. Give it the name: ["`FastLane API Key`"](#generate-api-key).
1. [Record three more secrets](#copy-api-key-secrets)
* Record the issuer id; this will be used for `FASTLANE_ISSUER_ID`.
* Record the key id; this will be used for `FASTLANE_KEY_ID`.
@@ -63,7 +76,7 @@ You need to save your information digitally, so you can copy and paste. The info
This section provides detailed instructions for the four Secrets associated with your *Apple Developer* ID.
-|Name|Description|
+|Name|Description|
|---------|---------|
|TEAMID|This 10-character identifier is associated with your *Apple Developer* ID and never changes|
|FASTLANE_ISSUER_ID|The issuer ID is associated with your *Apple Developer* ID and never changes|
@@ -77,24 +90,24 @@ This section provides detailed instructions for the four Secrets as
If not, you need to purchase one ($99 annual fee). It may take a few days for the account to be enabled.
* LoopDocs has an [*Apple Developer* Program](../build/apple-developer.md){: target="_blank" } page that explains in detail how to sign up for an account
-* This link takes you straight to [*Apple Developer* account](https://developer.apple.com){: target="_blank" } to sign up
+* This link takes you straight to [*Apple Developer* account](https://developer.apple.com) to sign up
### Find TEAMID
-Sign in to your *Apple Developer* account at this link: [*Apple Developer* portal page](https://developer.apple.com/account){: target="_blank" }.
+Sign in to your *Apple Developer* account at this link: [*Apple Developer* portal page](https://developer.apple.com/account).
1. Click `Account` in the top menu bar
1. If you need to accept a new agreement (happens about twice a year), be sure to do so now
* Need help? Look at this section on the update page: [Accept Agreements](bb-update.md#accept-agreements){: target="_blank" }
1. Click the `Membership Details` icon
- {width="600"}
+ > {width="600"}
{align="center"}
1. Next to the `Team ID` field, is a 10-character ID number.
This is your ***Apple Developer* `TEAMID`**.
-{width="500"}
+ > {width="500"}
{align="center"}
Record this for use as TEAMID in your Secrets file. You will also need it when you [Create App Group](prepare-app.md#create-app-group){: target="_blank" }.
@@ -117,31 +130,33 @@ This step is used to create and save the final 3 `Secrets` you need from your *A
If you are waiting for *Apple* to enable your account, you can skip ahead to create a [New *GitHub* Account](#new-github-account) and [Create *GitHub* `Personal Access Token`](#create-github-personal-access-token). You then pause at [Configure Secrets](prepare-fork.md#configure-secrets){: target="_blank" } until your *Apple* account is active.
-1. Click this link to open in a new tab: [`App Store Connect/Access/Integrations/API`](https://appstoreconnect.apple.com/access/integrations/api){: target="_blank" }
- * The top of the display is shown in the graphic below
+Click this link to open in a new tab: [`App Store Connect/Access/Integrations/API`](https://appstoreconnect.apple.com/access/integrations/api)
- {width="700"}
- {align="center"}
+* The top of the display is shown in the graphic below
- * Click the `Integrations` tab as indicated in the graphic above
- * If this is your first time here, you will see:
+ > {width="700"}
+{align="center"}
- "`Permission is required to access the App Store Connect API. You can request access on behalf of your organization.`"
+Click the `Integrations` tab as indicated in the graphic above
- * Click on `Request Access` and follow directions until access is granted
+If this is your first time here, you will see:
- * Once access is granted, click on the `Generate API Key` button
+* "Permission is required to access the App Store Connect API. You can request access on behalf of your organization.`"
- * If you did not get routed through the `permission is required` screens click the blue + sign
+* Click on `Request Access` and follow directions until access is granted
- * A new `Generate API Key` dialog box will appear as shown in the graphic below
+The numbered steps below correspond to the actions you take in the subsequent windows:
- {width="500"}
- {align="center"}
+1. Click on the `Generate API Key` button or the blue + sign to open the `Generate API Key` dialog box
- * Enter the name of the key as "`FastLane API Key`" and choose `Admin` in the access dropdown menu
- * Confirm the name and that "`Admin`" is selected and then click on the "`Generate`" button.
+2. Enter the name of the key as "`FastLane API Key`"
+
+3. Choose `Admin` in the access dropdown menu
+
+4. Confirm the name and that "`Admin`" is selected and then click on the "`Generate`" button
+
+ > {width="500"}
### Copy `API Key Secrets`
@@ -149,7 +164,7 @@ The `Integrations` screen appears again with content similar to the graphic belo
Review the graphic and then follow the directions below to save more parameters you will need to [Configure Secrets](prepare-fork.md#configure-secrets){: target="_blank" }
-{width="700"}
+> {width="700"}
{align="center"}
1. A button labeled Copy is always adjacent to the `Issuer ID` above the word Active (this is the same for all keys that you generate with this *Apple Developer* ID)
@@ -160,24 +175,25 @@ Review the graphic and then follow the directions below to save more parameters
* In the file where you are saving information, paste this with the indication that it is for `FASTLANE_KEY_ID`
1. Click on the `Download API Key` button - you will be warned you can only download this once.
- {width="700"}
+ > {width="700"}
{align="center"}
6. Find your `AuthKey` download in your downloads folder. The name of the file will be "`AuthKey_KeyID.p8`" where `KeyID` matches your `FASTLANE_KEY_ID`
- * Double-click to open it and you will be presented a message asking how you'd like to open it (The message shown is for a Mac - translate these directions to whatever computer you are using)
- * Click on "`Choose Application...`" and then select "`TextEdit`" (on a Mac, NotePad on a PC, or any text-only editor you prefer)
-
- 
+ The next task is to rename the file so you can open it.
+ Highlight the filename and choose rename, then add ".txt" after ".p8". In other words, modify `AuthKey_AAAAAAAAAA.p8` to `AuthKey_AAAAAAAAAA.p8.txt` and click on `Use .txt` when questioned.
-1. The contents of this file will be used for `FASTLANE_KEY`
+ > {width=200}
- * Copy the full text, including the "`-----BEGIN PRIVATE KEY-----`" and "`-----END PRIVATE KEY-----`" lines
+2. Double-click to open the `AuthKey_AAAAAAAAAA.p8.txt` file. It will look similar to the screenshot below. You need to highlight **ALL OF THE CONTENTS** of that file and copy it and then paste it into your Secrets Reference file as the `FASTLANE_KEY`.
+ * **Click inside that file**
+ * Highlight **all** the text, including the "`-----BEGIN PRIVATE KEY-----`" and "`-----END PRIVATE KEY-----`" lines and then
+ * Copy **all** of the text to the clipboard (Cf. screenshot below).
* On a *Mac*, use ++command+"A"++, then ++command+"C"++ to copy all the contents
* On a **PC**, use ++control+"A"++ , then ++control+"C"++ to copy all the contents
* In the file where you are saving information, paste this with the indication that it is for `FASTLANE_KEY`
- 
+ > 
#### Organize your Key File
@@ -219,7 +235,7 @@ If you do not already have a *GitHub* account, you need to create one. Be sure t
Decide on a couple of usernames that you will be happy with - this will get embedded into your *GitHub* URL. Your first choice might not be available, so be prepared with several candidates. Your personal URL will be: `https://github.com/username`.
-* Click on this link to sign up for a free account: [*GitHub* account signup](https://github.com/signup){: target="_blank" }
+* Click on this link to sign up for a free account: [*GitHub* account signup](https://github.com/signup)
* You will need to enter the **email** you want associated your *GitHub* account
* You will be asked to enter a **password**
* You will be asked to enter a **username**
@@ -238,7 +254,7 @@ The free level comes with plenty of storage and compute time to build the *Loop*
??? abstract "Section Summary (click to open/close)"
Log into your *GitHub* account to create a personal access token, which you will save as GH_PAT.
- Click to create a [new `personal access token`](https://github.com/settings/tokens/new){: target="_blank" }:
+ Click to create a [new `personal access token`](https://github.com/settings/tokens/new):
* Enter a name for your token, use "`FastLane Access Token`"
* Change the Expiration selection to `No expiration`
@@ -257,7 +273,7 @@ The free level comes with plenty of storage and compute time to build the *Loop*
You must be logged into your *GitHub* account before starting this step. If you are continuing, you are already logged in.
1. You will be creating a new *GitHub* `Personal Access Token` and giving it the name "`FastLane Access Token`"
-1. Open this link: [https://github.com/settings/tokens/new](https://github.com/settings/tokens/new){: target="_blank" }
+1. Open this link: [https://github.com/settings/tokens/new](https://github.com/settings/tokens/new)
* Referring to the graphic
* Note that `Tokens (classic)` is highlighted
* Most Looper will use the `classic Token`
@@ -270,7 +286,7 @@ You must be logged into your *GitHub* account before starting this step. If you
* A check will automatically appear in the `repo` scope as well - this is normal
* Scroll all the way to the bottom and click `Generate token` (it's a long way, ignore all other settings, do not check anything else)
- {width="700"}
+ > {width="700"}
{align="center"}
!!! tip "What does `repo` and `workflow` do?"
@@ -282,7 +298,7 @@ You must be logged into your *GitHub* account before starting this step. If you
* You will use this for `GH_PAT` when you set up your Secrets
* You can [Regenerate Personal Access Token](bb-update.md#regenerate-token){: target="_blank" } for `GH_PAT` if you lose it, but then you have to update that in the Secrets for all repositories using *GitHub* Build.
- {width="600"}
+ > {width="600"}
{align="center"}
### Create a Free *GitHub* Organization
@@ -333,6 +349,14 @@ To make a *passphrase* that is hard to guess and keeps your certificates safe:
If you already created a MATCH_PASSWORD that does not meet the criteria listed above, no worries, you are protecting an *Apple* developer certificate - not the family fortune. That information is provided for new builders who want guidance.
+---
+
## Next Step
-The next step is to [Prepare your Fork (Copy of LoopWorkspace)](prepare-fork.md).
+You've collected all 6 secrets! Ready to move forward:
+
+**→ [Step 3: Prepare Fork](prepare-fork.md)**
+
+---
+
+**Navigation:** [← Back: Introduction](intro-summary.md) | [Next: Prepare Fork →](prepare-fork.md)
diff --git a/docs/browser/tf-users.md b/docs/browser/tf-users.md
index 046ebb824f0..61c03673a4a 100644
--- a/docs/browser/tf-users.md
+++ b/docs/browser/tf-users.md
@@ -1,3 +1,9 @@
+!!! abstract "Progress: Step 6 of 7"
+ **📍 You are here:** Prepare TestFlight GroupDeveloper Mode to run or build Loop directly from Xcode. (This is true for any app created by Xcode directly on your device.) If you want to know more, click on this [Apple Link about Developer Mode](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device){: target="_blank" }.
+If you are running iOS 16 or newer with watchOS 9 or newer, you must enable Developer Mode to run or build Loop directly from Xcode. (This is true for any app created by Xcode directly on your device.) If you want to know more, click on this [Apple Link about Developer Mode](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device).
### Prepare your Phone and Watch
@@ -106,7 +106,7 @@ These steps have been reported on Facebook and have not been tested in a control
* Click on the watch and if it connects - you are done
5. Otherwise manually add the UDID to your Developer Account
* Copy UDID (right-click or control-click and choose Copy Identifier)
-7. Go to the [Apple developer website, devices page](https://developer.apple.com/account/resources/devices/list){: target="_blank" } and manually add the watch (using the UDID)
+7. Go to the [Apple developer website, devices page](https://developer.apple.com/account/resources/devices/list) and manually add the watch (using the UDID)
8. With phone plugged into computer and watch on wrist, follow these steps on the build errors page: [Apple Watch Loop App not running on Watch](build-errors.md#apple-watch-loop-app-not-running-on-watch) to build the watch app directly.
At this point, be sure to reboot the watch.
@@ -117,6 +117,11 @@ This page has the detailed steps to run the Build Select Script to download the
Every attempt was made to put messages directly in the script for each step. The next few sections of this page walk you through what you will see when you run the script.
+!!! tips "How to Reuse a Download"
+ Some people prefer to use an existing download instead of starting fresh. In that case, be sure to read this section of the docs.
+
+ * [Updating `Loop` using Terminal](../version/loopworkspace.md#updating-loop-using-terminal){: target="_blank" }
+
### Open Terminal
Go to the Finder app, click on Applications, then open the Utilities folder. Locate the Terminal app and double-click Terminal to open a terminal window. The terminal window is very plain looking when you open it. That is normal.
@@ -152,7 +157,9 @@ You will be informed that you are downloading open source software. Type `1` and
{width="700"}
{align="center"}
-The next screen informs you of what you will be downloading. Type `1` and return to begin the download or `2` to return to the main menu.
+The next screen asks you to choose to build either Loop `main` or Loop `dev`, with `main` recommended. Type `1` to choose `main` and return to begin the download.
+
+> You can choose `dev` by typing 2 and return. Or return to the BuildSelect Menu by typing 3 and return.
{width="700"}
{align="center"}
@@ -161,7 +168,7 @@ The next screen informs you of what you will be downloading. Type `1` and return
This download can take from 3 minutes to 30 minutes depending on your download speed. You can leave the room and return later to check on progress. When you read the words in the terminal, as the script runs, you may see terminology you do not understand - don't worry - you do not need to understand enumeration or submodule or cloning. You only need to review the display to look for any error messages.
-!!! tip "New Feature"
+!!! tip "Watch for messages"
The Build-Script automatically reports when the download is successful.
The next graphic shows terminal messages for the beginning of a successful download.
@@ -457,7 +464,7 @@ If you plan to build again on a backup phone, or want to try a customization, ea
But wait - there's more.
* Caregivers who help manage a loved-ones diabetes often use other open-source apps that can be built the same way
-* When you are done building and installing the *Loop* app, there are instructions on the *Loop and Learn* website to [Download and Build Related Apps](https://www.loopandlearn.org/build-select/#build-other-apps){: target="_blank" }
+* When you are done building and installing the *Loop* app, there are instructions on the *Loop and Learn* website to [Download and Build Related Apps](https://www.loopandlearn.org/build-select/#build-other-apps)
## Protect that App
diff --git a/docs/build/build-dev-mac.md b/docs/build/build-dev-mac.md
index ccb654d458a..7078ed9a99d 100644
--- a/docs/build/build-dev-mac.md
+++ b/docs/build/build-dev-mac.md
@@ -9,48 +9,67 @@
* **[What's going on in the `dev branch`](../version/development.md#whats-going-on-in-the-dev-branch)**
-## `BuildLoopDev` Script
+## Build `dev` with Mac
-There is a script to assist in building the `dev branch`. It gives you the option to choose the tip of the `dev branch` or to build a lightly tested commit. If you have not used the [Build Select Script](../build/build-app.md#build-select-script) to build Loop previously, you may want to review that page. The command below can be pasted into the terminal of your Mac. Read the directions in the script.
+The same script is used to build the `dev` branch as is used to build the `main` branch. Copy and paste this command in any terminal. Follow the instructions on the screen. Choose Build Loop and then choose `dev` branch.
-``` { .bash .copy title="Copy and Paste to start the BuildLoopDev script" }
+``` { .bash .copy title="Copy and Paste to start the BuildLoop Script" }
/bin/bash -c "$(curl -fsSL \
- https://raw.githubusercontent.com/loopandlearn/lnl-scripts/main/BuildLoopDev.sh)"
+ https://raw.githubusercontent.com/loopandlearn/lnl-scripts/main/BuildSelectScript.sh)"
```
+For more detailed instructions, head over to:
+
+* [Experienced Builder: Instructions to Download and Build Loop](https://loopkit.github.io/loopdocs/build/build-app/#download-loop){: target="_blank" }
+
+* [New Builder: Start here to set up Developer Mode on Phone and Watch](https://loopkit.github.io/loopdocs/build/build-app/#prepare-your-phone-and-watch){: target="_blank" }
+
### Build Other Branches
-You can use the BuildLoopDev script to build a specific development branch, other than `dev`. At the end of the script (from above), add a space after the final quote, followed by a hyphen, another space and then the branch name. See the example below that would build `other-branch`, if such a branch existed. This is just an example. You need to substitute the branch you desire for `other-branch`. The example below uses a continuation character to put the extra characters on a new line to make this easier to read.
+You can use the BuildLoop script to build a feature branch that was advertised in zulipchat but has not been merged into `dev`.
+
+> Note. You cannot use the BuildSelectScript to select a custom branch. You must directly choose the app you wish to build. In this case, BuildLoop.
+
+In the command (shown below), there is a space after the final quote, followed by a hyphen, another space and then the branch name. This example would build `other-branch`, if such a branch existed.
-``` { title="Replace other-branch with the desired branch" }
+> This is just an example. You need to substitute the branch you desire for `other-branch`. The example below uses a continuation character to put the extra characters on a new line to make this easier to read.
+
+``` { .bash .copy title="Replace other-branch with the desired branch" }
/bin/bash -c "$(curl -fsSL \
- https://raw.githubusercontent.com/loopandlearn/lnl-scripts/main/BuildLoopDev.sh)" \
+ https://raw.githubusercontent.com/loopandlearn/lnl-scripts/main/BuildLoop.sh)" \
- other-branch
```
+If you want to customize this custom branch. You can call the Customization Select script after you download the custom branch. This script finds the most recent download in your ~/Downloads/BuildLoop folder. If you want to customize a specific branch, first set the terminal to be in the LoopWorkspace folder for the download you want to customize.
+
+``` { .bash .copy title="Copy and paste to start the CustomizationSelect script" }
+/bin/bash -c "$(curl -fsSL \
+ https://raw.githubusercontent.com/loopandlearn/lnl-scripts/main/CustomizationSelect.sh)"
+```
+
## Update Loop-dev
While Loop-dev is under active development, you should monitor zulipchat and update frequently.
-Checking for updates every week is a good idea. Also - subscribe to all the streams on [Loop Zulipchat](https://loop.zulipchat.com){: target="_blank" } to make sure you don't miss critical information.
+Checking for updates every week is a good idea. Also - subscribe to all the streams on [Loop Zulipchat](https://loop.zulipchat.com) to make sure you don't miss critical information.
You may choose to download fresh each time you update.
You may prefer to use commands to fetch and pull the latest code without making a new clone.
-* Some users like to use [GitKraken](https://support.gitkraken.com/){: target="_blank" } to assist them (link takes you to a tutorial video).
-* Some are comfortable with the command line git commands described on [here](../version/loopworkspace.md#updating-loop-using-loopworkspace).
+* Some users like to use [GitKraken](https://support.gitkraken.com/) to assist them (link takes you to a tutorial video).
+* Some are comfortable with the command line git commands described on [here](../version/loopworkspace.md#updating-loop-using-terminal).
## Loop-dev Version
-The version of code that shows up under the Loop Settings screen does not change when the `dev branch` is modified.
+Starting with v3.7.x, the version of code that shows up under the Loop Settings screen increments with each formal change to the `dev` branch using the pull request process. That increment might be an update to match a hotfix to `main` or might be from a new feature brought just into the `dev` branch.
-If you need help with your app, the mentors need more information. Please issue a Loop Report when asking for help. Refer to [Support](../loop-3/settings.md#support) for how to issue a Loop Report. If you want to keep track yourself, refer to [Identify Loop-dev Version](#identify-loop-dev-version)
+If you need help with your app, the mentors need to know you are running a `dev` branch and the specific version that shows on your settings screen.
-* [`Loop` Version Numbering](../version/releases.md#loop-version-numbering)
+For a summary of features added to the `dev` branch by version number:
-### Identify Loop-dev Version
+* [Updates in `dev`](../version/development.md#updates-in-dev){: target="_blank" }
-The version of code that shows up under the Loop Settings screen will remain fixed until Loop-dev is released. In order to identify which version of dev you have on your phone, you need the commit.
+For more information about version numbers:
-The commit is identified by a 7-digit alphanumeric code. That code was also appended to the folder name of the downloaded code under Downloads/BuildLoop as shown in the graphic above. You can use finder to view the folder name after the script completes. It also appears in the Loop Report, refer to [Support](../loop-3/settings.md#support) for instructions on issuing a Loop Report. After you issue the Loop Report, look at the workspaceGitRevision number near the beginning of the report.
+* [`Loop` Version Numbering](../version/releases.md#loop-version-numbering){: target="_blank" }
diff --git a/docs/build/build-errors.md b/docs/build/build-errors.md
index 1ca2d31c69c..1248eac5a01 100644
--- a/docs/build/build-errors.md
+++ b/docs/build/build-errors.md
@@ -31,7 +31,7 @@ Before you start trying to resolve your red errors, start with the most obvious
1. **Did you check that you have the minumum Xcode version for your iOS?** This is critical. If you are updating your Loop app, please review the iOS driven requirements for minimum version of [macOS and Xcode](xcode-version.md#how-do-all-the-minimum-versions-relate-to-each-other).
-1. **Did you check your Apple developer account for new license agreement?** Periodically, Apple will release a new developer license agreement that you need to sign before you can build new apps. You will get a build failure if there is a pending license agreement to sign. [Login to your Apple developer account](https://developer.apple.com/account){: target="_blank" } to check if there's a new license agreement.
+1. **Did you check your Apple developer account for new license agreement?** Periodically, Apple will release a new developer license agreement that you need to sign before you can build new apps. You will get a build failure if there is a pending license agreement to sign. [Login to your Apple developer account](https://developer.apple.com/account) to check if there's a new license agreement.
1. **Do you have a new computer, never used to build Loop?** Did you [Add Apple ID](xcode-settings.md#add-apple-id) to Xcode?
@@ -406,19 +406,12 @@ This is very similar to the steps for the WatchApp Entitlements Error but you ne
{width="750"}
{align="center"}
-
-### No Such Module 'LoopKit' or Similar Message
-
-**Error Message:** If you see a **Cartfile failure** and several other red errors (in particular saying there is "no such module 'LoopKit'").
-
-**Solution**: Read the [Carthage Error](build-errors.md#carthage-error) section above.
-
### Developer License Update (PLA Update)
**Error message:** `The Apple Developer Program License Agreement has been updated, In order to access certain membership resources, you must accept the latest license agreement`.
Or you may see `Unable to process request - PLA Update available. You currently don't have access to this membership resource. To resolve this issue, agree to the latest Program License Agreement in your developer account.`
-**Solution:** You'll need to log onto your Apple Developer account at [developer.apple.com](https://developer.apple.com/account/){: target="_blank" } and accept the latest license agreement.
+**Solution:** You'll need to log onto your Apple Developer account at [developer.apple.com](https://developer.apple.com/account/) and accept the latest license agreement.
{width="750"}
{align="center"}
@@ -490,7 +483,7 @@ If your problem persists after that, then you might need to do total reset of yo
{width="750"}
{align="center"}
-**Solution:** This error message has recently started to appear for some new Loop builders. To resolve the issue, please log in to your Developer account at [developer.apple.com](https://developer.apple.com){: target="_blank" } and then click on "Certificates, Identifiers & Profiles". Under that screen, you will see "Development" under the "Certificates" section in the column on the left. You will need to click on the certificates, and choose "revoke" from the options that show after you click on the certificate. Confirm the warning message that will appear asking "Do you want to revoke the certificate?"
+**Solution:** This error message has recently started to appear for some new Loop builders. To resolve the issue, please log in to your Developer account at [developer.apple.com](https://developer.apple.com) and then click on "Certificates, Identifiers & Profiles". Under that screen, you will see "Development" under the "Certificates" section in the column on the left. You will need to click on the certificates, and choose "revoke" from the options that show after you click on the certificate. Confirm the warning message that will appear asking "Do you want to revoke the certificate?"
{width="750"}
{align="center"}
diff --git a/docs/build/build-free-loop.md b/docs/build/build-free-loop.md
index 7e7c8cdbcab..7eb7ac92013 100644
--- a/docs/build/build-free-loop.md
+++ b/docs/build/build-free-loop.md
@@ -77,7 +77,7 @@ It is time to Sign the Targets with your [Apple ID](xcode-settings.md#add-apple-
If you chose to sign manually but have a paid account, you can skip the Free Account steps below.
-You will be building multiple targets to make a complete app and must sign each one. With Loop 2.2.x, there are 4 targets. With Loop 3, there are 5 targets.
+You will be building multiple targets to make a complete app and must sign each one. There are 6 targets to sign.
Start with the Loop target, the first one on the target list. Choose your Apple ID.
@@ -90,22 +90,36 @@ This section is required if you are using the free account.
Some features of Loop are not available with the Free option, so as you sign, you will need to remove features that are not supported.
-1. You must remove unsupported capabilities from 2 targets, this is best done as you sign each target:
- * **Loop Target:** Push Notification, Siri, Time Sensitive Notifications and Near Field Communication Tag Reading
- * **Watch App Extension Target:** Siri
-1. Add the keyword `SIRI_DISABLED` to the LoopConfigOverride.xcconfig file
+> These directions are for Xcode 26.2. They may vary based on Xcode version.
+
+1. You must remove unsupported capabilities from 2 targets, this is best done as you sign each target. The items you must delete (using the trashcan) or edit by adjusting checked boxes are listed in order from top to bottom:
+ * **Loop Target:**
+ * HealthKit **DO NOT DELETE**
+ * uncheck the Clinical Health Records if it is checked;
+ * finish with the Healthkit Background Delivery checked - you may need to toggle it off and then back on to get the signing to work
+ * NFC Tag Reading capabilities (delete), (NFC Scan is OK)
+ * Push Notifications (delete)
+ * Siri (delete)
+ * Time Sensitive Notifications (delete)
+ * **Watch App Extension Target:**
+ * HealthKit **DO NOT DELETE**
+ * uncheck the Clinical Health Records if it is checked
+ * check the Healthkit Background Delivery
+ * Siri (delete)
+2. Add the keyword `SIRI_DISABLED` to the LoopConfigOverride.xcconfig file
* Click on the filename in the left pane of Xcode and view it in the Xcode editor
- * Examine the file and find the line that starts withNightscout monitoring of the *Loop* app is a priority, then a cell plan may be desired.
- **What watches work with the *Loop* app?** Only *Apple* watches work with the *Loop* app. With *iOS 17*, some of the older *Apple* watch series are no longer compatible. See: [Watch Hardware and OS Requirements](../operation/features/watch.md#watch-hardware-and-os-requirements)
@@ -22,22 +22,34 @@
The *Loop* app requires an *Apple* device and uses the *Apple Health* app to store and retrieve your blood glucose and insulin data and to store your carbohydrate records. Older iPads do not support *Apple Health* which used to be required, and is still strongly recommended, for the *Loop* app. It may be possible to run Loop with newer iPads and newer *iOS*, but this has not been tested.
-You need a minimum version of the mobile operating software, called the *iOS*, to be installed on your iPhone. The *Loop* app is compatible with iPhone devices with *iOS* 15.1 or newer.
+You need a minimum version of the mobile operating software, called the *iOS*, to be installed on your iPhone. It is **strongly advised your phone hardware support and be updated to the most recent iOS**. This is for security and feature compatibility for *Loop* and companion apps.
-* It is unusual for four different *iOS* to be supported
-* The developers try to maintain support for the current and one-level earlier *iOS*
- * Be prepared for your *iOS* 15 device to no longer be supported in future releases
- * Be prepared for your *iOS* 16 device to no longer be supported in future releases
+!!! Danger "Update Older Phones!"
+ Some CGM vendors are limiting which iOS versions, and therefore which phones, are supported by their apps.
+
+ The Compatible Device list in LoopDocs is updated to reflect that. Devices that cannot be updated to the latest iOS version are treated as incompatible.
### Compatible Device
-All the devices listed below are currently compatible with Loop. They are separated by the available *iOS* for the phone. Those that only support *iOS* 15 or 16 may become incompatible for the next version of the *Loop* app, but can be used with `Loop version 3.4.x`.
+All the devices listed below are currently compatible with Loop. They are separated by the available *iOS* for the phone.
+
+These phones require *iOS* 26 and `Loop version 3.8.x` or newer
+
+- iPhone 17, all variants except 17e
+ - iPhone 17e models are compatible but **not recommended for use with Omnipod DASH**
+ * See [Atlas or InPlay DASH pod](../faqs/omnipod-faqs.md#atlas-or-inplay-dash-pods){: target="_blank" } warning
+
+!!! important "iOS 26 requires `Loop v3.8.2` or newer"
+ Any iPhone 17 must run iOS 26. You must install `Loop v3.8.2` or newer before updating to iOS 26. `Loop v3.7.x` and earlier do not to support iOS 26.
-These phones require *iOS* 18
+ **Do not attempt to run an older version of Loop on any iOS 26 phone, use `Loop v3.8.2` or newer.**
-- iPhone 16, all variants
+These phones require *iOS* 18 and are compatible with *iOS* 26.
-These phones are compatible with both *iOS* 17 and 18
+- iPhone 16 models are compatible but **not recommended for use with Omnipod DASH**
+ * See [Atlas or InPlay DASH pod](../faqs/omnipod-faqs.md#atlas-or-inplay-dash-pods){: target="_blank" } warning
+
+These phones are compatible with *iOS* 17, 18 and 26
- iPhone 15, all variants
- iPhone 14, all variants
@@ -48,17 +60,18 @@ These phones are compatible with both *iOS* 17 and 18
- iPhone SE (3rd generation or later model; 2022 first release)
- iPhone SE (2nd generation; 2020 first release)
-These phones are limited to *iOS* 16.
+### Not Supported
-- iPhone X, without an extra letter
-- iPhone 8, all variants
+**The [Older Devices](#older-devices) listed below are no longer supported by some CGM vendors and should be considered incompatible**
-These phones are limited to *iOS* 15.
+* **Please update your phone hardware and iOS as soon as possible**
-- iPhone 7, all variants
-- iPhone 6s or 6s Plus, note the `s`
-- iPhone SE (1st generation; 2016 first release)
-- iPod Touch, 7th generation
+### Older Devices
+
+These phones are limited to *iOS* 16. No longer supported by *Dexcom*. Update ASAP.
+
+- iPhone X, without an extra letter
+- iPhone 8, all variants
## Find Your *iOS*
@@ -72,7 +85,7 @@ Do not use any of the beta *iOS* versions. (If you are uncertain what that means
> When you build the *Loop* app using [Build with Browser](../browser/bb-overview.md), you are not required to enable Developer Mode on the phone or watch.
-With *iOS* 16 or newer and *watchOS* 9 or newer, *Apple* added a feature. If you want to know more, click on this [Apple Link about Developer Mode](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device){: target="_blank" }.
+With *iOS* 16 or newer and *watchOS* 9 or newer, *Apple* added a feature. If you want to know more, click on this [Apple Link about Developer Mode](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device).
When you build the *Loop* app on your phone from *Xcode* directly and then transition to or start with *iOS* 16 or newer, you need to have Developer Mode enabled. This is also a requirement to use the *Loop* app on a watch paired to your phone running *watchOS* 9 or newer. You will be told to enable it in the [Build the *Loop* App: Prepare your Phone and Watch](build-app.md#prepare-your-phone-and-watch) instructions.
@@ -93,7 +106,7 @@ Make sure the battery on your phone is solid. Your phone will become a critical
* Consider buying a battery pack, keep it charged, and add it to your travel bag
!!! tip "Low Power Mode"
- With newer *iOS*, some people have reported the *Loop* app continues working in the background (phone locked) even in [Low Power Mode](https://support.apple.com/en-us/HT205234){: target="_blank" }. Others have reported they still get red loops. You can experiment to determine if your phone/iOS/app is able to maintain green loops in low-power mode. Otherwise, the best practice is to avoid Low Power Mode.
+ With newer *iOS*, some people have reported the *Loop* app continues working in the background (phone locked) even in [Low Power Mode](https://support.apple.com/en-us/HT205234). Others have reported they still get red loops. You can experiment to determine if your phone/iOS/app is able to maintain green loops in low-power mode. Otherwise, the best practice is to avoid Low Power Mode.
## Use Automatic Time
@@ -107,8 +120,14 @@ Please read: [The *Loop* Phone Must be on Automatic Time](../faqs/time-faqs.md#t
**Please be proactive - install updates as soon as the all-clear is given for using the *Loop* app with that *iOS* update.**
-If a limitation on your *Mac* prevents you from updating your phone to the latest *iOS*, consider using [Build with Browser](../browser/bb-overview.md).
+If a limitation on your *Mac* prevents you from updating your phone to the latest *iOS*, switch to using [Build with Browser](../browser/bb-overview.md).
+
+!!! Important "Update While Awake and Aware"
+ The suggestion is to turn off automatic install of updates so you can be awake and aware when you do an iOS update. Otherwise, it happens in the middle of the night.
+
+ For major updates, for example iOS 18 to iOS 26, we suggest you hold off until the initial bugs get worked out. In other words when iOS 26.1 was released, the OK was given for everyone to update to iOS 26. Often, that includes an update to the Loop app to accommodate changes in the phone operating system.
+ For minor updates, for example iOS 26.1 to iOS 26.2, update at your earliest convenience.
### Why Turn off Automatic Updates?
@@ -120,7 +139,7 @@ If a limitation on your *Mac* prevents you from updating your phone to the lates
1. Configure your phone to automatically download the updates
1. Choose to install the updates manually
-When *iOS* updates are released, the [_Loop and Learn_ Version Updates](https://www.loopandlearn.org/version-updates){: target="_blank" } page is typically updated faster than LoopDocs. Check to see if a new update is causing an issue with the *Loop* app or your CGM before accepting the update from *Apple*.
+When *iOS* updates are released, the [_Loop and Learn_ Version Updates](https://www.loopandlearn.org/version-updates) page is typically updated faster than LoopDocs. Check to see if a new update is causing an issue with the *Loop* app or your CGM before accepting the update from *Apple*.
Within a few days, the "All-Clear" or (very rare) the "WAIT there is a problem" message will be posted.
diff --git a/docs/build/pump.md b/docs/build/pump.md
index 4553564c18c..b7849486bd3 100644
--- a/docs/build/pump.md
+++ b/docs/build/pump.md
@@ -8,12 +8,15 @@
!!! abstract "Summary"
- If you have a Medtronic pump, check the [Medtronic Pump Version](#check-medtronic-pump-version) list to ensure compatible model/firmware
- If you use [Omnipod](#omnipod-pumps) - check which kind
+ - For expert testers only, must build a special branch:
+ - If you use [Dana](#sooil-dana-pumps) - check which kind
+ - If you use [Medtrum Nano](#medtrum-nano) - click the link
!!! question "FAQs"
- **"How can I find a compatible Medtronic pump?"** Refer to [Finding a Medtronic Pump](#finding-a-medtronic-pump).
- **"What are the differences between Medtronic pump models?"** This question is answered in the [Extra Details](#extra-details-on-medtronic) section.
- **"But what about the other types of pumps?"** No other pumps work with the *Loop* app at this time.
- - There are other open-source closed loop options such as [AAPS: Android Artificial Pancreas System](https://androidaps.readthedocs.io/en/latest/index.html){: target="_blank" } and [OpenAPS](https://openaps.readthedocs.io/en/latest/){: target="_blank" } that support other pumps
+ - There are other open-source closed loop options such as [AAPS: Android Artificial Pancreas System](https://androidaps.readthedocs.io/en/latest/index.html) and [OpenAPS](https://openaps.readthedocs.io/en/latest/) that support other pumps
- **"Can I change the firmware of my Medtronic pump?"** No.
## Pumps Compatible with the *Loop* app
@@ -23,7 +26,12 @@ These types of pumps are compatible with the *Loop* app.
* [Older Medtronic pumps](pump.md#check-medtronic-pump-version)
* [Omnipod Eros pumps](pump.md#omnipod-pumps)
* [Omnipod DASH pumps](#omnipod-dash)
-* [Dana-i / DanaRS-v3](#sooil-dana-pumps) Coming soon
+ * See caveat about [iPhone 16](phone.md#compatible-device){: target="_blank" }
+
+You must build a special branch to test these pumps. Please only test if you are willing to update frequently, pay close attention and return to open loop as needed.
+
+* [Dana-i / DanaRS-v3](#sooil-dana-pumps) (new pump manager, work in progress)
+* [Medtrum Touchcare Nano](#medtrum-nano) (new pump manager, work in progress)
## Check Medtronic Pump Version
@@ -117,7 +125,7 @@ Finding a compatible Medtronic pump is probably the most difficult part for most
* Check out the **HelpAround, NextDoor, OfferUp, and/or LetGo** apps for pumps.
-* [Looping in a time of covid](https://www.facebook.com/groups/1087611668259945/){: target="_blank" }
+* [Looping in a time of covid](https://www.facebook.com/groups/1087611668259945/)
The most success appears to come from either one-on-one discussions with people with diabetes, your doctors or using apps (Craigslist, NextDoor, LetGo, HelpAround). If you are using Craigslist, you may wish to use an app on your iPhone to make the searching easier. There are apps to search multiple cities at once for your keywords and set up alerts.
@@ -157,7 +165,7 @@ Medtronic will not typically sell pump supplies directly to customers who have n
### Omnipod Eros
-Eros pods (also known as Gen 3) were launched in 2013 and continue to be sold by Insulet in some countries. Insulet stopped providing Eros pods in the US end of December 2023. As far as we know, there are no timelines announced for the discontinuation of Eros pods for other countries. Insulet doesn't specifically call these "Eros" anymore, they just use the term "Omnipod system". For clarity, from [Insulet's webpage](https://www.omnipod.com/discontinuation){: target="_blank" }:
+Eros pods (also known as Gen 3) were launched in 2013 and continue to be sold by Insulet in some countries. Insulet stopped providing Eros pods in the US end of December 2023. As far as we know, there are no timelines announced for the discontinuation of Eros pods for other countries. Insulet doesn't specifically call these "Eros" anymore, they just use the term "Omnipod system". For clarity, from [Insulet's webpage](https://www.omnipod.com/discontinuation):
!!! info "Alternative Names for Omnipod Eros Pump and Pods"
@@ -179,16 +187,23 @@ The DASH system has the newer, slimmer locked-android Personal Diabetes Manager
{width="750"}
{align="center"}
+[See warning about iPhone 16 with DASH](phone.md#compatible-device){: target="_blank" }.
+
### Omnipod 5
Loop does not support Omnipod 5 pods.
## Sooil Dana pumps
-!!! warning "Future Feature Only"
- Sorry but the Dana pump has not landed in released code or even dev code at this time. There is a testing fork, so check out [Zulipchat Dana Pump discusion](https://loop.zulipchat.com/#narrow/stream/144182-development/topic/Dana.20i.20pump){: target="_blank" }.
+!!! warning "You must build a feature branch to use Dana pumps"
+ Dana is supported in both of [these feature branches](../version/development.md#feature-branch-dana-and-medtrum-support){: target="_blank" }, `feat/dev-dana-medtrum` or `feat/eversense`.
+
+ * You must follow [zulipchat DanaKit topic](https://loop.zulipchat.com/#narrow/channel/144182-development/topic/DanaKit.20Troubleshooting/with/547829260)
+
+ Read these pages in LoopDocs:
- The information below is for the convenience of people reading along in zulipchat.
+ * [Add a Dana Pump](../loop-3/add-pump.md#dana-i-danars-v3){: target="_blank" }
+ * [Dana Troubleshooting](../troubleshooting/dana-faq.md){: target="_blank" }
**Every Dana pump has built-in BLE communications. Therefore, no RileyLink-compatible device is needed to use Dana-i / DanaRS-v3 with the *Loop* app.**
@@ -196,8 +211,6 @@ Loop does not support Omnipod 5 pods.
The Dana-i is the latest and greatest from the Korean pump manufacturer Sooil, released in 2020.
-The special fork (see [link](#sooil-dana-pumps) for details) works with the Dana-i. If your version of the *Loop* app not from that fork, you cannot use the Dana-i.
-
{width="250"}
{align="center"}
@@ -206,11 +219,33 @@ The special fork (see [link](#sooil-dana-pumps) for details) works with the Dana
The DanaRS was first released in 2002, with firmware version v1 which is not supported at this time. Only firmware version v3 and onwards are supported with the *Loop* app.
[Check here](../loop-3/add-pump.md#dana-i-danars-v3) to see how to check your firmware version.
-The special fork (see [link](#sooil-dana-pumps) for details) works with the DanaRS-v3. If your version of the *Loop* app not from that fork, you cannot use the DanaRS-v3.
-
{width="250"}
{align="center"}
+## Medtrum Nano
+
+!!! warning "You must build a feature branch to use Medtrum pumps"
+ Medtrum Nano is supported in both of [these feature branches](../version/development.md#feature-branch-dana-and-medtrum-support){: target="_blank" }, `feat/dev-dana-medtrum` or `feat/eversense`.
+
+ * You must follow [zulipchat Medtrum channel](https://loop.zulipchat.com/#narrow/channel/144182-development/topic/Medtrum.20Nano.20-.20pumps.20for.20development.20use/with/481836247)
+
+ Read this section in LoopDocs:
+
+ * [Medtrum Nano](../loop-3/add-pump.md#medtrum-nano){: target="_blank" }
+
+!!! info "All versions are supported!"
+ Both 200U (MD0201 & MD8201) and 300U (MD8301) version are supported with the correct version of the *Loop* app.
+
+**Every Medtrum patch pump has built-in BLE communications. Therefore, no RileyLink-compatible device is needed to use Medtrum patch pump with the *Loop* app.**
+
+
+The Medtrum patch pump is the second tubeless pump option available to the *Loop* app.
+The patch pump is 13.8gram, 40.5mm X 31.5mm x 11.5mm, making it the smallest and most discreet patch pump on the market as of now.
+It uses a steel cannula, instead of the Teflon cannula of the Omnipods, with a virtually painless insertion.
+
+{width="250"}
+{align="center"}
+
## Next Step: Compatible CGM
Now you are ready to check if you have a [Compatible CGM](cgm.md).
diff --git a/docs/build/rileylink.md b/docs/build/rileylink.md
index 0eeacfd6f53..f065c6cad94 100644
--- a/docs/build/rileylink.md
+++ b/docs/build/rileylink.md
@@ -1,9 +1,11 @@
## Order a RileyLink Compatible Device
-**Not needed for DASH**
+**Not needed for any pump that supports direct Bluetooth BLE commands such as Dana, DASH and Medtrum**
+
+**Required when using an older Medtronic pump or Omnipod Eros pods**
!!! info "Time Estimate"
- - 0 minutes if you plan to use a DASH Omnipod pump - you don't need one
+ - 0 minutes if you plan to use a pump that supports direct BLE communication - you don't need one
- 15-20 minutes to read about RileyLink compatible devices
- 15 minutes to order a device
@@ -13,8 +15,8 @@
!!! question "FAQs"
- **What is a RileyLink Compatible Device?** RileyLink refers to both the communication protocol and the name of the original device. Other DIY Loopers have created [RileyLink Compatible Devices](rileylink.md#rileylink-compatible-devices) that use the RileyLink protocol. All these devices can be used interchangeably with the *Loop* app to support Eros and Medtronic use.
- - **Do I have to buy one?** These are open-source hardware devices, but it takes special skills to build them yourself. It is recommended you buy one (or two) if you require it. At the current time, new OrangeLink and EmaLink devices are available for purchase. There are many used devices available in the community now that many users have switched to DASH. **Not needed for DASH**
- * Facebook Group where you may find used items: [Looping in a time of covid](https://www.facebook.com/groups/1087611668259945/){: target="_blank" }
+ - **Do I have to buy one?** These are open-source hardware devices, but it takes special skills to build them yourself. It is recommended you buy one (or two) if you require it. At the current time, new OrangeLink and EmaLink devices are available for purchase. There are many used devices available in the community now that many users have switched to DASH. **Not needed for DASH or Dana pumps**
+ * Facebook Group where you may find used items: [Looping in a time of covid](https://www.facebook.com/groups/1087611668259945/)
- **"What happens if I lose my RileyLink compatible device or walk away from it?"** Within a half hour, your pump returns to the normal scheduled basal rate
- **"Can I swap out RileyLink compatible devices at any time?"** Yes, you can. You do not need to start a new pod or rebuild the *Loop* app. Tap on the pump menu in settings to search for new devices. You can swap between compatible devices.
- **"How close does the RileyLink compatible device need to be to me? Do I have to carry it with me?"** See [RileyLink Compatible Device Range](../faqs/rileylink-faqs.md#range){: target="_blank" }.
@@ -22,7 +24,7 @@
## What is a RileyLink Compatible Device
-The RileyLink compatible device is required to allow your phone to talk to compatible *Medtronic* and *Omnipod Eros* pumps. **It is not needed for *Omnipod DASH* pumps.**
+The RileyLink compatible device is required to allow your phone to talk to compatible *Medtronic* and *Omnipod Eros* pumps. **It is not needed for *Omnipod DASH* or Sooil Dana pumps.**
!!! abstract "Details for RileyLink"
The RileyLink compatible device is an open-source hardware device that can bridge Bluetooth Low Energy (BLE) to the radio-frequency wireless communication used by compatible *Medtronic* and *Omnipod Eros* pumps.
@@ -38,16 +40,18 @@ Loop 3 has *Omnipod DASH* support, among other new features. When using *Omnipod
The RileyLink protocol defines a specific Bluetooth interface and way of opening a Sub-GHz radio channel to pumps. All RileyLink compatible devices follow the RileyLink protocol.
+> Many Omnipod users have switched to DASH and no longer need a RileyLink device, so the demand is significantly less than it used to be. You can still buy the devices, but there are fewer options.
+
There used to be just one option, the original RileyLink. Now there are more options, so you have to make a decision. Depending on your choice, be sure to have the correct charger and cables or batteries handy and add spare compatible supplies to your diabetes go-bag.
-- A [Comparison Chart](https://getrileylink.org/rileylink-compatible-hardware-comparison-chart?fbclid=IwAR2vHbOzla-zmM-cSp4NkOB_23k3spgnaYvCIGRcACcIQ25FJAU_7HRkH2A){: target="_blank" } is provided by the GetRileyLink organization for all the RileyLink compatible devices listed below
+- A [Comparison Chart](https://getrileylink.org/rileylink-compatible-hardware-comparison-chart?fbclid=IwAR2vHbOzla-zmM-cSp4NkOB_23k3spgnaYvCIGRcACcIQ25FJAU_7HRkH2A) is provided by the GetRileyLink organization for all the RileyLink compatible devices listed below
- RileyLink
- Designed by Pete Schwamb
- Rechargeable battery (max 36 hours per charge)
- No longer available new, check this Facebook Group for used ones:
- * [Looping in a time of covid](https://www.facebook.com/groups/1087611668259945/){: target="_blank" }
+ * [Looping in a time of covid](https://www.facebook.com/groups/1087611668259945/)
- OrangeLink
- - Designed by Vic Wu, available from [GetRileyLink](https://getrileylink.org){: target="_blank" }
+ - Designed by Vic Wu, available from [GetRileyLink](https://getrileylink.org)
- Uses 2 AAA batteries, batteries typically last weeks or more, depending on the batteries/pump type
- Works with either Omnipod or Medtronic
- Uses new chipsets, reported to have a longer range
@@ -59,8 +63,8 @@ There used to be just one option, the original RileyLink. Now there are more opt
- Standard: 6 to 7 days
- Maxx: 12 to 14 days
- Must order either Omnipod or Medtronic version
- - This [EmaLink Information](https://github.com/sks01/EmaLink#emalink){: target="_blank" } includes photos of various EmaLink configurations as well as photos showing relative sizes of EmaLink, OrangeLink and RileyLink
- - In North America, available from [EmaLink.us](https://www.emalink.us){: target="_blank" }
+ - This [EmaLink Information](https://github.com/sks01/EmaLink#emalink) includes photos of various EmaLink configurations as well as photos showing relative sizes of EmaLink, OrangeLink and RileyLink
+ - In North America, available from [EmaLink.us](https://www.emalink.us)
## More information
@@ -72,7 +76,7 @@ Sections of interest include:
## Waiting for your RileyLink Compatible Device
-While you are waiting for the RileyLink compatible device to arrive, you can proceed with these build directions and can try one of the [Simulated Loop](../version/simulator.md){: target="_blank" } options. After that, unless you are using *Omnipod DASH*, you'll have to wait for your device.
+While you are waiting for the RileyLink compatible device to arrive, you can proceed with these build directions and can try one of the [Simulated Loop](../version/simulator.md){: target="_blank" } options. After that, unless you are using pump that communicates directly with Bluetooth, you'll have to wait for your device.
The population of DIY loopers (Loop and Android APS) has grown enough that you might be able to find someone local to loan you their spare.
diff --git a/docs/build/test-settings.md b/docs/build/test-settings.md
index 39ff438f5f2..e2e0397965c 100644
--- a/docs/build/test-settings.md
+++ b/docs/build/test-settings.md
@@ -1,9 +1,9 @@
## Test Settings
!!! info "Time Estimate"
- - 2 hours to review the rest of *LoopDocs* (particularly the [Set Up](../loop-3/loop-3-overview.md){: target="_blank" }, [Operate](../operation/loop/open-loop.md){: target="_blank" }, and [FAQs](../faqs/overview-faqs.md){: target="_blank" } sections) and [LoopTips](https://loopkit.github.io/looptips/){: target="_blank" }
+ - 2 hours to review the rest of *LoopDocs* (particularly the [Set Up](../loop-3/loop-3-overview.md){: target="_blank" }, [Operate](../operation/loop/open-loop.md){: target="_blank" }, and [FAQs](../faqs/overview-faqs.md){: target="_blank" } sections) and [LoopTips](https://loopkit.github.io/looptips/)
* If you like quizzes, this older quiz has not been updated for version 3 of the *Loop* app and not all the links work (when your answers are scored), but the questions are still really good and the scoring report provides extra insight into why your answer was right or wrong
- - 15 minutes to take [this quiz](https://docs.google.com/forms/d/e/1FAIpQLSfTkL0pWC-x3a5l_I3aJYBSx3xAS7dtkBbQiiLd348H70TTWg/viewform){: target="_blank" } to confirm you understand the *Loop* app expected behavior
+ - 15 minutes to take [this quiz](https://docs.google.com/forms/d/e/1FAIpQLSfTkL0pWC-x3a5l_I3aJYBSx3xAS7dtkBbQiiLd348H70TTWg/viewform) to confirm you understand the *Loop* app expected behavior
* New with version 3 of the *Loop* app:
* you can remote bolus
* you can set a manual temp basal rate
@@ -54,11 +54,11 @@ If you are spiking higher than you’d like after a meal, but still coming back
## Other Resources
-Check the companion site [LoopTips](https://loopkit.github.io/looptips){: target="_blank" }. Several direct links to discussions are provided below:
+Check the companion site [LoopTips](https://loopkit.github.io/looptips). Several direct links to discussions are provided below:
-* How to [check settings](https://loopkit.github.io/looptips/settings/settings/){: target="_blank" }
-* [Why settings are important](https://loopkit.github.io/looptips/settings/overview/){: target="_blank" }
-* [What to do when you need to change settings](https://loopkit.github.io/looptips/settings/adjust/){: target="_blank" } which covers short term and long term reasons
+* How to [check settings](https://loopkit.github.io/looptips/settings/settings/)
+* [Why settings are important](https://loopkit.github.io/looptips/settings/overview/)
+* [What to do when you need to change settings](https://loopkit.github.io/looptips/settings/adjust/) which covers short term and long term reasons
If you’re fascinated by this topic, read the book *'Think Like A Pancreas'* by Gary Scheiner for a really great discussion.
diff --git a/docs/build/testflight-xcode.md b/docs/build/testflight-xcode.md
index 304d5b6b8ee..5372075bb25 100644
--- a/docs/build/testflight-xcode.md
+++ b/docs/build/testflight-xcode.md
@@ -1,6 +1,6 @@
## Introduction
-There are several different methods for making use of TestFlight:
+There are several different methods for making use of *TestFlight*:
* Test an app someone else is developing
* Use the [Build with Browser](../browser/bb-overview.md) method to build and distribute your Loop app to your iPhone or that of a family member
@@ -8,24 +8,26 @@ There are several different methods for making use of TestFlight:
This guide can also be followed to install other apps you build with *Xcode* via *TestFlight*. Examples include LoopFollow, LoopCaregiver and xDrip4iOS.
-Some useful features of using TestFlight to install Loop:
+Some useful features of using *TestFlight* to install Loop:
* You don't need to plug your phone into your computer
* You can update Loop on your kid's phone while they're away at college
* Reinstalling Loop on the fly is quick and easy from your phone, even if you accidentally delete the app, see [Protect that App](build-app.md#protect-that-app), or need to install Loop on a brand new phone
-Since apps built with TestFlight expire after 90 days, it is suggested you also setup a build using the [Build with Browser](../browser/bb-overview.md) method even if you don't plan on using it. The GitHub build can be updated in a few minutes from any browser and is an extra layer of protection in these scenarios if you do not have access to your Mac for a rebuild:
+Since apps built with *TestFlight* expire after 90 days, it is suggested you also setup a build using the [Build with Browser](../browser/bb-overview.md) method even if you don't plan on using it. The GitHub build can be updated in a few minutes from any browser and is an extra layer of protection in these scenarios if you do not have access to your Mac for a rebuild:
-* Your Xcode built Loop in TestFlight expires
+* Your Xcode built Loop in *TestFlight* expires
* An urgent update to Loop is released
-In all cases, except accidental deletion of Loop or loss of phone, the Loop you install from TestFlight builds over your existing app and you keep all your settings including your pump.
+In all cases, except accidental deletion of Loop or loss of phone, the Loop you install from *TestFlight* builds over your existing app and you keep all your settings including your pump.
-## Build to TestFlight via Xcode
+- - -
+
+## Build to *TestFlight* via Xcode
### Initial Steps
-Before creating the app or uploading it to *TestFlight*, use the [Build with *Mac*](../build/overview.md) guide to [sign your targets](../build/build-free-loop.md#select-signing-capabilities-tab) and build Loop to a [simulator phone](../build/build-free-loop.md#build-to-a-simulator) in Xcode. This checks to ensure the app you upload to your TestFlight will work as expected.
+Before creating the app or uploading it to *TestFlight*, use the [Build with *Mac*](../build/overview.md) guide to [sign your targets](../build/build-free-loop.md#select-signing-capabilities-tab) and build Loop to a [simulator phone](../build/build-free-loop.md#build-to-a-simulator) in Xcode. This checks to ensure the app you upload to your *TestFlight* will work as expected.
### Archive the Project
@@ -41,6 +43,8 @@ Now go to the top menu and choose **Product > Clean Build Folder**. Once it's do
Go back to the top menu and choose **Product > Archive**. This will build Loop into a file rather than a phone or simulator. It should take about the same amount of time as building to a phone or simulator does.
+- - -
+
## Upload the Archive
Once the archive finishes building, it should automatically open the **Archives** window. If you want to open this window without re-archiving, click the following in the top menu: **Xcode > Window > Organizer**.
@@ -62,14 +66,14 @@ On the next screen, **Upload** is selected by default. Click **Next**.
### First-Time Archive Upload
-If you have already created a TestFlight for Loop via Xcode or the GitHub Build method, the next screen will not be shown, so skip ahead to [Subsequent Archive Upload](#subsequent-archive-upload).
+If you have already created a *TestFlight* for Loop via Xcode or the GitHub Build method, the next screen will not be shown, so skip ahead to [Subsequent Archive Upload](#subsequent-archive-upload).
-If this is the first time you're creating a TestFlight for Loop, enter the following on the next screen and click **Next**:
+If this is the first time you're creating a *TestFlight* for Loop, enter the following on the next screen and click **Next**:
* **Name:** Enter a name that is unique. Most people just use "Loop" followed by their initials, so James Kirk would use "LoopJK". If he gets an error that the name is already taken, he might try something like "LoopJTK" or "Loop_JTK_1701".
-* **SKU:** This can be anything, but it can't be the same SKU that you've used for a different app that you've created a TestFlight for. Ideally, just leave it as the autofilled bundle id.
+* **SKU:** This can be anything, but it can't be the same SKU that you've used for a different app that you've created a *TestFlight* for. Ideally, just leave it as the autofilled bundle id.
* **Primary Language:** Set this to your primary language.
-* **Bundle Identifier:** This should already be autofilled. If it's not, it should be "com.YOUR_TEAM_ID.loopkit.Loop". Make sure you replace YOUR_TEAM_ID with your actual TEAM ID, which you can find at [developer.apple.com/account](https://developer.apple.com/account){: target="_blank" }.
+* **Bundle Identifier:** This should already be autofilled. If it's not, it should be "com.YOUR_TEAM_ID.loopkit.Loop". Make sure you replace YOUR_TEAM_ID with your actual TEAM ID, which you can find at [developer.apple.com/account](https://developer.apple.com/account).
{width="700"}
{align="center"}
@@ -96,22 +100,56 @@ Wait until uploading is finished. Don't be alarmed if you see the following scre
{width="700"}
{align="center"}
+- - -
+
## Deploy App
-Now that it's uploaded to TestFlight, it will take a little bit before it finishes processing and becomes available for installation on your iPhone. You can check [appstoreconnect.apple.com/apps](https://appstoreconnect.apple.com/apps){: target="_blank" } to find it's progress by clicking **Test Flight** and then **iOS** under **Builds** in the upper left. Once it no longer says "Processing" and instead says "Ready to Submit" next to the build's number, it should be available and ready to install on your iPhone.
+Now that your app is uploaded to *TestFlight*, it will take some time before it finishes processing and becomes available for installation on your iPhone.
+
+* You can check [appstoreconnect.apple.com/apps](https://appstoreconnect.apple.com/apps) to find its progress by clicking **Test Flight** and then **iOS** under **Builds** in the upper left.
+* Once it no longer says "Processing" and instead says "Ready to Submit" next to the build's number, it should be available and ready to install on your iPhone.
+* The processing is normally done within half-hour but sometimes *Apple* gets slowed down; be sure to refresh your browser to see if processing completed since the last time you checked
{width="700"}
{align="center"}
-To install Loop from TestFlight onto your iPhone, follow the instructions on the [GitHub Deploy](../browser/phone-install.md) page.
+### First Time with *TestFlight*
-## Update App
+If you are a repeat user of *TestFlight*, skip ahead to [Install App from *TestFlight*](#install-app-from-testflight).
+
+When you use *TestFlight* to distribute the app to yourself or a family member, you create an Internal *TestFlight* Group.
+
+* You will add yourself - your email address will already be available
+* If you want to add others, you must add the email addresses for these users. Each email address must match that associated with each Apple account
+* This group can be edited as needed to add or remove members
+
+> If one of your users is a child, you or another adult will need to log into the `Media & Purchases` portion of their phone to install and use *TestFlight* and to install each new build of the app from *TestFlight*. Do not try to add a child to your Internal *TestFlight* Group.
+
+This link provides the instruction you need as a first-time *TestFlight* user.
+
+* [Prepare TestFlight Group](../browser/tf-users.md){: target="_blank" }
-Apps installed via TestFlight are only valid for a maximum of 90 days, so you must upload a new build to TestFlight at least every 90 days.
+You must also install the *TestFlight* app on the phone of the person who will be using the app you just built.
-To update, simply repeat all the steps on this page.
+* Follow the instructions at [Install *TestFlight*](../browser/phone-install.md#install-testflight){: target="_blank" }
+
+Continue with the next section, which covers the steps needed for each new *TestFlight* build.
+
+### Install App from *TestFlight*
+
+The members of your Internal *TestFlight* group are notified via email each time a new build is available. They can choose to install the new build of the app from *TestFlight*.
+
+* Follow the instructions at [Install App with *TestFlight*](../browser/phone-install.md#install-app-with-testflight){: target="_blank" }
+
+When installing the app for a child, there are additional instructions.
+
+* [*TestFlight* for a Child](../browser/phone-install.md#testflight-for-a-child){: target="_blank" }
+
+
+- - -
+
+## Update App
-!!! warning "Add a Calendar Reminder"
- Note that the built-in Loop Notification for expiration has not been modified to read TestFlight expiration, yet.
+Apps installed via *TestFlight* are only valid for a maximum of 90 days, so you must upload a new build to *TestFlight* at least every 90 days.
- So, please add a calendar reminder.
+To update, simply repeat the steps on this page.
diff --git a/docs/build/updating.md b/docs/build/updating.md
index cacc2660d82..9fb2c55f165 100644
--- a/docs/build/updating.md
+++ b/docs/build/updating.md
@@ -122,7 +122,7 @@ Make sure your new computer has the macOS and Xcode required by your phone iOS.
## Check your Developer Account
-Apple updates its License Agreement for the Developer Program frequently. You need to login to your [developer account](https://developer.apple.com/account/){: target="_blank" } to manually check if there is a new agreement to accept. If you see a big red or orange banner across the top of your Developer Account announcing a new license agreement like shown below...please read and accept it before building Loop.
+Apple updates its License Agreement for the Developer Program frequently. You need to login to your [developer account](https://developer.apple.com/account/) to manually check if there is a new agreement to accept. If you see a big red or orange banner across the top of your Developer Account announcing a new license agreement like shown below...please read and accept it before building Loop.

@@ -138,7 +138,7 @@ This step is optional, but if your computer is low on space, it helps to clean u
There is an easy way to do this. The Build Select Script used to download and build Loop provides Maintenance Utilities to help free up disk space.
-Please review [Loop and Learn: Build Select Script](https://www.loopandlearn.org/build-select/){: target="_blank" } for more information.
+Please review [Loop and Learn: Build Select Script](https://www.loopandlearn.org/build-select/) for more information.
Copy the line below that starts with `/bin/bash` by hovering the mouse near the bottom right side of the text and clicking the copy icon (should say `Copy to Clipboard` when you hover over it). When you click the icon, a message that says `Copied to Clipboard` will appear on your screen.
@@ -225,7 +225,7 @@ More information is shown in the orange box below.
1. You might get this if you logged in as a different user, have a new computer or if your computer had to undergo a factory reset
* You can transfer your keychain to your new computer (or just revoke and keep going)
- * To transfer your keychain, check this [Apple Documentation Link](https://help.apple.com/xcode/mac/current/#/dev8a2822e0b){: target="_blank" }
+ * To transfer your keychain, check this [Apple Documentation Link](https://help.apple.com/xcode/mac/current/#/dev8a2822e0b)
1. Your version of Xcode is way out-of-date
* Mentors have seen this with people trying to build with Xcode 11.4 or earlier
* Update [Xcode](xcode-version.md) to the most recent version
@@ -258,7 +258,7 @@ The instructions do not hold your hand.
Here are the different steps you need to follow when doing the Direct Download instead of the App Store method:
-1. Open the [Apple Developer Download page](https://developer.apple.com/download){: target="_blank" }
+1. Open the [Apple Developer Download page](https://developer.apple.com/download)
- You may need to login
- Examine the menus (on my computer there are buttons across the top)
- Click on Applications
diff --git a/docs/build/xcode-settings.md b/docs/build/xcode-settings.md
index 5172d313bec..17c0d47486e 100644
--- a/docs/build/xcode-settings.md
+++ b/docs/build/xcode-settings.md
@@ -31,8 +31,6 @@ Some people have their macOS privacy settings configured so that *Xcode* does no
Yes, watchOS simulators are required to build Loop. If Xcode asks if you want to download them - say yes. It's slow but you cannot build Loop without the simulator.
-* Refer to [New with Xcode 14](../build/build-errors.md#new-with-xcode-14){: target="_blank" } for more information
-
## Command Line Tools
The very first time you open Xcode it may install a package of command line tools. Wait patiently until it finishes. The command line tools may have installed without asking.
diff --git a/docs/build/xcode-version.md b/docs/build/xcode-version.md
index 8ea9cdd96f5..7cfaaf0c400 100644
--- a/docs/build/xcode-version.md
+++ b/docs/build/xcode-version.md
@@ -75,34 +75,25 @@ After any update of [macOS](computer.md#check-your-macos-version) or Xcode, it i
## How do all the minimum versions relate to each other?
-### Compatible Versions
-
-The current release of _Loop_ requires Xcode version 15 or higher regardless of the iOS on the phone. This requires macOS 13.5 or higher.
+This section is no longer updated.
-* If your phone is iOS 17.4 or newer, you must have macOS 14.0 or higher.
-* If your phone is iOS 18.0 or newer, you must have macOS 14.5 or higher.
-* As an alternative, use [Build with Browser](../browser/bb-overview.md){: target="_blank" }, which supports iOS 15, 16, 17 and 18.
+We used to keep track of the minimum Xcode and macOS that enabled users to keep building with their (often older) Mac computer.
-When this page was last updated, macOS 14.6 and Xcode 15.4 were tested to successfully build the app for phones with iOS 15 through iOS 18.0.1. Newer versions, macOS 15 and Xcode 16 work as well.
+With the advent of browser build, this is no longer worth maintaining. If you don't or can't keep your Mac up to date, please use [Build with Browser](../browser/bb-overview.md){: target="_blank" }.
-> Release 3.4.2 and newer fix an issue building *Loop* with Xcode 16. If your current *Loop* app does not show your expiration date, please rebuild to version 3.4.4 as soon as possible.
-The table below lists the **minimum** requirements to build the current release of Loop 3.4.4. If your macOS or Xcode version is higher, you can build with *Mac*.
-
-Find your phone iOS in the table below. If your iOS is not listed, e.g., 17.6.1, choose the first row that is less than your iOS.
+### Compatible Versions
-| iOS Version | minimum Xcode | minimum macOS |
-|:---:|:---:|:---:|
-| 18.0 | 15.4 | 14.5 |
-| 17.5 | 15.4 | 14.0 |
-| 17.4 | 15.3 | 14.0 |
-| 15.1 toApple Program License Agreement](https://support.pushpay.com/s/article/Accepting-the-Apple-Program-License-Agreement){: target="_blank" }
+ * [Apple Program License Agreement](https://support.pushpay.com/s/article/Accepting-the-Apple-Program-License-Agreement)
* If you use the Browser build method:
* Follow the steps on [Update/Rebuild with Browser](../browser/bb-update.md)
@@ -27,7 +27,7 @@ In both cases, you build the code to install over an existing app on your phone
If you have a very slow download speed or if you do a lot of customizations, it may be worth your time to decide if you need a new download.
* Use Finder to check the date of your last download by looking in the Downloads/BuildLoop folder
- * Check the date of the last release at [*GitHub* `LoopKit/Loop releases`](https://github.com/LoopKit/Loop/releases){: target="_blank" }
+ * Check the date of the last release at [*GitHub* `LoopKit/Loop releases`](https://github.com/LoopKit/Loop/releases)
* If the date in Finder is after the release date, follow [Find my Downloaded *Loop* Code](../build/edit-mac.md#find-my-downloaded-loop-code)
* Double-click on the Loop.xcworkspace file in that folder
* This opens Xcode and you can just plug in your phone and build with your existing download
@@ -74,7 +74,7 @@ Updating the *Loop* app is the same idea as what happens to your other apps on y
Regardless of the build method, always check your *Apple* Developer Account status.
-*Apple* updates its License Agreement for the Developer Program frequently. You need to log in to your [developer account](https://developer.apple.com/account/){: target="_blank" } to manually check if there is a new agreement to accept. If you see a big red or orange banner across the top of your Developer Account announcing a new license agreement like shown below...please read and accept it before building Loop.
+*Apple* updates its License Agreement for the Developer Program frequently. You need to log in to your [developer account](https://developer.apple.com/account/) to manually check if there is a new agreement to accept. If you see a big red or orange banner across the top of your Developer Account announcing a new license agreement like shown below...please read and accept it before building Loop.

diff --git a/docs/index.md b/docs/index.md
index d24473e365a..574c45fddcc 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -22,7 +22,7 @@ The *Loop* app is an automated insulin delivery application that you build and o
### What is _Loop_ Video
!!! success " _Loop_ Video"
- * This [What is _Loop_](https://youtu.be/64qhgnmkyAE){: target="_blank" } video with associated [pdf deck](http://www.loopandlearn.org/wp-content/uploads/2021/05/What-is-Loop.pdf){: target="_blank" } was created by the Loop and Learn team
+ * This [What is _Loop_](https://youtu.be/64qhgnmkyAE) video with associated [pdf deck](http://www.loopandlearn.org/wp-content/uploads/2021/05/What-is-Loop.pdf) was created by the Loop and Learn team
* It is a great introduction, created when Reese was using an earlier version of Loop
* Special thanks to
* Tina and Reese Hammer for the terrific video
@@ -34,8 +34,8 @@ This site shows you step-by-step how to [**build**](intro/requirements.md){: tar
* **You do not need a technical or computer background to do this**
* **You can choose to build the *Loop* app several ways:**
- * Use a [browser](browser/bb-overview.md) on any computer or tablet and install it on your *iPhone* via *TestFlight*
- * Use an **up-to-date** [*Mac* Computer](build/overview.md) and install it directly on your *iPhone*
+ * Use a [browser](browser/bb-overview.md){: target="_blank" } on any computer or tablet and install it on your *iPhone* via *TestFlight*
+ * Use an **up-to-date** [*Mac* Computer](build/overview.md){: target="_blank" } and install it directly on your *iPhone*
In order to become proficient with the app, you should learn the information on this site. Consider doing this over a period of time and reviewing the materials more than once.
diff --git a/docs/intro/loopdocs-how-to.md b/docs/intro/loopdocs-how-to.md
index 126a2a5fd40..a66de6fdcf1 100644
--- a/docs/intro/loopdocs-how-to.md
+++ b/docs/intro/loopdocs-how-to.md
@@ -2,22 +2,28 @@
Volunteers generously provide support for Loop via online platforms. You have several options for joining conversations on Loop and asking for help. Links to the main platforms are listed below. Non-US Loop users in Italy, Australia, and several other countries have also formed Facebook (FB) groups.
-* The [Looped Group](https://www.facebook.com/groups/TheLoopedGroup){: target="_blank" } on Facebook. Looped Group is the original FB group for DIY looping systems. There are a lot of active members there with an excellent history of helping people.
-* Loop and Learn is a community that provides Loop-centric information, a T1D Speaker Series covering many topics of general diabetes interest as well as Loop-specific chats, alerts whenever there is an update to iOS and Xcode, Quick Tips and articles written by mentors providing their Loop experience.
- * [LoopandLearn Facebook Group](https://www.facebook.com/groups/LOOPandLEARN){: target="_blank" }
- * [LoopandLearn Website](https://www.loopandlearn.org){: target="_blank" }
- * [LoopandLearn YouTube Channel](https://youtube.com/loopandlearn){: target="_blank" }
-* The [LoopTips](https://loopkit.github.io/looptips/){: target="_blank" } website provides non-build information that is helpful once you are looping, e.g., how to print endo reports, find Loop data, deal with therapy settings changes, etc.
-* Many Loopers use a companion app called Nightscout. Nightscout help can be found in the [CGM in the Cloud](https://www.facebook.com/groups/CGMinthecloud){: target="_blank" } Facebook group.
-* For those interested in what is coming next for Loop and those who prefer not to use Facebook, join [Loop Zulipchat](https://loop.zulipchat.com){: target="_blank" } and be sure to subscribe to all the streams or you'll miss some interesting conversations.
-* Loop has an Instagram account @diy.loop where some updates are shared.
+* Loop and Learn is a community that provides help for iOS based Open-Source applications like the *Loop* app. Their Facebook group has a number of active mentors to assist you.
+ * [`LoopandLearn` Facebook Group](https://www.facebook.com/groups/LOOPandLEARN)
+* The [Looped Group](https://www.facebook.com/groups/TheLoopedGroup) is the original FB group for DIY looping systems. There are many active members there with a lot of overlap with the `LoopandLearn` Facebook Group.
+* The [LoopTips](https://loopkit.github.io/looptips/) website provides non-build information that is helpful once you are looping, e.g., how to print endo reports, find Loop data, deal with therapy settings changes, etc.
+* Many Loopers use a companion app called Nightscout. Nightscout help can be found in the [CGM in the Cloud](https://www.facebook.com/groups/CGMinthecloud) Facebook group.
+* For those interested in what is coming next for Loop and/or those who prefer not to use Facebook:
+ * Join [Loop Zulipchat](https://loop.zulipchat.com) and be sure to subscribe to all the streams or you'll miss some interesting conversations.
+ * [Sign up](https://www.loopandlearn.org/newsletter-signup/) for the `LoopandLearn` newsletter published once or twice a month
+ * Visit the [LoopandLearn Website](https://www.loopandlearn.org)
+ * Check out the [LoopandLearn YouTube Channel](https://youtube.com/loopandlearn)
+ * T1D Speaker Series covering many topics of general diabetes interest
+ * Open-Source Automated Insulin Dosing (OS-AID) specific topics
### How to Ask for Help
If you are having trouble building or using your Loop app, there are some important steps to get responses to your question, while also being considerate of our volunteers' time.
+> If you are in a panic about something, it's ok to post in [`LoopandLearn` Facebook Group](https://www.facebook.com/groups/LOOPandLEARN) without searching all the places listed below.
+Just explain the situation and someone will give you an answer pretty quickly. For non-panic situations, try searching - you may learn a lot.
+
1. Always search in **both** [LoopDocs](#website-search) and your favorite [support group](#how-to-find-help).
- * Confused about how to search in a Facebook group? [Here is a video](https://www.youtube.com/watch?v=_vSN6C-Uo04){: target="_blank" } to help.
+ * Confused about how to search in a Facebook group? [Here is a video](https://www.youtube.com/watch?v=_vSN6C-Uo04) to help.
2. If you use Facebook, click on the Featured posts (at the top of the page); many posts asking for help are already answered there.
3. Don't post a duplicate question in multiple groups (mentors monitor many groups). Only post to a different group if you have had no responses for several hours.
4. If a LoopDocs search, FB or Zulipchat search, and a check of Looped Group featured posts pinned to the top of the page haven't answered your question, then post for help. Review the [tips for how to post for help](../build/community.md) so that our volunteers get all the information they'll need to help you, without needing to ask 40 questions first.
@@ -85,10 +91,10 @@ Please submit suggestions for updates and improvements to this documentation. Th
### Pull Requests and Issues
-If you decide to do a GitHub Pull Request (PR) or create an Issue, first look to see if someone has already opened a [PR](https://github.com/LoopKit/loopdocs/pulls){: target="_blank" } or [Issue](https://github.com/LoopKit/loopdocs/issues){: target="_blank" } on the topic so you don't create a duplicate.
+If you decide to do a GitHub Pull Request (PR) or create an Issue, first look to see if someone has already opened a [PR](https://github.com/LoopKit/loopdocs/pulls) or [Issue](https://github.com/LoopKit/loopdocs/issues) on the topic so you don't create a duplicate.
* If a PR or Issue on the topic is open, feel free to add your comments (don't be shy), but please don't create a duplicate
-* If a PR doesn't exist, watch this [LoopDocs Pull Request video](https://youtu.be/6qSppvgGxpg){: target="_blank" } on how to create one (it's easy, video is less than 5 minutes)
+* If a PR doesn't exist, watch this [LoopDocs Pull Request video](https://youtu.be/6qSppvgGxpg) on how to create one (it's easy, video is less than 5 minutes)
* If your Issue is new, please add it by clicking on the `New Issue` button
* Give the Issue a descriptive title
* Indicate which page or pages need updating , along with a brief description of the problem(s)
@@ -96,6 +102,6 @@ If you decide to do a GitHub Pull Request (PR) or create an Issue, first look to
### Facebook or Zulipchat
Helpful tips for providing LoopDocs feedback through Facebook and/or Zulipchat:
-* In [Looped Group](https://www.facebook.com/groups/TheLoopedGroup){: target="_blank" } - make sure your post is clear that you have a comment about LoopDocs in particular.
-* In Loop Zulipchat, please use the [documentation stream, Loopdocs Issue](https://loop.zulipchat.com/#narrow/stream/270362-documentation/topic/Loopdocs.20Issue){: target="_blank" } channel.
+* In [`LoopandLearn` Facebook Group](https://www.facebook.com/groups/LOOPandLEARN) - make sure your post is clear that you have a comment about LoopDocs in particular.
+* In Loop Zulipchat, please use the [documentation stream, Loopdocs Issue](https://loop.zulipchat.com/#narrow/stream/270362-documentation/topic/Loopdocs.20Issue) channel.
diff --git a/docs/intro/overview-intro.md b/docs/intro/overview-intro.md
index d87456fac10..d74c65afe1e 100644
--- a/docs/intro/overview-intro.md
+++ b/docs/intro/overview-intro.md
@@ -17,7 +17,7 @@ The _LoopDocs_ website is organized as fol
* [Operate](../operation/loop/open-loop.md): How to use the Loop app
* [Troubleshoot](../troubleshooting/overview.md): What to do if you're having trouble with the Loop app
* [Version](../version/overview-version.md): Information about Loop versions, code customization and development
-* [Nightscout](../nightscout/overview.md): Loop-specific Nightscout details; [Nightscout](https://nightscout.github.io/){: target="_blank" } is an open-source cloud application used by people with diabetes and their caregivers
+* [Nightscout](../nightscout/overview.md): Loop-specific Nightscout details; [Nightscout](https://nightscout.github.io/) is an open-source cloud application used by people with diabetes and their caregivers
* [Remote Overview](../nightscout/remote-overview.md): Overview on issuing commands remotely to a Loop app using Nightscout and Apple Push Notifications
* [LoopCaregiver](../nightscout/loop-caregiver.md): Companion app useful for remote commands
* [FAQs](../faqs/overview-faqs.md): Pages with safety tips, frequently asked questions and the Glossary
@@ -29,7 +29,7 @@ You will notice many links in the *LoopDocs* pages pointing to detailed informat
* If you notice an arrow pointing up and to the right beside the link:
* This means a new tab or window (depending on your browser configuration) is opened when you click on the link
- * For example, the [What is Loop?](https://youtu.be/64qhgnmkyAE){: target="_blank" } video is found on *YouTube*
+ * For example, the [What is Loop?](https://youtu.be/64qhgnmkyAE) video is found on *YouTube*
* This link format is used anytime the link will take you to a different website
* In some cases, it is also used when referring to a different *LoopDocs* page
@@ -90,11 +90,11 @@ Some techniques are specific to _Loop_, but the
Here are development history links to other resources for you to explore.
* The early history of Loop development:
- * [History of Loop and LoopKit](https://medium.com/@loudnate/the-history-of-loop-and-loopkit-59b3caf13805){: target="_blank" }, written by Loop developer Nate Racklyeft
+ * [History of Loop and LoopKit](https://medium.com/@loudnate/the-history-of-loop-and-loopkit-59b3caf13805), written by Loop developer Nate Racklyeft
* The early days and the many advances brought about by the `#We Are Not Waiting` diabetes community:
- * [The Artificial Pancreas Book](https://www.artificialpancreasbook.com/){: target="_blank" } written by Dana Lewis and check out her website [DIYPS](https://diyps.org){: target="_blank" }.
+ * [The Artificial Pancreas Book](https://www.artificialpancreasbook.com/) written by Dana Lewis and check out her website [DIYPS](https://diyps.org).
* How the Omnipod Eros pods were cracked to work with Loop:
- * [Insulin Pumps, Decapped Chips and Software Defined Radios](https://medium.com/@ps2){: target="_blank" } written by Loop developer Pete Schwamb
- * [Deep Dip Teardown of Tubeless Insulin Pump](https://arxiv.org/ftp/arxiv/papers/1709/1709.06026.pdf){: target="_blank" } by Sergei Skorobogatov
+ * [Insulin Pumps, Decapped Chips and Software Defined Radios](https://medium.com/@ps2) written by Loop developer Pete Schwamb
+ * [Deep Dip Teardown of Tubeless Insulin Pump](https://arxiv.org/ftp/arxiv/papers/1709/1709.06026.pdf) by Sergei Skorobogatov
diff --git a/docs/intro/requirements.md b/docs/intro/requirements.md
index c9d59654482..5a51d60b413 100644
--- a/docs/intro/requirements.md
+++ b/docs/intro/requirements.md
@@ -25,7 +25,7 @@ These requirements are independent of how you build the Loop app:
1. [Compatible Pump](../build/pump.md)
1. [Compatible CGM](../build/cgm.md)
1. [RileyLink Compatible Device](../build/rileylink.md)
- * Not needed with Omnipod DASH
+ * Not needed with Omnipod DASH or SOOIL Dana pumps (i or RS)
* Required for Medtronic and Omnipod Eros
1. [Apple Developer Membership](../build/apple-developer.md)
* If building for a child, be sure to read [Loopers Need Their Own Apple ID](../build/apple-developer.md#loopers-need-their-own-apple-id)
diff --git a/docs/loop-3/add-cgm.md b/docs/loop-3/add-cgm.md
index bd002d4383f..d787f24ad7f 100644
--- a/docs/loop-3/add-cgm.md
+++ b/docs/loop-3/add-cgm.md
@@ -15,6 +15,7 @@ Loop can be connected to the following CGMs:
* [Dexcom G7 or ONE+](#dexcom-g7-or-one)
* [Libre](#libre) **(Loop 3.4 and later)**
* Only some Libre sensors are supported; some have encryption that limits DIY use
+ * [Eversense E3/365](#eversense-e3365) **Experimental branch only**
* [Minimed Enlite CGM](#medtronic-enlite-cgm)
* Medtronic Pump only
* **You must [add the Medtronic pump](add-pump.md) first**
@@ -77,11 +78,11 @@ To use the Dexcom G5, G6 or ONE:
#### Where to get the Transmitter ID for Dexcom G6?
-You can find the **transmitter ID** in your Dexcom G6 app or on the back of the transmitter box (please refer to the below screenshots).
+You can find the **transmitter ID** in your Dexcom G6 app or on the back of the transmitter box (see screenshots below).
* In your Dexcom G6 app
* Tap "⚙️ Settings"
- * The **transmitter ID** is located under section "CGM" where it says "Transmitter" with a the 6-digit string.
+ * The **transmitter ID** is located under the section "CGM" where it says "Transmitter" with a 6-digit string.
* Alternatively, while in Settings, tap on the > in the "Transmitter" row: your **transmitter ID** is the 6-digit identifier next to "SN" (short for serial number).
{width="550"}
@@ -97,11 +98,11 @@ It is suggested that you enable [Remote Upload from Loop](#remote-upload-from-lo
#### Change Dexcom Sensor
-When you change a Dexcom G5, G6 or ONE sensor, you do this in the Dexcom app. When the sensor completes warmup and CGM values are once again reported in the Dexcom app, Loop picks these values up because you are using the same Dexcom Transmitter.
+When you change a Dexcom G5, G6, or ONE sensor, you do this in the Dexcom app. When the sensor completes warmup and CGM values are once again reported in the Dexcom app, Loop picks these values up because you are using the same Dexcom Transmitter.
#### Change Dexcom Transmitter
-When you change the Dexcom G5, G6 or ONE Transmitter, you need to delete your CGM selection from Loop and then add it back after you complete the pairing with the transmitter in your Dexcom app.
+When you change the Dexcom G5, G6, or ONE Transmitter, you need to delete your CGM selection from Loop and then add it back after you complete the pairing with the transmitter in your Dexcom app.
??? info "FYI: When You Change Dexcom Transmitters (click to open)"
@@ -129,7 +130,7 @@ It is suggested that you enable [Remote Upload from Loop](#remote-upload-from-lo
{align="center"}
!!! tip "Don't forget Health Permissions"
- For those switching from *Dexcom G6* to *Dexcom G7*, you might forget to add permission for the *G7* app to write to *Apple Health*. If you want long-term history of those CGM readings to persist in *Apple Health*, turn on the permission for the *Dexcom* app to write glucose to *Health*.
+ For those switching from *Dexcom G6* to *Dexcom G7*, you might forget to add permission for the *G7* app to write to *Apple Health*. If you want the long-term history of those CGM readings to persist in *Apple Health*, turn on the permission for the *Dexcom* app to write glucose to *Health*.
If either the G6 or the G7 has permission to write to *Apple Health*, then *Loop* will delete the *Loop* glucose data in *Apple Health* that are older than 3 hours and newer than 1 week. The *Dexcom* app will write its glucose values to Health when each value is 3 hours old.
@@ -137,19 +138,74 @@ It is suggested that you enable [Remote Upload from Loop](#remote-upload-from-lo
The Libre plugin for Loop, [LibreTransmitter](https://github.com/LoopKit/LibreTransmitter/), connects directly via Near Field Communication (NFC) during pairing (for some sensors) and via Bluetooth (direct to sensor or direct to a transmitter attached to the sensor) for regular readings. No other app is needed.
-* Libre 1 are supported but must use a third-party transmitter (miaomiao and bubble transmitters are supported)
+* Libre 1 is supported but must use a third-party transmitter (miaomiao and bubble transmitters are supported)
* European Libre 2 can be used directly or via transmitter
* American Libre 2 is not supported
* Libre 3 is not supported
!!! tip "Connecting to Libre"
- First reading for a new sensor will often take 2-4 minutes. This is due to some technicalities on how the Libre sensor announces its presence via bluetooth.
+ The first reading for a new sensor will often take 2-4 minutes. This is due to some technicalities on how the Libre sensor announces its presence via Bluetooth.
There are solutions for some Libre 3 but they cannot reside on an iPhone. The Android solution can be uploaded to Nightscout, with Loop using Nightscout as a Remote CGM; but this requires internet access to continue closed-loop performance.
-Part of the problem with Libre sensors is that there are differences in region, type and "security generations" which makes it hard to account for all variants. For example, the Libre 2 US has a different "security generation" than European Libre 2 sensors (different encryption in the data transmitted over bluetooth).
+Part of the problem with Libre sensors is that there are differences in region, type and "security generations" which makes it hard to account for all variants. For example, the Libre 2 US has a different "security generation" than European Libre 2 sensors (different encryption in the data transmitted over Bluetooth).
-Libre 3 sensors have started appearing as well, but are unsupported. Other Libre sensors that are unsupported: Libre Pro, Libre H, Libre Sense Glucose Sport Biosensors.
+Libre 3 sensors have started appearing as well, but are unsupported. Other Libre sensors that are unsupported: Libre Pro, Libre H, and Libre Sense Glucose Sport Biosensors.
+
+### Eversense E3/365
+
+With Eversense added to *Loop* you get direct connection to your transmitter for glucose readings and can configure alert notifications. Because the transmitter can only connect to one app at a time, you must first disconnect from the Eversense app before you can connect to the *Loop* app.
+
+The *Loop* app does not have glucose notification features, at this time. You can enable the on-transmitter notification within the *Loop* app so the transmitter will vibrate to alert you of an issue.
+
+Review the graphic and text below for the steps to add the Eversense CGM. Note the middle screen of that graphic is only shown for the 365 transmitter. The E3 does not require a login step.
+
+{width="750"}
+{align="center"}
+
+Step 1: Choose the type of Eversense Transmitter
+
+* Eversense E3: click the radio button for E3 and tap Continue to proceed to Step 2
+* Eversense 365: click the radio button for 365 and tap Continue to proceed to the login screen
+ * If you already have an Eversense login, and you should, just enter the credential here to login and continue to Step 2
+ * Note that you must have internet access at this point, but only at this point. After the login, all required communication is through Bluetooth between the OS-AID and the Transmitter
+
+Step 2: Select the correct transmitter name (see SN at the bottom of your transmitter) and accept the iOS pairing prompt (if shown) and wait till the pairing has completed
+
+* If this is the first time you pair this transmitter with this phone / app, you might need to put the Transmitter into pairing mode before
+
+#### Troubleshooting
+
+If you are having trouble with connecting to the Eversense, try these steps.
+
+* Make sure the official Eversense app is not connected to the Transmitter
+* In your phone settings, find the Transmitter name and forget that device
+* Reboot your phone
+
+#### Important Information
+
+!!! warning "You must build feat/eversense branch to use the Eversense CGM"
+ The Eversense CGM is in feat/eversense (as of version v3.11.0) and is experimental as of now.
+
+ This branch adds the [EversenseKit](https://github.com/loopandlearn/EversenseKit) repository to the *Loop* app.
+
+!!! important "Wait till initialization phase is completed"
+ During the initialization phase after insertion of a new sensor, the glucose reading might be incorrect.
+ Before using automated insulin delivery, be sure to complete the initialization phase using the official Eversense app.
+
+!!! warning "Transmitter is read by only one app: Eversense app or the *Loop* app"
+ The transmitter is not able to support multiple connections to the same device due to the security protocol.
+
+ From Official to *Loop* app:
+
+ * In the official app, go to Connections and tap on the Transmitter and select Disconnect
+ * In the *Loop* app, choose Eversense, login and then select the Transmitter
+ * If this is the first time you pair this transmitter with this phone / app, you might need to put the Transmitter into pairing mode before it will show up
+
+ From *Loop* to Official app:
+
+ * In the *Loop* app, go to Settings, CGM and delete CGM
+ * In the official app, go to Connections and tap on the Transmitter and select Connect
### Medtronic Enlite CGM
@@ -163,7 +219,7 @@ The Medtronic Enlite CGM is only available if you have connected it to your comp
!!! warning "If you need to use *Dexcom Share*"
- If the dexcom is on another phone, you can use Share if internet / cell coverage is good.
+ If the Dexcom is on another phone, you can use *Dexcom Share* if Internet/cell coverage is good.
*Dexcom Share* is not available for Dexcom ONE CGM.
@@ -186,20 +242,25 @@ In addition to the risks of missing data, if the internet is not reliable, you m
If you decide to use Nightscout as a CGM source, make sure the data stored in Nightscout is reliable. If the app you choose uploads bad results to Nightscout, you don't want Loop to use that bad data.
- _Sensors that can be added to Nightscout via other apps include Dexcom, some Libre, and some Medtronic sensors. Please refer to [Nightscout Docs: Configure your Uploader](https://nightscout.github.io/uploader/setup/){: target="_blank" }._
+ _Sensors that can be added to Nightscout via other apps include Dexcom, some Libre, and some Medtronic sensors. Please refer to [Nightscout Docs: Configure your Uploader](https://nightscout.github.io/uploader/setup/)._
- There are third-party apps that bring some models of Libre data to your Loop phone. Customization instructions are provided at the `Loop and Learn` website: [New CGM and Pump](https://www.loopandlearn.org/custom-code-add-cgm-pump/){: target="_blank" } that explain how to modify Loop to add a CGM or Pump that is not part of the released `Loop` code.
+ There are third-party apps that bring some models of Libre data to your Loop phone. Customization instructions are provided at the `Loop and Learn` website: [New CGM and Pump](https://www.loopandlearn.org/custom-code-add-cgm-pump/) that explain how to modify Loop to add a CGM or Pump that is not part of the released `Loop` code.
It is suggested that you use Open Loop during warmup until the new sensor begins to provide reasonable data. This is especially important with European Libre 2 using a direct Bluetooth connection.
- The xDrip4iOS app (which can also be found in the app store under the name Shuggah) may have a problem during the warmup of a new sensor (European Libre 2 using a direct Bluetooth connection). There were two instances of crazy high values being reported and picked up by Loop 3. One Shuggah user and one xDrip4iOS user who connected via Nighscout as a CGM with Loop 3 had a serious overdose of insulin because of bad readings with a new sensor. The developers of xDrip4iOS fixed their application - so make sure you have the latest version. Those developers have no control over what is provided by Shuggah.
+ The xDrip4iOS app (which can also be found in the app store under the name Shuggah) may have a problem during the warmup of a new sensor (European Libre 2 using a direct Bluetooth connection). There were two instances of crazy high values being reported and picked up by Loop 3. One Shuggah user and one xDrip4iOS user who connected via Nightscout as a CGM with Loop 3 had a serious overdose of insulin because of bad readings with a new sensor. The developers of xDrip4iOS fixed their application - so make sure you have the latest version. Those developers have no control over what is provided by Shuggah.
{width="350"}
{align="center"}
-The user must enter both the URL and API_SECRET for their site to ensure the security of the data. The URL must start with `https://` and cannot have any extra spaces in the line.
+The user must enter both the URL and API_SECRET for their site to ensure the security of the data.
+
+!!! important "Format of the Nightscout URL"
+ The *Nightscout* URL must start with `https://`.
+ It cannot have any extra spaces in the line.
+ The `s` character is required after `http` and before `://`.
{width="350"}
{align="center"}
@@ -225,7 +286,7 @@ Scroll to the bottom of the screen and select `Delete CGM`.
### Dexcom G5, G6 and One (not G7)
-For older Dexcom sensors, the transmitter is replaced separately about once every three months. In order to enter a new transmitter number, you must first delete the CGM and then add the CGM.
+For older Dexcom sensors, the transmitter is replaced separately about once every three months. To enter a new transmitter number, you must first delete the CGM and then add the CGM.
Detailed instructions are found at [CGM FAQs: What do I do when I switch Dexcom transmitters?](../faqs/cgm-faqs.md#what-do-i-do-when-i-switch-dexcom-transmitters).
diff --git a/docs/loop-3/add-pump.md b/docs/loop-3/add-pump.md
index 3570df8125a..e4dcc76f735 100644
--- a/docs/loop-3/add-pump.md
+++ b/docs/loop-3/add-pump.md
@@ -10,22 +10,23 @@ The HUD looks like the graphic below if no CGM or Pump is chosen:
!!! question "Switching Pumps?"
To change the pump connected to Loop go to [Change Pump Type](#change-pump-type).
-Loopers can choose from 4 pumps and a simulator:
+Loopers can choose from multiple pumps and a simulator:
* Minimed
* Note: only some Minimed pumps are compatible
* Please refer to [Compatible Pump](../build/pump.md#check-medtronic-pump-version) for additional details
* Omnipod
* Omnipod DASH
-* Dana-i / DanaRS-v3 (Coming soon)
- * Note: DanaRS-v1 or any Dana korean versions are not supported
- * A special fork is required at this time (see [link](../build/pump.md#sooil-dana-pumps) for details)
+* [All Omnipod Types](../version/development.md#feature-branch-omnipodkit-pump-manager){: target="_blank" } (available with `feat/omnipodkit` feature branch)
+* Dana-i / DanaRS-v3 (**work-in-progress; new pump manager, use with care**)
+ * Note: DanaRS-v1 or any Dana Korean versions are not supported
+* Medtrum Nano patch pump (**work-in-progress; new pump manager, use with care**)
* Insulin Pump Simulator
!!! info "Omnipod Terms"
The Loop app and LoopDocs use these terms:
- * **Omnipod** is the older (Eros) pods (requires RileyLink compatible device to Loop)
+ * **Omnipod** is the older (Eros) pods (requires [RileyLink](../build/rileylink.md){: target="_blank" } compatible device to Loop)
* **Omnipod DASH** is the newer BLE pods (phone talks directly to pod - no extra device needed to Loop)
* **Omnipod Common** means information common to Omnipod and Omnipod DASH
@@ -53,7 +54,12 @@ Here is an overview of the different steps for adding each pump. Before changin
1. [Select RileyLink](#select-rileylink)
1. [Medtronic](#medtronic)
-#### Steps for [Dana-i / DanaRS-v3](#dana-i-danars-v3) (Coming soon)
+#### Other Pumps
+
+> These are new pump managers that can be built using one of [two feature branches](../version/development.md#feature-branch-dana-and-medtrum-support){: target="_blank" }, `feat/dev-dana-medtrum` or `feat/eversense`.
+
+* [Dana-i / DanaRS-v3](#dana-i-danars-v3)
+* [Medtrum Nano](#medtrum-nano)
## Add Pump
@@ -132,7 +138,7 @@ At this point - you should hit `Cancel` (upper right of screen) and review the [
If you are not ready to fill and attach a pod with insulin, try filling a pod with water and let it drip into a ziplock bag to test running Loop on the pod. (Be sure the pod is not near anything when you hit "Insert Cannula".)
- You may enjoy reading [Rufus the Bear](https://www.loopandlearn.org/sl-rufus/){: target="_blank" }.
+ You may enjoy reading [Rufus the Bear](https://www.loopandlearn.org/sl-rufus/).
## Medtronic
@@ -230,10 +236,7 @@ The Medtronic status and commands available are shown in the [Pump Settings](med
## Dana-i / DanaRS-v3
-!!! important "Coming Soon"
- The Dana pump is not part of the released code yet. But the plug-in feature of Loop makes adding it extremely easy.
-
- If you want to test the Dana before it added to Loop, please join the discussion of this pump in zulipchat: [Dana Discussion](https://loop.zulipchat.com/#narrow/stream/144182-development/topic/Dana.20i.20pump){: target="_blank" }
+### Check Dana Pump Version
!!! info "Support for Dana-i"
All versions of the Dana-i are supported at the moment!
@@ -245,19 +248,59 @@ The Medtronic status and commands available are shown in the [Pump Settings](med
{width="450"}
{align="center"}
-When you select the "Dana-i/RS" option, you will be prompted to select your pump model.
-After this selection, you will get a short description on how the pairing process will work.
-Then you will get the following menu's:
+### Dana is a New Pump Manager
+
+**WARNING: Dana support in Loop is a work-in-progress; this is one of several new pump managers.**
+
+### Before Testing Dana
+
+You must build a feature branch to get Dana support in Loop. You can use either one of two feature branches: `feat/dev-dana-medtrum` or `feat/eversense`.
+
+* Please refer to information summarized at [Feature Branch: Dana and Medtrum Support](../version/development.md#feature-branch-dana-and-medtrum-support){: target="_blank" }.
+
+
+### When Testing Dana
+
+* Please do not use Dana with Loop unless you are willing to test and communicate with [developers on zulipchat in this DanaKit channel](https://loop.zulipchat.com/#narrow/channel/144182-development/topic/DanaKit.20Troubleshooting/with/547829260)
+### Add Dana Pump
+
+You can only add the Dana when no pump is selected. If you already have a pump selected, you must first delete the pump as detailed in [Change Pump Type](#change-pump-type).
+
+1. Select [Dana-i / DanaRS-v3](#select-dana-idanars-v3)
1. Select [Insulin Type](#insulin-type)
-2. Select [Delivery speed](#delivery-speed)
-3. Prepare your [Dana-i / DanaRS-v3 pump](#prepare-dana-idanars-v3)
-4. Connect to your [Dana-i pump](#pairing-dana-i) or [DanaRS-v3 pump](#pairing-danars-v3)
-5. (Optional): Enable [silent pump tones](#optional-enable-silent-pump-tones)
-6. (Optional): [Check if you need a heartbeat](#optional-check-if-you-need-a-heartbeat)
+1. Select [Delivery speed](#delivery-speed)
+1. [Pair Dana](#pair-dana)
+ * [Dana-i pump](#pairing-dana-i)
+ * [DanaRS-v3 pump](#pairing-danars-v3)
+1. (Optional): Enable [silent pump tones](#optional-enable-silent-pump-tones)
+1. (Optional): [Check if you need a heartbeat](#optional-check-if-you-need-a-heartbeat)
{align="center"}
+#### Device Name
+
+You will need to have a battery in the pump and you will need the 10-character Device Name for your pump.
+
+Start by checking the device name at the back of your Dana (or inside the "Model information" menu).
+Observe the a 10 character device-name listed behind the SN.
+The example below is from a Dana-i, but is the same for every Dana pump
+
+{width="450"}
+{align="center"}
+
+### Select Dana-i/DanaRS-v3
+
+When you select the "Dana-i/RS" option in the Add Pump screen, you will be prompted to select your pump model.
+
+Choose the pump you plan to use: either Dana-i or DanaRS-v3. You will see a third option, but it is not supported at this time.
+
+After this selection, you will get a short description on how the pairing process will work.
+
+Once you enter the pump type, you will see an information screen for that pump. Read the information and then continue to select the [Insulin Type](#insulin-type).
+
+After choosing insulin type, you will see the [Delivery speed](#delivery-speed) screen.
+
### Delivery speed
!!! info "IMPORTANT"
@@ -265,26 +308,24 @@ Then you will get the following menu's:
The Dana pumps supports several bolus/delivery speeds.
This might be interesting to customize if you want to slow down the bolus speed for insulin types that feel like it is burning.
+
Dana supports 3 speeds:
* 12 seconds per unit (default)
* 30 seconds per unit
* 60 seconds per unit
-### Prepare Dana-i/DanaRS-v3
+### Pair Dana
-Start by checking the device name at the back of your Dana (or inside the "Model information" menu).
-This is a 10 character code, which is listed behind the SN.
-The example below is from a Dana-i, but is the same for every Dana pump
-
-{width="450"}
-{align="center"}
+After you choose Delivery Speed, you will land on the Dana scanning page.
-After you have done the [Insulin Type](#insulin-type) and [Delivery speed](#delivery-speed), you will land on the Dana scanning page.
This page will show all the Dana pumps it could find in your area.
-Once you see your device name in the list, click on it and Loop will try to connect to your Dana-i / DanaRS-v3.
+Once you see your [device name](#device-name) in the list, click on it and Loop will try to connect to pair with:
-### Pairing Dana-i
+* [Dana-i](#pairing-dana-i)
+* [DanaRS-v3](#pairing-danars-v3)
+
+#### Pairing Dana-i
Once connected, your Dana-i will prompt you with a question if you want to connect.
Accept this and you will see a code on your Dana-i.
@@ -292,18 +333,22 @@ Meanwhile, you will see the standard iOS Bluetooth pairing modal.
Also accept this and fill in the code from your pump into iOS.
After that is done, Loop is ready to use your Dana-i!
-{width="450"}
-{align="center"}
-
-### Pairing DanaRS-v3
+#### Pairing DanaRS-v3
Once you see your device name in the list, click on it and Loop will try to connect to your DanaRS-v3.
+{width="450"}
+{align="center"}
+
Once connected, your DanaRS-v3 will prompt you with a question if you want to connect.
Accept this and you will see two codes on your DanaRS-v3.
Meanwhile, you will see a prompt for 2 codes in Loop.
Fill in the codes from your pump into iOS and Loop is ready to use your DanaRS-v3!
+### Setup Complete
+
+After the Dana pump is paired to the phone app, you will see the Setup Complete screen. Tap finish to begin using your Dana pump.
+
### (Optional) Enable silent pump tones
Normally, a Dana pump will make a sound or a vibration every time a bolus is completed.
@@ -323,8 +368,89 @@ Some pumps can also provide a heartbeat if the CGM you choose cannot provide one
DanaKit doesn't provide a heartbeat by default.
-Therefore, it is important to check if your CGM provides a heartbeat. If it does not, there are battery-intensive work-around methods for Dana pump. See [Dana Heartbeat Modes](../troubleshooting/dana-faq.md).
+Therefore, it is important to check if your CGM provides a heartbeat. If it does not, there are battery-intensive work-around methods for Dana pump. See [Dana Heartbeat Modes](../troubleshooting/dana-faq.md#heartbeat-modes){: target="_blank" }.
+
+## Medtrum Nano
+
+
+### Medtrum is a New Pump Manager
+
+**WARNING: Medtrum support in Loop is a work-in-progress; this is one of several new pump managers.**
+
+You must build a feature branch to get Medtrum support in Loop. You can use either one of two feature branches: `feat/dev-dana-medtrum` or `feat/eversense`.
+
+* Please refer to information summarized at [Feature Branch: Dana and Medtrum Support](../version/development.md#feature-branch-dana-and-medtrum-support){: target="_blank" }.
+
+
+### When Testing Medtrum Nano
+
+* Please do not use Medtrum Nano with Loop unless you are willing to test and communicate with [developers on zulipchat in the Medtrum channel](https://loop.zulipchat.com/#narrow/channel/144182-development/topic/Medtrum.20Nano.20-.20pumps.20for.20development.20use/with/481836247)
+
+### Confirm Patch and Pump Base are Compatible
+
+!!! info "All versions are supported!"
+ Both 200U (MD0201 & MD8201) and 300U (MD8301) version are supported with the correct version of the *Loop* app.
+
+!!! warning "Always check your REF's"
+ Before connecting your pump base with your patch, always check the REF on your patch with the REF on your pump base.
+ The first 3 digits should always match, the patch always ends with 0, while the pump base always ends with 1.
+ Do not use the patch if they do not match.
+
+ {width="450"}
+ {align="center"}
+### Add Medtrum Nano Pump
+
+You can only add the Medtrum patch pump when no pump is selected.
+If you already have a pump selected, you must first delete the pump as detailed in [Change Pump Type](#change-pump-type).
+
+1. Select [Insulin Type](#insulin-type)
+1. Check [Patch settings](#patch-settings)
+1. Enter your [pump base Serial Number](#check-pump-base-serial-number)
+1. Prime & Activate patch. See [Activation flow patch](#activation-flow)
+ 1. Note, make sure the pump base is connected to your patch before adding insulin
+
+{align="center"}
+
+### Patch settings
+
+!!! info "Good to know"
+ All of these settings can be adjusted throughout the lifespan of the patch. You can safely update them after activating the patch
+
+There are several settings you can setup while using Medtrum nano with the *Loop* app:
+
+1. `Max hourly insulin` & `Max daily insulin`: Medtrum Nano does not work with max bolus and max basal settings, it uses max hourly & max daily insulin. Just like the names suggests, it controls the maximum amount of insulin per hour or per day.
+1. `Alarm setting`: The Medtrum Nano has the ability to make a beep it there is an occlusion, patch fault, empty battery, etc. These alarms can also be silenced using this setting
+1. `Patch lifetime`: Normally, the medtrum nano runs for 3 days and 8 hours. This ensures the funcioning of the patch. You can disable this limit with this setting to extend the lifetime of the patch untill an failure occures, like an occlusion, empty battery, etc
+1. `Notification for expiration patch`: If the `Patch lifetime` setting is set to normal lifetime, you have the ability to update this setting. With this setting, you can control at what point you get a reminder notification for replacing the patch
+
+### Check pump base serial number
+
+After checking the patch settings, you are prompted to enter the pump base serial number.
+This serial number is used by the *Loop* app to connect to the correct pump base.
+To see your serial number, grab your pump base and look at the bottom of the base.
+It should have a QR code and a small 8 character serial number.
+See image below:
+
+{width="450"}
+{align="center"}
+
+### Activation flow
+
+!!! warning "IMPORTANT"
+ While the priming is running, DO NOT USE THE CANCEL BUTTON.
+ This might corrupt the activation flow, so please be patience while the priming process is running.
+
+!!! warning "IMPORTANT"
+ Connect your pump base to the patch before adding insulin to your patch.
+ Otherwise, you might corrupt the activation flow.
+
+After the serial number prompt, you need to setup the patch itself.
+Follow the visual guide in the *Loop* app and press "Start priming" to start priming the cannula of the patch.
+It is important to not attach the patch on your body before the priming process completes.
+
+After priming, follow the rest of the visual guide in the *Loop* app.
+From here, you can attach the patch to your body and complete the activation process.
## Change Pump Type
@@ -332,6 +458,8 @@ Before changing from one pump type to another pump type, you must delete the old
* If you are using Medtronic or Dana (RS/-i), scroll to the bottom of the pump screen and select `Delete Pump`
+* If you are using Pump Simulator on the phone, you must tap on Simulator Settings and then scroll to the bottom of the pump screen and select `Delete Pump`
+
* Before switching between Omnipod and Omnipod DASH or any kind of Omnipod to Medtronic, you must deactivate your current pod
* This does not include changing a pod, so long as the pods are of the same type
* The `Switch to other insulin delivery device` button will not be available with an active pod
diff --git a/docs/loop-3/dana.md b/docs/loop-3/dana.md
new file mode 100644
index 00000000000..31b36d99a6c
--- /dev/null
+++ b/docs/loop-3/dana.md
@@ -0,0 +1,30 @@
+!!! warning "🚧 Documentation Under Construction 🚧"
+
+ This page is under development.
+
+ The addition of the Dana-i and DanaRS-v3 pump to iOS Open-Source Automated Insulin Delivery systems is new.
+
+ Please review the [DanaKit Issues](https://github.com/bastiaanv/DanaKit/issues) page for open issues reported for the DanaKit Pump Manager.
+
+
+!!! important
+ This Issue is very important:
+
+ * [When Bluetooth communication is interrupted during a bolus, cannot cancel, bolus finalized while in progress](https://github.com/bastiaanv/DanaKit/issues/34)
+ * This issue prevents you from cancelling a bolus from inside the OS-AID app if Bluetooth communication with the pump is lost during a bolus
+
+
+### Testing Dana with the *Loop* App
+
+* The branch needed to get Dana in *Loop* is: `feat/dev-dana-medtrum`
+ * This branch is subject to rapid updates
+ * If you also want to use the Eversense CGM, the `feat/eversense` branch provides support for Dana and Medtrum along with the Eversense CGM
+
+* Please refer to the [zulipchat Loop-dev development channel](https://loop.zulipchat.com/#narrow/channel/144182-development/topic/Loop-dev.20Status/with/515372445) before building this branch.
+
+
+
+Most of the information needed for the Dana pump can be found here:
+
+* [How to add a Dana Pump](add-pump.md#dana-i-danars-v3){: target="_blank" }
+* [Dana Troubleshooting](../troubleshooting/dana-faq.md){: target="_blank" }
diff --git a/docs/loop-3/displays-v3.md b/docs/loop-3/displays-v3.md
index 132d5f2434f..cad0d4d4f9f 100644
--- a/docs/loop-3/displays-v3.md
+++ b/docs/loop-3/displays-v3.md
@@ -108,28 +108,67 @@ Please note that for safety reasons, Loop will assume a bolus was successful, ev
### Event History, Reservoir and Non-Pump Insulin
-Clicking on either the Active Insulin or Insulin Delivery charts will open your Insulin Delivery history. The top of the screen will display the current IOB and the total insulin delivered for the day since midnight (or since the time the loop became active if you started Loop after midnight). There are three tabs that can be viewed, with Event History shown by default:
+Tapping on either the Active Insulin or Insulin Delivery charts will open your Insulin Delivery history. The top of the screen will display the current IOB and the total insulin delivered for the day since midnight (or since the time the loop became active if you started Loop after midnight). There are three tabs that can be viewed, with Event History shown by default:
{width="250"}
{align="center"}
-* **Event History**: Event history is a detailed accounting of all pump/pod actions. Both Medtronic and Omnipod users will have a detailed record of event history. If you tap on an event, you get more detail. Turn your phone to landscape to improve readability.
+* **Event History**: Event history is a detailed accounting of all pump/pod actions. All pump managers provide a detailed record of event history. If you tap on an event, you get more detail. Turn your phone to landscape to improve readability.
* **Reservoir**:
- - **Omnipod** users should not worry if the reservoir display is blank. Pods do not report or track insulin remaining until their reservoirs get below 50 units remaining. When a pod is deactivated, the reservoir history for that pod is no longer displayed.
- - **Medtronic** users will have reservoir history displayed in 5-minute increments, unless Loop has been having communication issues.
+ - **Omnipod** users: Do not not worry if the reservoir display is blank. Pods do not report or track insulin remaining until their reservoirs get below 50 units remaining. When a pod is deactivated, the reservoir history for that pod is no longer displayed.
+ - **All other pump** users: The reservoir history is displayed in 5-minute increments, unless Loop has been having communication issues.
* **Non-Pump Insulin**: The user can enter insulin taken by another method such as inhaled or by injection. The user can choose a different insulin type than used by the pump. This is explained further at this [link](features.md#non-pump-insulin).
-!!! abstract "Previous Pod Insulin History"
- For those who want to delete some recorded insulin near the end of a pod because the site was not absorbing properly, this can be done in Apple Health.
+#### Event History and Details
+
+The event history lists pump events such as Temp Basal and Bolus, Suspend and Resume along with other events provided by the pump manager. In general, when the pump returns to Scheduled Basal, there is no indication in the list because that action is implied when the preceding Temp Basal event completed (the end of temp basal restores the pump to scheduled basal delivery unless a new temp basal rate event is started.)
+
+Additional details are available for every pump event. These are displayed by tapping on the event.
+
+#### Manual Bolus Example
+
+The graphic below shows pump event details for a manual bolus of 1 U. The `automatic: false` indicates this was a manual event initiated by the user.
+
+* The left side shows a bolus-in-progress
+ * The variable `isMutable` remains true while the bolus is in progress
+ * The `deliveredUnits` value is set to `nil` to indicate the final amount is not yet known
+ * The value for `units` is the requested bolus amount
+* The right side shows the same event once delivery is finalized
+ * The variable `isMutable` is set to false
+ * The `deliveredUnits` value is the final dose as reported by the pump manager and is used by *Loop* to update the earlier estimates *Loop* assumed for this event
+
+> {width="700"}
+{align="center"}
+
+#### Automatic Temporary Basal Rate Example
+
+The graphic below shows an automatic temporary basal rate (TBR) event. The `automatic: true` indicates this was an automatic event initiated by *Loop*.
+
+* The left side shows a temporary basal rate (TBR) in progress
+ * The variable `isMutable` remains true while the TBR is in progress
+ * The `deliveredUnits` value is set to `nil` to indicate the final amount is not yet known
+ * The value for `units` is the current temporary basal rate (in U/hr)
+ * The end date is based on the planned duration for this TBR
+* The right side shows this same event once it is finalized. In this case, the TBR was superceded by another command
+ * The end date was updated to show the actual end time for this TBR
+ * The variable `isMutable` is set to false
+ * The `deliveredUnits` value is the final dose as reported by the pump manager and is used by *Loop* to update the earlier esimates *Loop* assumed for this event
+
+> {width="700"}
+{align="center"}
+
+#### Modify Insulin History
+
+!!! abstract "Previous Insulin History"
+ For those who want to delete some recorded insulin when a site was not absorbing properly, this can be done in Apple Health.
Before attempting that modification, please read this entire section on [How does Loop use Apple HealthKit](../faqs/apple-health-faqs.md#how-does-loop-use-apple-healthkit) in detail.
Pay special attention to [Insulin and Apple HealthKit](../faqs/apple-health-faqs.md#insulin-and-apple-healthkit){: target="_blank" } section.
-
### Active Carbohydrates Chart
{width="400"}
@@ -269,8 +308,8 @@ The nominal pump icon displays high-level status information for the pump with t
* If Loop sets a temp basal rate of 0.2 U/hr, the icon displays -0.115 U
* If Loop sets a temp basal rate of 1.5 U/hr, the icon displays +1.185 U
* The reservoir status indicates insulin remaining graphically and displays a value when less than 50 U remain.
- * For Medtronic Pumps, the reservoir display indicates the level graphically.
* For Pods, the reservoir graphic is constant until the pod begins to report reservoir level when less than 50 U remain.
+ * For all other pumps, the reservoir display indicates the level graphically.
The table below shows examples for a few nominal Pump Status Icons and Alert messages that might be shown. In all cases, tapping on the Pump Status Icon opens the Pump Settings screen with more information.
@@ -278,10 +317,10 @@ The table below shows examples for a few nominal Pump Status Icons and Alert mes
| Icon | Meaning |
|---|---|
|{width="175"}|This nominal pump status graphic is for a Pod with temp basal less than scheduled basal rate and no reported reservoir level.|
-|{width="175"}|This nominal pump status graphic is for a Medtronic pump running scheduled basal rate and with a half-full reservoir.Manual Temp Basal menu and then an example.
+First the equations to calculate the desired rate $(\mathit{MT}\mathit{B})$ to enter into the Manual Temp Basal menu and then an example.
$$ Balance = BolusTotal - PromptAmount $$
-$$ MTB = Balance / H + BR $$
+$$ \mathit{MT}\mathit{B} = Balance / H + BR $$
-1. Turn on a [Manual Temp Basal](../../loop-3/omnipod.md#manual-temp-basal) to value of $MTB$ units/hour for $H$ hours
+1. Turn on a [Manual Temp Basal](../../loop-3/omnipod.md#manual-temp-basal) to value of $(\mathit{MT}\mathit{B})$ units/hour for $H$ hours
2. Tap the bolus icon on the main toolbar and enter a bolus for $PromptAmount$ units
The order is important. Sending the Manual Temp Basal request to the pod is a single command and then the *Loop* app is available for the next command to be entered. The *Loop* app (and pod) will not respond to any pod commands until the bolus finishes delivering; this takes about 40 seconds per unit requested.
@@ -164,9 +164,9 @@ For this example:
$$ Balance = 3 U - 1 U = 2 U $$
-$$ MTB = (2 / 1.5) U/hr + 0.5 U/hr = 1.55 U/hr $$
+$$ \mathit{MT}\mathit{B} = (2 / 1.5) U/hr + 0.5 U/hr = 1.85 U/hr $$
-You have your choice of rounding $MTB$ up or down to the nearest $0.05 U/hr$. For this example, the quantity of $(2/1.5)=1.333$ was rounded up to $1.35 U/hr$.
+You have your choice of rounding $(\mathit{MT}\mathit{B})$ up or down to the nearest $0.05 U/hr$. For this example, the quantity of $(2/1.5)=1.333$ was rounded up to $1.35 U/hr$ and then the scheduled basal rate was added.
??? question "Why isn't there a menu item? (Click to see more)"
Each item provided by the *Loop* app needs a volunteer to decide it is important and develop a method to provide that item. If a volunteer steps up to do this work, there is a long process of discussion and code review before such a modification is considered for the development branch.
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index f549b8a0df6..6002c154082 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -1,3 +1,15 @@
+/*
+ * Materialize links that open in a new window/tab with a right-up arrow icon
+ */
+ .md-main a[target="_blank"]::after,
+ .document a[target="_blank"]::after {
+ content: "↗";
+ display: inline-block;
+ margin-left: 0.2em;
+ width: 1em;
+ height: 1em;
+ }
+
/* Custom styles to override MkDocs defaults and enhance theme */
/* Unordered list repository. These work for any compatible fork from the original GitHub repository.
+
+ The SHA-1 20-character value is abbreviated as SHA and typically only the first 7 or 8 characters are presented to identify the commit for a particular repository.
+
+### How to Build Feature Branches
+
+For full instructions on building different branches, review these pages:
+
+* [Browser Build: Build a Version in Development](../browser/build-dev-browser.md#build-development-version){: target="_blank" }
+ * For short-cut instructions on adding the feature branch: [Feature Branch](../browser/build-dev-browser.md#feature-branch){: target="_blank" }
+* [Mac Xcode: Build a Version in Development](../build/build-dev-mac.md#build-other-branches){: target="_blank" }
+
+#### Browser Build
+
+Use the page linked above to add the desired branch name (from the table above) to your fork. In other words, where the directions indicate the `dev` branch, you substitute the branch name of interest.
+
+#### Mac-Xcode Build
+
+For Mac Xcode build, the lines you need to copy and paste into a Terminal window are explicitly provided below:
+
+``` { .bash .copy title="Download and build the feat/omnipodkit branch" }
+/bin/bash -c "$(curl -fsSL \
+ https://raw.githubusercontent.com/loopandlearn/lnl-scripts/main/BuildLoop.sh)" \
+ - feat/omnipodkit
+```
+
+``` { .bash .copy title="Download and build the feat/dev-dana-medtrum branch" }
+/bin/bash -c "$(curl -fsSL \
+ https://raw.githubusercontent.com/loopandlearn/lnl-scripts/main/BuildLoop.sh)" \
+ - feat/dev-dana-medtrum
+```
+
+``` { .bash .copy title="Download and build the feat/eversense branch" }
+/bin/bash -c "$(curl -fsSL \
+ https://raw.githubusercontent.com/loopandlearn/lnl-scripts/main/BuildLoop.sh)" \
+ - feat/eversense
+```
+
+### Version Number Plan
+
+Please see [`Loop` Version Numbering](releases.md#loop-version-numbering) for the current method for version numbering for the `main` and `dev` branches.
+
+The idea of having a feature branch is not new for the *Loop* app but hasn't been used for a few years. At this point, we have several feature branches.
+
+The version number in the feature branch will match either the `dev` branch version number or a work-in-progress update to the `dev` branch which uses the naming convention `update_dev_to_M.m.#`.
+
+* In other words, the feature branch is up to date with other changes to `dev` or `update_dev_to_M.m.#` with the added support for the specific feature
+* Each feature has an associated repository that contains the feature
+ * When updates to the feature are added, the SHA for the feature branch and the SHA for the submodule(s) which support that feature will be reported in the table above and can be found by examining the LoopWorkspace repository for that feature branch
+
+### Feature Branch: OmnipodKit Pump Manager
+
+You need to build the `feat/omnipodkit` branch if you want to test the new `All Omnipod Types` pump manager. Build instructions are found here: [How to Build Feature Branches](#how-to-build-feature-branches).
+
+This pump manager comes with improved user interface and user experience for Omnipod Classic (Eros) and DASH pods including
+
+* Some layout adjustments
+* Some new labels
+* Some reworked sub-menus with added information or features
+* WARNINGS
+ - no translations added yet so English only for the initial roll-out
+ - no pod-keep-alive function added yet
+
+The next time you change a pod, delete the pump manager you are using and add a new pump. See [Change Pump Type](loop-3/add-pump.md#change-pump-type){: target="_blank" } for detailed instructions.
+
+* Select `All Omnipod Types` as your new pump manager.
+* Go through the onboarding of selecting notifications and reminders and insulin type.
+* You will then be presented with a screen to select the type of pod.
+* Choose the Classic (Eros) or DASH Pod type
+
+The underyling control code should be the same, but we want more people testing it to ensure this works as well as the older pod managers. The developers have been using it on themselves before making this publicly available.
+
+!!! warning "Do not use with iPhone 16 or 17e and Atlas pods"
+ The new OmnipodKit does not have the pod-keep-alive feature incorporated. For now, if you use an iPhone 16 (any model) or iPhone 17e and have Atlas pods (the newer version for DASH pods), stick with the old Omnipod DASH selection.
+
+!!! question "Why OmnipodKit?"
+ When the initial work to add DASH to the supported pumps was started in 2021, a completely separate pump submodule was created distinct from the Classic (Eros) pump submodule. In other words, OmniBLE handled DASH and OmniKit handled Eros.
+
+ A significant portion of the two repositories serve the same function. Whenever a fix or improvement was added to OmniBLE, it was duplicated and added to OmniKit. Having a universal pod manager saves significant developer resources.
+
+ OmnipodKit provides the individual support needed for different `Pod Types` while using a single copy of code for most of the logic and user interface.
+
+ The improvements that have been going on in the background landed in the new pump manager only - and were not replicated in the OmniKit or OmniBLE repositories.
+
+ This will be a significant time saver for developers moving forward for updating code and adding support for new types of pods.
+
+!!! tip "feat/omnipodkit supports other plugins"
+ For the convenience of the developers and testers, this feature branch, feat/omnipodkit, also supports the new pump and cgm managers that are found in the other feature branches.
+
+ In other words:
+
+ * Eversense is available as a CGM
+ * Dana and Medtrum are available as a pump, in addtion to OmnipodKit and all the older pump managers
+
+### Feature Branch: Pod Keep Alive Feature
+
+The feat/pod-keep-alive branch has been deleted. It was updated and incorporated into the released code. Please build the `main` branch over your existing app. All your selections will remain as you configured them when building the `feat/pod-keep-alive` branch.
+
+See [Pod Keep Alive Feature](../loop-3/omnipod.md#pod-keep-alive-feature){: target="_blank" }.
+
+
+### Feature Branch: Dana and Medtrum Support
+
+Anyone using Dana or Medtrum pumps must build one of these branches. The pump manager support is identical. The difference is the second one includes support for the Eversense CGM. Build instructions are found here: [How to Build Feature Branches](#how-to-build-feature-branches).
+
+* `feat/dev-dana-medtrum`
+* `feat/eversense`
+
+!!! important "New Pump Managers"
+ These are new Pump Managers and may have known or unknown bugs. Please only use a feature branch if you are prepared to follow along in zulipchat and are willing to help test and resolve issues. This is critical when using new pump managers.
+
+ * Please ensure you have the latest version of a given branch by synching before you build:
+ * Browser Build: be sure you select `feat/dev-dana-medtrum` or `feat/eversense` branch
+ * The Build Loop action automatically syncs your fork when building
+ * Be sure to install the resultant build from *TestFlight* onto your phone
+ * Mac-Xcode: you can update your clone or download a fresh copy
+ * if updating your clone, be sure to type `git pull --recurse` in your `LoopWorkspace` folder to include updates to all submodules
+ * See [Mac-Xcode Build](#mac-xcode-build) for fresh download instructions
+
+!!! important "Bluetooth Connection Issues for Dana and Medtrum"
+ Both the Dana and Medtrum pumps are designed to stay in continuous Bluetooth commnication with the pump controller. This is quite different from the older Pod and Medtronic pumps.
+
+ The behavior of your OS-AID system needs to properly handle bolus and temp basal rate events in progress if that communication is interrupted. This can happen if someone walks away from their phone during a bolus or while a temp basal rate is in progress.
+
+ Please read the rest of this section to learn about how this might affect an older or current version of your OS-AID app.
-### GitHub Browser Build Updates
+#### Recently Closed Issue for Medtrum
-The `dev` branch has several updates merged that make it easier to find errors in configuration and that make the GitHub Browser Build automatic.
+!!! success "Medtrum Bluetooth Comms Loss Updated"
-Note that the automatic build feature is opt-out. In other words, unless you take specific steps, the GitHub Browser Build for _Loop_ will:
+ #### MedtrumKit - fixed on 29 April 2026
-* Automatically build a new version once a month, with automatic update included
-* Automatically update your fork of LoopWorkspace once a week if updates are available
+ [MedtrumKit Issue 112](https://github.com/jbr7rr/MedtrumKit/issues/112) reported that MedtrumKit did not properly handle a Temp Basal Rate (TBR) event if BLE comms was lost at the time the TBR completed.
-It is suggested that all users of the released code (main branch), maintain this automatic schedule so they are never without a valid and up-to-date _Loop_ in their *TestFlight* app.
+ [MedtrumKit PR 118](https://github.com/jbr7rr/MedtrumKit/pull/118) provided an updated management of TBR providing accurate handling of TBR when BLE was interrupted and later restored.
-In addition to the easier to read error messages found with these updates, these additional simplifications include:
+ #### MedtrumKit - fixed on 25 March 2026
-* Actions are broken into logical components, each of which provides an easy to understand error message if it fails which includes a suggested fix
-* A new builder no longer needs to create the Match-Secrets repository
- * If it does not exist, one is created for you
- * Only the App Group ID must be added to the Identifiers; all other App services are automatically added
-* For new builders and current 3.2.3 users updating to the next release
- * The branches with `alive` in the name required to enable automatic update and building are created automatically
- * Make sure your GitHub repository is in sync with the LoopKit/LoopWorkspace repository
+ [MedtrumKit Issue 92](https://github.com/jbr7rr/MedtrumKit/issues/92) reported that when the Medtrum moved out of Bluetooth range, the app reported an interrupted bolus when in fact the bolus continued. This led to underreported values for Active Insulin, also known as Insulin on Board (IOB).
-These sections are still useful for version 3.5.0 `dev` users:
+ [MedtrumKit Pull Request 93](https://github.com/jbr7rr/MedtrumKit/pull/93) fixed this issue. Now if Bluetooth communication is lost, the pump manager relies on expected timing to continue the bolus progress display. The bolus is not considered final until BLE is restored and the app is able to communicate with the pump.
-* [Browser Build for dev](../browser/build-dev-browser.md): How to use GitHub Browser Build for `dev` branch
-* [Browser Build: One-Time Changes](../browser/build-dev-browser.md#one-time-changes): New steps and dates at which the new steps were added
+#### Open Issue for DanaKit
-### Miscellaneous Code Fixes
+!!! bug "DanaKit Bluetooth Comms Loss Not Fixed"
-#### G7 Sensors: Duplicate CGM Values
+ #### DanaKit - Issue is still open
-Fixed with [PR 16: Fix parsing of age field of message](https://github.com/LoopKit/G7SensorKit/pull/16){: target="_blank" }
+ The Medtrum Issue report led to testing for DanaKit. The bolus issue has a slightly different error signature. This two issues are still open, so Dana users need to be aware of them.
-* Most sensors report the time with very little offset between time of arrival and time of sensing
-* If the time discrepancy is large, the error (using one byte instead of two for age of the reading) could cause CGM values to appear as duplicate readings in Loop
+ [DanaKit Issue 36](https://github.com/bastiaanv/DanaKit/issues/36) reported that DanaKit did not properly handle a Temp Basal Rate (TBR) event if BLE comms was lost at the time the TBR completed.
-#### Remote Services Update
+ [DanaKit Issue 34](https://github.com/bastiaanv/DanaKit/issues/34)
-The code that feeds Loop data to remote services like Tidepool and Nightscout have been improved to be more robust.
+ * When Bluetooth communication is interrupted during a bolus, the pump manager reports the bolus as finalized even if it is still being delivered
+ * If this happens, you cannot cancel from the app
+ * The OS-AID treats that bolus as finalized as soon as communication is lost
+
+ This is less serious of a problem because the reported IOB matches what the pump was told to deliver. But of course, it will be fixed.
+
+#### Issue Fixed Earlier
+
+!!! success "Temp Basal Accounting Corrected"
+ The accounting used by Loop requires specific feedback from the Pump Managers. This important information was not initially added to the Dana or Medtrum pump managers. Those both were developed first for Trio which uses a different algorithm and accounts for insulin dosing differently.
+
+ This oversight is fixed for both Dana and Medtrum.
+
+ * Medtrum was fixed on 17 Feb 2026
+ * Dana was fixed on 26 Feb 2026
+
+ If you were using Loop with one of these pumps before those dates, be aware that when you update your build, your settings may need to be adjusted.
+
+ * For more information see the closed MedtrumKit Issue: [Loop and Medtrum Pump Manager: Basal Delivery Accounting is Not Correct](https://github.com/jbr7rr/MedtrumKit/issues/77#issuecomment-3915865502)
+ * For more information see the closed DanaKit Issue: [Loop and DanaKit: Observe Pump Event Details in Loop](https://github.com/bastiaanv/DanaKit/issues/32#issuecomment-3937294107)
+
+- - -
+
+### Feature Branch: Eversense Support
+
+#### Recently Closed Issue for Eversense
+
+!!! success "Eversense Placement Guide updated"
+
+ #### EversenseKit - fixed on 30 April 2026
+
+ [EversenseKit Issue 26](https://github.com/bastiaanv/EversenseKit/issues/26) reported that the placement guide graph was not updating when attaching the Transmitter over the sensor.
+
+ [EversenseKit PR 30](https://github.com/bastiaanv/EversenseKit/pull/30) fixed the problem. The solution was to enable debug mode while using the placement guide and disable debug mode when done.
+
+There is a new feature branch available, `feat/eversense` which supports the Eversense E365 and E3 transmitters. In addition to Eversense support, this branch also has the same pump support as the `feat/dev-dana-medtrum` branch.
+
+For anyone who tests this branch with Eversense, if there are issues with your use of Loop with Eversense please report in this [zulipchat channel](https://loop.zulipchat.com/#narrow/channel/144182-development/topic/Eversense.20CGM/with/569969251).
+
+Be sure to include:
+
+* a description of your issue
+* your phone model and iOS version
+* your build method:
+ * Browser Build
+ * Mac-Xcode and include Xcode version
+* which version of code you are running (branch name and SHA)
+* share your Eversense logs (at bottom of the Loop Eversense screen)
+
+If you prefer to create an issue directly at the Eversense repo, create it here:
+
+* [https://github.com/bastiaanv/EversenseKit/issues](https://github.com/bastiaanv/EversenseKit/issues)
+
+> Note
+
+> * This was tested using an E365 transmitter attached to a small vial containing a sensor in glucose solution
+> * This enabled testing the Eversense behavior with Loop on a test phone
+> * No testing with the E3 (3-month, 90-day) sensor has been performed
+
+
+## Older updates
+
+### Updates from v3.8 to v3.10
+
+The updates developed in the `dev` branch before the release of v3.10.0 are found in these PR.
+
+* [Update dev to 3.9.5](https://github.com/LoopKit/LoopWorkspace/pull/394)
+* [Update dev to 3.9.4](https://github.com/LoopKit/LoopWorkspace/pull/367)
+* [Update dev to 3.9.3](https://github.com/LoopKit/LoopWorkspace/pull/358)
+
+
+### Updates from v3.6 to v3.8
+
+The updates developed in the `dev` branch before the release of v3.8.0, are provided in reverse chronological order.
+
+#### v3.7.7
+
+The changes are to maintenance scripts and to translations with no change to the function of the code:
+
+* There are some updates to translated strings that people who use Loop in other languages may notice
+ * The DanaKit pump translations now work
+ * Parts of the Favorite Foods sections are now translated
+ * Many common keys used in more than one submodule are linked so they only need to be translated one time to appear in the app
+* With v3.6.2, the method to Add Identifiers when using Browser Build for the *Loop* app changed.
+ * The new method requires the time-sensitive capability be added manually
+ * This change was captured in LoopDocs but not in testflight.md
+ * The instructions found in testflight.md were updated
+* For developers who might want to know, this update included
+ * conversion to use String Catalogs for localization in the submodules with associated tweaks to Xcode configuration
+ * updates to the CircleCI configurations
+
+#### v3.7.6
+
+* Updated some localization (strings translated to different languages)
+ * Added scripts to make localization more streamlined
+* Cleaned up some code
+ * Fixed a bolus problem with iOS 26
+ * Discarded some unneeded files
+ * Updated to Xcode 16.4 for browser build and CircleCI quality testing
+
+#### v3.7.5
+
+* Added support for Dana-i and DanaRS-v3 pump models
+
+#### v3.7.0 through v3.7.4
+
+* `dev` v3.7.x was same as [`main` v3.6.x](releases.md#loop-v364).
+
+### Updates from v3.4 to v3.6
+
+All updates are reported in [`Loop 3.6.0`](releases.md#loop-v360){: target="_blank" }
+
+Check [Version History](releases.md#loop-3-version-history) for minor updates found in 3.6.x.
+
+### Updates from v3.2 to v3.4
+
+Features new with v3.4, originally in the Updates in `dev` section before the release, have been inserted into the appropriate part of the *LoopDocs* website (indicated by the up-right arrow after the link). The links below are left to assist people in finding the features.
+
+* [Support for Libre Sensors](../loop-3/add-cgm.md#libre){: target="_blank" }
+* [Pump or CGM Simulator on Phone](simulator.md#pump-or-cgm-simulator-on-phone){: target="_blank" }
+* [Algorithm Experiments](../loop-3/settings.md#algorithm-experiments){: target="_blank" }
+ * [Glucose Based Partial Application Factor](../loop-3/features.md#glucose-based-partial-application-gbpa){: target="_blank" }
+ * [Integral Retrospective Correction](../loop-3/features.md#integral-retrospective-correction-irc){: target="_blank" }
+* [Favorite Foods](../loop-3/settings.md#favorite-foods){: target="_blank" }
+* [TestFlight Expiration Warning](../operation/features/notifications.md#loop-app-expiration-notification){: target="_blank" }
+
+- - -
## What are Git Branches?
There is a lot of discussion about *branches* with *Loop* but the concept is simple. Basically, they are all slightly different versions of *Loop*...kind of like different edits of the same book.
-To really understand what branches are, we should probably explain a little more about the software and how development works. You can watch a 30-minute long, classic Katie DiSimone [video explanation about branches](https://www.youtube.com/watch?v=cWqvYs4Azt0&t=4s){: target="_blank" } created when *Loop* Version 2.0 was newly released. Keep in mind while watching the video:
+To really understand what branches are, we should probably explain a little more about the software and how development works. You can watch a 30-minute long, classic Katie DiSimone [video explanation about branches](https://www.youtube.com/watch?v=cWqvYs4Azt0&t=4s) created when *Loop* Version 2.0 was newly released. Keep in mind while watching the video:
Details that are different:
* The way the code is organized has changed: see [LoopWorkspace](loopworkspace.md){: target="_blank" }
* The default branch name used to be `master` - but is now `main`
-* `carthage` is no longer used to determine which submodules (frameworks) are pulled in to build Loop (see [LoopWorkspace](#loopworkspace))
+* `carthage` is no longer used to determine which submodules (frameworks) are pulled in to build Loop (see [LoopWorkspace](loopworkspace.md))
The information in this video is still generally useful with the last half focused on automatic-bolus - the automatic-bolus dosing strategy has now been incorporated into *Loop* `main` branch. *Loop* has moved on to using only one stable branch (`main`), with `dev` suggested for developers/testers.
### `Loop` GitHub Information
-*Loop* developers own an account in *GitHub* called [LoopKit](https://github.com/LoopKit){: target="_blank" }. Within that account, the developers have several repositories that support *Loop* in particular. A repository is like a book...let's think of it like a cookbook for now. Within the `LoopKit` account, there are `repositories` for Loop itself, *LoopDocs*, and various other supporting "frameworks" that are helper repositories for *Loop* to build correctly. For example, Loop's repository has a lot of info about the app itself; the outward-facing things that you interact with. How information is put to you and taken in from you...that's in *Loop* repository code. But, there's more than just a user interface for Loop. *Loop* has to do a lot of complex work like Bluetooth communications, algorithm math, pump communications, etc. The *Loop* app has help from frameworks to do those other parts. `CGMBLEkit` for some of the transmitter parts of *Loop*, `RileyLink_ios` for the pump managers (talking to the pumps and decoding their information), `LoopKit` for the algorithm about carbs and insulin curves, etc.
+*Loop* developers own an account in *GitHub* called [LoopKit](https://github.com/LoopKit). Within that account, the developers have several repositories that support *Loop* in particular. A repository is like a book...let's think of it like a cookbook for now. Within the `LoopKit` account, there are `repositories` for Loop itself, *LoopDocs*, and various other supporting "frameworks" that are helper repositories for *Loop* to build correctly. For example, Loop's repository has a lot of info about the app itself; the outward-facing things that you interact with. How information is put to you and taken in from you...that's in *Loop* repository code. But, there's more than just a user interface for Loop. *Loop* has to do a lot of complex work like Bluetooth communications, algorithm math, pump communications, etc. The *Loop* app has help from frameworks to do those other parts. `CGMBLEkit` for some of the transmitter parts of *Loop*, `RileyLink_ios` for the pump managers (talking to the pumps and decoding their information), `LoopKit` for the algorithm about carbs and insulin curves, etc.
-When you build *Loop*, in the background, *Loop* pulls those other frameworks (7 in total) into the build process using `Carthage`. `Carthage` is like a personal shopper. You give it a shopping list (the cart file in *Loop* code is that shopping list) and it goes and fetches that for you during the build process. Sometimes your computer has an old shopping list...and that can cause build errors. Hence the `carthage update` fix in the Build Errors page...that command updates the shopping list to get the right versions of those frameworks.
+When you build *Loop*, you actually start with LoopWorkspace which points to all the other repositories needed for a complete *Loop* app.
-{width="650"}
-{align="center"}
-
-Anyways...so now you know about the general structure of *Loop* and *LoopKit* in *GitHub*. Now we can discuss *Loop* itself a little deeper.
+### *Loop* as a Cookbook
So let's imagine *Loop* as a cookbook. The developers are the authors/chefs of the recipes (code) in the cookbook. The authors spend countless hours testing new recipes, taste testing, and documenting improvements. They send the drafts to the editor, who makes suggestions and eventually, the cookbook is finalized. There are no grammar issues, and no typos, the photos are beautiful and the recipes are yummy. They publish the book and you see a gorgeous final product on the shelves. That is called a release, and it is the `main` branch. This book has been well-tested and is super stable. Every time you cook with those recipes, you know exactly what you're getting and lots of people have had a chance before you to make sure that it all tastes good. The `main` branch is stable and tested.
-But then...the chefs/developers go on a trip. They are inspired by new cuisine and want to add new recipes to the old cookbook. (Things like Omnipod support and the overrides are new "recipes" that were developed since the last `main` release, for example.) But, the process of developing a recipe is arduous. There was a lot of trial and error involved. Lots of tweaking ingredients (code). The editors try out the new recipes and offer feedback (similar to the [Issues List on GitHub](https://github.com/LoopKit/Loop/issues){: target="_blank" }). While the recipes are being developed, they have a version of the old cookbook that gets marked up...edited in pencil a lot. Scribbles and notes in the side. Revisions happen frequently because that's what testing new recipes is all about. These marked-up versions of the cookbook are called the `dev` branch. Short for "development" branch. Like the name sounds...this is where new developments are happening, new recipes, and tweaks.
+But then...the chefs/developers go on a trip. They are inspired by new cuisine and want to add new recipes to the old cookbook. (Things like Omnipod support and the overrides are new "recipes" that were developed since the last `main` release, for example.) But, the process of developing a recipe is arduous. There was a lot of trial and error involved. Lots of tweaking ingredients (code). The editors try out the new recipes and offer feedback (similar to the [Issues List on GitHub](https://github.com/LoopKit/Loop/issues)). While the recipes are being developed, they have a version of the old cookbook that gets marked up...edited in pencil a lot. Scribbles and notes in the side. Revisions happen frequently because that's what testing new recipes is all about. These marked-up versions of the cookbook are called the `dev` branch. Short for "development" branch. Like the name sounds...this is where new developments are happening, new recipes, and tweaks.
After much testing and tweaking, eventually, the recipes get the flavors right (bugs in code are squashed) and enough people have provided feedback and careful observations of results...that the book goes to the publishing house for the next printing. The cookbook is republished with an updated edition number and new recipes are highlighted. When this happens in *Loop*, Loop's `main` branch is updated with the new features coming from `dev` (aka, the `dev` branch is merged into the `main` branch). When that happens, the `main` branch gets another `release` version. At this point, `dev` and `main` are identical. They remain so until the development team for *Loop* starts working on the next batch of improvements, which could be in the next hour or even days later, but then the cycle starts again. The developers will start editing the code again and dropping those edits in the `dev` branch for further development.
## What's going on in the `dev` branch?
-The `dev` branch, currently v3.5.0, is where the next version of *Loop* is being developed and tested.
+The `dev` branch is where the next version of *Loop* is being developed and tested.
If you choose to build *Loop* using a `dev` branch, you need to be aware that the `dev` branch may update code frequently and unannounced in the traditional sense that most users in the *Looped* group or *Instagram* would see. Developers are not helped by people being in a `dev` branch if those users mistakenly think of it as a stable `main` branch with lots of detailed docs to go with it. People should only use a `dev` branch build if they EDUCATE themselves on the expectations and how to properly manage `dev` information and updates. People using the `dev` branch should also have regular access to a computer to be able to rebuild quickly if a new bug/fix is identified.
-If you choose to use a `dev` build, you can stay abreast of developments in a number of ways...but they will all require you to do some legwork and keep yourself informed. This is not a situation where you should expect a fancy *Loopdocs* page updated regularly with current "`dev` updates"...that's just not the way the `dev` branch works (at least normally).
+If you choose to use a `dev` build, you can stay abreast of developments in a number of ways...but they will all require you to do some legwork and keep yourself informed. This is not a situation where you should expect a fancy *Loopdocs* page updated regularly with current "`dev` updates"...that's just not the way the `dev` branch works (at least normally). There is, however, an attempt to organize the current status of development in the [Updates in `dev`](#updates-in-dev) section.
### Subscribe to the Zulipchat channels
-Use [Zulipchat](https://loop.zulipchat.com){: target="_blank" } forums for *Loop*.
+Use [Zulipchat](https://loop.zulipchat.com) forums for *Loop*.
This forum has several streams of conversations (`streams`) depending on interest. I highly recommend following all the streams so you do not miss conversations. You can select by stream and by topic within a stream to focus on a given conversation.
!!! tip "Zulip Chat Streams"
- - If you are using the **dev** branch, you **must** be in the **[#development](https://loop.zulipchat.com/#narrow/stream/144182-development){: target="_blank" }** stream.
- - If you want to know when **LoopDocs** gets updated, follow the **[#documentation](https://loop.zulipchat.com/#narrow/stream/270362-documentation){: target="_blank" }** stream.
+ - If you are using the **dev** branch, you **must** be in the **[#development](https://loop.zulipchat.com/#narrow/stream/144182-development)** stream.
+ - If you want to know when **LoopDocs** gets updated, follow the **[#documentation](https://loop.zulipchat.com/#narrow/stream/270362-documentation)** stream.
- **Code changes** are called commits in GitHub.
- The **[#github](https://loop.zulipchat.com/#narrow/stream/144191-github){: target="_blank" }** stream will have an automated post whenever a new commit is made and it will give a brief line description of the commit.
+ The **[#github](https://loop.zulipchat.com/#narrow/stream/144191-github)** stream will have an automated post whenever a new commit is made and it will give a brief line description of the commit.
{width="650"}
{align="center"}
-You can also go directly to the git commit history for each of the branches if you'd like.
+You can also go directly to the git commit history for each of the branches if you'd like. Note that `LoopWorkspace` is the card-catalog for all the books (repositories) used by Loop.
-- [`Loop` **`main`** branch: git commit history](https://github.com/LoopKit/Loop/commits/main){: target="_blank" }
-- [`Loop` **`dev`** branch: git commit history](https://github.com/LoopKit/Loop/commits/dev){: target="_blank" }
+- [`LoopWorkspace` **`main`** branch: git commit history](https://github.com/LoopKit/LoopWorkspace/commits/main)
+- [`LoopWorkspace` **`dev`** branch: git commit history](https://github.com/LoopKit/LoopWorkspace/commits/dev)
-If you click on the commit, you can see exactly what changes to the code were made. It's an interesting learning experience. In red is the old code, and in green is the updated code. The line numbers and file names of the edited code are also there to help.
+If you click on the commit, you can see exactly what changes to the code were made. It's an interesting learning experience. In red is the old code, and in green is the updated code. The line numbers and file names of the edited code are also there to help.)
{width="550"}
{align="center"}
@@ -141,45 +405,52 @@ I don't expect many of you would understand exactly what the edits mean, or how
### Watch the `Loop Repository` and `Issues List`
-Open the [`Loop repository`](https://github.com/LoopKit/Loop){: target="_blank" } and subscribe to the `Issues`.
+Open the [`Loop repository`](https://github.com/LoopKit/Loop) and subscribe to the `Issues`.
-You can choose to watch the `repository` so that you get emails when new `Issues` are reported. This is a good way to find out if other people are reporting odd behavior that you are wondering about. If you use `dev` and wonder about something you are seeing in *Loop*, you can check [`Issues` list](https://github.com/LoopKit/Loop/issues){: target="_blank" } to see if others are noticing the same. If so, you can help by capturing information and reporting it. Not super helpful to just say "Yeah, me too..." but better if you can attach screenshots, `Issue Reports` from *Loop* settings, and a thorough description of the problem you are seeing. Be a part of the solution by thoughtfully providing information to help debug.
+You can choose to watch the `repository` so that you get emails when new `Issues` are reported. This is a good way to find out if other people are reporting odd behavior that you are wondering about. If you use `dev` and wonder about something you are seeing in *Loop*, you can check [`Issues` list](https://github.com/LoopKit/Loop/issues) to see if others are noticing the same. If so, you can help by capturing information and reporting it. Not super helpful to just say "Yeah, me too..." but better if you can attach screenshots, `Issue Reports` from *Loop* settings, and a thorough description of the problem you are seeing. Be a part of the solution by thoughtfully providing information to help debug.
{width="650"}
{align="center"}
-### Keep checking `Looped` group
-
-Keep watching [`The Looped Group`](https://www.facebook.com/groups/TheLoopedGroup){: target="_blank" } on *Facebook*. Major concerns/issues are brought up there...so it doesn't hurt to scroll through and see what's going on there.
-
### Become familiar with your data sources
Another useful thing if you'll be on `dev` branches undergoing a lot of active change...know how *Loop* works and where to look for additional information about what you are seeing. For example, if you see an IOB value that looks odd, you should know to look at the insulin deliveries stored in the *Health* app.
-### Generate an Issue Report
+### Generate an Issue Report and a Critical Event Log
+
+!!! tip "Issue Report vs Loop Issue"
+ The action in the *Loop* app where you select `Issue Report` generates a human-readable LoopReport file that you can share which has a lot of useful information.
+
+ The `Loop Issue` mentioned in [Watch the `Loop Repository` and `Issues List`](#watch-the-loop-repository-and-issues-list) is a website at GitHub where known Issues with the *Loop* app are kept in permanent storage.
+
+ The names are similar, but the activity is quite different.
+
+Know how to generate an `Issue Report` and `Export a Critical Event Log` when you see a problem so you can provide that if asked.
-Know how to generate an `Issue Report` when you see a problem so you can provide that if asked. An `Issue Report` is a log file generated by the *Loop* app that has a lot of information the developers can parse to figure out what *Loop* was doing when you were having a problem.
+* An `Issue Report` is a log file generated by the *Loop* app that has a lot of information the developers can parse to figure out what *Loop* was doing when you were having a problem. Some items go back 84 hours (pump and cgm messages), others are limited to a few hours (decision arrays) and some items are overall status (build version number and phone model / iOS).
+* A `Critical Event Log` contains a zip of 7 individual zips. Each zip is for one day and contains the complete set of data used for Loop decision making. The event log goes back 7 full days.
-* `Loop Settings` and then scroll almost to the bottom and select `Issue Report`
+To issue these reports:
-Do not confuse this with reporting an issue with *Loop*. That is done by logging into *GitHub* and going to the [`Issue` page](https://github.com/LoopKit/Loop/issues){: target="_blank" } to report a new issue. You can read about existing issues without logging in, but to report a new one, you must log in to *GitHub*.
+* `Loop Settings` and then scroll almost to the bottom and select `Issue Report` and thenm share
+* `Loop Settings` and then scroll almost to the bottom and select `Export a Critical Event Log` and then share
### Create a Debug Report
-This 6-minute long, classic Katie DiSimone video shows how to [capture debugging logs](https://youtu.be/Ac4MguvUO7M){: target="_blank" }. If you are testing a new branch, this is a valuable skill to assist developers in identifying problems. In addition to showing you how to generate and save the debug text information, the video explains how to create a gist with the debug information using your *GitHub* account and file an official Issue on the *Loop* *GitHub* repository. This may be required in some cases. But start by chatting directly on [Zulipchat](https://loop.zulipchat.com){: target="_blank" } with the developer. What you are experiencing may already be known. If the developers need you to open a new `Issue`, they will say so on *Zulipchat*.
+This 6-minute long, classic Katie DiSimone video shows how to [capture debugging logs](https://youtu.be/Ac4MguvUO7M). If you are testing a new branch, this is a valuable skill to assist developers in identifying problems. In addition to showing you how to generate and save the debug text information, the video explains how to create a gist with the debug information using your *GitHub* account and file an official Issue on the *Loop* *GitHub* repository. This may be required in some cases. But start by chatting directly on [Zulipchat](https://loop.zulipchat.com) with the developer. What you are experiencing may already be known. If the developers need you to open a new `Issue`, they will say so on *Zulipchat*.
## `Repositories` and Code
If you're a developer looking for direct links to the **code and documentation** in *GitHub*:
-* [`Loop`](https://github.com/LoopKit/Loop){: target="_blank" }
-* [`LoopDocs`](https://github.com/LoopKit/Loopdocs){: target="_blank" }
+* [`LoopWorkspace`](https://github.com/LoopKit/LoopWorkspace)
+* [`LoopDocs`](https://github.com/LoopKit/Loopdocs)
For more information on **how to contribute code to the *Loop* project**, please review:
- * [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/){: target="_blank" }
- * the [LICENSE](https://github.com/LoopKit/Loop/blob/main/LICENSE.md){: target="_blank" }
- * the [CODE_OF_CONDUCT](https://github.com/LoopKit/Loop/blob/main/CODE_OF_CONDUCT.md){: target="_blank" }
+ * [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/)
+ * the [LICENSE](https://github.com/LoopKit/Loop/blob/main/LICENSE.md)
+ * the [CODE_OF_CONDUCT](https://github.com/LoopKit/Loop/blob/main/CODE_OF_CONDUCT.md)
-If you want to contribute **code improvements**, please join [*Loop Zulipchat*](https://loop.zulipchat.com){: target="_blank" } and be sure to subscribe to all the channels. Meet the developers and testers who make this app, and learn about what is coming next.
+If you want to contribute **code improvements**, please join [*Loop Zulipchat*](https://loop.zulipchat.com) and be sure to subscribe to all the channels. Meet the developers and testers who make this app, and learn about what is coming next.
diff --git a/docs/version/img/app-version.jpg b/docs/version/img/app-version.jpg
deleted file mode 100644
index 3a427449cbd..00000000000
Binary files a/docs/version/img/app-version.jpg and /dev/null differ
diff --git a/docs/version/img/app-version.png b/docs/version/img/app-version.png
new file mode 100644
index 00000000000..d3a68a663c0
Binary files /dev/null and b/docs/version/img/app-version.png differ
diff --git a/docs/version/img/loop-development-branches.png b/docs/version/img/loop-development-branches.png
new file mode 100644
index 00000000000..32e21d78935
Binary files /dev/null and b/docs/version/img/loop-development-branches.png differ
diff --git a/docs/version/img/loopkit.png b/docs/version/img/loopkit.png
deleted file mode 100644
index 42e3d296bfb..00000000000
Binary files a/docs/version/img/loopkit.png and /dev/null differ
diff --git a/docs/version/loopworkspace.md b/docs/version/loopworkspace.md
index f47eb738fbc..3de59945c60 100644
--- a/docs/version/loopworkspace.md
+++ b/docs/version/loopworkspace.md
@@ -40,7 +40,7 @@ There are several ways to use this to sign the targets automatically.
Your Apple Developer ID is the 10-character Team ID
found on the Membership page after logging into your account at:
- [https://developer.apple.com/account/#!/membership](https://developer.apple.com/account/#!/membership){: target="_blank" }.
+ [https://developer.apple.com/account/#!/membership](https://developer.apple.com/account/#!/membership).
### What is git?
@@ -55,7 +55,7 @@ But yes, git commands take awhile to properly use. And they are not plain Englis
There is more information in [Loop Development](../version/development.md#what-are-git-branches) that is not repeated here.
-The important fact for this discussion on *LoopWorkspace* is that Loop developers own an account in *GitHub* called [`LoopKit`](https://github.com/LoopKit){: target="_blank" }. Within that account, the developers have several `repositories` that support *Loop* in particular. A `repository` is like a book...let's think of it like a cookbook for now. Within the `LoopKit` account, there are repositories for *Loop* itself, *LoopDocs*, and various other supporting "frameworks" that are helper repositories for Loop to build correctly. For example, Loop's repo has a lot of info about the app itself; and the outward-facing things that you interact with. How information is put to you and taken in from you...that's in *Loop* `repository` code. But, there's more than just a user interface for *Loop*. Loop has to do a lot of complex work like Bluetooth communications, algorithm math, pump communications, etc. The *Loop* app has help from frameworks to do those other parts. `CGMBLEkit` for some of the transmitter parts of *Loop*, `RileyLink_ios` for the pump managers (talking to the pumps and decoding their information), *LoopKit* for the algorithm about carbs and insulin curves, etc.
+The important fact for this discussion on *LoopWorkspace* is that Loop developers own an account in *GitHub* called [`LoopKit`](https://github.com/LoopKit). Within that account, the developers have several `repositories` that support *Loop* in particular. A `repository` is like a book...let's think of it like a cookbook for now. Within the `LoopKit` account, there are repositories for *Loop* itself, *LoopDocs*, and various other supporting "frameworks" that are helper repositories for Loop to build correctly. For example, Loop's repo has a lot of info about the app itself; and the outward-facing things that you interact with. How information is put to you and taken in from you...that's in *Loop* `repository` code. But, there's more than just a user interface for *Loop*. Loop has to do a lot of complex work like Bluetooth communications, algorithm math, pump communications, etc. The *Loop* app has help from frameworks to do those other parts. `CGMBLEkit` for some of the transmitter parts of *Loop*, `RileyLink_ios` for the pump managers (talking to the pumps and decoding their information), *LoopKit* for the algorithm about carbs and insulin curves, etc.
When you build *Loop* from `LoopWorkspace`, each of those repositories is downloaded to your computer. This is slower than the old zip-download as far as downloading *Loop* - but it is much faster when you build Loop because all the files are already on your computer.
@@ -143,7 +143,7 @@ For this graphic, the cloned `LoopWorkspace` is in the home directory.
* Choose your device
* Tap on the build (play) button to build to your selected device
-## Updating Loop using `LoopWorkspace`
+## Updating `Loop` using Terminal
When it's time to update the copy of `LoopWorkspace` on your computer - you have choices. You can use the method below or redo the whole cloning process.
@@ -163,7 +163,7 @@ Be sure your terminal is in the correct location using [Open a Terminal in `Loop
git pull --recurse
```
-If you are testing the LoopKit dev branch, you need to be on [Zulipchat](https://loop.zulipchat.com){: target="_blank" } and subscribe to at least the #development and #github streams. (It's a good idea to subscribe to all the streams.) When you see repository updates similar to the graphic below, there may also be an announcement in the #development channel that LoopWorkspace is updated and ready to test. If not you can check the commits in LoopWorkspace and see if they've been updated. It's a good idea to wait 24 hours. My procedure is to build dev to my backup phone and then put it on my "real" phone. Otherwise, wait for someone else to do it and give the all-clear in Zulipchat.
+If you are testing the LoopKit dev branch, you need to be on [Zulipchat](https://loop.zulipchat.com) and subscribe to at least the #development and #github streams. (It's a good idea to subscribe to all the streams.) When you see repository updates similar to the graphic below, there may also be an announcement in the #development channel that LoopWorkspace is updated and ready to test. If not you can check the commits in LoopWorkspace and see if they've been updated. It's a good idea to wait 24 hours. My procedure is to build dev to my backup phone and then put it on my "real" phone. Otherwise, wait for someone else to do it and give the all-clear in Zulipchat.
{width="600"}
{align="center"}
@@ -343,7 +343,7 @@ This tutorial is pretty nice.
!!! tip "Git Tutorial"
When I first started using git, my adult son answered all my questions very politely and then started sending me links to this tutorial instead.
- * [Learn Git Branching](https://learngitbranching.js.org/){: target="_blank" }
+ * [Learn Git Branching](https://learngitbranching.js.org/)
There's a section called `Main` that goes over commands in your local copy (clone) of the code. There's a section called `Remote` that goes over fetching, pulling, and pushing to remote copies.
@@ -378,4 +378,4 @@ It's a little easier to think about this with an analogy. Let's say you're worki
Where do the submodules fit in? Each submodule is actually a branch, so when you make changes to multiple submodules, you'll need to commit those changes to their respective branches. Let's say you've made changes to Loop and LoopKit. You'll need to go into Loop and commit and push the changes, then go into LoopKit and commit and push the changes.
-There are a few different ways to keep track of all these different branches. Some people like using the command line (which is what you're using when you do commands like `git clone`) because it's very customizable and has the largest variety of commands. Others like to use graphical Git editors, which make it easier to see changes and be able to do a variety of common actions (like cloning, committing, and pushing) with the push of a button. Everyone has their own preferences, but some methods that Loop contributors have used in the past include the command line, [Gitkraken](https://www.gitkraken.com/){: target="_blank" }, and [SourceTree](https://www.sourcetreeapp.com/){: target="_blank" }.
+There are a few different ways to keep track of all these different branches. Some people like using the command line (which is what you're using when you do commands like `git clone`) because it's very customizable and has the largest variety of commands. Others like to use graphical Git editors, which make it easier to see changes and be able to do a variety of common actions (like cloning, committing, and pushing) with the push of a button. Everyone has their own preferences, but some methods that Loop contributors have used in the past include the command line, [Gitkraken](https://www.gitkraken.com/), and [SourceTree](https://www.sourcetreeapp.com/).
diff --git a/docs/version/releases-version2.md b/docs/version/releases-version2.md
index 981f651da78..fc21d745829 100644
--- a/docs/version/releases-version2.md
+++ b/docs/version/releases-version2.md
@@ -87,12 +87,12 @@ Omnipod Code Fixes:
* Make insertion more robust (LoopKit issue #1369)
* Fix “Pod already primed” errors when priming cancelled (rileylink_ios issue #661)
* Prevent 049 pod faults during setup (rileylink_ios issue #627)
-* See [RileyLink Pull Request 676](https://github.com/ps2/rileylink_ios/pull/676){: target="_blank" } for additional details.
+* See [RileyLink Pull Request 676](https://github.com/ps2/rileylink_ios/pull/676) for additional details.
(REMOVED) Insulin Accounting:
* Reduced occurrences of overlaps in accounting for insulin via reservoir and dose history, which causes temporary overestimation of IOB
-* See [Loop Pull Request 344](https://github.com/LoopKit/LoopKit/pull/344){: target="_blank" } for details
+* See [Loop Pull Request 344](https://github.com/LoopKit/LoopKit/pull/344) for details
* This modification (in v2.2.5) was removed for v2.2.6
- It worked as advertised during testing, but . . .
- If the user's phone had trouble communicating with the Apple HealthKit app, this could cause IOB to be under-reported and cause Loop to provide more insulin than needed
diff --git a/docs/version/releases.md b/docs/version/releases.md
index d063133a744..3247abee9ac 100644
--- a/docs/version/releases.md
+++ b/docs/version/releases.md
@@ -4,32 +4,351 @@ The new features added with each Loop release are provided for reference.
For information about version 2 releases and compatibility between version 2 and 3, refer to [Older Releases](releases-version2.md){: target="_blank" }.
+- - -
+
## Current Release
-The current released version for the *Loop* app is 3.6.0. The dates and contents for releases are summarized below in reverse chronological order (so newest release information comes first).
+The current released version for the *Loop* app is v3.14.0 and is built from the `main` branch of LoopWorkspace. The dates and contents for releases are summarized below in reverse chronological order (so newest release information comes first).
### What Version Do I Have?
Tap on the Settings icon at the toolbar of the *Loop* app and look at the version information at upper left.
-{width="400"}
+{width="400"}
{align="center"}
### Is the Released Version Newer?
-Release information is found on the [*GitHub* _LoopKit/LoopWorkspace_ release page](https://github.com/LoopKit/LoopWorkspace/releases){: target="_blank" }.
+Release information is found on the [*GitHub* _LoopKit/LoopWorkspace_ release page](https://github.com/LoopKit/LoopWorkspace/releases).
+
+> Older releases, `Loop v3.4.4` and earlier, are documented at [*GitHub* _LoopKit/Loop_ release page](https://github.com/LoopKit/Loop/releases).
-Releases from `Loop 3.4.4` and older are reported at [*GitHub* _LoopKit/Loop_ release page](https://github.com/LoopKit/Loop/releases){: target="_blank" }.
+- - -
## Loop 3 Version History
+- - -
+
+## Loop v3.14.0
+
+[*Loop* v3.14.0](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.14.0) was released on 14 May 2026.
+
+#### v3.14.0 Highlights
+
+**Loop Features**
+
+* The Pod Keep Alive feature for folks using Omnipod with iPhone 16 (all models) or iPhone 17e is now part of the released code
+* Live Activity Plots on the phone were improved
+* Live Activity on the watch now opens the Loop app on the watch
+* Bugfix: the G6 sensor start used to report a time in the future which messed up SAGE reporting on Nightscout - that is now fixed
+
+**Support**
+
+* The support files for browser build were updated to fastlane 2.234.0
+* Additional translations were imported from lokalise
+* Two languages with no translations (Chechen and Hindi) were removed, while Korean was added
+* A CONTRIBUTING.md file was added to assist volunteers who want to contribute to the community
+
+- - -
+
+## Loop v3.12.x
+
+### Loop v3.12.1
+
+[*Loop* v3.12.1](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.12.1) was released on 03 April 2026.
+
+#### v3.12.1 Highlights
+
+**Loop Features**
+
+No change to any Loop Features.
+
+**Browser Build Support**
+
+This release fixes those nagging warning messages:
+
+* The Build action uses Xcode 26 (takes care of the SDK 18 warning)
+* The GitHub actions were updated to use Node.js 24
+* The value for `ENABLE_NUKE_CERTS` is now case insensitive; it now works if you entered `True` instead of `true`
+
+**Translations**
+
+Additional translations were imported from lokalise.
+
+- - -
+
+### Loop v3.12.0
+
+[*Loop* v3.12.0](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.12.0) was released on 24 February 2026.
+
+#### Customization Update for v3.12.0
+
+!!! tip ""
+ This customization is no longer compatible.
+
+ * `remote_window`
+
+ **Browser Builders:** If you used this customization, remove it from your build_loop.yml file. Otherwise, your **build will fail**.
+
+ Instead of using a 15-minute window with *LoopCaregiver* and *Loop*, it is suggested you try *LoopFollow* remote commands which provide direct APNS message from *LoopFollow* to *Loop* with real-time returned APNS response. This still depends on APNS availability, but should be more direct and reliable than *LoopCaregiver*.
+
+ * [*LoopFollow* Remote Control](https://loopfollowdocs.org/remote/remote-control-loop/)
+
+#### v3.12.0 Highlights
+
+**Loop Features**
+
+* Improves Live Activity display
+ * handles larger fonts, limits truncation, modifies some displays
+ * fixes colored glucose plot bug [Issue 2392](https://github.com/LoopKit/Loop/issues/2392)
+* Supports real-time APNS response for remote control commands
+ * This, in combination with *LoopFollow* version 4.5.1 or newer, provides real-time response to report the success of a remote command (or explict error message) returned to the originating *LoopFollow* phone
+ * Please see [*LoopFollowDocs*: *Loop* Remote Control](https://loopfollowdocs.org/remote/remote-control-loop/) documentation
+ * Support for real-time response in *Loop* added with [NightscoutService PR 19](https://github.com/LoopKit/NightscoutService/pull/19)
+
+**Miscellaneous Features**
+
+* Brings in pretty print for pump event details: [Loop PR 2403](https://github.com/LoopKit/Loop/pull/2403) and [LoopKit PR 586](https://github.com/LoopKit/LoopKit/pull/586)
+ * makes the details much easier to interpret, see [Event History and Details](../loop-3/displays-v3.md#event-history-and-details){: target="_blank" }
+ * adds a localized date to the pump event display
+* Updates support files for Browser Build
+* Updates translations
+* Adds to the Loop Report Build Details section the list of all submodules used for that build including their branch name and SHA
+ * This supports developers and testers working with development and feature branches
+
+- - -
+
+## Loop v3.10.0
+
+[*Loop* v3.10.0](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.10.0) was released on 10 January 2026.
+
+#### Customization Update for v3.10.0
+
+!!! tip ""
+ These customizations are now included in the released code.
+
+ * `live_activity`
+ * `dexcom_upload_readings`
+
+ **Browser Builders:** If you used these, remove them from your build_loop.yml file. Otherwise, your **build will fail**.
+
+
+#### v3.10.0 Highlights
+
+**Loop Features**
+
+* Add [Live Activity](../loop-3/features.md#live-activity){: target="_blank" } Feature
+ * Loop [PR 2191](https://github.com/LoopKit/Loop/pull/2191)
+* Reduce the size of *Loop* Documents & Data storage on the phone
+ * LibreTransmitter [PR 33](https://github.com/LoopKit/LibreTransmitter/pull/33); log only once per 5 minute instead of every minute
+ * LoopKit [PR 581](https://github.com/LoopKit/LoopKit/pull/581); purge logs of data older than 7 days
+
+**CGM Features**
+
+* Support added for 15-day G7 Sensors [PR 48](https://github.com/LoopKit/G7SensorKit/pull/48)
+* Modify default for G6 / ONE and G7 / ONE+ to upload glucose
+ * CGMBLEKit [PR 206](https://github.com/LoopKit/CGMBLEKit/pull/206), G7SensorKit [PR 50](https://github.com/LoopKit/G7SensorKit/pull/50)
+
+**Pump Features**
+
+* OmniBLE (DASH pod) and OmniKit (Eros pod) repositories improvements
+ * OmniBLE [PR 154](https://github.com/LoopKit/OmniBLE/pull/154), [PR 157](https://github.com/LoopKit/OmniBLE/pull/157), [PR 158](https://github.com/LoopKit/OmniBLE/pull/158)
+ * OmniKit [PR 61](https://github.com/LoopKit/OmniKit/pull/61), [PR 63](https://github.com/LoopKit/OmniKit/pull/63), [PR 64](https://github.com/LoopKit/OmniKit/pull/64)
+ * OmniBLE test suite: [PR 160 ](https://github.com/LoopKit/OmniBLE/pull/160)
+* MinimedKit [PR 25](https://github.com/LoopKit/MinimedKit/pull/25): Add CAGE and IAGE to pump settings view
+
+**Miscellaneous Features**
+
+* Improve messages for Browser Build and update to fastlane 2.230.0
+* [Translations](../faqs/app-translation.md#code-translation){: target="_blank" } added from community volunteers
+
+#### Mac-Xcode Builders
+
+One change moving to v3.10.0 from 3.8.2 (or newer) is the Build Order selected in Xcode changed from the deprecated `Manual Order` to the preferred `Dependency Order`.
+
+* If you start with a fresh download - this will not affect you
+* If you update an existing clone on your computer with the `git pull --recurse` command, you will need to perform a `Product: Clean Build Folder` in Xcode, close the workspace in Xcode and reopen it
+ * If there are still build errors, then quit out of Xcode, issue the following command and try again
+ * `rm -rf ~/Library/Developer/Xcode/DerivedData`
+
+- - -
+
+## Loop v3.8.x
+
+!!! important "[iOS 15 is no longer supported](../build/phone.md#not-supported){: target="_blank" }"
+ * It is a known issue that some screens show up as a different language for iOS 15 devices with v3.8.x.
+ * It is expected *Loop* will soon require a minimum of iOS 17
+
+ See [Compatible Device](../build/phone.md#compatible-device){: target="_blank" }.
+
+### Loop v3.8.2
+
+[*Loop* v3.8.2](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.8.2) was released on 31 October 2025.
+
+**Warning - Dana users - this version does not support Dana but 2 alternate branches are available. Choose one of those to build to continue using your pump. Please read the note below:**
+
+* [Why was DanaKit Support Changed?](#why-was-danakit-support-changed)
+
+!!! warning "Browser Build Disabled?"
+ We do not know why, but GitHub is disabling the Build Loop Action for many user's LoopWorkspace fork.
+
+ * We think it is associated with running too many builds at a busy time that requested too many runners (virtual computers)
+ * The redesigned build action for v3.8.2 should alleviate this
+ * We also plan to reach out to GitHub after people have transitioned to the v3.8.2 build schedule
+
+> Please follow these steps to build manually:
+
+> * [What Manual Action is Required?](../browser/automatic.md#what-manual-action-is-required){: target="_blank" }
+
+#### Updates in v3.8.2
+
+This version updates a few iOS 26 interface issues, moves support for Dana pumps to a different branch, and streamlines and enhances the Browser Build process.
+
+* Restore expected behavior for phones running iOS 26
+ * see [Loop PR 2371](https://github.com/LoopKit/Loop/pull/2371) / [LoopKit PR 573](https://github.com/LoopKit/LoopKit/pull/573)
+* Modify the build schedule to run on Sundays and build on the second Sunday of each month
+ * see [Updated Build Features](../browser/automatic.md#updated-build-features){: target="_blank" } details
+
+* [Remove DanaKit](#why-was-danakit-support-changed) support from `main` and `dev` branches of the *Loop* app
+* Update some translations
+
+#### Why was DanaKit Support Changed
+
+> **A pump manager that works for Trio must be separately tested for Loop**
+
+* Several issues were reported regarding bolus accounting and IOB reporting for *Loop* v3.8.1
+* For this reason, Dana support is only found in 2 special branches
+
+If you were using Dana with v3.8.1, a branch called `release/3.8.1` was created for your continued use.
+
+* The `release/3.8.1` branch will remain available while troubleshooting continues
+* This branch is meant to support people already using Dana with v3.8.1 who understand how to manage the issues with that version
+
+If you are an expert and want to use [Dana](../loop-3/add-pump.md#dana-in-loop-requires-expert-testing){: target="_blank" } or [Medtrum](../loop-3/add-pump.md#medtrum-in-loop-requires-expert-testing){: target="_blank" }, the experimental branch is `feat/dev-dana-medtrum`
+
+* This branch is subject to rapid updates
+* Please do not use Dana with Loop unless you are willing to test and communicate with [developers on zulipchat in this DanaKit channel](https://loop.zulipchat.com/#narrow/channel/144182-development/topic/DanaKit.20Troubleshooting/with/547829260)
+
+* Please do not use Medtrum with Loop unless you are willing to test and communicate with [developers on zulipchat in the Medtrum channel](https://loop.zulipchat.com/#narrow/channel/144182-development/topic/Medtrum.20Nano.20-.20pumps.20for.20development.20use/with/481836247)
+
+
+
+### Loop v3.8.1
+
+[*Loop* v3.8.1](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.8.1) was released on 23 September 2025.
+
+This was released as a hotfix:
+
+* the designed behavior of tapping on the bolus line should automatically replace the recommended value with zero
+* this stopped working after changes were made to this interface to accommodate iOS 26
+
+When putting together the hotfix, the following additional updates were included:
+
+* Bring in updates from DanaKit
+* Restore expected behavior for G6 of going to CGM Manager screen, instead of the Dexcom app, when tapping on glucose in the HUD
+* Update Gemfile and Gemfile.lock to fix a security warning
+* Add audio capability to Loop to support DanaKit optional behavior and possible OmniBLE InPlay/iPhone 16 work-around later
+ * Dana users no longer need to modify the code to use [Background Sound](../troubleshooting/dana-faq.md#background-sound){: target="_blank" } if their CGM does not have a heartbeat
+* Update some translations
+
+> When main was updated to v3.8.1 for a hotfix, the same hotfix was applied to the `dev` branch, which is at v3.9.1.
+
+### Loop v3.8.0
+
+[*Loop* v3.8.0](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.8.0) was released on 14 September 2025.
+
+> When v3.8.0 was released, the `dev` branch version was similarly updated to v3.9.0
+
+#### v3.8.0 Highlights
+
+* Add support for Dana-i and DanaRS-v3 pump models
+* Update translations and convert to String Catalogs
+* Update to support iOS 26
+
+#### Limitations for *iOS* 15
+
+Note that iOS 15 devices do not support:
+
+* *Loop Widgets*, however, *Loop Widgets* continue to work with iOS 16 devices and iOS 18 and newer devices now support tinted widgets.
+* The Mixpanel Service is not available
+
+- - -
+
+## Loop v3.6.x
+
+### Loop v3.6.4
+
+[*Loop* v3.6.4](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.6.4) was released on 31 July 2025.
+
+This release:
+
+* provides support for newer European Libre 2 plus sensors (mid 2025 Libre 2 plus EU sensors)
+* adds localization to the LibreTransmitter module
+* adjusts build dependencies for G7SensorKit (no functional change)
+* shifts the automatic build time from hh:00 to hh:33
+ * automatic builds have been running into errors recently
+ * this time shift avoids a time when GitHub resources are impacted
+
+> The updates applied to `main` for v3.6.4 were also applied to `dev` in v3.7.4.
+
+### Loop v3.6.3
+
+[*Loop* v3.6.3](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.6.3) was released on 10 July 2025.
+
+This release fixes [Loop Issue 2322: Negative interrupted bolus](https://github.com/LoopKit/Loop/issues/2322).
+
+* The bug was that the amount reported after an interrupted bolus could be incorrect
+ * This bug was reported when a user **heard a pod fault** and tried to **manually interrupt the bolus**
+ * This release ensures the amount not delivered is only subtracted once for all cases
+
+> The updates applied to `main` for v3.6.3 were also applied to `dev` in v3.7.3.
+
+### Loop v3.6.2
+
+[*Loop* v3.6.2](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.6.2) was released on 25 June 2025.
+
+There are no changes to the *Loop* app - this is a Browser Build fix only.
+
+This release is the second fix for Browser Build features that stopped working when Apple made changes to their infrastructure beginning in May 2025. Those with valid Identifiers and build credentials probably did not notice that there was a problem.
+
+**Fixed**
+
+* The ability to run the `Add Identifiers` action is fixed with this version
+
+**Not Fixed**
+
+This only affects new builders and the instructions are updated to accomodate this restriction.
+
+* We can no longer automatically enable the capability for Time Sensitive Notifications for Loop. This capability must be added manually as directed in this section: [Add Time Sensitive Notifications](../browser/prepare-app.md#add-time-sensitive-notifications){: target="_blank" }
+
+> The updates applied to `main` for v3.6.2 were also applied to `dev` in v3.7.2.
+
+### Loop v3.6.1
+
+[*Loop* v3.6.1](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.6.1) was released on 13 June 2025.
+
+There are no changes to the *Loop* app - this is a Browser Build fix only.
+
+This release partially restored some Browser Build features that stopped working when Apple made changes to their infrastructure beginning in May 2025. Those with valid Identifiers and build credentials probably did not notice that there was a problem.
+
+**Fixed**
+
+* The ability to generate new build credentials after certificates expired or were deleted is fixed with this version
+
+**Not Fixed**
+
+* The ability to run the `Add Identifiers` action is still "broken" with this version
+* Identifiers can be added manually
+
+> The updates applied to `main` for v3.6.1 were also applied to `dev` in v3.7.1.
+
### Loop v3.6.0
-*Loop* v3.6.0 was released on 23 April 2025.
+[*Loop* v3.6.0](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.6.0) was released on 23 April 2025.
-* [Link to release notes for Loop 3.6.0](https://github.com/LoopKit/LoopWorkspace/releases/tag/v3.6.0){: target="_blank" }
+> When v3.6.0 was released, the `dev` branch version was similarly updated to v3.7.0
-#### 3.6.0 Highlights
+#### v3.6.0 Highlights
* Add Automatic Certificate Generation and Renewal
* Implement updates to minimize Dexcom G7 outages that were reported over the last few months, possibly related to iOS 18 changes
@@ -44,7 +363,7 @@ Releases from `Loop 3.4.4` and older are reported at [*GitHub* _