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 ![fix a disabled build state](img/build-disabled-fix.png ) @@ -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. ![normal weekly check for updates when there are no updates](img/normal-check-for-updates.png) @@ -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 |
`SCHEDULED_SYNC`
|
`SCHEDULED_BUILD`
| Automatic Actions | |---|---|---| - | `true` (or N/A) | `true` (or N/A) | This is the default:
keep-alive, weekly update check (auto update/build), monthly build with auto update| - | `false` | `true` (or N/A) | keep-alive, monthly build, no auto update | - | `true` (or N/A) | `false` | keep-alive, weekly update check with auto update, only builds if update detected | - | `false` | `false` | no automatic activity, no keep-alive| + | `true` (or N/A) | `true` (or N/A) | This is the default:
weekly update check (auto update/build), monthly build with auto update| + | `false` | `true` (or N/A) | monthly build, no auto update | + | `true` (or N/A) | `false` | weekly update check with auto update, only builds if update detected | + | `false` | `false` | no automatic activity| ### How to configure a variable @@ -208,16 +276,15 @@ Your build will run on the following conditions: - Default behaviour: - Run weekly, every Wednesday at 08:00 UTC to check for changes; if there are changes, it will update your repository and build - Run monthly, every first of the month at 06:00 UTC, if there are changes, it will update your repository; regardless of changes, it will build - - Each time the action runs, it makes a keep-alive commit to the `alive` branch if necessary -- If you disable any automation (both variables set to `false`), no updates, keep-alive or building happens when `Build Loop` runs -- If you disabled just scheduled synchronization (`SCHEDULED_SYNC` set to`false`), it will only run once a month, on the first of the month, no update will happen; keep-alive will run -- If you disabled just scheduled build (`SCHEDULED_BUILD` set to`false`), it will run once weekly, every Wednesday, to check for changes; if there are changes, it will update and build; keep-alive will run +- If you disable any automation (both variables set to `false`), no updates or building happens when `Build Loop` runs +- If you disable only scheduled synchronization (`SCHEDULED_SYNC` set to`false`), the build action runs weekly but your fork is not updated and the monthly build uses the current version of your fork +- If you disable only scheduled build (`SCHEDULED_BUILD` set to`false`), the build action runs weekly to check for changes; if there are changes, it will update and build ### Disable Automatic Actions To enable the scheduled build and sync, the `GH_PAT` must hold the `workflow` permission scopes. This permission serves as the enabler for automatic and scheduled builds with browser build. To disable this, follow these steps: -1. Go to your [FastLane Access Token](https://github.com/settings/tokens){: target="_blank" } +1. Go to your [FastLane Access Token](https://github.com/settings/tokens) 1. If it says `repo`, `workflow` next to the `FastLane Access Token` link, then automatic building is enabled 1. To disable automatic update and build, click on the link to open the token detail view * Click to uncheck the `workflow` box @@ -236,7 +303,7 @@ What if I decide I don't want the automatic building feature? * Otherwise, you may see the dreaded "Loop Beta has expired" message, have a Loop that won't open and not have a version ready to go in TestFlight that you can install within a few seconds * If you are taking a break from Loop and want to stop monthly Build emails, consider disabling actions for the `Build Loop` action for your app. - * [GitHub Directions to Disable and Enable a Workflow](https://docs.github.com/en/actions/using-workflows/disabling-and-enabling-a-workflow#disabling-a-workflow){: target="_blank" } + * [GitHub Directions to Disable and Enable a Workflow](https://docs.github.com/en/actions/using-workflows/disabling-and-enabling-a-workflow#disabling-a-workflow) * It is the Build action that kicks off the update and build steps, so simply disabling the one action is sufficient -* If you are done with Loop, you can delete the whole repository; but you should be sure about this because you'll need to start over with [Configure to use Browser](bb-overview.md#configure-to-use-browser) to restore ability to build Loop with GitHub. +* If you are done with Loop, you can delete the whole repository; but you should be sure about this because you'll need to start over with [Configure to use Browser](bb-overview.md#step-by-step-build-process) to restore ability to build Loop with GitHub. diff --git a/docs/browser/bb-errors.md b/docs/browser/bb-errors.md index 4e7e2d1cb8a..043c51195a6 100644 --- a/docs/browser/bb-errors.md +++ b/docs/browser/bb-errors.md @@ -28,8 +28,8 @@ If you are having trouble: These are two places to ask for help, but please choose only one. You may get a faster response from Facebook, but there are mentors on both sites: -* [LoopandLearn Facebook Group](https://www.facebook.com/groups/LOOPandLEARN){: target="_blank" } -* [Zulipchat: Loop: Build Help]( https://loop.zulipchat.com/#narrow/channel/148543-Loop/topic/Browser.20Build){: target="_blank" } +* [LoopandLearn Facebook Group](https://www.facebook.com/groups/LOOPandLEARN) +* [Zulipchat: Loop: Build Help]( https://loop.zulipchat.com/#narrow/channel/148543-Loop/topic/Browser.20Build) ### What Information is Needed for Help @@ -77,7 +77,9 @@ If there is no upright arrow by a link, then the location is on the same page: ### Look at the Annotation -If you get an error in an Action. Click on the link and scroll down to view the annotation. An example is shown below. Most errors have a clear annotation telling you what to do. If the annotation is not clear to your, please [ask a mentor for help](#where-to-get-help-with-browser-build). +If you get an error in an Action. Click on the link and scroll down to view the annotation. An example is shown below. Some errors have a clear annotation telling you what to do. If the annotation is not clear to your, please [ask a mentor for help](#where-to-get-help-with-browser-build). + +> Changes at *Apple* led to a number of new errors - these do have have nice annotations. ![graphic with an example validate secret error](img/example-annotation.png){width="800"} {align="center"} @@ -89,32 +91,39 @@ If you get an error in an Action. Click on the link and scroll down to view the ## New Builder: Quick Reference -### New Builder: Validate Secrets Error +### New Builder: Validate 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. -![graphic with an example build error](img//example-identifier-build-errors.png){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. +![graphic with an example build error](img/example-identifier-build-errors.png){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. ![fix a disabled build state](img/build-disabled-fix.png ) ### 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. ![graphic showing missing distribution certificate](img/missing-distribution-certificate.png){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 - -AAAAAAAAAA - -FASTLANE_KEY - ------BEGIN PRIVATE KEY----- -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAA ------END PRIVATE KEY----- -``` - -The `FASTLANE_KEY` can be taken from the `p8` file you downloaded. The other keys are all able to be copied again from your *Apple* Developer account page. See [Copy `API Key Secrets`](secrets.md#copy-api-key-secrets){: target="_blank" }. +## Action: `Create Certificates` Errors -If you decide to revoke the key and start again, see [Generate `API Key`](secrets.md#generate-api-key){: target="_blank" }. You will need to first revoke the existing `FASTLANE_KEY`: +The modern version of Browser Build creates your certificates automatically when you run the build action. -* Select `Edit` -* Click on the checkbox beside `FASTLANE_KEY` -* Select `Revoke Key` +The first time you run the build action, there might be a certificate error if you did not configure your secrets or Identifiers correctly. -Then follow the normal steps detailed in that section to generate a new key and save the updated key and key ID in your Secrets Reference file and in your organization or repositories. +Subsequent times: -Do not hesitate to [ask a mentor for help](#where-to-get-help-with-browser-build). +* You must have your *Apple* Developer license up to date with all agreements signed +* After a year, you must have the [`ENABLE_NUKE_CERTS` variable](prepare-fork.md#add-variable){: target="_blank" } set to true for automatic renewal - make sure to set that up now -## Action: `Create Certificates` Errors +and > Reminder - If it is not obvious to you what your error is, please [ask a mentor for help](#where-to-get-help-with-browser-build) @@ -396,6 +358,8 @@ Do not hesitate to [ask a mentor for help](#where-to-get-help-with-browser-build Review [Find the Error](#find-the-error) for instructions on how to use the error strings. +* If you want to do a general search for an error, enter `::error` in the search box or just `error` and look at the first item + List of certificate errors on this page: * [Error: No profile for team](#error-no-profile-for-team) @@ -418,7 +382,7 @@ If that phrase is found, then: * You probably do not have the correct `TEAMID` entered in your `Secrets` * The rest of these instructions assume: * You have already created a *Loop* App in the *App Store* with that incorrect `TEAMID` - * This is true if you completed the steps after running Action: `Add Identifiers` and before Action: `Create Certificates` + * This is true if you completed the steps after running Action: `Add Identifiers` and before Action: `Create Certificates` or `Build Loop` Click on this link to [Delete Identifiers](#delete-identifiers). @@ -428,7 +392,7 @@ Click on this link to [Delete Identifiers](#delete-identifiers). #### Rerun Steps with correct TEAMID 1. Enter your `TEAMID` correctly in the repository `Secrets` - - Make sure you use copy and paste from your [Apple Developer Membership](https://developer.apple.com/account/#!/membership){: target="_blank" } page for that `TEAMID`. + - Make sure you use copy and paste from your [Apple Developer Membership](https://developer.apple.com/account/#!/membership) page for that `TEAMID`. - Follow the update instructions here (this example is for `GH_PAT`, you'll do the same but for `TEAMID`) [Update Secrets](bb-update.md#update-secrets) 1. Run Action: [Configure to Use Browser: `Add Identifiers`](identifiers.md#add-identifiers) again @@ -441,7 +405,7 @@ You will remove that app and create a new one. #### Remove App with Incorrect `TEAMID` -Go to [`App Store Connect / Apps`](https://appstoreconnect.apple.com/apps){: target="_blank" } and follow the numbered steps in the graphic below. +Go to [`App Store Connect / Apps`](https://appstoreconnect.apple.com/apps) and follow the numbered steps in the graphic below. 1. Find the *Loop* app you created earlier and click on it 2. On the left side, under `General`, click on `App Information` @@ -469,7 +433,9 @@ Follow the [Configure to Use Browser: Create Loop App in App Store Connect](prep #### Create Certificates -You should be able to continue with the [Configure to Use Browser Steps to `Create Certificates`](certs.md#create-certificates) and then proceed from there with `Build Loop` and keep going. +You can go straight to [`Build Loop`](build-yml.md#build-the-loop-app){: target="_blank" } which will `Create Certificates` for you. However, you may be more comfortable making sure you got your mistakes fixed. You can run [`Create Certifcates`](certs.md#create-certificates){: target="_blank" } as a stand-alone process. It should only take a few minutes. + +* After your stand alone run of Create Certificates succeeds, proceed to [`Build Loop`](build-yml.md#build-the-loop-app){: target="_blank" } and keep going. ### Error: Error cloning certificates @@ -493,7 +459,7 @@ If you see this phrase, the `fastlane` package that is utilized during the `3. C To fix this error: -- Open this link: [https://github.com/settings/tokens/](https://github.com/settings/tokens/){: target="_blank" } +- Open this link: [https://github.com/settings/tokens/](https://github.com/settings/tokens/) - Here you will see your personal access token (`Fastlane Access Token`) that was created during [Configure to Use Browser: Setup *GitHub*: Create `GitHub Personal Access Token`](../browser/secrets.md#create-github-personal-access-token) - Note that `Tokens (classic)` is highlighted in the menu on the left - Click on the token name (should be bold, blue **`Fastlane Access Token`** ) to open its detail page @@ -523,7 +489,7 @@ The full error message is: If you know you entered the incorrect 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 before
+ **✅ Goal:** Find and fix your mistake
+ **📋 Repeat Builders:** [Action: `Build Loop` Errors when Updating](#action-build-loop-errors-when-updating) - If you had to step backward and fix an `Identifier`, you must run `Create Certificates` again. +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). Refer to [Annotation without Clear Message (*Build*)](#annotation-without-clear-message-build) for a detailed example of these steps: @@ -578,11 +527,47 @@ For each section below, copy the phrase into the search function of the log. If List of build errors in this section: -* [`Error: Could not find an app on App Store Connect`](#error-could-not-find-an-app-on-app-store-connect) * [`Error: Provisioning Profile`](#error-provisioning-profile) +* [`Error: Could not find an app on App Store Connect`](#error-could-not-find-an-app-on-app-store-connect) * [`Error: A new one cannot be created because you enabled`](#error-a-new-one-cannot-be-created-because-you-enabled) +### `Error: Provisioning Profile` + +Copy the words on the line below and paste them into the search function for your action log. + +> ``` { .text .copy } +> error: Provisioning profile "match AppStore +> ``` + +If that phrase is found one, or more times, it means you missed a step when configuring the Loop identifier or missed associating your *Loop* App Group with one or more identifiers. + +!!! tip "`App Group` Mistake" + The most common reasons for a new builder to see this + + 1. They spelled the `App Group` correctly but missed one or more Identifiers that needed the `App Group` configure - see [`Add App Group to Identifier`](prepare-app.md#add-app-group-to-identifiers){: target="_blank" } + 1. They did not spell the `App Group` properly + * In the [directions](prepare-app.md#create-app-group){: target="_blank" }, please copy and paste the protype and then insert your TEAMID + * Do not type what you think you see + * It is too easy to mess this one up and it will affect every Identifier. Read this whole section and follow the appropriate links + +For example, you might see: + +* `error: Provisioning profile "match AppStore com.***.loopkit.Loop` +* `error: Provisioning profile "match AppStore com.***.loopkit.Loop.LoopWidgetExtension` +* `error: Provisioning profile "match AppStore com.***.loopkit.Loop.statuswidget` +* `error: Provisioning profile "match AppStore com.***.loopkit.Loop.Loop-Intent-Extension` + +If some, but not all, of those errors are seen when building the *Loop* app, then you spelled the `App Group` correctly, but failed to associate all the Identifiers with that App Group. + +* Link to the entire section: [First-Time: Identifiers for the `Loop` app](prepare-app.md#identifiers-for-the-loop-app){: target="_blank" } + * Link to [Create `App Group`](prepare-app.md#create-app-group){: target="_blank" } + * Link to [``Add App Group to Identifier`](prepare-app.md#add-app-group-to-identifiers){: target="_blank" } + +You can build *Loop*: + +* Action: `Build Loop` + ### `Error: Could not find an app on App Store Connect` Copy the words on the line below and paste them into the search function for your action log. @@ -598,7 +583,7 @@ If that phrase is found, then: * This can also be caused if you correctly created the *Loop* App but entered an incorrect value for the `TEAMID`. - * If you have the incorrect `TEAMID`, check this link: [Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources/identifiers/list){: target="_blank" } for entries with the incorrect `TEAMID` embedded + * If you have the incorrect `TEAMID`, check this link: [Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources/identifiers/list) for entries with the incorrect `TEAMID` embedded * For example, if your `TEAMID` is `0123456789`, but you entered `000123`, you may see both of these in your identifiers list * `com.0123456789.loopkit.Loop` * `com.000123.loopkit.Loop` @@ -607,38 +592,23 @@ If that phrase is found, then: * `Create Certificates` * `Build Loop` -### `Error: Provisioning Profile` +### `Error: A new one cannot be created because you enabled` Copy the words on the line below and paste them into the search function for your action log. > ``` { .text .copy } -> error: Provisioning profile "match AppStore +> A new one cannot be created because you enabled > ``` -If that phrase is found one, or more times, it means you missed a step when configuring the Loop identifier or missed associating your *Loop* App Group with one or more identifiers. - -For example, you might see: - -* `error: Provisioning profile "match AppStore com.***.loopkit.Loop` -* `error: Provisioning profile "match AppStore com.***.loopkit.Loop.LoopWidgetExtension` -* `error: Provisioning profile "match AppStore com.***.loopkit.Loop.statuswidget` -* `error: Provisioning profile "match AppStore com.***.loopkit.Loop.Loop-Intent-Extension` - -Return to [First-Time: Identifiers for the `Loop` app](prepare-app.md#identifiers-for-the-loop-app) and make sure you followed all the steps. - -You can build *Loop*: - -* Action: `Build Loop` +If that exact phrase is found with lines similar to those in [Bundle ID is wrong](#bundle-id-is-wrong) below and this is your first build, you have the `Bundle ID` problem. -### `Error: A new one cannot be created because you enabled` +However, this very similar phrase means you need to delete one or more Distribution Certificates and try again: `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`. -Copy the words on the line below and paste them into the search function for your action log. +* Follow the directions to [Revoke Distribution Certificate](#revoke-distribution-certificate) -> ``` { .text .copy } -> A new one cannot be created because you enabled -> ``` +#### Bundle ID is wrong -If that phrase is found with lines similar to the following: +This is not typical and will only be seen for the very first build if you entered an incorrect TEAMID. ``` [31mA new one cannot be created because you enabled `readonly` @@ -655,7 +625,7 @@ This tells you, the `Bundle ID` you selected in [First-Time: Create Loop App in Once you have created an app in the *App Store* that is not based on your `TEAMID`, you cannot delete it, but you can Remove it (i.e. hide it so that it is no longer visible on this page and you don't accidentally click on it). -1. Open this link: [App Store Connect / Apps](https://appstoreconnect.apple.com/apps){: target="_blank" } to view your apps; log in if needed. +1. Open this link: [App Store Connect / Apps](https://appstoreconnect.apple.com/apps) to view your apps; log in if needed. 1. Find the App with the wrong `Bundle ID` and click on it 1. On the left-hand side, click on `App Information` (under `General`) * Confirm the `Bundle ID` listed does not include your `TEAMID` @@ -673,7 +643,7 @@ Use the [Examine Annotation](#examine-annotation) instructions to find your erro ### `ERROR: Asset validation failed` -This error indicates your fork needs to be updated. As of 24 April 2025, you are required to use Xcode 16 to build the app. This is provided with `Loop 3.6.0` and newer versions. +This error indicates your fork needs to be updated. There are serveral phrases you can check for. All of them have the same solution. @@ -742,8 +712,8 @@ The graphic below shows the steps to make sure your `fork` is up to date and to previous_build_number + 1 ``` -2. Tap on the `Find` button and the `Replace` button to make 2 changes to the file -3. After modifying the two lines, click on the `Commit changes` button at upper right +2. Tap on the `Find` button and the `Replace` button to change the file +3. Click on the `Commit changes` button at upper right ![Graphic shows steps to edit fastfile](img/tf-build-number-error-03.svg){width="750"} {align="center"} @@ -787,44 +757,150 @@ Once you get a successful build, you return to using your normal `branch` for fu Assuming you have successfully built using the Browser-Build / *GitHub* method before: -* If the details show this message, `Could not install WWDR certificate`, make sure your [*Apple developer* account](https://developer.apple.com){: target="_blank" } is in good standing and that there are no agreements that need to be accepted and that your `Distribution Certificates` did not expire +* If the details show this message, `Could not install WWDR certificate`, make sure your [*Apple developer* account](https://developer.apple.com) is in good standing and that there are no agreements that need to be accepted and that your `Distribution Certificates` did not expire * Sometimes this is a sign that *Apple* did not respond to a request, this failure happens in the first few minutes * Repeat the build and it should be fine the next time ![graphic showing failure to install certificate](img/github-error-cert-failed.png){width="500"} {align="center"} -## Extra Sections +- - - -It is unlikely you will need these sections. +## Handle the `FastLane API Key` Error -### Reset `Match-Secrets` +This was never an actual error - but a procedure that worked briefly. There is no need to revoke and generate a new `FastLane API Key`. -This is not the first thing to try, but sometimes it is the best approach. +!!! important "Browser Build Temporary Issue is Fixed with `Loop 3.6.2`" + *Apple* made a modification in May 2025 that impacted Browser Build for builders who needed to renew their certificates or generate Identifiers. With the release of `Loop 3.6.2`, these issues are resolved. + + It took several weeks for the change at *Apple* to propagate through all the `API Keys`. Thus an adhoc fix worked initially but then stopped working. An update to fastlane (the code that communicates between *Apple* and *GitHub*) is now in the released Loop code (3.6.1 and newer). -There might be several reasons to do this: +We have removed the section on getting a new Fastlane API Key - that is not the solution to what turned out to be a change made by *Apple*. -* You lost your MATCH_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). + +> ![view the current certificates at Apple](img/certificates-01.png) + +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 + + > ![examine profiles](img/profiles-01.png){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 + + > ![select invalid profiles](img/profiles-02.png){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 + + > ![delete selected profiles](img/profiles-03.png){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 ![steps to delete a given identifier](img/delete-identifiers.svg){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 or
Five minutes with [Manual Actions](automatic.md#manual-action-for-automatic-build){: target="_blank"}
Build uploaded to TestFlight| Manual via Xcode | +| **Build Time** | ~30 minutes (in cloud) | ~30 minutes (local) | +| **App Expiration** | 90 days (TestFlight) | 1 year | +| **Customization** | Supported | Supported | + +**Build Frequently** Please check monthly to see if there is a newer version of the *Loop* app. + +* Sometimes there is a new feature +* Sometimes there is a required update to support the latest phone iOS +* Even though a *Mac* lets you go a year between builds, you should build at least once a quarter + +Both methods produce the identical Loop app. Choose based on your available hardware and preferences. diff --git a/docs/browser/bb-update.md b/docs/browser/bb-update.md index baae4d2e97d..11c9aa73e41 100644 --- a/docs/browser/bb-update.md +++ b/docs/browser/bb-update.md @@ -34,14 +34,14 @@ Most users will start at [How to Update or Rebuild](#how-to-update-or-rebuild): - * If currently using verion 3.4.0 or newer, builds are automatic but you still need to do some actions: + * If currently using verion 3.4.0 or newer, builds are supposed to be automatic, but are being disabled by GitHub ([for Loop, not other OS-AID](https://github.com/orgs/community/discussions/181236)), so you should check the status monthly + * In addition to that monthly check, expect to do these actions: * Your *Apple Developer* account must be active * All agreements must be signed for your *Apple Developer* account * Once a year, you need to update renew certificates, but this is automatic with `Loop 3.6.0` and newer versions If you are running `Loop-dev`, be sure to review these instructions but modify for the branch you are using: refer to [Build Loop dev with Browser](build-dev-browser.md) - ???+ question "FAQs (click to open/close)" - **"What is an update?"** Anytime you want to change versions or if your *TestFlight* build is about to expire, follow the instructions on this page. - **"Do I delete my old Loop app first?"** Definitely **not**! If you keep your Loop app on your phone, your Loop settings (and existing pod) will continue to work the same after the update. Seamless. @@ -74,7 +74,7 @@ Under ordinary circumstances, you do not *have to* rebuild or update your *Loop* There is also a helpful video for updating: - * [How to Update and Rebuild DIY Loop with a Web Browser](https://www.youtube.com/watch?v=0ipTsiqbbrQ){: target="_blank" } + * [How to Update and Rebuild DIY Loop with a Web Browser](https://www.youtube.com/watch?v=0ipTsiqbbrQ) !!! important "How to Ask for Help" Updating with Browser Build should be pretty fast and often automatic. @@ -92,12 +92,12 @@ Under ordinary circumstances, you do not *have to* rebuild or update your *Loop* If your build with browser fails, wait longer. An hour wait was reported by one person. -Sign in to your [Apple Developer account](https://developer.apple.com/account){: target="_blank" }. 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. +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`. + + ![add identifiers using github actions](img/action-02-add-identifiers.svg){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` + +![graphic showing selection of the correct App Group](img/update-identifier-loop-3-4.png){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`". + + ![create certificates using github actions](img/action-03-create-certs.svg){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 ![steps to add a branch](img/add-branch-01.svg){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 ![steps to add a branch continued](img/add-branch-02.svg){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 App
+ **⏱️ Time:** 20-30 minutes (mostly automated)
+ **✅ Goal:** Trigger the build and wait for completion
+ **📋 Next:** [Install on Phone](phone-install.md) + ## Build the *Loop* App ??? abstract "Section Summary (click to open/close)" @@ -9,7 +15,7 @@ * one says the build succeeded (or failed) * one says *TestFlight* is ready (typically half-hour after the build succeeds) * Ignore the one that says you need to fix "issues" in your app. You are not selling the app in the app store; so no action is required. The app you built is for personal use for you or a family member. - 1. Your app should eventually appear on [App Store Connect](https://appstoreconnect.apple.com/apps){: target="_blank" }. + 1. Your app should eventually appear on [App Store Connect](https://appstoreconnect.apple.com/apps). Refer to the graphic below for the first four steps: @@ -37,7 +43,7 @@ You should get several emails * one says *TestFlight* is ready (typically half-hour after the build succeeds) * Ignore the one that says you need to fix "issues" in your app -Your app should eventually appear on [`App Store Connect`](https://appstoreconnect.apple.com/apps){: target="_blank" }. +Your app should eventually appear on [`App Store Connect`](https://appstoreconnect.apple.com/apps). ### Successful Build @@ -56,20 +62,31 @@ You can ignore an email from *Apple* that there are things you must fix in your Did you get a red X? Head over to the [Errors with Browser](bb-errors.md){: target="_blank" } to page find a solution. +--- + ## Next Steps -It may take up to an hour for your new build to appear in TestFlight. +!!! success "🎉 Congratulations!" + Your Loop app is building! It will take about 20-30 minutes to complete. + +**What happens now:** + +1. ⏳ **Wait ~30 minutes** - GitHub is building your app in the cloud +2. 📧 **Check email** - You'll receive confirmation when build completes +3. ⏳ **Wait another ~30 minutes** - Apple processes the app for TestFlight +4. 📧 **Second email** - TestFlight is ready! -From the phone where you want to install the *Loop* app, use TestFlight on that phone to install the app. +**Next, install on your phone:** -* [Install on Phone](phone-install.md) +**→ [Install on Phone](phone-install.md)** -If is you skipped the step about creating a *TestFlight* Group or want to add another person to your group: +--- -* [TestFlight Group](tf-users.md) +**Additional Resources:** -## Caregivers +* Need to add more people to TestFlight? [TestFlight Group](tf-users.md) +* Building for a caregiver? [Build Other Apps with Browser](other-apps.md) -If you are a Caregiver who helps manage a loved-ones diabetes, you may 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 to [Build Other Apps with Browser](other-apps.md) +**Navigation:** [← Back: TestFlight Group](tf-users.md) | [Next: Install on Phone →](phone-install.md) diff --git a/docs/browser/custom-browser.md b/docs/browser/custom-browser.md index f7a9de33e9f..eb128772944 100644 --- a/docs/browser/custom-browser.md +++ b/docs/browser/custom-browser.md @@ -19,14 +19,14 @@ Some customizations are the same for everyone and have been prepared for easy us The *Loop and Learn* team commits to maintaining these prepared customizations and provides an easy method to add your selection from these customizations to your version of *Loop*. -Please read the documentation for these on the [Loop and Learn: Customization Select Page](https://www.loopandlearn.org/custom-code){: target="_blank" }: +Please read the documentation for these on the [Loop and Learn: Customization Select Page](https://www.loopandlearn.org/custom-code): -* [List of Customizations Available](https://www.loopandlearn.org/custom-code#custom-list){: target="_blank" } +* [List of Customizations Available](https://www.loopandlearn.org/custom-code#custom-list) * When building using a browser you will be modifying one of the special files that enable the *GitHub* action to build the *Loop* app. This file is called the build_loop.yml file and can be located at your `fork` of your `LoopWorkspace` repository. There are several sections you need to review on the *Loop and Learn* page: - * [Overview](https://www.loopandlearn.org/custom-code/#github-intro){: target="_blank" } of how to modify the build_loop.yml file * You will copy a template that you paste into that file and then edit it to keep just the customizations you want - * [Template for `main`](https://www.loopandlearn.org/custom-code#template){: target="_blank" } - * [Template for `dev`](https://www.loopandlearn.org/custom-code#template-dev){: target="_blank" } + * [Overview](https://www.loopandlearn.org/custom-code-browser-build/){: target="_blank" } of how to modify the build_loop.yml file + * [Template for `main`](https://www.loopandlearn.org/custom-code-browser-build/#template-main){: target="_blank" } + * [Template for `dev`](https://www.loopandlearn.org/custom-code-browser-build/#template-dev){: target="_blank" } ## Personal Customizations diff --git a/docs/browser/edit-browser.md b/docs/browser/edit-browser.md index 8073af4c2bf..8d7290fbe94 100644 --- a/docs/browser/edit-browser.md +++ b/docs/browser/edit-browser.md @@ -1,7 +1,7 @@ ## Hot Topics !!! tip "Pro Tip" - The method on this page allows you to create a set of personalized customizations that you can use in addition to the [Loop and Learn: Prepared Customizations](https://www.loopandlearn.org/custom-code#prepared-custom-list){: target="_blank" }. You can use (and re-use) your customizations with either Browser Build or *Mac* builds so you don't have to repeat the customization with every update. + The method on this page allows you to create a set of personalized customizations that you can use in addition to the [Loop and Learn: Prepared Customizations](https://www.loopandlearn.org/custom-code/#custom-list). You can use (and re-use) your customizations with either Browser Build or *Mac* builds so you don't have to repeat the customization with every update. * If you are building with *Mac* method, you can use the same lines prepared for Build with Browser method and simply paste them in your terminal at the LoopWorkspace folder to customize your code * You can often use the same customization for several releases @@ -26,6 +26,11 @@ This would be an attempt to merge changes from your fork 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 ![GitHub screen with rejected commit](img/gh-email-error.png){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 - - ![create branch for version](img/create-branch.gif){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`
The file name is: `Pod.swift` - So you will go to your OmniBLE fork (see [New Fork](#new-fork){: target="_blank" } if you don't have a fork yet): + So you will go to your OmniBLE fork (see [New Fork](#new-fork){: target="_blank" } if you don't have a fork yet). + + **Ensure your fork is up-to-date.** Tap on the `Sync `ork` button if necessary. 1. Tap to select `OmniBLE` folder in that fork 1. Tap to select `OmnipodCommon` folder in that folder @@ -397,7 +361,7 @@ Return to your GitHub fork for LoopWorkspace&nb Open the text file in which you saved the customization lines. -For a given submodule, paste the "comment" and "curl" lines that you prepared in [Prepare customization lines](#prepare-customization-lines) similar to the examples, near line 279 (`main` or 239 for `dev`), that are commented out and provided as an example. The best place to paste these is at the end of the `# Customize Loop: Download and apply patches` section and before the `# Patch Fastlane Match to not print tables` line. +For a given submodule, paste the "comment" and "curl" lines that you prepared in [Prepare customization lines](#prepare-customization-lines) (similar to the examples found in lines 279 through 286). These examples are commented out and are just for guidance. The best place to paste these is at the end of the `# Customize Loop: Download and apply patches` section and before the `# Patch Fastlane Match to not print tables` line. The indenting needs to match, so tab or (shift-tab) to line up the columns. The graphic below shows a couple of common mistakes. @@ -440,7 +404,7 @@ In about 1 hour, your customized app will be available for installation on your ## Extra Information -The rest of this page has additional information most people can skip. If a mentor is helping you, they may use some of this information. +The rest of this page has additional information most people can skip. ### How to Use the `patches` Folder @@ -474,52 +438,6 @@ If you've gotten this far, keep going. No more pretty graphics, but I think you * Commit to your default branch * Test the build to make sure everything worked -### Customization and SHA-1 - -When you commit your customization to your `branch` of your `fork`, there is a new SHA-1 associated with that step. The SHA-1 for a given branch, typically `main` or `dev` identifies to a mentor exactly which version of code you used for your build. - -The SHA-1 for customized code will not be recognized by a developer or mentor. If you are having a problem and need to ask for help you need to identify what the SHA-1 was before you added your customizations. - -If you are on `main` branch and it is up-to-date, this is less of an issue. If you are on `dev` branch, that can require some investigation. - -### Ask for Help to Identify Your Base Version - -The easy method is to provide a mentor with your GitHub username and they can figure out the base version you are using aside from customization. They can also identify the customizations you added. - -### Identify Your Base Version - -If you want to do this yourself, this section explains the steps. - -* Step 1: In your customized `LoopWorkspace fork`: tap on 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 rectangle

- - ![main branch after applying customization](img/show-fork-main-customized.png){width="600"} - {align="center"} - -* Step 2: Click on the clock symbol, highlighted by blue rectangle in the previous graphic, to view the commit 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 mentor

- - ![main branch after applying customization](img/show-history-main-customized.png){width="600"} - {align="center"} - - * The second example is for `dev` where the `fork` was synched both before and after customizations were applied - * Red rectangle labeled 1 is the commit a mentor will recognize - * Blue dashed rectangle labeled 2 is what GitHub adds when the user successfully syncs the repository - 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 - - ![dev branch after applying customization and then sync](img/show-history-dev-customized.png){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 Identifiers
+ **⏱️ Time:** 15-30 minutes
+ **✅ Goal:** Validate secrets and create Apple identifiers
+ **📋 Next:** [Prepare App](prepare-app.md) + ## First Use of Actions Tab Near the top middle of your LoopWorkspace  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 @@ + +image/svg+xml11234 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 @@ + +image/svg+xml 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 -ERABERABERABERABEahhAhLhNQxchxMBERABERABERABERABiXDdAyIgAiIgAiIgAiIgAiJQwwTm -GxG+8847O/4++ugjt/jii7urr766hlHpcCIgAiIgAiIgAiIgAiJQHAJ1Jk2a9G9xiqreUhDesW2y -ySbu5ZdfjjdpWQREQAREQAREQAREQATmCwJ1//vf/14yX9TUKokXPNjdd9/tll122bCa1yflDRky -pOBy8jl4OPbjjz/u6tSpM0/qkE2955d6ZnMuSiMCIiACIiACIiACpUJgvvGEAyx4w8877zxnjYeC -GYbyatqrHsJqkieAZ5+6YKHBEdaTaat7neMT8hPqER8vrme8fX5YDuczr7jOD4xURxEQAREQAREQ -geonMN/EhMcx4JtuumnBMeFxeUGYVT9ulxK2QfgjaGlUYHGdPvzww1QMfE3UK3mM0FAI9aSOoZ5h -XzLP/LA+r7nOD4xURxGobQT4DZgxY0bOp92nTx83evTonPMpw/xH4KeffnIjRoyY/yquGpc0gYVL -unblleML8pprrvFriFbEaqGezLi8ICrjMjkmgg3BH4z12AOfTZqQN3zGxw3bwnEpjz8sfHLMTMcl -XVwf1oOQj+sdl09ZWDKf31j+L5QR9zjEZVA30nAtgrEtlM2xQ3r2h30cMyyzPa5DOGZlaUJZfIZj -xWWwHYuPwXpIw3b+MPLzF/b5jfpXqwn07dvXHXTQQe7JJ590K6+8cq1mUeonf/zxx7t69eq522+/ -vShV3X///d0XX3zhWrduXWl5b731lltzzTVd8+bNfbrTTz/dHXXUUY76yKqfAOGb4bciebSLL77Y -7bvvvsnNRVu/5ZZb3Nprr+2OPfbYopWpgpy78MIL3fPPP+9REJrbsWNHd+SRR3onZE3zoZH1yy+/ -uM0226zGDj1fiPDw0CHswl8Qs/mIqCDEgmcX2klRiUDjGLFwIx3bQjhGNmnIExv1p0yOF9c9Xg6N -AvJxvFjQxvvC/lgsh/Sh3uwjf1X54joGPvG2sEw9Oe9Y5FdVNucayqR+wdgWhHy8PV4mbWBDeo4V -G2nD9WA7x0rmZztlpKtHKJs0stpNgB/42bNnux49erjLL7+8dsMo4bMfO3ase+ONN3wNL7vsMte0 -adMaqy1C7/rrr0+JcDzh9evXr7Hj1/YD7bHHHm7zzTf3GPg+pyF29tln+/WavA9q+3Uo5vmPHz/e -7b333u64445zf//9t3vnnXd8wxZh3qVLl2Ieqsqyvv76a3fPPffUqAgv+XAUhFcQcEnBlE5sVUnZ -EiAiseCxDcLYb0z8C0LRZpFJhWPw8MdGGsRuZWlC+nAO1J2YdERlLA5Jh6gMDQSWg1AN6eJjUXfK -CozIH5bJxzkm87E95CN90kL+UNd4P/nYzicWymadcoPoT9aJtJQb0oT1cCzWg8Vp4mscBDj707Gm -LqQPdSENy6EucbmhjHBMfdZuArNmzXLPPvusu++++9xTTz3lxXggQjf0TTfd5L766it3wgknOLyf -LAe78cYb3Y8//ujTHHLIId47O3PmzLDb4T09/PDD3WGHHeZ69eqV2q6F/AhwfXbZZRe33Xbb+WsW -Svn333+9R/rnn392p556qr9OX375Zdjt/vrrL3fddde5Aw44wJ122mnuhx9+SO0LC6+99pq/B8I6 -n1dccYXr16+f/94bNmyYu+GGG9xtt93mk9x1113um2++SSV/+umnXdeuXb2geP3111PbQ53wuJM/ -n9CXVGG1eKFRo0auTZs2/q9x48ZuscUWS60vuuii/vpzzXnWeJ4x1k888UQv7Lh3gvXu3dvx161b -N3fooYe6Bx54wE2ZMiXsdr/99pu/T3h2+b2IbeLEie6SSy7xnvdzzjnHjRw5Mt6t5RwJNGnSxPdC -Lbfccu6II45w22yzjXvzzTdTpXDduKZnnHGG++yzz1Lbq/ruxbN91VVXuYMPPtg3nmnAByPvBx98 -4L8ruJY0qJnwY8CAAf4+4vr/888/XpTzncF3P71lxbaSF+EIKwwxxR8Wi8Ow3+/I8l8QdqG8kC2d -IAyikjTB+5tMRzmhTuGTNMl0lEHaICBZJg31CWKcNJks1DscI3ymS8+XBuXzF/JR/2Sdkuvpyqps -W8hPXTgWn6FeyWsTpyFtOkuXhmOE44R8rIdGVNgXyiNNSEd5oUET9utTBJIE+MJfccUV/X3Dj/y7 -776bSjJmzBgvzBDie+65p1t++eXdXnvt5RBWGCL7mGOOcYgARPgrr7yS8s59++237uSTT/Y/IEcf -fbQXYC+88EKqbC3kToCeCsIO+HviiSdSBSDC2cf33a677uratWvnP//880+fhuvQv39/d9JJJzl+ -7Hfccce5xDDb+d6iUYYR741I45pz7fG2brvttm7rrbf2+/HaIcwxBDmCHW8t3+eIM0QegnunnXZy -6667rvvPf/7juCcuuOACn0f/ikcgXP8rr7zSX3fChmgg0fAhvAAhdfPNN7uHHnrIH5TwM64DDeYD -DzzQN5BvvfVWv2/y5Mn+GiP6EX8vvfSSF2yhtgiyqVOn+vzcE9wbsuIRGDx4cGoiDp4rQoH4bsUz -zvXg2mGVffeis3gWf//9d3/tybPPPvv4xnjIe+aZZ7o11ljD3y884/SytGzZ0h+LkDNEOR55nlue -eb73i93gKrlwlKRwiwVW2If4QljxZRsEpr8i9i8Is7Ce/AxlsD14VkMa9iVbvGEfn0HcxXUK25Pp -kmni/SwHocoyxw3nkqn+obwgLsmHsc4+vPvJfWUp5vxPni970uULZVJuVWVmqteco85ZissKx5iz -N7sljpfuPMgd6gLDYBwnPm7Yrk8RiAkg5viCxhB3iDm8McHoMkWM4bHBA8uPBOErl156qU+y/fbb -p+KCEVudOnVy1157rRs3bpz31vFFz5f6p59+6hALsvwI0ONAo2jjjTf2HOnCJoZzhRVWSBVIeAIx -/YhlRPDbb7/tdtttN3fvvfe6unXr+nR8Rzz88MPeG06cb7CVVlrJtW3b1n+XbLHFFu7FF1/0Xnca -WOuvv75DlHEtV1lllZAl9YlQePDBB1PfN/yoc98gwqdNm+ZjyVdffXX36KOPpkR+KrMWikaA5464 -Yox4/bPOOsuLMNbxnnN/4G3FuJb0mmCEFV100UU+RhnPK/cCXlSMe2G99dbzy/z7448/vCgjP2If -MSfLn8D777/vnwnCUfBO0whCbGM0jOhhWm211fw600rzfc2zhGX67iVkjRhznnuMhjnfy3i8w3c7 -PSTEnwfjeyPWRFxnvg943tdZZx23++67p75DQp5CP0tKhCOikqI6nCD7gsgiTezdjPOQpjIhHcpL -J8zCMeJ94ZghX3Kd7cltyfWQl8/QCIhFOMvkqSxfqFNlaeLjpFumZZiLpWuUhAYD/Kk39Qp1D3UM -4T5hPZdjVpWWMrO5vnE51K866hIfQ8vzLwG6lgkd4MuWUAG6LLnH6JpGdGMIqrDMOj++CLxga621 -Vlj0YhtvCmEs/HgjBhHm/KjTtR3EfiqDFrIm0LNnT9esWTMf+kOmFi1a+AYT4ikY3uxg7du394KJ -dQT8I4884r+vpk+f7me6SBcWwuBcQhm4dnjB8GhXZXjb8ZojyILFQj2EwSyxxBLem0bPSZgiN6TX -Z3EILLPMMqmCBg0a5EXX/fff77fRwzFq1KhUuFmme4VQhPha0njjmQ+Gt53fQEIadthhB3fKKae4 -Dh06hN36zJEAYhnGNLAJ/aLHimeF54rrhSAnDUYPROfOnVNHyPTd+/3338/1u48OYHsQ4VUNxKaR -f+6553rxTsOdAdjF1hILpc6kBBY4OW5sPqv6o7qxEGedPLG4ZVvSgmDnRzb+I28mC8I5fCaPi8gL -+8InZaUrk+PzF6cLIjZTnlCvUF7IS75wPpWddzIf5VFGJo9yELnxeZEnPh7rsQXhHW8r5nI4B+oQ -G+cQeAQGYZ104TzDtthLHpej5dpLAMGFQEY4M9CrVatW3rP63HPPpaAkp6FjPRZR8X4Gd+IBZz8/ -LPxgI8gRc8QSE3sqy50AXJm5hkYN14k/lhHmVfUuENtJA4gfbDzjhCnQ6EpnNJLwohFPSo9HNt8Z -eMhpHGTqqqYrnR9/elO+++47HxKT7tjaVlwChJYxmJYBd/wRkoDQCz0imY6GOIufadLF6xtssIEP -WaPxzvcG3li8uLL8CBAuRMgHIX80XkPIEM8V4T44PMI1JAyQHqpg8XWJv3u5hvSSxcZ6VcI7Ts9v -AQ13QsgYh0IDPd1YkjhPrsslJcKpPEIqiEDWY6EcL5OOvyCI+WR/EGvkTVoQYiFPvD+dgAv7Ebr8 -oAbBG7aHT47JPgRhSJPuGKQP5xbKpNwghuM84Ys/ncgMedPlC3WKP8O5xflYroxVqEvIk6xnKDPd -+ZCH/CFNXJdClkOdQl34RJQHVpwPadjGPv7CeSbrEnMtpE7KO/8ToGuTOGEG64U/PB6Iu2B4x+nW -ROzhmenevbv3gIX9iCuEN/uZNg8PWzuLSeb5QAQsssgibsstt3Qbbrihwzsny53Ae++95xo2bOgH -xIXrRDgQHrJk4zxZOt4zurH5sSe0hFjuTNcBMU2ICmEMCPKFFprzM0k4AwO30hlCjFAIYoz54web -2VuISSUsAq8eXejMBPHrr7+mK0LbikwAjyeDrcO4AHo2eB6rMu4TGmI0nDDulzAojwYd4zvw2PLW -bhp39KYRQiErnADPDGI8DKIkFpuQFLjz/UqIUDzANtN3L/HdDKBnfA95+S4eOHCg22ijjTJWkueb -XpAwsJ6eUQbT0xAgHpzrXexnt6TCUQIZBBJfqpWJxJAWcYXQ4g9Liq2Qjs8g1sJnvC8IuHgby5QX -vLzUifVkvViPt6VLE8olHWEhoUEQzpM6xWWwzE3DsUN947zhRyd5rCBUw/H4jPOxTl7Kjo/H9tgo -l7+q6kme5Pkk68RxkseKz4kyMtU7zku55INJOAfyxmWTJhhp0tUlyTWk12ftI4BnhB/a0KANBIgh -JnYUTyhGVzRf4MQMTpgwwf/wxoOxGPTFDz4/xnSjEm+MeGMgEV3hdJ8i/pZeeumUlyccS5/ZEQgD -MuPUCHCEMg0p4sQzGbNo0K3MdwU/qISaEOOZyRioh/eaWRNio1ucHg3iSkOIQ9iPcCDMhHuEMBdE -ALM5EMbEeAAEONefH/g77rgjZNNnNRLoajPV8IzTqOJ5pIHFFHRV2aqrruobUDzjeM0JJ2OAJ0Y5 -POvs47ry+4f+oGxZ4QR4jvlDbPNMIcCJ4Q/PFSKaWO5gmb57+c7FIUKDne9sQtf4XqZ3JJNxnXlG -CT9EJ3Cdeaa5voSw0fPGIOtiWkm+th7hx0lXJRQDiFzTh3yVfWZTZkiDgIzFX2Xlap8IiMD8RYCB -QsQcM3iIL2KEX4MGDVInwSwbfNETG4o3DMGXNKbHo6sUT4ts3hEgZIC4YDzqlRkeU4Qysy+kM8oh -HCadhTjz+B4hHdef+4NGgKxmCeAJZXBsrs8fnleeXRrQ6YyBtzS6496SdOm0rXACXAc4x89VNt+9 -HJmesFyuffL5pqHFd0Z1vBNgTj9b4YyKVgKClpOOPZyVFZ5r+srK0j4REAERyESAsJL4RyCZLp0A -Jw1f4Ln8CCTL1XpxCCCcqxLgxPDj7a7MsZJJgFNL7o909wgeVQnw4lzHXEtBvOXz/NHgziTAqcOS -Sy4pAZ7rxcgzPc9tuucqFJfpu5f9uV775PNNaGt1CHDqVpKecCpWCkY4Q1UNAdJgVaUrhfNRHURA -BHInwCwpzAXN4M10RowwXZh8UcvmfwLPPPOMnzM+TIE2/5+RzkAEFkwCC8J3r0T4gnlv6qxEQARE -QAREQAREQARKmEBJhqOUMC9VTQREQAREQAREQAREQAQKJiARXjBCFSACIiACIiACIiACIiACuRGQ -CM+Nl1KLgAiIgAiIgAiIgAiIQMEEJMILRqgCREAEREAEREAEREAERCA3AhLhufFSahEQAREQAREQ -AREQAREomIBEeMEIVYAIiIAIiIAIiIAIiIAI5EZAIjw3XkotAiIgAiIgAiIgAiIgAgUTkAgvGKEK -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" /> diff --git a/docs/browser/img/api-key-revoke.svg b/docs/browser/img/api-key-revoke.svg new file mode 100644 index 00000000000..d2e53c2101a --- /dev/null +++ b/docs/browser/img/api-key-revoke.svg @@ -0,0 +1,203 @@ + +image/svg+xml1423 diff --git a/docs/browser/img/certificates-01.png b/docs/browser/img/certificates-01.png new file mode 100644 index 00000000000..b6a9d7adcc3 Binary files /dev/null and b/docs/browser/img/certificates-01.png differ diff --git a/docs/browser/img/dev-generate-key.png b/docs/browser/img/dev-generate-key.png deleted file mode 100644 index b05147c4a1b..00000000000 Binary files a/docs/browser/img/dev-generate-key.png and /dev/null differ diff --git a/docs/browser/img/example-identifier-build-errors.png b/docs/browser/img/example-identifier-build-errors.png index 27ae92c7cf8..481a94b6271 100644 Binary files a/docs/browser/img/example-identifier-build-errors.png and b/docs/browser/img/example-identifier-build-errors.png differ diff --git a/docs/browser/img/p8-key-rename.png b/docs/browser/img/p8-key-rename.png new file mode 100644 index 00000000000..a5a445ea66d Binary files /dev/null and b/docs/browser/img/p8-key-rename.png differ diff --git a/docs/browser/img/profiles-01.png b/docs/browser/img/profiles-01.png new file mode 100644 index 00000000000..a146b664cad Binary files /dev/null and b/docs/browser/img/profiles-01.png differ diff --git a/docs/browser/img/profiles-02.png b/docs/browser/img/profiles-02.png new file mode 100644 index 00000000000..264dfe06030 Binary files /dev/null and b/docs/browser/img/profiles-02.png differ diff --git a/docs/browser/img/profiles-03.png b/docs/browser/img/profiles-03.png new file mode 100644 index 00000000000..37bec5bdae9 Binary files /dev/null and b/docs/browser/img/profiles-03.png differ diff --git a/docs/browser/img/show-fork-main-customized.png b/docs/browser/img/show-fork-main-customized.png deleted file mode 100644 index a6b057353c1..00000000000 Binary files a/docs/browser/img/show-fork-main-customized.png and /dev/null differ diff --git a/docs/browser/img/show-history-dev-customized.png b/docs/browser/img/show-history-dev-customized.png deleted file mode 100644 index 88c8a1e7b63..00000000000 Binary files a/docs/browser/img/show-history-dev-customized.png and /dev/null differ diff --git a/docs/browser/img/show-history-main-customized.png b/docs/browser/img/show-history-main-customized.png deleted file mode 100644 index ebf342911a1..00000000000 Binary files a/docs/browser/img/show-history-main-customized.png and /dev/null differ diff --git a/docs/browser/img/update-org-secret.svg b/docs/browser/img/update-org-secret.svg new file mode 100644 index 00000000000..6e29054289c --- /dev/null +++ b/docs/browser/img/update-org-secret.svg @@ -0,0 +1,217 @@ + +image/svg+xml1234 diff --git a/docs/browser/intro-summary.md b/docs/browser/intro-summary.md index e22a1571dce..e9b7ec176d4 100644 --- a/docs/browser/intro-summary.md +++ b/docs/browser/intro-summary.md @@ -1,3 +1,8 @@ +!!! abstract "Progress: Step 1 of 7" + **📍 You are here:** Introduction and Summary
+ **⏱️ Time:** 15-30 minutes to understand the process
+ **📋 Next:** [Collect Secrets](secrets.md) + ## Summary of Steps ???+ info "Time Estimate (click to open/close)" @@ -16,7 +21,7 @@ If you prefer watching your instructions, a narrated video is available: - * [How to Build the *Loop* App With a Web Browser](https://www.youtube.com/watch?v=kiu5ho0MTW8){: target="_blank" } + * [How to Build the *Loop* App With a Web Browser](https://www.youtube.com/watch?v=kiu5ho0MTW8) Once you have *Apple Developer* and *GitHub* accounts, the steps below are a high-level summary with links to the detailed `LoopDocs` section. @@ -43,18 +48,18 @@ * [Create your version of *Loop* in `App Store` (personal use only, not for distribution)](prepare-app.md#create-loop-app-in-app-store-connect){: target="_blank" } * [Set up `Internal TestFlight Group for the App`](tf-users.md#testflight-overview){: target="_blank" } * *GitHub*: - * Action: 3. Create Certificates is included in Build Action with `Loop 3.6.0` * [`Action: 4. Build Loop`](build-yml.md#build-the-loop-app){: target="_blank" } + * Yes we can count, but Action 3 is included in Action 4 * Phone: [Install the *Loop* app using the *TestFlight* app](phone-install.md){: target="_blank" } ???+ question "FAQs (click to open/close)" - **Do I need a Mac computer?** No. This can be done on any browser, although it will be easier using a computer or tablet than just using a phone. - - **Isn't it hard to build every 90 days?** The initial setup and installation take a lot of your focused time. But once you build, future updates and builds are automatic. You just need to keep your Apple Developer account up to date. Review any email that says a GitHub action failed - read the error and take action. For more information, see [Automatic Update & Build](automatic.md){: target="_blank" }. + - **Isn't it hard to build every 90 days?** The initial setup and installation take a lot of your focused time. But once you build, future updates and builds are really fast. You just need to keep your Apple Developer account up to date. Review any email that says a GitHub action failed - read the error and take action. For more information, see [Automatic Update & Build](automatic.md){: target="_blank" }. - **When do I have to kick off my automatic build?** Starting in May 2025, you may need to take an extra action after 60 days with no updates to the app: [Manual Action for Automatic Build](automatic.md#manual-action-for-automatic-build){: target="_blank" } - **Can you explain the new automatic building?** There's a whole page on [Automatic Update & Build](automatic.md){: target="_blank" } for more explanations - **Can I use this for my child?** You, as the adult, can install using *TestFlight* on your child's phone. The explicit steps are provided at [Install on Phone: *TestFlight* for a Child](phone-install.md#testflight-for-a-child){: target="_blank" }. - **Can I still use my customizations?** Yes. [Customize using Browser](custom-browser.md){: target="_blank" } - - **Is there a build video?** Yes. [How to Build the *Loop* App With a Web Browser](https://www.youtube.com/watch?v=kiu5ho0MTW8){: target="_blank" } + - **Is there a build video?** Yes. [How to Build the *Loop* App With a Web Browser](https://www.youtube.com/watch?v=kiu5ho0MTW8) ## Tips and Tricks @@ -87,7 +92,7 @@ Complete instructions are found at this link for those comfortable with using *G If you prefer watching your instructions, there is a narrated video of each step needed to build using a browser. This video was created for version 3.2.x and some steps have been simplified with version 3.4.x. -* [How to Build the *Loop* App With a Web Browser](https://www.youtube.com/watch?v=kiu5ho0MTW8){: target="_blank" } +* [How to Build the *Loop* App With a Web Browser](https://www.youtube.com/watch?v=kiu5ho0MTW8) > Do not decide to uncheck the box for Near Field Communications in the Identifer for `Loop` - that is required to build version 3.4.x and newer. @@ -256,11 +261,19 @@ Some of these **terms** have ToolTips, so hover your mouse over those - or revie * Doing this provides 3 of your 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`. ![add identifiers using github actions](img/action-01-validate-secrets.svg){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" ![add identifiers using github actions](img/action-02-add-identifiers.svg){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 Groups
| + | `LoopCaregiverIntentExtension` | `com.TEAMID.loopkit.LoopCaregiver.IntentExtension` | App Groups
| + | `LoopCaregiverWatch` | `com.TEAMID.loopkit.LoopCaregiver.watchkitapp` | App Groups
| + | `LoopCaregiverWatchWidgetExtension` | `com.TEAMID.loopkit.LoopCaregiver.watchkitapp.WidgetExtension` | App Groups
| + | `LoopCaregiverWidgetExtension` | `com.TEAMID.loopkit.LoopCaregiver.WidgetExtension` | App Groups
| + + ### Add `LoopCaregiverGroup` to each Identifier Find and click on the row for the `LoopCaregiver` on the [Certificates, Identifiers & Profiles: Identifiers List](https://developer.apple.com/account/resources/identifiers/list){: target="_blank" } page. Look in the **`IDENTIFIER`** column to find `com.TEAMID.loopkit.LoopCaregiver`. The **`NAME`** might begin with an `XC` if you previously built with Xcode. However, the **`IDENTIFIER`** column value should match. @@ -288,11 +268,9 @@ This requires you to provide some information. Examine the table below for the b | App Name | Bundle ID | | --- | --- | | LoopCaregiver | com.TEAMID.loopkit.LoopCaregiver | -| LoopFollow | com.TEAMID.LoopFollow | -> If you build from a second or third `repository` for `LoopFollow`, the Bundle ID will have `.Second` or `.Third` at the end. -1. Open this link: [App Store Connect / Apps](https://appstoreconnect.apple.com/apps){: target="_blank" } to view your apps; log in if needed. +1. Open this link: [App Store Connect / Apps](https://appstoreconnect.apple.com/apps) to view your apps; log in if needed. 1. If this App already exists, you can continue to [Create Certificates](#create-certificates) 1. Click the Add Apps button or the blue "plus" icon and select New App as shown in the graphic below @@ -301,7 +279,7 @@ This requires you to provide some information. Examine the table below for the b {align="center"} 1. The New App dialog box opens and should appear similar to the graphic below. Before you fill anything out, make sure your Bundle ID is available in the dropdown menu. If you do not see the Bundle ID for your app; back out of this screen and follow the directions in [Configure to Use Browser: Find My Loop](prepare-app.md#find-my-loop), where you'll be finding App Name instead of Loop. - * Select "iOS". For LoopFollow you can also select "macOS" if you own a Mac with macOS 11 or later. + * Select "iOS" * Enter a name: this will have to be unique * You could start with "App Name ABC" where ABC are your initials * If that is already taken, you can add a number, for example, "App Name ABC 123" @@ -324,7 +302,7 @@ You are done with the create app step. ## Add Users to *TestFlight* for App -> If you are not already on your app page because you just created it, use this link to get there: [App Store Connect / Apps](https://appstoreconnect.apple.com/apps){: target="_blank" }. Find your app and click on it and then select the *TestFlight* tab at the top of the page. +> If you are not already on your app page because you just created it, use this link to get there: [App Store Connect / Apps](https://appstoreconnect.apple.com/apps). Find your app and click on it and then select the *TestFlight* tab at the top of the page. You need to configure a *TestFlight* Internal Testing Group for each app you build and invite the users (including yourself). @@ -343,7 +321,7 @@ Refer to the graphic below for the numbered steps: 1. Click on the "Actions" tab of your Repository 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 (`main` for LoopFollow, `dev` for LoopCaregiver) + * You will see your default branch (`dev`) * You can select a different branch, but typically, you run the default 1. Tap the green button that says "Run workflow". @@ -362,17 +340,6 @@ The graphic below is an example from Loop, your screen will show your app and as If you are building the *LoopCaregiver* app, skip ahead to [Build Action](#build-action). -### Display Name Customization for `LoopFollow` - -> If you build `LoopFollow` for one, two or three loopers, you may choose to customize your `fork` or `forks` to insert a custom display name. - -> * Find and click on the file `LoopFollowDisplayNameConfig.xcconfig` -> * Tap the pencil icon so you can edit the file -> * The last line says `display_name = LoopFollow` (or `LoopFollow_Second` or `LoopFollow_Third`) -> * Insert your custom name so the last line says `display_name = LF custom name` -> * Click on commit changes and chose to commit directly into the `main` branch - -> Continue to build as instructed below. After you install the app on your phone, iPad or Mac via *TestFlight*, that custom name is what is displayed. The prefix LF is suggested to make it easier to find the custom named `LoopFollow` app in the list of apps, but is not required. ### Build Action @@ -381,7 +348,7 @@ Refer to the graphic below for the first four steps: 1. Click on the "Actions" tab of your Repository repository. 1. On the left side, click on "Build *App Name*". 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 will see your default branch (`dev`) * You can select a different branch, but typically, you run the default 1. Tap the green button that says "Run workflow". @@ -395,7 +362,7 @@ Refer to the graphic below for the first four steps: 1. If the process appears to be happening without an error, go do something else for a while. The build should take less than half an hour (these tend to build faster than the *Loop* app. * When you see the green check (:octicons-check-circle-fill-16:{: .passed }) continue * If there is a late-appearing error, then use [Quick Reference for Browser Build Errors](bb-errors.md#quick-reference-for-browser-build-errors){: target="_blank" } -1. Your app should eventually appear on [App Store Connect](https://appstoreconnect.apple.com/apps){: target="_blank" }. +1. Your app should eventually appear on [App Store Connect](https://appstoreconnect.apple.com/apps). ### Build Errors @@ -498,7 +465,7 @@ You can disable the build actions from the repositories in your personal account * Notice the github address now says `my-name` instead of `my-name-org` * Select the repository you wish to disable build actions for and follow these instructions * It is the Build action that kicks off the update and build steps, so simply disabling the one action is sufficient - * [GitHub Directions to Disable and Enable a Workflow](https://docs.github.com/en/actions/using-workflows/disabling-and-enabling-a-workflow#disabling-a-workflow){: target="_blank" } + * [GitHub Directions to Disable and Enable a Workflow](https://docs.github.com/en/actions/using-workflows/disabling-and-enabling-a-workflow#disabling-a-workflow) #### Option 2: Delete `repository` @@ -513,4 +480,4 @@ You can delete the DIY repositories from your personal account * Select `Your Repositories` * Notice the github address now says `my-name` instead of `my-name-org` * Select the repository you wish to delete and follow these instructions - * [GitHub Docs: Delete a repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/deleting-a-repository){: target="_blank" } + * [GitHub Docs: Delete a repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/deleting-a-repository) diff --git a/docs/browser/phone-install.md b/docs/browser/phone-install.md index e13d4599945..bf4a6518ce6 100644 --- a/docs/browser/phone-install.md +++ b/docs/browser/phone-install.md @@ -1,6 +1,12 @@ ## General Installation Information -**The *Loop* app must be built at least every 90 days when using a browser to build.** With version 3.4.0 and newer, the build is automatic (once a month or with a new release). It is recommended you manually install the new build using *TestFlight* at your convenience. +**The *Loop* app must be built at least every 90 days when using a browser to build.** + +> 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" } + +It is recommended you manually install the new build using *TestFlight* at your convenience. After you [Build the *Loop* App](build-yml.md#build-the-loop-app){: target="_blank" } with a browser and you get the email that it is availble in *TestFlight*, you are ready to install on as many phones as you and your family members need. @@ -28,7 +34,7 @@ Once you get an email that your app is available to test on iOS and watchOS, you * Note this can be half-hour to an hour after the build displays the green check mark on your browser * Once the app is on your phone, you can choose to install the watch version using your phone *Watch* app -* If you did not already add your email to your *TestFLight* group for your app, go and do it now using these [instructions](tf-users.md#configure-testflight-group-for-the-app){: target="_blank" } +* If you did not already add your email to your *TestFlight* group for your app, go and do it now using these [instructions](tf-users.md#configure-testflight-group-for-the-app){: target="_blank" } The first time you use *TestFlight* on any phone associated with a given email, you must `Redeem` the code sent to that email inviting you to test the app. The GIF below is for someone who has never used *TestFlight*. @@ -129,8 +135,8 @@ If you tap on the row that says `Previous Builds`, highlighted by the dashed-gre More information: - * [Link 1: Apple forum](https://forums.developer.apple.com/forums/thread/720033){: target="_blank" } - * [Link 2: Stackoverflow thread](https://stackoverflow.com/questions/74588716/testflight-beta-has-expired){: target="_blank" } + * [Link 1: Apple forum](https://forums.developer.apple.com/forums/thread/720033) + * [Link 2: Stackoverflow thread](https://stackoverflow.com/questions/74588716/testflight-beta-has-expired) ## *TestFlight* for a Child @@ -158,7 +164,7 @@ Suppose you really don't like the name you picked initially for the _ + **⏱️ Time:** 30-45 minutes
+ **✅ Goal:** Configure identifiers at Apple and create your Loop app
+ **📋 Next:** [Prepare TestFlight Group](tf-users.md) + ## Prepare the App -After creating the identifiers, you will need to +This page involves working with two different Apple websites. Pay close attention to which site you're on: + +!!! info "🍎 Two Apple Sites - Don't Confuse Them!" + **Site 1: Apple Developer** (developer.apple.com) + + * 🔧 **Purpose:** Configure Identifiers and App Groups + * 📍 **You'll do:** Link identifiers to Loop App Group + * 🎨 **Look:** Developer-focused, technical interface + + --- + + **Site 2: App Store Connect** (appstoreconnect.apple.com) + + * 📱 **Purpose:** Manage your app listing and TestFlight + * 📍 **You'll do:** Create the Loop app entry + * 🎨 **Look:** App management interface and manage your TestFlight group -1. [Configure](#configure-identifiers-for-loop){: target="_blank" } them to associate the correct App Group with specific identifiers -2. [Create](#create-loop-app-in-app-store-connect){: target="_blank" } the *Loop* App. +After creating the identifiers, you will: -Some people get confused on this page. Many of the links look similar but are actually different pages at *Apple*. +1. ✅ [Configure identifiers](#configure-identifiers-for-loop) at **Apple Developer** +2. ✅ [Create the Loop app](#create-loop-app-in-app-store-connect) at **App Store Connect** !!! 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" }. + This page has the most steps. If you're unsure which website you're on or get confused - [ask for help early](bb-errors.md#help-with-errors){: target="_blank" }! + +--- ## Configure Identifiers for Loop +!!! tip "📍 You're now at: **Apple Developer** (developer.apple.com)" + This section works with technical identifiers. You'll link 4 identifiers to your Loop App Group. + ???+ tip "Background Information (Click to open/close)" * One of the identifiers just created is used as the `Bundle ID` for building your app * This can be a little confusing and a lot of pages over at Apple look the same @@ -31,7 +57,7 @@ Please read carefully to avoid confusion. ??? abstract "Section Summary (click to open/close)" [:material-skip-forward:](#optional-app-group-description-modification) If you have already built the *Loop* app via Xcode using this *Apple* ID, skip ahead to [Optional: App Group Description Modification](#optional-app-group-description-modification). - 1. Go to [Register an `App Group`](https://developer.apple.com/account/resources/identifiers/applicationGroup/add/){: target="_blank" } on the *Apple Developer* site. + 1. Go to [Register an `App Group`](https://developer.apple.com/account/resources/identifiers/applicationGroup/add/) on the *Apple Developer* site. 1. For Description, use "Loop App Group". 1. For Identifier, enter "group.com.TEAMID.loopkit.LoopGroup", substituting your team id for `TEAMID`. 1. Click "Continue" and then "Register". @@ -42,7 +68,7 @@ The `Loop` *App Group* already exists if you previously built the *Loop* app usi If you have never built the *Loop* app with *Xcode* using your `TEAMID`, you need to create an *App Group* associated with your `TEAMID`. -1. Open this link: [Register an App Group](https://developer.apple.com/account/resources/identifiers/applicationGroup/add/){: target="_blank" } on the *Apple Developer* site. +1. Open this link: [Register an App Group](https://developer.apple.com/account/resources/identifiers/applicationGroup/add/) on the *Apple Developer* site. 1. For **`Description`**, use `Loop App Group`. 1. For **`Identifier`**, enter `group.com.TEAMID.loopkit.LoopGroup`, substituting your team id for `TEAMID`. 1. Double-check the spelling - your `TEAMID` must be correct and the `Loop` *App Group* must match the format shown in the previous step @@ -58,7 +84,7 @@ If you get an error saying `An Application Group with Identifier 'group.com.TEAM > This step is not required, but if you previously built using a Mac with Xcode, it is a good idea to update the Name associated with the Identifier for the Loop App Group. Then what you see on your display will match the directions as you continue. ??? tip "Optional Rename Step (click to open/close)" - Click to display the [App Group List](https://developer.apple.com/account/resources/identifiers/list/applicationGroup){: target="_blank" } + Click to display the [App Group List](https://developer.apple.com/account/resources/identifiers/list/applicationGroup) Tap on the Identifier that shows `group.com.TEAMID.loopkit.LoopGroup` where TEAMID is your Developer ID. @@ -82,7 +108,7 @@ First, review the Identifiers and then [Add `App Group` to Identifiers](#add-app #### New Builders -Click this link: [`Certificates, Identifiers & Profiles: Identifiers List`](https://developer.apple.com/account/resources/identifiers/list){: target="_blank" } on the *Apple Developer* site. +Click this link: [`Certificates, Identifiers & Profiles: Identifiers List`](https://developer.apple.com/account/resources/identifiers/list) on the *Apple Developer* site. If you never built using *Xcode*, then after the Add 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 Groups
HealthKit
NFC Tag Reading
Push Notifications (do not configure)
Siri
Time Sensitive Notifications | + | `Loop Intent Extension` | `com.TEAMID.loopkit.Loop.Loop-Intent-Extension` | App Groups
| + | `Loop Status Extension` | `com.TEAMID.loopkit.Loop.statuswidget` | App Groups
| + | `Loop Widget Extension` | `com.TEAMID.loopkit.Loop.LoopWidgetExtension` | App Groups
| + | `WatchApp` | `com.TEAMID.loopkit.Loop.LoopWatch` | none | + | `WatchAppExtension`| `com.TEAMID.loopkit.Loop.LoopWatch.watchkitextension` | HealthKit
SiriKit | + ### Add `App Group` to Identifiers ??? abstract "Section Summary (click to open/close)" @@ -125,7 +163,7 @@ If you built previously using a Mac with Xcode, you may see the XCode version in Note 2 - Depending on your build history, you may find some of the Identifiers already have your "App Group" and you are just verifying the status. - 1. Go to [Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources/identifiers/list){: target="_blank" } on the *Apple Developer* site. + 1. Go to [Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources/identifiers/list) on the *Apple Developer* site. 1. For each of the following identifier names (be sure to look in Identifier column if names do not match): * `Loop` * `Loop Intent Extension` @@ -142,7 +180,7 @@ If you built previously using a Mac with Xcode, you may see the XCode version in [:material-skip-forward:](#create-loop-app-in-app-store-connect) To skip the detailed instructions, click on [Create Loop App in App Store Connect](#create-loop-app-in-app-store-connect) -Click to open the [Certificates, Identifiers & Profiles: Identifiers List](https://developer.apple.com/account/resources/identifiers/list){: target="_blank" } page. +Click to open the [Certificates, Identifiers & Profiles: Identifiers List](https://developer.apple.com/account/resources/identifiers/list) page. Look in the **`IDENTIFIER`** column to locate each Identifer. The name in the **`NAME`** column may be different if you previously [built with a Mac using Xcode](#previous-xcode-builders). @@ -155,7 +193,13 @@ Look in the **`IDENTIFIER`** column to locate each Identifer. The name in the ** Click on each **`IDENTIFIER`** in turn and the `Edit Your App ID Configuration` screen will open. -The example graphic below has numbered steps that match these directions: +#### Add Time Sensitive Notifications + +There is one difference for the Loop Identifier from the other 3 Identifiers. You must manually enable the Time Sensitive Notifications capabilty. Follow the directions below for adding the Loop App Group, but keep scrolling down until you see the Time Sensitive Notifications. Make sure that check box is enabled, as shown in the graphic below. If you do not do this, the Build will fail. + +> ![graphic showing selection of the time sensitive notifications](img/add-time-sensitive-notifications-loop-identifier.png){width="300"} + +The example graphic below has numbered steps that match these directions. The columns from left to right are `Capabilities`, `App Services` and `Capability Requests`. With the exception of one App Service (for Loop), the check box under `Capabilities` will already be checked for you.: 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 @@ -178,14 +222,20 @@ The full list of Identifiers should be displayed again. Repeat until the 4 Identifiers have the `Loop App Group` configured. * If you miss an identifier, the `Create Certificates` step will succeed but `Build Loop` will fail. +* If you do not [enable the `Time Sensitive Notifications`](#add-time-sensitive-notifications) for the `Loop` Identifier, the `Create Certificates` step will succeed but `Build Loop` will fail. + +--- ## Digital Service Act Compliance +!!! tip "📍 You're now at: **App Store Connect** (appstoreconnect.apple.com)" + This quick step confirms you're building for personal use, not selling apps. + In order to create an app you need to indicate whether you are a trader or a non-trader. You are a non-trader unless you use the same Developer ID to submit apps for sale. Even if the graphic below does not match what you see exactly, it should assist in guiding you through the steps. -Open this link: [`App Store Connect / Apps`](https://appstoreconnect.apple.com/apps){: target="_blank" }; log in if needed. +Open this link: [`App Store Connect / Apps`](https://appstoreconnect.apple.com/apps); log in if needed. If you do not see the banner, shown in the top of the graphic below, asking you to Complete Compliance Requirements, you can skip ahead to [Create Loop App in App Store Connect](#create-loop-app-in-app-store-connect). @@ -204,12 +254,17 @@ If you do see the banner, follow the numbered steps in the graphic below: You do not need to add a bank account or fill out tax forms if you are only using the App Store to get your own app into TestFlight. You only need to have a paid account with a valid license agreement and have completed this compliance form. Ignore other requests from Apple. +--- + ## Create Loop App in App Store Connect +!!! tip "📍 Still at: **App Store Connect** (appstoreconnect.apple.com)" + Now you'll create the actual Loop app entry for TestFlight distribution. + ??? abstract "Section Summary (click to open/close)" - If you have created a Loop app in App Store Connect before, make sure you [Remove Apple Vision Pro](#remove-apple-vision-pro) and then skip ahead to [Create Certificates](certs.md#create-certificates). + If you have created a Loop app in App Store Connect before, make sure you [Remove Apple Vision Pro](#remove-apple-vision-pro) and then skip ahead to [Prepare TestFlight Group](tf-users.md). - 1. Click on the link [apps list](https://appstoreconnect.apple.com/apps){: target="_blank" } to open App Store Connect and click the blue "plus" icon to create a New App. + 1. Click on the link [apps list](https://appstoreconnect.apple.com/apps) to open App Store Connect and click the blue "plus" icon to create a New App. * Select "iOS". * Select a name: this will have to be unique, so you may have to try a few different names here, but it will not be the name you see on your phone, so it's not that important. * Select your primary language. @@ -228,7 +283,7 @@ If you have created a `Loop app` in *App Store Connect* before, skip ahead to [C If you have previously used some kind of remote build, like `diawi` or `TestFlight`, you may have your Loop in the *App Store* but can't see it. Don't worry - there are instructions for this case. -1. Open this link: [`App Store Connect / Apps`](https://appstoreconnect.apple.com/apps){: target="_blank" } to view your apps; log in if needed. +1. Open this link: [`App Store Connect / Apps`](https://appstoreconnect.apple.com/apps) to view your apps; log in if needed. * If you have never added an app to *App Store Connect*, you will not see the icons inside the red rectangle and should keep going, although some people report the search icon shows up for them * If you have an app that is not shown, you will see a search icon and the `All Statuses` dropdown. If you get to step 3 and cannot find your `com.TEAMID.loopkit.Loop` in the *Bundle ID* dropdown, this means you need to follow [Find My Loop](#find-my-loop). @@ -262,7 +317,7 @@ If you have previously used some kind of remote build, like `diawi` or `TestFlig 1. One last check - if the `Bundle ID` has a number other than your actual 10-digit `TEAMID` embedded in it, you will be creating an App in the App Store that you cannot use * In this case, do **NOT** select `Create` - * Instead, go back and put the correct value into the `TEAMID` *Secret* and follow the steps in [Errors with Browser: Delete Identifiers](bb-errors.md#delete-identifiers){: target="_blank" } + * Instead, go back and put the correct value into the `TEAMID` *Secret* and follow the steps in [Errors with Browser: Delete Identifiers](bb-errors.md#delete-identifiers) 1. Click `Create` but do not fill out the next form. That is for submitting to the app store and you will not be doing that. ### Remove Apple Vision Pro @@ -271,7 +326,7 @@ If you have previously used some kind of remote build, like `diawi` or `TestFlig It is now time to edit the availability of your app on Apple Vision Pro. If you skip this step, you will get an annoying email telling you Apple Vision Pro is not supported by your app. -* First click to return to the main [App Store Connect](https://appstoreconnect.apple.com/apps){: target="_blank" }. In the message section labeled **iOS Apps on Apple Vision Pro**, click on "Edit Availability", highlighted by the red rectangle in the graphic below. +* First click to return to the main [App Store Connect](https://appstoreconnect.apple.com/apps). In the message section labeled **iOS Apps on Apple Vision Pro**, click on "Edit Availability", highlighted by the red rectangle in the graphic below. ![Edit Availability for Apple Vision Pro](img/apple-vision-pro.png){width="600"} {align="center"} @@ -296,7 +351,7 @@ There are two possible reasons: You may have no memory of ever setting up `Loop` in *App Store Connect*. If you previously used some kind of remote build, like `diawi`, your `Loop` may be there as a *Removed App*. -* Open this link: [App Store Connect / Apps](https://appstoreconnect.apple.com/apps){: target="_blank" }, look for the `All Statuses` dropdown indicator, and select `Removed Apps` +* Open this link: [App Store Connect / Apps](https://appstoreconnect.apple.com/apps), look for the `All Statuses` dropdown indicator, and select `Removed Apps` ![app store connect with deleted apps](img/01-app-store-connect.png){width="600"} {align="center"} @@ -319,6 +374,14 @@ You may have no memory of ever setting up `Loop` in *App Store Connect*. If you ![find removed apps](img/restore-removed-02.png){width="800"} {align="center"} +--- + ## Next Step -The next step is to configure your [TestFlight Group](tf-users.md) for this app. \ No newline at end of file +App created at App Store Connect! Now set up TestFlight access: + +**→ [Step 6: Prepare TestFlight Group](tf-users.md)** + +--- + +**Navigation:** [← Back: Prepare Identifiers](identifiers.md) | [Next: TestFlight Group →](tf-users.md) \ No newline at end of file diff --git a/docs/browser/prepare-fork.md b/docs/browser/prepare-fork.md index 6ed20084e79..6d75ca231b6 100644 --- a/docs/browser/prepare-fork.md +++ b/docs/browser/prepare-fork.md @@ -1,14 +1,32 @@ +!!! abstract "Progress: Step 3 of 7" + **📍 You are here:** Prepare Fork
+ **⏱️ Time:** 30-60 minutes
+ **✅ Goal:** Create your copy of LoopWorkspace and add secrets
+ **📋 Next:** [Prepare Identifiers](identifiers.md)
+ ## Fork `LoopWorkspace` -???+ tip "Are you a Caregiver? Are you planning to build more than one app? (Click to close/open)" - Did you skip the optional section to [Create a Free *GitHub* Organization](secrets.md#create-a-free-github-organization){: target="_blank" }? +!!! question "Important Decision: Personal Account or Organization?" + **Before you fork**, decide whether to use a GitHub organization. This affects where you store your secrets. + + **Use a GitHub Organization if you:** + + * ✓ Plan to build multiple apps (Loop + LoopFollow/LoopCaregiver) + * ✓ Want to enter secrets once for all apps + * ✓ Might try customized versions or development builds + + **Use Personal Account if you:** + + * Only building Loop (no other apps planned) + * Prefer simpler setup (fewer concepts to learn) - If you plan to build more that one app and use your personal account, you must add the 6 Secrets 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` ![fork information for LoopWorkspace](img/gh-fork-loopworkspace-top.svg){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*). ![settings screen](img/gh-quick-access-org.png){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 ![enable nuke certs](img/gh-nuke-certs.png){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 Secrets
+ **⏱️ Time:** 1-2 hours
+ **✅ Goal:** Gather 6 secrets needed for building
+ **📋 Next:** [Prepare Fork](prepare-fork.md) + ## Collect and Save Secrets -??? abstract "Section Summary (click to open/close)" - You require 6 Secrets (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 - ![Apple Developer Account Membership Details](img/apple_dev_account-teamid-001.svg){width="600"} + > ![Apple Developer Account Membership Details](img/apple_dev_account-teamid-001.svg){width="600"} {align="center"} 1. Next to the `Team ID` field, is a 10-character ID number. This is your ***Apple Developer* `TEAMID`**. -![Apple Developer TEAMID](img/apple_dev_account-teamid-002.svg){width="500"} + > ![Apple Developer TEAMID](img/apple_dev_account-teamid-002.svg){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) - ![App Store Connect Key page](img/api-key-initial-screen.svg){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: + > ![App Store Connect Key page](img/api-key-initial-screen.svg){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: - ![generate api key dialog box](img/dev-generate-key.png){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 + + > ![generate a new FastLane API Key](img/api-key-generate.svg){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" } -![App Store Connect Key page](img/api-key-in-process.svg){width="700"} +> ![App Store Connect Key page](img/api-key-in-process.svg){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. - ![download key only once](img/dev-dl-key-once.png){width="700"} + > ![download key only once](img/dev-dl-key-once.png){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) - - ![img/apns-open.png](../nightscout/img/apns-open.png) + 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` + > ![rename the p8 file](img/p8-key-rename.png){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` - ![img/apns-copy-key.png](../nightscout/img/apns-copy-key.png) + > ![img/apns-copy-key.png](../nightscout/img/apns-copy-key.png) #### 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) - ![request a new personal access token](img/gh-access-token.svg){width="700"} + > ![request a new personal access token](img/gh-access-token.svg){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. - ![copy fastlane access token on github](img/gh-token-to-copy.png){width="600"} + > ![copy fastlane access token on github](img/gh-token-to-copy.png){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 Group
+ **⏱️ Time:** 10-15 minutes
+ **✅ Goal:** Set up who can install your Loop app via TestFlight
+ **📋 Next:** [Build the Loop App](build-yml.md) + ## *TestFlight* Overview There are two parts to this. Step 1 is only done one time. Step 2 is done for each new app. @@ -21,7 +27,7 @@ You are configuring a private capability for your family using an Internal Testi First you need to add the email address(es) to your *App Store Connect* Access Users list: -* Open this link: [Users and Access](https://appstoreconnect.apple.com/access/users){: target="_blank" } +* Open this link: [Users and Access](https://appstoreconnect.apple.com/access/users) * You must provide a role for each person - `Customer Support` is a good choice * Once you have added them here, you'll be able to select them in the `TestFlight` internal test group for each of your apps @@ -33,7 +39,7 @@ First you need to add the email address(es) to your *App Store Connect* Access U !!! tip "Add user for each app" Once you add a user to have access to your TestFlight internal test group for an app, you don't need to do it again - it remains available to them across rebuilds and different versions for that app. -1. Open this link: [App Store Connect / Apps](https://appstoreconnect.apple.com/apps){: target="_blank" } to view your apps; log in if needed. +1. Open this link: [App Store Connect / Apps](https://appstoreconnect.apple.com/apps) to view your apps; log in if needed. * Select your *Loop* app * Click on the `TestFlight` tab @@ -60,6 +66,14 @@ First you need to add the email address(es) to your *App Store Connect* Access U ![select your users for the testing group](img/setup-testflight-03.png){width="700"} {align="center"} +--- + ## Next Step -[Create Certificates](certs.md) for your app. \ No newline at end of file +TestFlight group configured! Ready to build: + +**→ [Step 7: Build the Loop App](build-yml.md)** + +--- + +**Navigation:** [← Back: Prepare App](prepare-app.md) | [Next: Build Loop →](build-yml.md) \ No newline at end of file diff --git a/docs/build/apple-developer.md b/docs/build/apple-developer.md index 27840de8c30..757dc43228e 100644 --- a/docs/build/apple-developer.md +++ b/docs/build/apple-developer.md @@ -8,7 +8,7 @@ There are two options: Paid ($99/year) or Free (re-build weekly, Xcode only) - - Paid Developer Account: Go to the [Apple Developer website](https://developer.apple.com/programs/enroll/){: target="_blank" } to enroll in an individual account. + - Paid Developer Account: Go to the [Apple Developer website](https://developer.apple.com/programs/enroll/) to enroll in an individual account. - Free: No action required at this time. * Free requires the [Build with *Mac*](overview.md){: target="_blank" } method @@ -22,7 +22,7 @@ The Apple ID is DIFFERENT than the Apple Developer ID. !!! warning "Apple ID" - Parents should set up a **different** Apple ID for each of their looper children and looper children should **not** use the parent Apple ID. Use Apple's Instructions for [Create an Apple ID for your child](https://support.apple.com/en-us/HT201084){: target="_blank" }. + Parents should set up a **different** Apple ID for each of their looper children and looper children should **not** use the parent Apple ID. Use Apple's Instructions for [Create an Apple ID for your child](https://support.apple.com/en-us/HT201084). The Apple Health record is a convenient record of blood glucose, insulin and carbohydrates and should be associated with only one individual. @@ -74,7 +74,7 @@ Once PaidLoop is working, delete the FreeLoop instance from your phone to avoid ## Enrolling -To enroll in an individual paid Paid account, go to the Apple's Developer Program website [Apple Developer website](https://developer.apple.com/programs/enroll/){: target="_blank" }. +To enroll in an individual paid Paid account, go to the Apple's Developer Program website [Apple Developer website](https://developer.apple.com/programs/enroll/). Be sure to use the credit card already associated with the email you are using for the developer account. If you switch credit cards, it can cause delays. diff --git a/docs/build/build-app.md b/docs/build/build-app.md index f7e1267aaea..7320da78b96 100644 --- a/docs/build/build-app.md +++ b/docs/build/build-app.md @@ -18,7 +18,7 @@ ## Build Video -The Loop and Learn team prepared this [YouTube video](https://youtu.be/gddhljzsNkM){: target="_blank" } showing how to build Loop 2.2.x including the steps required to update if you previously built. The steps are different now. The video may be worth watching, but once you've reviewed it, work through the new build process described on this page. +The Loop and Learn team prepared this [YouTube video](https://youtu.be/gddhljzsNkM) showing how to build Loop 2.2.x including the steps required to update if you previously built. The steps are different now. The video may be worth watching, but once you've reviewed it, work through the new build process described on this page. If you do watch this video, please note that you no longer are required to delete provisioning profiles as a separate step and the overall building process is streamlined. @@ -39,7 +39,7 @@ You will see a message similar to the next graphic. ![phone message if trying to run xcode app without developer mode enabled](img/phone-developer-mode-required.jpeg){width="300"} {align="center"} -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){: 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 ![open-source warning](img/bss-open-source-warning.svg){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. ![agree to the download](img/bss-03-download.svg){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 ![img/device-support-files.jpg](img/device-support-files.jpg){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. ![img/license.png](img/license.png){width="750"} {align="center"} @@ -490,7 +483,7 @@ If your problem persists after that, then you might need to do total reset of yo ![img/pending_certification_request.jpg](img/pending_certification_request.jpg){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?" ![img/revoke1.png](img/revoke1.png){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 with
`SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited)` - * Insert the new keyword (separated by a space) anywhere after `$(inherited)` and before the slashes near the end of the line - * When done, that line should be similar to:
`SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) SIRI_DISABLED` + * Examine the file and find the line that starts with`SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited)` + * Insert the new keyword (separated by a space) anywhere after `$(inherited)` before the end of the line + * When done, that line should be similar to: `SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) EXPERIMENTAL_FEATURES_ENABLED SIMULATORS_ENABLED ALLOW_ALGORITHM_EXPERIMENTS DEBUG_FEATURES_ENABLED SIRI_DISABLED` Details about removing unsupported capabilities: -- You must disable Push Notification, Siri, Time Sensitive Notifications and Near Field Communication Tag Reading - * If the target you are signing does not use one of these attributes, no error message will appear when you select (personal team) for that target - * If the target you are signing does use one of these attributes, an error message will appear when you select (personal team) for that target +- You must disable some capabilities to enable building the Free app + * If the target you are signing uses a capability that required a paid account, an error message will appear when you select (personal team) for that target + * Carefully follow the bullet list above for what needs to be modified - do not delete too many items - The Xcode error message starts with "Cannot create . . ." with a list of all the attributes not supported. - Scroll down and click on the little trash can icon next to each unsupported attribute + - Do NOT delete the HealthKit completely - only modify the check boxes if required - Scroll up and both the "Cannot create . . ." and "No profiles for . . ." error messages are gone - You are done with this target - Proceed to the next target @@ -119,12 +133,22 @@ Click on each of the three remaining targets shown in the red box below, and rep ![Xcode window showing the targets that must be signed](img/success.png){width="750"} {align="center"} -After signing the targets, click on the Loop icon under the `PROJECTS` heading. (Refer to the bright blue box in graphic above - click on that Loop icon.) +## Signing Complete -- If you skip this step, you may get an "Entitlements" Build Error for either Loop or WatchApp - - Follow this procedure to fix the error: [Entitlements Error](build-errors.md#entitlements-error) - - Much easier to just click on Loop under `Projects` +Now that you have signed your app, you will be able to build following these directions: [Start Build](build-app.md#start-build). If this is your first free build on this phone, you will need to build once, then "Trust the Free Account" and then build a second time. This is only for the first build. Subsequent builds on that phone are already trusted. -## Signing Complete +!!! important "Trust the Free Account" + The first time you build the free app, you will be told Xcode cannot install on the phone because the Free Account name is not trusted. + + The phone will also show a message stating `Untrusted Developer`. + + Once you see that error message, go into the phone and follow these steps: + + * Select iPhone Settings + * Select General + * Select VPN & Device Management + * At the bottom of the screen, tap on the free developer email address + * On the next screen, tap on Trust "free developer email address" + * Tap on "Allow" -Now that you have signed your app, return to the Build Loop page at [Start Build](build-app.md#start-build). + Return to Xcode and build again. diff --git a/docs/build/cgm.md b/docs/build/cgm.md index 43e511828df..0001c173f13 100644 --- a/docs/build/cgm.md +++ b/docs/build/cgm.md @@ -14,6 +14,7 @@ * *Dexcom* ONE+ (based off G7 sensor) is available in some countries - *Medtronic* sensors connected to a Loop-compatible *Medtronic* pumps - Some *Libre* sensors + - Eversense E3 and 365 sensors !!! question "FAQs" @@ -21,7 +22,7 @@ 1. Only some *Libre* sensors have methods to read them directly on an iPhone 2. There are more methods for Android 3. See also [CGM Customization](../faqs/cgm-faqs.md#cgm-customization){: target="_blank" } - - **"What about Eversense?"** Refer to [CGMs Not Supported in the *Loop* App](#cgms-not-supported-in-the-loop-app) + - **"What about Eversense?"** Refer to [*Eversense* E3 and 365 CGM](#eversense-e3-and-365-cgm) ## Continuous Glucose Monitor (CGM) @@ -39,7 +40,7 @@ If the *Dexcom* app is on the same device as the *Loop* app, your system can fun !!! warning "*Dexcom* G5 Support" - [*Dexcom* has stopped supporting the G5 system in the US](https://www.dexcom.com/obsolescence){: target="_blank" }. In the US, and some other countries, the G5 is not available for download from the Apple Store. There are countries in which *Dexcom* does supply and support G5. The G5 capability will continue to be supported in Loop. + [*Dexcom* has stopped supporting the G5 system in the US](https://www.dexcom.com/obsolescence). In the US, and some other countries, the G5 is not available for download from the Apple Store. There are countries in which *Dexcom* does supply and support G5. The G5 capability will continue to be supported in Loop. ## *Dexcom* G7 and ONE+ CGM @@ -58,6 +59,15 @@ With Loop 3.4 and newer versions, some *Libre* CGM are supported. * *Libre* 3 * See [CGM Customization](../faqs/cgm-faqs.md#cgm-customization){: target="_blank" } +## *Eversense* E3 and 365 CGM +![img/eversense.png](img/eversense.png){width="150"} + +Both the Eversense E3 (90 days & 180 days) and the Eversense 365 (full year) transmitters are supported, on an experimental branch feat/eversense. + +* See [Loop Development: Branches](../version/development.md#branches){: target="_blank" } for more information on how to build this branch. + +Eversense E3 and 365 are implantable continuous glucose monitoring (CGM) systems with a sensor inserted under the skin and a removable on-body transmitter that sends real-time glucose data and alerts to the *Loop* app. +Unlike traditional CGMs that require frequent sensor changes, Eversense reduces insertion frequency but requires weekly fingerstick calibrations. ## *Medtronic* CGM ![img/enlite.png](img/enlite.png){width="150"} @@ -79,13 +89,13 @@ The *Loop* app can download *Dexcom* Share data for use in modeling glucose. How ## Nightscout as a Remote CGM -Version 3 or later of the *Loop* app can use Nightscout as a remote source for CGM data. This requires cell or WiFi connection. +The *Loop* app allows you to use Nightscout as a remote source for CGM data. This requires cell or WiFi connection. ## CGMs Not Supported in the *Loop* App -Currently, there are no solutions for *Eversense*, *Guardian* or *Libre 3* CGM to be used directly with the *Loop* app, but some [Uploaders](https://nightscout.github.io/uploader/uploaders/){: target="_blank" } to Nightscout are available using an Android phone. Version 3 or later of the *Loop* app allows the use of Nightscout as a CGM source. +Currently, there are no solutions for *Guardian* or *Libre 3* CGM to be used directly with the *Loop* app, but some [Uploaders](https://nightscout.github.io/uploader/uploaders/) to Nightscout are available using an Android phone. Version 3 or later of the *Loop* app allows the use of Nightscout as a CGM source. ## Next Step diff --git a/docs/build/community.md b/docs/build/community.md index 1a4694f8a44..7d931f6b458 100644 --- a/docs/build/community.md +++ b/docs/build/community.md @@ -23,15 +23,37 @@ Volunteers provide assistance on building and using the *Loop* app at these site Note, the *LoopDocs* menus were reorganized after this video was prepared to make it easier to progress through the pages. -[![img/looped-group.png](img/looped-group.png)](https://youtu.be/_vSN6C-Uo04){: target="_blank" } +[![img/looped-group.png](img/looped-group.png)](https://youtu.be/_vSN6C-Uo04) ## Screenshots -Please take screenshots of your issue and include them in your posts. On an Apple computer, press ++shift+command+4++ keys at the same time and a little crosshairs tool will appear. Click-and-drag across the area you'd like to include in the screenshot. When you let go of the button, the screenshot will be saved to your desktop with a file name starting with the name `Screen Shot`. To capture an entire window, press ++shift+command+4++ keys at the same time followed by pressing ++space++ (the space bar) and then click on the window of interest. +Please take screenshots of your issue and include them in your posts - unless you want Browser Build help. **For Browser Build, include your URL, not a screenshot.** -**Use screenshots instead of cell phone images whenever possible.** Screenshots are higher resolution and easier to read. +### Help with the app -Take a wide screenshot (full window capture) when asking for help with settings or Xcode build errors. Nightscout and Xcode have lots of valuable information off-to-the-side that can be valuable for troubleshooters. +If you are asking for help using the *Loop* app after you've already built it, take screenshots on your phone and upload to either Facebook or zulipchat along with your question. + +If you are posting *Nightscout* graphics, use the full window from either your phone or your computer in your screenshot. + +> [How to Find Help](../intro/loopdocs-how-to.md#how-to-find-help){: target="_blank" } + +### Help with Browser Build + +If you need help with building the app using a browser, copy the URL for the LoopWorkspace fork and paste it into Facebook or zulipchat along with your question. + +> [How to Find Help](../intro/loopdocs-how-to.md#how-to-find-help){: target="_blank" } + +### Help with Mac Build + +If you are building with a Mac computer and need assistance, **use screenshots** from your Mac computer. Taking a cell phone photo of your Mac screen is generally insufficient. + +Include full window capture when asking for help. The *Nightscout* and *Xcode* apps have lots of valuable information off-to-the-side that can be valuable for troubleshooters. + +> [How to Find Help](../intro/loopdocs-how-to.md#how-to-find-help){: target="_blank" } + +#### How to Obtain a Screenshot on a Mac + +On an Apple computer, press ++shift+command+4++ keys at the same time and a little crosshairs tool will appear. Click-and-drag across the area you'd like to include in the screenshot. When you let go of the button, the screenshot will be saved to your desktop with a file name starting with the name `Screen Shot`. To capture an entire window, press ++shift+command+4++ keys at the same time followed by pressing ++space++ (the space bar) and then click on the window of interest. ## Descriptive Language @@ -56,7 +78,7 @@ The *Loop* app no longer allows you to enter your correction range in the wrong This example is not quite as old, but does refer to details from older *Loop* and *iOS* versions. It exemplifies the details needed to assist someone with a build error. !!! tip "Build with Browser" - If you are using the Build with Browser method, we still need descriptive details but we do not need screenshots. All that is required is to list your *GitHub* user name. The volunteers can then read your publicly available log files. (All private information is automatically redacted in those logs.) + If you are using the Build with Browser method, we still need descriptive details but we do not need screenshots. All that is required is to list your *GitHub* user name. Of course it's really nice if you just paste in your URL - then we don't have to construct the link. The volunteers can then read your publicly available log files. (All private information is automatically redacted in those logs.) **Bad:** "`My Loop app won't build.`" <----- What step are you on? What is the iOS on your phone? What kind of computer are you using? What macOS? What Xcode version? Have you built successfully before or is this new? @@ -72,6 +94,8 @@ Often, the best answer to your question is sending a link to the answer in *Loop If you've searched the docs and read relevant info already, please include that in your post or your reply. That way you don't get linked back to the part you are confused about. And if you have already read the specific section a mentor just linked, be specific about why your problem is not addressed by that link. Or just say "I'm confused when the doc says this". Letting us know when these docs can be improved is very useful. +- - - + ## Next Step Now you are ready to build or continue with setting up the *Loop* app. diff --git a/docs/build/computer.md b/docs/build/computer.md index eeeb8b186e4..da6cd7c9cd7 100644 --- a/docs/build/computer.md +++ b/docs/build/computer.md @@ -13,7 +13,7 @@ If you do not have a Mac, you can build Loop 3 with any computer using a browser. If you want to use that method, review this list and head over to [Build with Browser](../browser/bb-overview.md){: target="_blank" }. - You need a paid ($99/year) [Apple Developer Account](apple-developer.md){: target="_blank" } - - You need an account (free) with [GitHub](https://github.com){: target="_blank" } + - You need an account (free) with [GitHub](https://github.com) - You need a [compatible phone](phone.md) to install the app from *TestFlight* - You need a [compatible Pump](pump.md) and [CGM](cgm.md) if you want to actually use the app (and not just explore the app) @@ -38,26 +38,9 @@ If you have access to a computer with MacOS 14.0 or newer, you can skip ahead to ## 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. +We used to keep track of the minimum Xcode and macOS that enabled users to keep building with their (often older) Mac computer. -* 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. - -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. - -> 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. - -| 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 to
17.0 | 15.0 | 13.5 | +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" }. !!! warning "iOS Dictates Your Computer Needs" @@ -71,53 +54,47 @@ Do not use any of the beta macOS versions. (If you don't know what that means, y To find your macOS version, click on the Apple icon in the computer's upper left corner and select `About this Mac`. The graphic below highlights the macOS version with a red rectangle. Your computer can be a MacBook, iMac, macMini, etc. It will work to build Loop if it has the minimum required macOS version and enough storage. -With the Ventura macOS version, the `About this Mac` display changed. For Ventura, when you tap on the `More Info` icon, it opens the General -> About screen from the System Settings menu. This is very similar to the phone Settings -> General -> About screen. - -Sonoma, macOS 14.0, was released September 2023. +> ![image showing macOS and system details](img/macos-13_and_newer.svg){width="300"} -![image showing macOS and system details](img/macos-12-13.svg){width="750"} +To update your operating system: -If you do not have the required minimum macOS version - -* For macOS 12.6.1 or earlier, check the `Software Update` button on the screen shown above -* For macOS 13.0 or later, click on the Apple and choose `System Settings` +* Click on the Apple and choose `System Settings` or click on the `More Info` button on the screen shown above * Select `General` and `Software Update`, just like you would on the phone interface -Apple says upgrading to macOS Sonoma requires 26 GB of available storage. - ## Check the Space Available -You need to have 50 GB free space in order to install Xcode as directed on the [Xcode Version](xcode-version.md) page. At the top of the menu on the graphic above, click on the Storage Tab highlighted with a red rectangle, or, if running Ventura, tap on More Info to open the About screen (under System Settings->General), which includes storage at the bottom of the display. +You need to have 50 GB free space in order to install Xcode as directed on the [Xcode Version](xcode-version.md) page. Tap on More Info to open the About screen (under System Settings->General), which includes storage at the bottom of the display. To free up space, move things like photos to an external drive. The Xcode application cannot be run from an external drive. If you are evaluating a used computer, it's best to have at least 256 GB total disk space (more is better). -## Which Macs Are Compatible with macOS Sequoia? -Sequoia is not yet required for building the *Loop* app on a phone running iOS 18 or higher with the *Mac* method. The normal *Apple* schedule is that you will be required to have this installed by April of the year after the *iOS* version increments. The only difference between this list and the one for Sonoma is the MacBook Air must be newer for Sequoia. +## Which Macs Are Compatible with macOS Tahoe? -* MacBook Pro introduced in 2018 or later +Tahoe (macOS 26) is not yet required for building the *Loop* app on a phone running iOS 26 with the *Mac* method. The normal *Apple* schedule is that you will be required to have this installed by April of the year after the *iOS* version increments. + +* MacBook Pro introduced in 2020 or later * MacBook Air introduced in 2020 or later -* Mac mini introduced in 2018 or later -* iMac introduced in late 2019 or later +* Mac mini introduced in 2020 or later +* iMac introduced in late 2020 or later * iMac Pro introduced in 2017 or later * Mac Studio introduced in 2022 or later * Mac Pro introduced in 2019 or later -* get the full list from [Apple for Sequoia](https://support.apple.com/en-us/120282){: target="_blank" } +* get the full list from [Apple](https://www.apple.com/os/macos/) -## Which Macs Are Compatible with macOS Sonoma? +## Which Macs Are Compatible with macOS Sequoia? -Sonoma is required for building the *Loop* app on a phone running iOS 17.4 or higher with the *Mac* method. You can install Sonoma on the following: +Sequoia (macOS 15) is required for building the *Loop* app on a phone running iOS 18.6 or higher with the *Mac* method. * MacBook Pro introduced in 2018 or later -* MacBook Air introduced in 2018 or later +* MacBook Air introduced in 2020 or later * Mac mini introduced in 2018 or later * iMac introduced in late 2019 or later * iMac Pro introduced in 2017 or later * Mac Studio introduced in 2022 or later * Mac Pro introduced in 2019 or later -* get the full list from [Apple for Sonoma](https://support.apple.com/en-us/105113){: target="_blank" } +* get the full list from [Apple for Sequoia](https://support.apple.com/en-us/120282) ## Older Macs diff --git a/docs/build/custom-mac.md b/docs/build/custom-mac.md index 0754dc6f99f..36dda54fcdb 100644 --- a/docs/build/custom-mac.md +++ b/docs/build/custom-mac.md @@ -19,10 +19,10 @@ Some customizations are the same for everyone and have been prepared for easy us The *Loop and Learn* team is committed to maintaining these prepared customizations and provides an easy method to add your selection from these customizations to your version of *Loop*. -Please read the documentation for these on the [Loop and Learn: Customization Select Page](https://www.loopandlearn.org/custom-code){: target="_blank" }: +Please read the documentation for these on the [Loop and Learn: Customization Select Page](https://www.loopandlearn.org/custom-code): -* [List of Customizations Available](https://www.loopandlearn.org/custom-code/#custom-list){: target="_blank" } -* [Customization Select Script](https://www.loopandlearn.org/custom-code/#customization-select){: target="_blank" } +* [List of Customizations Available](https://www.loopandlearn.org/custom-code/#custom-list) +* [Customization Select Script](https://www.loopandlearn.org/custom-code-mac-xcode-build/#script) ## Personal Customizations diff --git a/docs/build/edit-mac.md b/docs/build/edit-mac.md index e4efa2e2704..b86c0444ed3 100644 --- a/docs/build/edit-mac.md +++ b/docs/build/edit-mac.md @@ -67,7 +67,7 @@ Each customization will also show Module, Folder and File bullet below the key p ## Open a Terminal in LoopWorkspace Folder -If you use the [Loop and Learn: Customization Select Script](https://www.loopandlearn.org/custom-code){: target="_blank" }, it automatically locates your most recent download, makes the customization you select in that download and then opens Xcode for you. +If you use the [Loop and Learn: Customization Select Script](https://www.loopandlearn.org/custom-code), it automatically locates your most recent download, makes the customization you select in that download and then opens Xcode for you. But sometimes, you need to find your downloaded code and make your own changes in Xcode. This section tells you how to do this. diff --git a/docs/build/img/bss-03-download.svg b/docs/build/img/bss-03-download.svg index e9ed05515cd..e55147f42c7 100644 --- a/docs/build/img/bss-03-download.svg +++ b/docs/build/img/bss-03-download.svg @@ -1,8 +1,8 @@ + id="image435" + x="771.78644" + y="1232.7732" + clip-path="url(#clipPath493)" + transform="translate(92.013611,-692.18018)" /> diff --git a/docs/build/img/eversense.png b/docs/build/img/eversense.png new file mode 100644 index 00000000000..b1adc49a319 Binary files /dev/null and b/docs/build/img/eversense.png differ diff --git a/docs/build/img/macos-12-13.svg b/docs/build/img/macos-12-13.svg deleted file mode 100644 index 38e57e1bfcd..00000000000 --- a/docs/build/img/macos-12-13.svg +++ /dev/null @@ -1,1736 +0,0 @@ - -image/svg+xml diff --git a/docs/build/img/macos-13_and_newer.svg b/docs/build/img/macos-13_and_newer.svg new file mode 100644 index 00000000000..207d1aa0c67 --- /dev/null +++ b/docs/build/img/macos-13_and_newer.svg @@ -0,0 +1,105 @@ + +image/svg+xml diff --git a/docs/build/img/medtrum.jpeg b/docs/build/img/medtrum.jpeg new file mode 100644 index 00000000000..a5ca990a15e Binary files /dev/null and b/docs/build/img/medtrum.jpeg differ diff --git a/docs/build/loop-data.md b/docs/build/loop-data.md index 619f0d7c32a..7aaa2c84507 100644 --- a/docs/build/loop-data.md +++ b/docs/build/loop-data.md @@ -27,7 +27,7 @@ Take some time to familiarize yourself with these data options and choose your p * [*Apple Health* app](../faqs/apple-health-faqs.md#healthkit-plots) * Great resource to view on the Loop phone * Not so great for showing your endo -* [*Tidepool*](https://loopkit.github.io/looptips/data/tidepool/){: target="_blank" } +* [*Tidepool*](https://loopkit.github.io/looptips/data/tidepool/) * Some endo offices will use your *Tidepool* website when you provide them with an invitation * Many users of the mobile app like the note-taking ability * The mobile app also uploads *Apple HealthKit* data to *Tidepool* when the "Read from *Apple Health*" option is selected @@ -37,15 +37,15 @@ Take some time to familiarize yourself with these data options and choose your p * If you use the mobile *Tidepool* app on your phone for uploading only, then it is no longer needed when you upload directly to *Tidepool* as a Service within the *Loop* app * *Nightscout*: * [LoopDocs: *Nightscout*](../nightscout/overview.md){: target="_blank" } section of LoopDocs, has Loop-centric information about *Nightscout* - * [LoopTips: *Nightscout*](https://loopkit.github.io/looptips/data/nightscout/){: target="_blank" } link to LoopTips page on *Nightscout* - * [*Nightscout*: Documentation](https://nightscout.github.io/){: target="_blank" } official *Nightscout* site with lots of information about building and using *Nightscout* + * [LoopTips: *Nightscout*](https://loopkit.github.io/looptips/data/nightscout/) link to LoopTips page on *Nightscout* + * [*Nightscout*: Documentation](https://nightscout.github.io/) official *Nightscout* site with lots of information about building and using *Nightscout* * *Nightscout* has a lot of useful alarms and alerts, provides a care portal and detailed reports * For those who assist someone who is Looping, *Nightscout* enables the caregiver to provide remote commands to the Looper's phone * `Loop 2` allows overrides to be enabled or disabled remotely * `Loop 3` allows remote commands for carbs, bolus, or overrides * The [*LoopCaregiver*](../nightscout/loop-caregiver.md) app is under development but already has sufficient capabilities to be useful for caregivers to monitor and provide remote commands to their Looper's phone -*Nightscout* options include free or nominal cost sites you build yourself or there are several *Nightscout* as a Service vendors who provide turn-key sites for a monthly fee. Links to the options are found in the [*Nightscout*: Documentation](https://nightscout.github.io/){: target="_blank" }. +*Nightscout* options include free or nominal cost sites you build yourself or there are several *Nightscout* as a Service vendors who provide turn-key sites for a monthly fee. Links to the options are found in the [*Nightscout*: Documentation](https://nightscout.github.io/). *Nightscout* provides a secure, real-time Dashboard with status of the *Loop* app visible to anyone with access codes and the internet. It is required for remote commanding. diff --git a/docs/build/phone.md b/docs/build/phone.md index 4021a33a8a3..de0e4557c3c 100644 --- a/docs/build/phone.md +++ b/docs/build/phone.md @@ -4,7 +4,7 @@ - 5 minutes, to check your device and *iOS* - 20 minutes, if need to update your compatible device to a new *iOS* - 10 minutes, if you need to order a [Compatible Device](#compatible-device) - - 0 minutes, if you own an Android and will not use *Apple* products; check out [AndroidAPS Documention](https://androidaps.readthedocs.io/en/latest/){: target="_blank" } + - 0 minutes, if you own an Android and will not use *Apple* products; check out [AndroidAPS Documention](https://androidaps.readthedocs.io/en/latest/) !!! abstract "Summary" - Check your iPhone against the [Compatible Device](#compatible-device) list @@ -13,7 +13,7 @@ - Turn off automatic updates !!! question "FAQs" - - **"Can I use an android?"** No. Check out [AndroidAPS Documention](https://androidaps.readthedocs.io/en/latest/){: target="_blank" }. + - **"Can I use an android?"** No. Check out [AndroidAPS Documention](https://androidaps.readthedocs.io/en/latest/). - **"Can I use an iPad?"** No. Older iPads do not support *Apple Health* which is required for the *Loop* app. It may be possible with newer iPads and newer *iOS*, but this has not been tested. - **"Does my iPhone need a cell plan?"** No. The *Loop* app works using communication on your phone with your CGM and your pump; no internet connection required. However, if access to *Dexcom Follow* or Nightscout 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 ![img/dash.png](img/dash.png){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. - ![Dana-i](img/dana-i.png){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. - ![DanaRS-v3](img/danars.png){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. + +![Medtrum Nano 200U](img/medtrum.jpeg){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). ![Preparing app record page](img/tf06.png){width="700"} {align="center"} @@ -96,22 +100,56 @@ Wait until uploading is finished. Don't be alarmed if you see the following scre ![Error page](img/tf10.png){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 ![App Store TestFlight page](img/tf11.png){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. ![Screenshot: Account - Apple Developer](img/license.png) @@ -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 to
17.0 | 15.0 | 13.5 | +* Before the release of iOS 26, the version of iOS was 18.x and could be built with Xcode 16.4 and macOS 15.3 +* To build to an iOS 26 phone, you can continue to use Xcode 16.4 + * Xcode 26.1.1, which requires macOS 15.6.1 or higher also works +* As an alternative, use [Build with Browser](../browser/bb-overview.md){: target="_blank" }. ### Wikipedia Chart for Apple Versions -This graphic (copied from Wikipedia and last updated March 2023) is not updated with every iOS update - use it as a map to read the minimum requirements. Every attempt will be made to update the words in the [Minimum Version List](#how-do-all-the-minimum-versions-relate-to-each-other) promptly - that's much easier than updating a graphic. +This graphic (copied from Wikipedia and last updated March 2023) is provided as a map to read the minimum requirements. -Follow this link to [Wikipedia](https://en.wikipedia.org/wiki/Xcode){: target="_blank" } and scroll down to the current version of this figure - the graphic shown below is a map of how to read the current version of this figure at Wikipedia. +Follow this link to [Wikipedia](https://en.wikipedia.org/wiki/Xcode) and scroll down to the current version of this figure - the graphic shown below is a map of how to read the current version of this figure at Wikipedia. ![Screenshot: Wikipedia Xcode example; Clip from Wiki with Xcode versions 13.x - 14.x showing relationship for iOS, Xcode, macOS; highlights how to read current graphic](img/xcode_vs_13-14.svg){width="750"} {align="center"} diff --git a/docs/faqs/algorithm-faqs.md b/docs/faqs/algorithm-faqs.md index 50e88ef3905..a32e41d8a70 100644 --- a/docs/faqs/algorithm-faqs.md +++ b/docs/faqs/algorithm-faqs.md @@ -17,7 +17,7 @@ No in that: * Loop does not adjust or "learn" the [Therapy Settings](../loop-3/therapy-settings.md) portion of Loop parameters directly * It keeps those fixed and user controlled, separate from the dynamic part of the Loop algorithm, which does learn based on short-term patterns * If outside factors (such as hormones, illness, exercise, medications, etc) affect your underlying Therapy Settings you may need to manually adjust those settings. -* This LoopTips 3-page section on [Settings](https://loopkit.github.io/looptips/settings/overview/){: target="_blank" } is recommended. +* This LoopTips 3-page section on [Settings](https://loopkit.github.io/looptips/settings/overview/) is recommended. Perhaps in subsequent versions of Loop, auto-adjustment of settings or machine learning could be incorporated. Until then, you will need to tell Loop if your underlying settings change or make temporary adjustments for short term issues. @@ -28,7 +28,7 @@ The use of [Overrides](../operation/features/overrides.md) can be quite helpful When Loop withholds or suspends some of your scheduled basal insulin, that starts an accumulation of insulin deficit. If you have a kinked cannula and insulin is not delivered, you'd call yourself "lacking insulin" (negative IOB). -When Loop reports negative IOB, it is a sign that Loop has been actively helping you prevent a low blood sugar. If you find significant negative IOB regularly, you probably need to [adjust/test your settings](https://loopkit.github.io/looptips/settings/settings/){: target="_blank" }. Glucose that continues to decrease (away from a meal) when IOB goes negative is typically a sign that the scheduled basal rate is too high. +When Loop reports negative IOB, it is a sign that Loop has been actively helping you prevent a low blood sugar. If you find significant negative IOB regularly, you probably need to [adjust/test your settings](https://loopkit.github.io/looptips/settings/settings/). Glucose that continues to decrease (away from a meal) when IOB goes negative is typically a sign that the scheduled basal rate is too high. !!! abstract "Developer Notes" Scheduled basal rates are meant to counteract your endogenous glucose production. Another way of saying this is that Loop expects your body to be producing an amount of glucose at a rate that is handled by your basal insulin settings. diff --git a/docs/faqs/app-translation.md b/docs/faqs/app-translation.md new file mode 100644 index 00000000000..a46dad06d1d --- /dev/null +++ b/docs/faqs/app-translation.md @@ -0,0 +1,216 @@ +## Overview + +* If you want to view translated pages of `LoopDocs`, please click on [Translation](../translate.md). + +* If you want to view your app on your phone in a different language, instructions are found at [Translated App on the Phone](#translated-app-on-the-phone). + +* If you want to help provide translations for everyone to use on their phone with their app (*Loop*, *Trio*, or *iAPS*), please click on [Code Translation](#code-translation). + +## Translated App on the Phone + +You can select the language you want displayed for any given app in your phone settings. + +If you have only one language on your phone, you will not see choices under the app settings. Click on the link below (for Apple instructions) to add language options to your phone. + +* [Add more than one language to your phone](https://support.apple.com/en-us/109358) + +Once your phone is configured to have more than one language, then the steps below should work. + +* Tap on phone Settings +* Scroll down and tap on Apps +* Choose your app, e.g., `Loop` +* Scroll down to Preferred Language +* Choose the language you prefer + +![choose a lanuage for Loop](img/choose-language-for-app.png){width="600"} +{align="center"} + +If a given phrase in the app does not have a translation string in what is called the String Catalog, then the app displays English. If you see an English phrase and you want to help yourself, and others, you can become a translator. + +For the *Loop* app and the submodules (Pumps, CGM and Services) associated with the *Loop* app, the [*lokalise*](https://app.lokalise.com/projects) website is used. You must be signed up with the *Loop* project to be able to see *Loop* translations at that site. + +!!! note "Want to Translate?" + To volunteer to translate, join [Loop zulipchat](https://loop.zulipchat.com/) and send a direct message to Marion Barker with your email address and the language(s) you can translate. + +- - - + +## Code Translation + +Localization (strings translated to the selected language in the app) makes use of volunteers who input translations in a special web app. Their work is then dowloaded and imported into the code used by the *Loop* app and its submodules (repositories on *GitHub*). + +If you notice *Loop* app messages in English even though you selected a specific language, and you can help translate it, please volunteer. + +### Loop *lokalise* project + +Translations for the repositories used by Loop are performed by volunteers at [*lokalise*](https://app.lokalise.com/projects). + +Some newer CGM and Pump modules, currently found in feature branches, were initially configured to get their translations from *crowdin* instead of *lokalise*. + +* There was an early attempt to use both *lokalise* and *crowdin* but merging input from two sources was deemed impractical + * Briefly, DanaKit, MedtrumKit and EversenseKit translations were handled by their separate *crowdin* projects +* In the interest of efficiency and offloading responsibility from developers so they can develop, these have been returned to *lokalise* + +### Volunteer to Translate + +To volunteer, join [Loop zulipchat](https://loop.zulipchat.com/) and send a direct message to Marion Barker with your email address and the language(s) you can translate. You will get an invitation to join the Loop *lokalise* project. You do not need to start a new *lokalise* project. Do not start a free *lokalise* trial or sign up for anything special; just join the project you are invited to. + +> If you are using the *Trio* or *iAPS* app instead of the *Loop* app, you can still assist with Pump, CGM and Tidepool module localization through *Loop* *lokalise*. Some repositories from *Loop* are used by [*Trio* and *iAPS*](#what-about-other-ios-apps). + +- - - + +## Lokalise Information + +### Initial Screen on *lokalise* + +When you log in to *lokalise*, you will see a screen similar to the screenshot below. Tap on the *Loop* icon, highlighted in the graphic with a red rectangle, to start translating. + +![initial screen on opening lokalise](img/lokalise-initial-screen.png){width="600"} +{align="center"} + +After tapping on the *Loop* icon, you see the general translation tasks. (Your screen may look different.) + +On the left are `keys` with the English language showing. On the right is the translation for that `key` in the language you selected. Each `key` has one or more words. The statistics list the total number of keys and the total number of words. + +![initial translation screen on lokalise](img/lokalise-initial-edit-screen.png){width="600"} +{align="center"} + +### How to Find Strings to Translate + +You can search for: + +* strings that are [not translated](#not-translated), which show up as Empty +* strings in a particular [submodule](#select-a-submodule) (for example - the Pump or CGM that you use) +* strings where the [English version was copied](#matches-source) to the translated field +* strings where you disagree with the translation + * some strings may have been automatically translated + * some translations may have a typographical error + +### Not Translated + +Strings that have not been translated can be selected by tapping on Filter and choosing Untranslated. An example graphic is shown before choosing untranslated keys. First tap on Filter than tap on Untranslated. + +![initial translation screen on lokalise](img/lokalise-filter-untranslated.png){width="900"} +{align="center"} + +### Enter a Translation + +After tapping on an item that is empty or you want to modify, type your translation into the box on the right, where you see the words "enter translation here" in the graphic below. + +![initial translation screen on lokalise](img/lokalise-selected-phrase.png){width="900"} +{align="center"} + +Notice the filename where that key is stored is indicated when you examine the details of a key. In the graphic above, the file `Loop/Loop/Localizable.xcstrings` is indicated. + +The area under the key has a comment. This is something added in the code to explain the use of the key. + +If a `key` does not have a translation in a given language, then when running the app, the English version is automatically provided. Do **not** tap on `Insert source`. + +> The only reason to use `Insert source` would be if that `key` should always be identical to the English version and you want to avoid having that `key` show up when looking for untranslated keys. + +### Select a Submodule + +Suppose you know that you want to modify translations for a particular submodule (CGM, Pump or Service module). You can choose context in *lokalise*. See [Submodule Table for Multiple Apps](#submodule-table-for-multiple-apps) for a detailed listing. + +* Tap on Filter +* Tap on Context +* Choose the submodule file + * some submodules have multiple string catalogs (*.xcstrings) + * some items are old enough to have a few of the older string format (*.strings) +* You can ignore any file that includes "Info.plist" + * those strings do not need to be translated and the keys should be configured to be hidden from translators + +The screenshot below is configured for someone translating simplified Chinese for the DanaKit pump. + +![choose a submodule for translation](img/lokalise-by-context-submodule-xcstrings.png){width="1024"} +{align="center"} + +### Matches Source + +Some of the String Catalogs have had the English version inserted in the translation field. This was done inadvertently. To find these instances in the language you are translating, set up a custom filter. + +First click on Filter, then Customize (see red highlights in graphic below) + +![select a custom filter on lokalise](img/lokalise-filter-custom.png){width="900"} +{align="center"} + +The next screen allows you to choose `Translation` in one drop-down and then `matches source` in the adjacent drop-down. + +![configure a custom filter for same as source on lokalise](img/lokalise-filter-for-matches-source.png){width="900"} +{align="center"} + +You can hit Apply or Save and Apply and give it a name so you can select the Name next time. + +The screenshot below is after creating and naming a custom filter called `Translation Matches Source`. + +![example using custom filter matches source on lokalise](img/lokalise-matches-source.png){width="900"} +{align="center"} + + +### Find a String + +If you observe a string you want to modify, you can type it in directly. The text you type in the search box can be all or part of a string, and in English or the language you are translating. + +![example using custom filter matches source on lokalise](img/lokalise-key-search.png){width="900"} +{align="center"} + +- - - + +## What About Other iOS Apps + +The *Trio* and the *iAPS* apps use submodules for CGM, Pump and Service features originally developed for the *Loop* app. New CGM and Pump modules are coming soon or already available. These are being configured for use with all these iOS apps. + +* The shared code originally developed for the *Loop* app resides in the *GitHub* *LoopKit* organization and is under the control of the *LoopKit* owners +* The *Trio* app has always used forks for these repositories so get their localizations for the CGM, Pump and Service modules from *lokalise* +* The *iAPS* app initially used copies of the code - not connected to the *LoopKit* repositories - and configured their own crowdin site for *iAPS* localization + * However, as improvements to the submodules evolved at *LoopKit*, the updates needed to be hand-edited and added to the *iAPS* copies + * In late 2025, *iAPS* started the transition to using forks from *LoopKit* instead of copies + * Some of the *iAPS* translations for CGM, Pump and Service submodules were imported into *lokalise* at this time + +The bottom line is + +* Loop and all its submodule translations are handled at [*lokalise*](https://app.lokalise.com/) + * This includes cgm managers, pump managers and service managers used by several OS-AID systems +* *Trio* translations are handled at [crowdin for *Trio*](https://crowdin.com/project/trio/invite/public?h=48e1a77abd1611860f475c1ce17540112591650&show_welcome) +* *iAPS* translations are handled at [crowdin for *iAPS*](https://crowdin.com/project/iaps) + +You can use the *Trio* or *iAPS* discord server to volunteer to translate using *lokalise* by sending a direct message to Marion Barker if you are not a member of zulipchat. + + +### Submodule Table for Multiple Apps + +These submodules are used by the *Loop*, *Trio* and *iAPS* apps and are handled by *lokalise*. + +| Type |
Name | Files | +|:-:|:--|:--| +| CGM | `CGMBLEKit` | CGMBLEKit/CGMBLEKit/Localizable.xcstrings
CGMBLEKit/CGMBLEKitUI/Localizable.xcstrings | +| CGM | `EversenseKit` | EversenseKit/EversenseKitUI/Localizable.xcstrings | +| CGM | `G7SensorKit` | G7SensorKit/G7SensorKit/Localizable.xcstrings
G7SensorKit/G7SensorKitUI/Localizable.xcstrings | +| CGM | `LibreTransmitter` | LibreTransmitter/LibreTransmitter/Localizable.xcstrings
LibreTransmitter/LibreTransmitterUI/Localizable.xcstrings | +| CGM | `Dexcom Share` | dexcom-share-client-swift/ShareClient/Localizable.xcstrings
dexcom-share-client-swift/ShareClientUI/Localizable.xcstrings | +| CGM | `NightscoutRemoteCGM` | NightscoutRemoteCGM/NightscoutRemoteCGM/Localizable.xcstrings | +| Pump | `DanaKit` | DanaKit/Localizable.xcstrings | +| Pump | `MedtrumKit` | MedtrumKit/Localizable.xcstrings | +| Pump | `OmniBLE` | OmniBLE/Localizable.xcstrings
OmniBLE/OmniBLE/Localizable.xcstrings | +| Pump | `RileyLinkKit` | RileyLinkKit/RileyLink/Localizable.xcstrings
RileyLinkKit/RileyLink/LoopKit.xcstrings
RileyLinkKit/RileyLinkBLEKit/Localizable.xcstrings
RileyLinkKit/RileyLinkKitUI/Localizable.xcstrings | +| Pump | `MinimedKit` | MinimedKit/MinimedKit/Resources/Localizable.xcstrings
MinimedKit/MinimedKitUI/Resources/Localizable.xcstrings
MinimedKit/MinimedKitUI/Resources/mul.lproj/MinimedPumpManager.xcstrings| +| Pump | `OmniKit` | OmniKit/Localizable.xcstrings
OmniKit/OmniKit/Resources/Localizable.xcstrings
OmniKit/OmniKitUI/Resources/Localizable.xcstrings | +| Misc | `LoopKit` | LoopKit/LoopKit/Resources/Localizable.xcstrings
LoopKit/LoopKitUI/Resources/Localizable.xcstrings
LoopKit/LoopKitUI/Resources/mul.lproj/InsulinKit.xcstrings
LoopKit/LoopKitUI/Resources/mul.lproj/LegacyInsulinDeliveryTableViewController.xcstrings
LoopKit/MockKit/Resources/Localizable.xcstrings
LoopKit/MockKitUI/Resources/Localizable.xcstrings | +| Service | `TidepoolService` | TidepoolService/TidepoolServiceKit/Localizable.xcstrings
TidepoolService/TidepoolServiceKitUI/Localizable.xcstrings | + +The modules are specific to the particular app: + +| Type |
Name | Files | +|:-:|:--|:--| +| Loop | `Loop` | use [Loop *lokalise*](https://app.lokalise.com/projects) | +| Trio | `Trio` | use [Trio *crowdin*](https://crowdin.com/project/trio) | +| iAPS | `iAPS` | use [iAPS *crowdsin*](https://crowdin.com/project/iaps) | + + +- - - + +## Adding Languages + +We can add languages if a translator commits to take on that task. + +At lokalise, the language must be added first before translators have access to that language. Send a DM to Marion Barker with your request for a new language. + diff --git a/docs/faqs/apple-health-faqs.md b/docs/faqs/apple-health-faqs.md index b04d7b0a117..15a3f17b021 100644 --- a/docs/faqs/apple-health-faqs.md +++ b/docs/faqs/apple-health-faqs.md @@ -51,9 +51,12 @@ All other CGM readings are reported with the *Loop* icon and there is no transit ### Carbohydrates and *Apple* HealthKit -In `Loop* 2.2.x`, if you set *Apple* Health app permissions to allow it, *Loop* will read carbohydrates from the Health app. If you give a third-party app permission to store carbohydrate data in Health, and do not realize that *Loop* reads that information, you might get unexpected insulin delivery based off those carbs. To avoid that unanticipated behavior, the directions tell you to set permissions to allow *Loop* to write to carbohydrate storage but not read. +In `Loop 2.2.x`, if you set *Apple* Health app permissions to allow it, *Loop* will read carbohydrates from the Health app. If you give a third-party app permission to store carbohydrate data in Health, and do not realize that *Loop* reads that information, you might get unexpected insulin delivery based off those carbs. To avoid that unanticipated behavior, the directions tell you to set permissions to allow *Loop* to write to carbohydrate storage but not read. -In `Loop 3`, the option to read from Health carbohydrates is explicitly disabled and can only be enabled by setting up special parameters when you build the app. The insructions for the code customization are not in LoopDocs yet. If it is important to you to use a third-party app to record carbohydrates and have *Loop* read the information and automatically dose with insulin, [ask for help in zulipchat](../intro/loopdocs-how-to.md#how-to-find-help). +In `Loop 3`, the option to read from Health carbohydrates is explicitly disabled and can only be enabled by setting up a `Build Time Flag` when you build the app. + +* The `Build Time Flag`, `OBSERVE_HEALTH_KIT_CARB_SAMPLES_FROM_OTHER_APPS_ENABLED`, is used to enable ability for the *Loop* app to read from the *Health* app +* The instructions for this code customization are found in [Modify the `Build Time Flags`](../version/build-time-flag.md#modify-the-build-time-flags){: target="_blank" }. ### Insulin and *Apple* HealthKit @@ -129,13 +132,13 @@ A simple example to illustrate this - for a pump with smallest insulin delivery ### *Tidepool* and *Apple* HealthKit !!! important "Choose One Method for Upload" - Previously, the only method to get *Loop* data into [*Tidepool*](https://tidepool.org){: target="_blank" } was to use their mobile app on your phone and enable that app to read from *Apple Health* to upload data to *Tidepool*. + Previously, the only method to get *Loop* data into [*Tidepool*](https://tidepool.org) was to use their mobile app on your phone and enable that app to read from *Apple Health* to upload data to *Tidepool*. You can now upload directly from *Loop* to *Tidepool* - this is the preferred method. With the direct upload, be sure to disable your *Tidepool* mobile app from reading Apple Health on your phone. If you do not do this, you will have double uploads of all your data. You can still make notes on the mobile app; it will get your data via the internet from *Tidepool*. - If you are currently using the *Tidepool* mobile app to upload and switch to direct upload, you will get one week of double uploads. You can filter the upload source for that week on the [*Tidepool* web browser tool](https://loopkit.github.io/looptips/data/tidepool){: target="_blank" }. + If you are currently using the *Tidepool* mobile app to upload and switch to direct upload, you will get one week of double uploads. You can filter the upload source for that week on the [*Tidepool* web browser tool](https://loopkit.github.io/looptips/data/tidepool). ## How Do I Modify *Apple* HealthKit Permissions diff --git a/docs/faqs/cgm-faqs.md b/docs/faqs/cgm-faqs.md index 67c614cf598..1e90f18d88c 100644 --- a/docs/faqs/cgm-faqs.md +++ b/docs/faqs/cgm-faqs.md @@ -4,8 +4,9 @@ The following CGM are supported by some or all versions of Loop: * All *Dexcom* CGM (Loop 3 and later) * Some *Libre* CGM (Loop 3.4 and later) +* Eversense E3 and 365 (Loop 3.11 and later, via an experimental feature branch) * Medtronic Enlite CGM when used with a compatible pump -* Remote CGM (requires internet access +* Remote CGM (requires internet access) * *Dexcom* Share * Nightscout as CGM (Loop 3 and later) @@ -101,7 +102,7 @@ sequenceDiagram ### Troubleshoot Connections -The "normal" *Libre* 2 sensors have a firmware configuration that makes them slow to reconnect when they loose the connection to iOS (both iOS and the sensors are to blame for this). What usually helps is to make sure your app is open and in the foreground and that your phone is unlocked. iOS seems to be better at reconnecting Bluetooth devices under such conditions (i.e. it gives more Bluetooth priority to the foreground app). If you need to modify how quickly your phone locks, this is found under iOS settings, Display & Brightness, Auto-Lock. +The "normal" *Libre* 2 sensors have a firmware configuration that makes them slow to reconnect when they lose the connection to iOS (both iOS and the sensors are to blame for this). What usually helps is to make sure your app is open and in the foreground and that your phone is unlocked. iOS seems to be better at reconnecting Bluetooth devices under such conditions (i.e. it gives more Bluetooth priority to the foreground app). If you need to modify how quickly your phone locks, this is found under iOS settings, Display & Brightness, Auto-Lock. If you try to pair a sensor in the app multiple times in a short period (let's say within a couple of minutes), you may need to just stop and wait. @@ -109,30 +110,31 @@ If you try to pair a sensor in the app multiple times in a short period (let's s * Multiple pairing attempts may make the sensor temporarily unable to function * If this matches your use case, shut off your phone and let it stay shut down for up to five minutes -Optionally: you can use miaomiao or bubble third party transmitters attached on top of your normal *Libre* 2 sensors . Although the setup is a bit more bulky, it works and does not have connection problems. LibreTransmitter supports bubble and miaomiao on top of *Libre* 1 sensors, but it also works with *Libre* 2 sensors. +Optionally: you can use miaomiao or bubble third-party transmitters attached on top of your normal *Libre* 2 sensors. Although the setup is a bit more bulky, it works and does not have connection problems. LibreTransmitter supports bubble and miaomiao on top of *Libre* 1 sensors, but it also works with *Libre* 2 sensors. ### Can I use *Libre* sensors with a reader like Miao Miao? -Loop 3.4.x and later enables the use of those *Libre* sensors supported by [LibreTransmitter](https://github.com/dabear/LibreTransmitter#libretransmitter-for-loop){: target="_blank" }. +Loop 3.4.x and later enables the use of those *Libre* sensors supported by [LibreTransmitter](https://github.com/LoopKit/LibreTransmitter#libretransmitter-for-loop){: target="_blank" }. ### What about other *Libre* sensors? -There are a number of *Libre* sensors in which the only option for digital access to the CGM readings is to use the app provided by the vendor: [*LibreLinkUp*](https://librelinkup.com/){: target="_blank" }. This enables you to upload your data to the *LibreLinkUp* servers and then access the data from there. +There are a number of *Libre* sensors in which the only option for digital access to the CGM readings is to use the app provided by the vendor: [*LibreLinkUp*](https://librelinkup.com/). This enables you to upload your data to the *LibreLinkUp* servers and then access the data from there. **The use of *LibreLinkUp* requires internet access via WiFi or Cell service.** -If this is your only option for CGM, evaluate whether you want to add xDrip4iOS as a CGM option. Instructions for this customization are found at [Loop and Learn: Add CGM to Loop](https://www.loopandlearn.org/custom-code/#add-cgm){: target="_blank" }. The reason to recommend this option is that xDrip4iOS can sense when the *Libre* transmits glucose readings to your phone, although it cannot read the glucose value. Shortly thereafter, it will request the CGM reading from *LibreLinkUp*. +If this is your only option for CGM, evaluate whether you want to add xDrip4iOS as a CGM option. Instructions for this customization are found at [Loop and Learn: Add CGM to Loop](https://www.loopandlearn.org/custom-code-add-cgm-pump/). The reason to recommend this option is that xDrip4iOS can sense when the *Libre* transmits glucose readings to your phone, although it cannot read the glucose value. Shortly thereafter, it will request the CGM reading from *LibreLinkUp*. -If you prefer not to customize Loop, then you can configure [Nightscout](https://nightscout.github.io/uploader/uploaders/#abbott-freestyle-*Libre*){: target="_blank" } to access data from *LibreLinkUp* and then use Nightscout as a CGM. +If you prefer not to customize Loop, then you can configure [Nightscout](https://nightscout.github.io/uploader/uploaders/#abbott-freestyle-*Libre*) to access data from *LibreLinkUp* and then use Nightscout as a CGM. * If you choose this option, your CGM will not act as a heartbeat to wake the app when the phone is locked or in the background * You probably have a pump that serves this role, but if your pump is not actively waking your app and you use *LibreLinkUp*, consider [CGM Customization](#cgm-customization). -## Can I use Eversense? +## Can I use Eversense E3 or Eversense 365? -There is a method to upload Eversense to Nightscout using an Android phone, but there is no method to read an Eversense directly with an iPhone at this time. +Using the experimental branch, feat/eversense using Loop 3.11.0 or newer, you can make a native connection to your Eversense E3 or 365. + +* See [Loop Development: Branches](../version/development.md#branches){: target="_blank" } for more information on how to build this branch. -You can use Nightscout as a CGM with Eversense, but that requires internet access. ## Can the *Loop* app read CGM data from Nightscout? @@ -142,12 +144,12 @@ Yes. If you can connect your CGM directly to *Loop* that is preferred. You can customize the *Loop* app to interface with the *xDrip4iOS* DIY CGM app if you prefer. You can use *xDrip4iOS* as a follower instead of a client to get some features from *xDrip4iOS* without any need to customize the *Loop* app. -If possible, it is recommended that *Libre* users take advantage of [LibreTransmitter](https://github.com/LoopKit/LibreTransmitter/blob/main/readme.md){: target="_blank" } which is incorporated into the *Loop* app for version 3.4 and later. However, some *Libre* sensors have encryption that limits ability to get data through open-source code and instead requires using the *LibreLinkUp* server. +If possible, it is recommended that *Libre* users take advantage of [LibreTransmitter](https://github.com/LoopKit/LibreTransmitter/blob/main/readme.md) which is incorporated into the *Loop* app for version 3.4 and later. However, some *Libre* sensors have encryption that limits ability to get data through open-source code and instead requires using the *LibreLinkUp* server. -You can add *xDrip4iOS* as a CGM option to the *Loop* app by applying a [code customization](https://www.loopandlearn.org/custom-code){: target="_blank" }. This uses the shared AppGroup feature to transfer data from the CGM app to Loop. This is not the preferred approach if you have another choice. For *Libre* users with a sensor that is not handled by LibreTransmitter, this is your only option for closed-loop. +You can add *xDrip4iOS* as a CGM option to the *Loop* app by applying a [code customization](https://www.loopandlearn.org/custom-code-add-cgm-pump/). This uses the shared AppGroup feature to transfer data from the CGM app to Loop. This is not the preferred approach if you have another choice. For *Libre* users with a sensor that is not handled by LibreTransmitter, this is your only option for closed-loop. -* xDrip4iOS can sense when the *Libre* are providing updates over Bluetooth but cannot interpret the readings because of the encryption for some sensor models +* xDrip4iOS can sense when the *Libre* is providing updates over Bluetooth but cannot interpret the readings because of the encryption for some sensor models * xDrip4iOS waits a few seconds after the new reading and then queries *LibreLinkUp* using your login credentials * Be aware this makes your ability for closed-loop dependent on having internet access -Please read the docs for [xDrip4iOS](https://xdrip4ios.readthedocs.io/en/latest/){: target="_blank" }. You must build these apps yourself so they have the same developer ID as your *Loop* app; you cannot use the TestFlight pre-built versions. And you must configure the app as explained in those docs. +Please read the docs for [xDrip4iOS](https://xdrip4ios.readthedocs.io/en/latest/). You must build these apps yourself so they have the same developer ID as your *Loop* app; you cannot use the TestFlight pre-built versions. And you must configure the app as explained in those docs. diff --git a/docs/faqs/img/choose-language-for-app.png b/docs/faqs/img/choose-language-for-app.png new file mode 100644 index 00000000000..aad5f061f49 Binary files /dev/null and b/docs/faqs/img/choose-language-for-app.png differ diff --git a/docs/faqs/img/lokalise-by-context-submodule-xcstrings.png b/docs/faqs/img/lokalise-by-context-submodule-xcstrings.png new file mode 100644 index 00000000000..678bc7694ac Binary files /dev/null and b/docs/faqs/img/lokalise-by-context-submodule-xcstrings.png differ diff --git a/docs/faqs/img/lokalise-filter-custom.png b/docs/faqs/img/lokalise-filter-custom.png new file mode 100644 index 00000000000..630343224b4 Binary files /dev/null and b/docs/faqs/img/lokalise-filter-custom.png differ diff --git a/docs/faqs/img/lokalise-filter-for-matches-source.png b/docs/faqs/img/lokalise-filter-for-matches-source.png new file mode 100644 index 00000000000..31a837f163b Binary files /dev/null and b/docs/faqs/img/lokalise-filter-for-matches-source.png differ diff --git a/docs/faqs/img/lokalise-filter-untranslated.png b/docs/faqs/img/lokalise-filter-untranslated.png new file mode 100644 index 00000000000..1c48d519b1f Binary files /dev/null and b/docs/faqs/img/lokalise-filter-untranslated.png differ diff --git a/docs/faqs/img/lokalise-initial-edit-screen.png b/docs/faqs/img/lokalise-initial-edit-screen.png new file mode 100644 index 00000000000..23b72c87dc7 Binary files /dev/null and b/docs/faqs/img/lokalise-initial-edit-screen.png differ diff --git a/docs/faqs/img/lokalise-initial-screen.png b/docs/faqs/img/lokalise-initial-screen.png new file mode 100644 index 00000000000..d8106cf0359 Binary files /dev/null and b/docs/faqs/img/lokalise-initial-screen.png differ diff --git a/docs/faqs/img/lokalise-key-search.png b/docs/faqs/img/lokalise-key-search.png new file mode 100644 index 00000000000..7f05e2673a8 Binary files /dev/null and b/docs/faqs/img/lokalise-key-search.png differ diff --git a/docs/faqs/img/lokalise-matches-source.png b/docs/faqs/img/lokalise-matches-source.png new file mode 100644 index 00000000000..a283ef5db1e Binary files /dev/null and b/docs/faqs/img/lokalise-matches-source.png differ diff --git a/docs/faqs/img/lokalise-selected-phrase.png b/docs/faqs/img/lokalise-selected-phrase.png new file mode 100644 index 00000000000..2f746d61cb0 Binary files /dev/null and b/docs/faqs/img/lokalise-selected-phrase.png differ diff --git a/docs/faqs/img/saw-atlas-identifiers.svg b/docs/faqs/img/saw-atlas-identifiers.svg new file mode 100644 index 00000000000..70e668b131b --- /dev/null +++ b/docs/faqs/img/saw-atlas-identifiers.svg @@ -0,0 +1,156129 @@ + +image/svg+xmlSAW, "TWI Board"Atlas, "InPlay BLE" diff --git a/docs/faqs/img/time-cannot-be-modified.png b/docs/faqs/img/time-cannot-be-modified.png new file mode 100644 index 00000000000..841df642c72 Binary files /dev/null and b/docs/faqs/img/time-cannot-be-modified.png differ diff --git a/docs/faqs/loop-faqs.md b/docs/faqs/loop-faqs.md index c9ddecffdff..929731a33b9 100644 --- a/docs/faqs/loop-faqs.md +++ b/docs/faqs/loop-faqs.md @@ -2,6 +2,8 @@ Please click on the [Requirements](../intro/requirements.md#common-requirements){: target="_blank" } link. +- - - + ## Can I download the *Loop* app from the App store? No. The *Loop* app is not available for download. You must build your own *Loop* app. The *Loop* app app will not be available in the *Apple* App store because that would be distribution of a medical device, and we are not in that "business". You can build yourself, but we are not distributors. @@ -10,11 +12,28 @@ Each step needed to successfully build your *Loop* app is found in these docs. T If you have any questions, use the [Search](../intro/loopdocs-how-to.md#website-search) feature to find topics in LoopDocs. +- - - + +## What about *Tidepool Loop*? + +*Tidepool Loop* was approved by the FDA in Jan 2023. In 2025, the [Sequel twiist pump](https://www.twiist.com/) became available with *Tidepool Loop*. Check their site to see if it available in your area. + +*Tidepool Loop*, cleared by the FDA, is the first: + +* App that provides automated insulin dosing **and** is configured to be fully interoperable with pump and CGM partners +* App that originated as a patient-led initiative + +With this approval, there is now an FDA-approved pathway for independent selection of an app, a pump, and a CGM. Stay tuned for updates at [https://tidepool.org/tidepool-loop](https://tidepool.org/tidepool-loop). + +- - - + ## Can I use an android phone or iPad for Loop? Loop requires an *Apple* device. Older iPads do not support *Apple* Health which is required for Loop. It may be possible with newer iPads and newer iOS, but this has not been tested. -There is open source software that runs on Android phones. Check out [AndroidAPS Documention](https://androidaps.readthedocs.io/en/latest/){: target="_blank" }. +There is open source software that runs on Android phones. Check out [AndroidAPS Documention](https://androidaps.readthedocs.io/en/latest/). + +- - - ## Do I have to be "tech-smart" to build Loop? @@ -22,9 +41,13 @@ No. You do not need any experience in code or computers to build Loop. If you al Often times the non-tech people do better than the tech people in building Loop. Why? Because the non-tech people take the time to read slowly and look at the screenshots in the directions. The tech people often skim and miss steps...which then leads to build errors that have to be retraced and fixed. +- - - + ## Is there a cheat sheet for a school nurse to use? -Sure, you can give this one a try. [School nurse's cheat sheet download](https://github.com/Kdisimone/images/raw/master/school_nurse.pdf){: target="_blank" } +Sure, you can give this one a try. [School nurse's cheat sheet download](https://github.com/Kdisimone/images/raw/master/school_nurse.pdf) + +- - - ## How long does it take to build Loop? @@ -38,34 +61,46 @@ Once you choose your method, you can break the required steps into shorter bits * The *Mac* Build method is broken into different pages for steps needed for the *Mac* and the actual build process +- - - + ## Does the *Loop* app cost money? Yes, there are some costs, beyond the obvious costs of owning a pump and CGM. -* If you have a pump that requires a [RileyLink Compatible Device](../build/rileylink.md#rileylink-compatible-devices), expect to spend $150 each (or find a used one). You should have two, one as a spare. * Most people use a paid *Apple* Developer Account ($99/year) * With a paid developer account, you can build using the [Build with Browser](../browser/bb-overview.md); no *Mac* required * If you build on a *Mac* using *Xcode* [Build with *Mac*](../build/overview.md), you need a *Mac* or a PC with Intel chips on which you include a virtual Mac * The *Mac* must be kept up to date with recent operating system * The *Xcode* app (from from Apple) must also be updated regular +* If you have a pump that requires a [RileyLink Compatible Device](../build/rileylink.md#rileylink-compatible-devices), expect to spend $150 each (or find a used one). You should have two, one as a spare. + * The RileyLink is only required for loopable Medtronic pumps and the older Eros Omnipod patch pumps + * No RileyLink is needed for the BLE pumps such as DASH, DanaKit and soon-to-be-implemented Medtrum patch pump There are no other costs, ongoing or initial, to use the *Loop* app beyond what you already pay for your CGM, pump supplies and insulin. +- - - + ## RileyLink Options -**This is not required for DASH users.** +**This is not required for BLE pump users.** + +> The RileyLink is only required for loopable Medtronic pumps and the older Eros Omnipod patch pumps. There are several options for [RileyLink Compatible Devices](../build/rileylink.md#rileylink-compatible-devices) at this time. They typically cost around $150. This is a one-time cost and the devices should last for years (unless it goes swimming, goes through the wash, gets run over by a car, etc.). It's fine to buy one device and make sure you want to Loop, but if you can afford it, go on and get two or get two different kinds. Once you Loop, you'll want a backup. -Many used devices are available in the community. You may find posts for resale on this Facebook Group [Looping in a time of covid](https://www.facebook.com/groups/1087611668259945){: target="_blank" }. This is a private FB group where you must agree to the rules. +Many used devices are available in the community. You may find posts for resale on this Facebook Group [Looping in a time of covid](https://www.facebook.com/groups/1087611668259945). This is a private FB group where you must agree to the rules. !!! warning "" Posts offering to buy or sell items in the support FB groups like The Looped Group, Loop and Learn or Little Loopers will be immediately taken down, or you will be directed to the appropriate location and comments will be turned off. FB can shut down groups without warning if they detect sales and the support groups are too important to risk. +- - - + ## Free Developer Account Options The *Apple* Developer License can be done for free, however, you will have to rebuild your *Loop* app every 7 days and you must use a computer with Xcode, [Build with *Mac*](../build/overview.md). That could get very tedious. The $99 annual *Apple* Developer program enrollment is an excellent investment. +- - - + ## Do I need to own my own *Apple* computer? You no longer need to own an *Apple* computer - see [Build with Browser](../browser/bb-overview.md). @@ -74,15 +109,25 @@ If you chose [Build with *Mac*](../build/overview.md), then you still don't **ha If you are borrowing an *Apple* computer, look at the required minimum settings associated with your iPhone [Compatible Computer](../build/computer.md#check-your-macos-version)) and [Xcode Version](../build/xcode-version.md#how-do-all-the-minimum-versions-relate-to-each-other). It would be really good to have the longer-term ability to borrow that computer again for [updating Loop](../build/updating.md#when-to-update-loop) later when needed. +- - - + ## Can I use a PC or Windows computer to build? You can build the *Loop* app using just a browser on any device: [Build with Browser](../browser/bb-overview.md). -If you want to use [Build with *Mac*](../build/overview.md), there is a hacked way of installing macOS on a Windows computer called a **Virtual Machine**. [This link](https://macosvmware.tech.blog/){: target="_blank" } provides some helpful information. This **Virtual Machine** method will not work on PCs that have AMD processors, only Intel. Double-check that your computer uses an Intel processor before attempting the virtual machine method. If you want to try this, there are mentors on [The Looped Facebook Group](https://www.facebook.com/groups/TheLoopedGroup){: target="_blank" } who can assist. +If you want to use [Build with *Mac*](../build/overview.md), there is a hacked way of installing macOS on a Windows computer called a **Virtual Machine**. [This link](https://macosvmware.tech.blog/) provides some helpful information. This **Virtual Machine** method will not work on PCs that have AMD processors, only Intel. Double-check that your computer uses an Intel processor before attempting the virtual machine method. If you want to try this, there are mentors on [The Looped Facebook Group](https://www.facebook.com/groups/TheLoopedGroup) who can assist. + +- - - ## How often do I need to get on the computer for Loop? -When you use the Browser Build method, you need to access a browser at least once every 90 days to [Update with Browser](../browser/bb-update.md). This is simple enough to do that you can do the steps on your phone in just a few minutes. Several people are already working on automated methods so that won't be required, but a manual Build Actions step is required for now. +When you use the Browser Build method, the initial configuration is best done on the computer. After that, the process should work automatically to build and upload the build to TestFlight once a month, or when a new release is published. + +After that, the tasks you need to do can be completed in a few minutes on your phone. + +* Update the app on your phone from TestFlight (minimum of once every 90 days) +* Make sure the TestFlight builds are being automatically generated +* Sign Developer License agreements when prompted When you use Build with *Mac*: the short answer is (1) when you first build and (2) once per year minimum after that. (If you decide to use a free *Apple* Developer Account, you will need to get on the computer every 7 days.) @@ -95,10 +140,14 @@ Loop updates are **not** available through the iPhone's app store...instead you In general, there are updates to the *Loop* app released a few times a year - these can occur more frequently after a major release. -## Will I need to build a new *Loop* app if I switch between Medtronic and Omnipod? +- - - + +## Will I need to build a new *Loop* app if I switch between different pumps? No. The *Loop* app lets you move between different pump types from within the same *Loop* app. See [Change Pump Type](../loop-3/add-pump.md#change-pump-type){: target="_blank" }. +- - - + ## Can I use my *Apple* Developer account to build for others? If there is more than one Looper in the family, you only need to have one *Apple* Developer ID and only one annual payment. The developer must be an adult. @@ -112,10 +161,14 @@ It's a good idea to let someone else in the family know how to build and have ac The *Apple* Developer ID and the *Apple* ID are two different things. PLEASE read this: [Loopers Need Their Own *Apple* ID](../build/apple-developer.md#loopers-need-their-own-apple-id). +- - - + ## What happens when I switch *Apple* Developer ID? The *Loop* app on the phone is different if the build uses a different *Apple* Developer ID from the one currently on the phone. So if the *Apple* Developer ID used for a new *Loop* build is different from the one used for the existing *Loop* app, there will be two *Loop* apps on the phone. The Looper will have to on-board the new app, enter all the settings again and delete the old app. +- - - + ## Can I use someone else's *Apple* Developer account? It's best that you build your own *Loop* app using your own *Apple* Developer ID. @@ -127,13 +180,19 @@ Your *Loop* app will also die immediately if their developer account is not rene Moral of the story, out of all the ways to save money...borrowing someone's developer account is not a good place to save money. You don't want your *Loop* app to suddenly stop working. +- - - + ## How can I find a compatible pump? supplies? +This [link](../build/pump.md#pumps-compatible-with-the-loop-app){: target="_blank" } lists all the compatible pumps. Please refer to it for updates. There are several additional BLE pumps available to the iOS Open-Source community. You need to consider which ones are available in your country. + You can use Omnipod DASH and Eros pumps with the *Loop* app. You do not need the Omnipod Personal Diabetes Manager (PDM), just the pod supplies. Your insurance or pharmacy coverage may cover some of the cost. See [Which pods work with the *Loop* app?](omnipod-faqs.md#which-pods-work-with-the-loop-app) for more details. There is a [whole page with detailed information about Medtronic pumps](../build/pump.md#check-medtronic-pump-version); how to find them, how to find supplies, and assessing whether your Medtronic pump is compatible. Please check out that page for more info. -Some Looping equipment can be found on this Facebook Group [Looping in a time of covid](https://www.facebook.com/groups/1087611668259945){: target="_blank" }. This is a private FB group where you must agree to the rules. +Some Looping equipment can be found on this Facebook Group [Looping in a time of covid](https://www.facebook.com/groups/1087611668259945). This is a private FB group where you must agree to the rules. + +- - - ## Can I pay someone else to do build the app for me? @@ -150,11 +209,19 @@ There are a few companies that provide the *Loop* app as a service. * Know how to Set up, Operate and Troubleshoot Loop * **These steps are important for your safety** +- - - + ## What if I lose my RileyLink Compatible Device? +**The RileyLink is is not required for BLE pump users.** + +> The RileyLink is only required for loopable Medtronic pumps and the older Eros Omnipod patch pumps. + For Medtronic users, you simply go back to old school pump use until you get a new RileyLink compatible device. You can either let your temp basal finish by itself (30 minutes or less) or cancel the temp basal on the pump's menu. For bolusing, you'd go back to using the pump's bolus commands. When you get a device (either finding your old one or getting your backup device out) and the *Loop* app running again, you'll want to do one thing. Enter in any carbs to the *Loop* app that you may have eaten in the recent past that could still be affecting blood glucose. While the *Loop* app will read whatever insulin deliveries had happened while the RileyLink compatible device was missing, it will not read any carbs you entered into the pump...so make sure to add those to the *Loop* app and backdate them to the time they were eaten. That will help make the transition back to closed loop smoother. -For Pod users, your Pod will finish any currently running temporary basal rate (maximum of 30 minutes) and then revert back to your scheduled basal rate. Without a RileyLink compatible device, you will be receiving normal basals, but will need to pull out pens/syringe for boluses. If you have a backup device, you can simply connect to the new device on the same *Loop* app and it will work with the existing pod session. If you don't have a backup device, you'll have to remove the pod and start a new pod paired with your PDM until you get a new device. +For Eros Pod users, your Pod will finish any currently running temporary basal rate (maximum of 30 minutes) and then revert back to your scheduled basal rate. Without a RileyLink compatible device, you will be receiving normal basals, but will need to pull out pens/syringe for boluses. If you have a backup device, you can simply connect to the new device on the same *Loop* app and it will work with the existing pod session. If you don't have a backup device, you'll have to remove the pod and start a new pod paired with your PDM until you get a new device. + +- - - ## What if I lose or get a new iPhone? @@ -162,34 +229,47 @@ If you lose your phone - follow the same dosing protocol as if you lost your [ri When you get a new iPhone, you can plan ahead. There's a whole FAQs page about transferring your *Loop* information to a new phone. [New Phone](new-phone.md). +- - - + ## What about other pumps? When will they Loop? -Hey now...let's be grateful for what we have first. The ability to use the *Loop* app is the result of tremendous amounts of effort, time, and sacrifice by volunteers. Cracking the pumps for the *Loop* app use is a large undertaking. If and when another set of people spend a large amount of time figuring out other pumps, then they could conceivably be added to Loop. But you don't need to let us know that you'd love to see more pumps compatible with Loop. There is just an awful lot of work that needs to happen and it is neither quick nor easy. +Hey now...let's be grateful for what we have first. The ability to use the *Loop* app is the result of tremendous amounts of effort, time, and sacrifice by volunteers. Cracking the pumps for any Open-Source Automated Insulin Deliver (OS-AID) system use is a large undertaking. If and when another set of people spend a large amount of time figuring out other pumps, then they could conceivably be added to the *Loop* app. You don't need to let us know that you'd love to see more pumps compatible with Loop; we know that. There is just an awful lot of work that needs to happen and it is neither quick nor easy. -* Tandem pumps are not compatible -* Omnipod DASH pods are compatible +* Tandem pumps are not compatible (yet) * Omnipod 5 pods are not compatible * Newer Medtronic pumps are not compatible +In fact there are several OS-AID systems for iOS which use a common set of pump and CGM repositories. And new ones are being developed. + +This [link](../build/pump.md#pumps-compatible-with-the-loop-app){: target="_blank" } lists all the compatible pumps. Please refer to it for updates. There are several additional BLE pumps available to the iOS OS-AID community. You need to consider which ones are available in your country. + +- - - + ## Can I have more than one *Loop* app on a phone? Yes, this is technically possible. You can have multiple *Loop* apps built onto the same iPhone. However, having multiple *Loop* apps on a single phone may lead to unexpected conflicts that can negatively affect your Loop's ability to stay green (keep looping). Additionally, your Pod will only work on one *Loop* app at a time anyways. So for smooth looping, just keep one *Loop* app on any phone for looping use. +- - - + ## Will I be able to the *Loop* app on a plane? Or in the mountains? Yes. The *Loop* app does not require internet or cell coverage to work. So long as the *Loop* user has Bluetooth enabled on the iPhone, then the CGM and DASH pod (or RileyLink for Eros or Medtronic pumps) will still be able to do their work with the *Loop* app and your pump/Pod. One exception - if you've chosen to use a CGM source that does require the internet, you will need to have cell or internet coverage. This ability is provided as a service to folks who cannot get their CGM data any other way. It is also a convenience for people testing the code. +- - - + ## How to Fix Loop Suddenly Changing Glucose Units from mmol/L to mg/dL? A known **display glitch** occasionally occurs, causing glucose readings to change from `mmol/L` to `mg/dL`.  If this is the case, the fix consists of simply [force closing](https://support.apple.com/en-us/109359) and reopening the *Loop* app. If this does not fix the issue, then read [this section](apple-health-faqs.md/#how-do-i-change-glucose-units) +- - - + ## What happened to FreeAPS? -[FreeAPS](https://www.loopandlearn.org/freeapsdoc){: target="_blank" } was last updated in early 2023 to include DASH, but that was the last improvement. It is strongly recommended people switch to `Loop 3` or [`Trio`](https://diy-trio.org/){: target="_blank" }. Do not use an application without an owner. +[FreeAPS](https://www.loopandlearn.org/freeapsdoc) was last updated in early 2023 to include DASH, but that was the last improvement. It is strongly recommended people switch to `Loop 3` or [`Trio`](https://diy-trio.org/). Do not use an application without an owner. The features people used with FreeAPS are now included in `Loop 3` or can be added with customization. diff --git a/docs/faqs/new-phone.md b/docs/faqs/new-phone.md index 74b858725cc..dd1de816c70 100644 --- a/docs/faqs/new-phone.md +++ b/docs/faqs/new-phone.md @@ -5,6 +5,12 @@ You can choose to keep Looping on the old phone and swap later. Most vendors give you more than a week to turn in your old device for credit. +!!! warning "New Phone Requires iOS Update" + In general, when you get a new phone you are required to update that phone to the latest operating system before you can finish onboarding. + + Be sure to update to the latest version of Loop on your old phone before configuring your new phone. + + For example - if you transfer to an iOS 26 phone with `Loop v3.7.x` or older, you will not be able to manually bolus. Do yourself a favor and install an update before you switch phones. !!! abstract "Phone Transition Overview - Detailed steps below" @@ -81,6 +87,12 @@ Some people don't have access to their old phone. There are instructions for han When you change phones, *Apple* will force you to the latest iOS version available for your new phone. +!!! important "iOS 26 requires `Loop v3.8.2` or newer" + 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. + + **Do not attempt to run an older version of Loop on any iOS 26 phone, use `Loop v3.8.2` or newer.** + + ### Prepare Before Upgrade If you are using Dexcom, record the transmitter or sensor number in case it doesn't transfer @@ -121,8 +133,8 @@ Update your old phone to the latest iOS the hardware supports - this simplifies 1. Procure the new phone and keep the old one (if possible) * [Use the Old Phone](#use-the-old-phone-until-ready) until it is convenient to switch to the new phone 1. Transfer your information to your new phone. Your options are: - 1. Use both devices with [Quick Start](https://support.apple.com/en-us/HT210216){: target="_blank" } to transfer from the old to the new phone - 1. Use an [iCloud back-up](https://support.apple.com/en-us/HT210217){: target="_blank" } for the transfer + 1. Use both devices with [Quick Start](https://support.apple.com/en-us/HT210216) to transfer from the old to the new phone + 1. Use an [iCloud back-up](https://support.apple.com/en-us/HT210217) for the transfer 1. Let the new phone vendor help you ### Use the Old Phone until Ready diff --git a/docs/faqs/omnipod-faqs.md b/docs/faqs/omnipod-faqs.md index 73f315221ae..f85f37d5fd2 100644 --- a/docs/faqs/omnipod-faqs.md +++ b/docs/faqs/omnipod-faqs.md @@ -23,21 +23,63 @@ You do not need the Omnipod Personal Diabetes Manager (PDM), just the pod suppli DASH pumps communicate with the phone via Bluetooth so they do not require a RileyLink compatible device. -## What about *Tidepool Loop*? -*Tidepool Loop* was approved by the FDA in Jan 2023, but at the current time, there are no announced pump or CGM partners. What does this mean? +### Atlas or InPlay DASH pods + +!!! warning "iPhone 16 (all models) and 17e model with Omnipod DASH" + **iPhone 16 all models** and **iPhone 17e model only** can be slow to reconnect to Atlas versions of DASH pods. This can cause delays to automatic and manual insulin dosing. + + **Other phones, including iPhone 17 models other than 17e, work fine with InPlay DASH pods** + +Beginning in 2025, some of the DASH pods are produced with a newer version of chips and firmware. The only way to tell the difference before use is to examine the paper cover over the pods inside the box for the word `Atlas` (newer) or `SAW` (older) as shown in the graphic below. It is anticipated that `Atlas` pods, which report electronically as `InPlay BLE`, will become more common. + +**If you do not already own an iPhone 16 or a 17e, it is strongly suggested you choose an older (iPhone 15 or SE or older) or newer (iPhone 17 that is not the 17e) phone.** + +* The left images show the SAW marking for `TWI Board` DASH pods +* The right images show the Atlas marking for `InPlay BLE` DASH pods +* The exact location of the marking varies according to manufacture location and date but the `SAW` or `Atlas` notation indicates the internal BLE configuration for that pod + +![identifying marks for SAW and Atlas DASH pods](img/saw-atlas-identifiers.svg){width="750"} +{align="center"} + +#### Characteristics of Atlas with iPhone 16 or 17e + +* The Atlas DASH pods, which advertise a Bluetooth Device name of `InPlay BLE` and indicate `-Atlas` in small print on the paper pod cover are fully compatible with all iPhone models except iPhone 16 and iPhone 17e +* Although `InPlay` pods do work with the iPhone 16 and 17e you may notice some communication issues + * It can take many attempts to get the pod to initially connect when pairing; just keep hitting retry + * Once the pod disconnects itself from the phone Bluetooth, the phone is slow to reconnect the pod to the *Loop* app + * Pod firmware initiates the disconnect 3 minutes after the last message exchange + * With other models, the reconnect happens in about 1 sec + * With iPhone 16 or 17e, this can take many seconds and sometimes a few minutes + * When the pod is not connected, neither automatic nor manual commands can be sent to the pod to modify insulin delivery + * No solution to this issue is known + * There is a work-around to keep these pods more connected by issuing a keep-alive message before the 3-minute BLE disconnect; but it uses extra battery for the phone. + * Although it does increase the number of messages to the pod slightly, this is not thought to be a big issue. Pods with marginal batteries are as likely to fault without this feature as with the feature. + * If you are forced to use an iPhone 16 or 17e with InPlay pods, please read the [Pod Keep Alive Feature](../loop-3/omnipod.md#pod-keep-alive-feature){: target="_blank" } section. This used to be found only in a feature branch but as of v3.14.0 is part of the released Loop code + +> DASH pods that advertise a Bluetooth Device name of `TWI Board` and indicate `-SAW` in small print on the paper pod cover are fully compatible with all phones including the iPhone 16 and 17e. + +> The earliest `Atlas` DASH pods noticed by the OS-AID community were manufactured in Feb 2025. Some TWI DASH pods were manufactured in May 2025. Later in 2025, `Atlas` DASH pods with July 2025 and later manufacture dates were seen. + +We have no insight into the deployment plans from Insulet. Just pay attention if you have an iPhone 16 or iPhone 17e. Otherwise, you won't notice a difference. + + +- - - + +## What about *Tidepool Loop*? -*Tidepool Loop*, cleared by the FDA, is the first: +*Tidepool Loop* was approved by the FDA in Jan 2023. In 2025, the [Sequel twiist pump](https://www.twiist.com/) became available with *Tidepool Loop*. Check their site to see if it available in your area. -* App that provides automated insulin dosing **and** is configured to be fully interoperable with pump and CGM partners -* App that originated as a patient-led initiative +There is no arrangement for using an FDA cleared version of the Loop app with Omnipod. You must still build it yourself to use Omnipod Eros or DASH pods. -With this approval, there is now an FDA-approved pathway for independent selection of an app, a pump, and a CGM. Stay tuned for updates at [https://tidepool.org/tidepool-loop](https://tidepool.org/tidepool-loop){: target="_blank" }. +- - - ## Do I still need a PDM with Omnipod Loop? No, pods are monogamous little creatures. They will pair with only one device at a time for safety reasons...so a pod is either paired with a PDM or your *Loop* app on your iPhone. In other words, your PDM can stay in the diabetes closet while you are Looping. You cannot use the PDM for a pod that has been activated with the *Loop* app. That doesn't mean you should get rid of your PDM if you have one. Instead, keep it for backup situations if you lose your phone. See below for what to do if you lose your phone or RileyLink. +- - - + ## Can I cancel a bolus? Yes, you can cancel a bolus in progress. In fact, because it is very easy to cancel, make sure your phone is locked prior to being put away to avoid inadvertently cancelling a bolus. (This behavior is very similar to the Insulet PDM - which also needs to be locked once a bolus has started.) @@ -51,6 +93,8 @@ As soon as a bolus is initiated, look at your phone in portrait orientation. Yo ![graphic showing the bolus in progress - tap to cancel display](img/cancel-bolus.svg){width="300"} {align="center"} +- - - + ## Can I cancel a temp basal? ### Cancel Temp Basal with the *Loop* app @@ -62,13 +106,33 @@ You can tap on disable Closed-Loop and then immediately tap on enable Closed-Loo !!! tip "Bolus in progress" Even if a bolus is in progress, you can still switch to Open-Loop and restore scheduled basal. The current bolus continues unless you separately cancel the bolus. +- - - + ## Can I set my own temp basal on Loop? With version 3, the *Loop* app provides a [Manual Temp Basal](../loop-3/omnipod.md#manual-temp-basal) feature. +- - - + +## How much insulin is left when Pod reservoir say zero or 0 U? + +When the Pod reports 0 U in the reservoir, there can be up to 4 U more delivered. + +* You will not see a report of these units on the reservoir icon or on the Pod screen +* The pod keeps track of how many units are delivered after it reports 0 U in the reservoir and it will stop when it delivers 4 more units +* The pod also keeps track of whether insulin is being delivered and it will start to scream when there is not any more + +Do **not** count on those 4 U, but be aware that they might be available. + +The Event Log for dose delivery keeps track of what was actually delivered. The Insulin on Board (IOB) for the app updates if a bolus is interrupted because the pod runs out of insulin or hits the 4 U below zero limit. + +- - - + ## What if I lose my phone or RileyLink? -For pod users, your pod will finish any currently running temporary basal rate and then revert back to your scheduled basal rate. Without a phone or RileyLink, however, you will not be able to affect any pod use; no basal change, suspend, cancel, or bolus. To do anything other than let basals continue, you will need to take action depending on the situation. +Most users are now on DASH and no longer need a RileyLink, but you might still walk away from your phone - we just hope you didn't lose it. + +For pod users, your pod will finish any currently running temporary basal rate and then revert back to your scheduled basal rate. Without a phone (or RileyLink with Eros pod), however, you will not be able to affect any pod use; no basal change, suspend, cancel, or bolus. To do anything other than let basals continue, you will need to take action depending on the situation. * Lost RileyLink only: You can replace your missing RileyLink with one from your backup supplies. No problem to [switch out to a different Rileylink mid-pod session](rileylink-faqs.md#adding-or-changing-rileylink). If you don't have a backup RileyLink to use, then you will need to remove the pod and put on a new pod paired with your PDM until you can get a new RileyLink. In the interim, you are still getting basal from the pod. If you are taking bolus insulin via injection, just add it to Apple Health under insulin. The *Loop* app will read it and keep making predictions for you. Once you inject, then add the carbs that go with that injection into Loop. @@ -76,6 +140,8 @@ For pod users, your pod will finish any currently running temporary basal rate a * Lost both RileyLink and phone: You're having a really bad day. You'll need a hug and to follow the same directions as if you lost the phone as shown in the bullet above. +- - - + ## Is there an increase in pod failures on Loop? There is more communication between the pod and the controller (your *Loop* phone) than is typical with the PDM (Insulet provided controller). This increases the load on the pod battery. Most people have no increase in pod failures, but there are steps to take to limit "extra pod battery use". Every time the *Loop* app requests an update of the pod state or issues a command (bolus, basal schedule, temp basal), messages are exchanged with the pod. @@ -86,10 +152,14 @@ There is more communication between the pod and the controller (your *Loop* phon * If uncertain communications are detected such that the *Loop* app cannot determine if a dosing command sent to the pod was actually received, the app will try once a minute to get a response * The combination of Eros pods with a RileyLink device with poor signal leading to uncertain comms may cause excessive battery use and contribute to pod faults +- - - + ## What do I do if a pod fails to pair? If you get a pod that is failing to pair, please see [this page](../troubleshooting/pod-pairing.md){: target="_blank" } for steps on how to fix the problem. Follow these steps before filling and trying another pod. If the pod is not screaming, you can probably recover it. +- - - + ## What do you do to stop a screaming pod? Screaming pods indicate the pod is out of insulin or out of time (80 hours) or there has been a critical pod fault. In all these cases, there is no more delivery of insulin. @@ -103,6 +173,8 @@ Once you have removed the screaming pod, it can be silenced using a paperclip. S ![img/paperclip.jpg](img/paperclip.jpg){width="500"} {align="center"} +- - - + ## What Are the Pod Priming and Start Delays? - You have 2 hours after you fill the Pod with insulin to do a successful prime (this happens when you tap on `Pair Pod` on the Omnipod screen) diff --git a/docs/faqs/overview-faqs.md b/docs/faqs/overview-faqs.md index 5f6580739d4..984033d8756 100644 --- a/docs/faqs/overview-faqs.md +++ b/docs/faqs/overview-faqs.md @@ -10,9 +10,10 @@ Map to this section: * [Omnipod FAQs](../faqs/omnipod-faqs.md) * [CGM FAQs](../faqs/cgm-faqs.md) * [Update/Rebuild Loop FAQs](../faqs/update-faqs.md) - * [What if I'm Changing Phones](../faqs/update-faqs.md#what-if-im-changing-phones) * [New Phone Tips](../faqs/new-phone.md) -* [RileyLink FAQs](../faqs/rileylink-faqs.md) +* [Remote Control FAQs](../faqs/remote-control.md) +* [Translation FAQs](../faqs/app-translation.md) * [Algorithm FAQs](../faqs/algorithm-faqs.md) * [Apple Health FAQs](../faqs/apple-health-faqs.md) +* [RileyLink FAQs](../faqs/rileylink-faqs.md) * [Glossary](../faqs/glossary.md) diff --git a/docs/faqs/remote-control.md b/docs/faqs/remote-control.md new file mode 100644 index 00000000000..3b6b4560913 --- /dev/null +++ b/docs/faqs/remote-control.md @@ -0,0 +1,40 @@ +## Remote Caregivers + +If you are a caregiver and want to issue remote commands to the *Loop* app, you have 3 options. All of these require you to configure a [Nightscout site](../nightscout/overview.md){: target="_blank" } for that person. + +Once the Nightscout site is configured, you can remotely monitor that person. + +In the documentation below, the OTP is a one-time password that changes every 30 seconds. + +You can add remote control to: + +* modify the Override (Custom Preset) +* add Carbohydrates (requires OTP) +* issue a Bolus (requires OTP) + +You have 3 ways in which to do this. The first two require additions to the config vars on your Nightscout site and then you send commands through the Nightscout site either directly (option 1) or using the *LoopCaregiver* app (option 2) to the Looper's phone. The third option (*LoopFollow*) uses direct Apple Push Notifications (APNS) from your phone to the Looper's phone. With that method, the Nightscout site is used for monitoring, not issuing commands. + +All of these methods require an APNS key from someone with an Apple Developers License and that must be the same developer who built to *Loop* app. + +1. Use the [Careportal at the Nightscout URL](../nightscout/remote-commands.md){: target="_blank" } + * If the Caregiver uses an Android phone, this is your only option + * The Nightscout config vars must include APNS keys and the developer ID for the developer who built the Loop app +2. Build the [*LoopCaregiver* app](../nightscout/loop-caregiver.md){: target="_blank" } on the caregiver's iPhone to issue command through the Nightscout site + * The Caregiver must have an iPhone with iOS 16 or newer + * The Nightscout config vars must include APNS keys and the developer ID for the developer who built the Loop app +3. Build the [*LoopFollow* app](https://loopfollowdocs.org/remote/remote-control-loop/) on the caregiver's phone to directly issue APNS to the Looper's phone, this can be faster and more reliable + * The Caregiver must have an iOS phone with iOS 16.6 or newer + * The Nightscout site monitors the Looper's phone + * No additions to the Nightscout config vars are required - this makes it easier when you use Nightscout as a Service + +## Customization for Longer OTP Window + +May people find the OTP expires too soon when their Looper is on a different network from the Caregiver. + +Consider adding the option that allows Loop to accept a remote command that arrives within a 15 minute window. + +Please review this carefully before deciding to use this. + +* [Increase Remote Window to 15 minutes](https://www.loopandlearn.org/loop-features-in-development/#remote-window) + +This customization is for the *Loop* app so works with all three remote methods mentioned in the previous section. diff --git a/docs/faqs/rileylink-faqs.md b/docs/faqs/rileylink-faqs.md index a8736b5d3b4..ae95bb622e5 100644 --- a/docs/faqs/rileylink-faqs.md +++ b/docs/faqs/rileylink-faqs.md @@ -100,7 +100,7 @@ If several power cycles do not make the correct firmware show up, contact the ma The OrangeLink devices allow the user to update the firmware on the device using an app on the phone itself (available for iPhone 7 and later devices). -* [OrangeLink Firmware Update](https://getrileylink.org/orangelink-firmware){: target="_blank" } +* [OrangeLink Firmware Update](https://getrileylink.org/orangelink-firmware) A number of OrangeLink Pro devices were shipped with FW2.6 and for people who already had OrangeLink devices, a version of FW2.6 was offered for download. However, this firmware did not work well with Loop (or AndroidAPS). @@ -134,9 +134,9 @@ Make sure the LiPo battery is well-plugged into the connection. Line up the litt Loose battery cable on left. Proper battery cable on right -Finally, the board and the battery fit into the slim case fairly tightly as well. Click on the image below to watch a helpful [assembly video](https://www.youtube.com/watch?v=-GHxxEJMCZc&feature=youtu.be){: target="_blank" }. +Finally, the board and the battery fit into the slim case fairly tightly as well. Click on the image below to watch a helpful [assembly video](https://www.youtube.com/watch?v=-GHxxEJMCZc&feature=youtu.be). -[![frame for video on how to insert RileyLink into slim case, follow link for video](img/slimcase.png)](https://www.youtube.com/watch?v=-GHxxEJMCZc&feature=youtu.be){: target="_blank" } +[![frame for video on how to insert RileyLink into slim case, follow link for video](img/slimcase.png)](https://www.youtube.com/watch?v=-GHxxEJMCZc&feature=youtu.be) ## RileyLink Lights @@ -160,7 +160,7 @@ If your blue light remains on despite trying a restart, it is time to pull out y The battery that comes with RileyLink is not charged completely when it is shipped, so be sure to charge it up before initial use. RileyLink takes about 2 hours to fully charge (the red light will turn off when fully charged, read note above about red light patterns) and should easily last at least a full day of constant Loop use. Typically, it can go into the 30-hour range without any problems. Most people charge their RileyLink each night when they are sleeping. You don't have to worry about leaving the RileyLink plugged in "too long" for charging. It will automatically stop charging the battery when it is fully charged. -Since the best practice is to charge your RileyLink overnight while you sleep, and the battery lasts safely over 24 hours, there is no battery level indicator for the RileyLink. The RileyLink's charge level is not viewable on Nightscout, nor within the Loop app. If you forget to charge your RileyLink overnight, you can recharge it with a portable USB battery in a pinch. A [short mini-USB cable](https://www.adafruit.com/product/899){: target="_blank" } could be a good addition to a small gear bag. +Since the best practice is to charge your RileyLink overnight while you sleep, and the battery lasts safely over 24 hours, there is no battery level indicator for the RileyLink. The RileyLink's charge level is not viewable on Nightscout, nor within the Loop app. If you forget to charge your RileyLink overnight, you can recharge it with a portable USB battery in a pinch. A [short mini-USB cable](https://www.adafruit.com/product/899) could be a good addition to a small gear bag. ### What are the differences between the RileyLink Medtronic and Omnipod Antennas? @@ -196,10 +196,10 @@ After a year of use (and a year of being dropped), the antenna may no longer be ### RileyLink Battery -Keep your RileyLink and its Lithium-ion Polymer (LiPo) battery protected from damage. LiPo batteries are unsafe when damaged or punctured, so the case is an important part of safe Looping. If your battery is damaged in some way, please disconnect it immediately, and dispose of it (it should be recycled). You can order new RileyLink batteries on the [GetRileyLink website](https://getrileylink.org/){: target="_blank" } +Keep your RileyLink and its Lithium-ion Polymer (LiPo) battery protected from damage. LiPo batteries are unsafe when damaged or punctured, so the case is an important part of safe Looping. If your battery is damaged in some way, please disconnect it immediately, and dispose of it (it should be recycled). You can order new RileyLink batteries on the [GetRileyLink website](https://getrileylink.org/) ## RileyLink Battery Removal -To remove the LiPo battery from the RileyLink, please do so slowly and patiently. Work the battery connection side to side slowly to loosen it from the plug. Some people have reported success using small, curved needle-nose pliers such as hemostats. Others have used small flathead screwdrivers as shown in [this video](https://youtu.be/s2qNPLpfwww){: target="_blank" }. +To remove the LiPo battery from the RileyLink, please do so slowly and patiently. Work the battery connection side to side slowly to loosen it from the plug. Some people have reported success using small, curved needle-nose pliers such as hemostats. Others have used small flathead screwdrivers as shown in [this video](https://youtu.be/s2qNPLpfwww). -[![frame from video showing how to remove battery from RileyLink, follow link for video](img/rileylink_battery_removal.png)](https://youtu.be/s2qNPLpfwww){: target="_blank" } +[![frame from video showing how to remove battery from RileyLink, follow link for video](img/rileylink_battery_removal.png)](https://youtu.be/s2qNPLpfwww) diff --git a/docs/faqs/safety-faqs.md b/docs/faqs/safety-faqs.md index 7c538bab317..16e35b7f83b 100644 --- a/docs/faqs/safety-faqs.md +++ b/docs/faqs/safety-faqs.md @@ -4,7 +4,7 @@ Do not enter settings that you are unsure of. For example, if you haven't any id ## iOS *Focus* Notifications -iPhones have [*Focus* modes](https://support.apple.com/en-us/108302){: target="_blank" } to enable maximum flexibility for notifications. These modes must be configured by each user to allow important notifications from your diabetes apps. +iPhones have [*Focus* modes](https://support.apple.com/en-us/108302) to enable maximum flexibility for notifications. These modes must be configured by each user to allow important notifications from your diabetes apps. **Set up every *Focus* mode you use to allow glucose alerts or you will not get them.** diff --git a/docs/faqs/time-faqs.md b/docs/faqs/time-faqs.md index e70cdf2becc..e6fa51aefe2 100644 --- a/docs/faqs/time-faqs.md +++ b/docs/faqs/time-faqs.md @@ -1,16 +1,37 @@ ## The *Loop* Phone Must be on Automatic Time !!! danger "The *Loop* Phone is a Medical Device" - There have been several instances where a Looper disabled automatic time to change the time on their *Loop* phone. + **The app relies on phone time when calculating active insulin. When you modify the time artificially to defeat screen time limits or to change the rules on a game, you run the risk of modifying that active insulin calculation.** - As of January 2023, this change in time is detected and the *Loop* app stops all automatic dosing of insulin other than your scheduled basal rates and begins to aggressively warn the user. + * The *Loop* app detects if you modified the time + * This is only possible when you disable Automatic Time in the phone settings + * The app stops all automatic dosing of insulin other than your scheduled basal rates + * The app will aggressively warn the user: [*Loop* Warning about Time Change](#loop-warning-about-time-change) - One scenario should be enough to convince you not to do this: + * This detection is for your safety + * Some manual time changes can cause the app to crash and not reopen - * Glucose is 180 mg/dL (10 mmol/L) when you set time one day ahead (for a game) - * Later you return time to automatic and think nothing of it - * As soon as automatic time is restored, the *Loop* app thinks your eventual glucose will be the future value (in this example 180 mg/dL) and attempts to bring you to your correction range - * If you are running a very old version of the *Loop* app, dosing could continue based on that incorrect future glucose value + This behavior is meant to prevent a situation where the user has a lot of insulin active but, because of the time change, the *Loop* app thinks they do not. The app could suggest a bolus or deliver increased insulin that could cause injury. + +### Not on Automatic Time + +What can happen if you don't [Force Automatic Time](#force-automatic-time)? + +* Someone can change time manually +* This is not referring to time zone changes when you are traveling; those are handled for you when automatic time is enabled + +If the time was changed manually and you pay attention to the warning: + +* Sometimes you can recover by restoring time and deleting erroneous values, if any, from Apple Health +* Sometimes you have to **delete the app and reinstall**. + +One **worst-case** scenario should be enough to convince you to [Force Automatic Time](#force-automatic-time): + +* While a bolus was being delivered, a user manually adjusted the time to be in the past by changing time on the phone +* In this case, an exception was entered into the record that caused the app to crash (End Time for bolus was before Start Time) +* Their **solution was to delete the app completely and reinstall** + * A deleted app means a new pod if that is the type of pump used + * A deleted app means all settings and configurations have to be entered again ### Force Automatic Time @@ -20,10 +41,47 @@ You can configure the iPhone to only allow automatic time. * Scroll down to the Lock Screen Time Settings row * Enter a passcode -The ability to use anything other than automatic time is disabled as long as that iOS setting has a passcode. Parents can use this for children. Adults can use this too in case they need a reminder not to change the time - you must first disable the passcode. +The ability to use anything other than automatic time is disabled as long as that iOS setting has a passcode. + +* Adults can use this too in case they need a reminder not to change the time - you must first disable the passcode +* Parents can use this for children - but if they have [family managed settings](#automatic-time-for-managed-phones), they may need different instructions. This does not affect automatic time zone changes, those are handled by the phone without need for interaction. +### Test the Configuration + +To test that Time & Date can no longer be modified, navigate to the following Settings: + +* Settings > General > Date & Time + +The option to modify "Set Automatically" should be disabled (greyed out), as seen in the screenshot below. + +![screenshot for case where time adjustment is not allowed on the phone](img/time-cannot-be-modified.png){width="350"} +{align="center"} + +### Automatic Time for Managed Phones + +If you manage the *Loop* phone as part of a family account, forcing the phone to be on automatic time may take a few more steps. + +After enabling Screen Time and creating a password, navigate to the following settings: + +* Settings > Screen Time > Content & Privacy Restrictions > Location Services > System Services > Setting Time Zone + + * Disable the option for Setting Time Zone + +Then return to the following settings: + +* Settings > Screen Time > Content & Privacy Restrictions > Location Services +* Select the option "Don't Allow Changes". + +Be sure to [Test the Configuration](#test-the-configuration). + +### Troubleshooting + +If Time & Date can still be modified after making the above changes, try disabling Content and Privacy Restrictions or disabling Screen Time all together and then enabling it again. This might correct the problem. [Test the Configuration](#test-the-configuration) again. + +Note, when Screen Time is remotely administered through a Family Group from another person's iPhone, such as a parent, if the IOS version is not the same or similar to the child's phone, it can create unexpected behavior in Screen Time settings and can cause an inability to disable Time & Date modifications using Screen Time. Update both phones to be on the latest version of IOS and try again. + ### Remove Future Glucose If you have future glucose from a manual time change or just entering something into Apple Health with the wrong timestamp: @@ -34,7 +92,9 @@ If you have future glucose from a manual time change or just entering something * If you tap on the bolus icon, Loop informs you it detected invalid future glucose * If you tap on the glucose icon - it takes you to your CGM which probably has a very different number from that shown on the main Loop screen * If you also use Nightscout **and** have the upload CGM readings enabled in Loop, those future glucose values will appear in Nightscout - * To fix this problem (after you fix Apple Health), use the [Admin Tools in Nightscout](https://nightscout.github.io/nightscout/admin_tools/){: target="_blank" } to remove future treatments and future entries + * To fix this problem (after you fix Apple Health), use the [Admin Tools in Nightscout](https://nightscout.github.io/nightscout/admin_tools/) to remove future treatments and future entries + +### *Loop* Warning about Time Change The *Loop* app is very aggressive at warning you if you make this mistake. you will get a notification - even when you are in a different app. The graphic below shows the alert when you next view the *Loop* app after turning off automatic time and changing the time. Even if you respond right away, you may have at least one glucose reading in the future when you see this alert. Please [Remove Future Glucose](#remove-future-glucose). diff --git a/docs/faqs/update-faqs.md b/docs/faqs/update-faqs.md index 23b5c194602..f6e49c06e82 100644 --- a/docs/faqs/update-faqs.md +++ b/docs/faqs/update-faqs.md @@ -12,7 +12,7 @@ In both cases, you build the code to install over an existing app on your phone !!! important "Check *Apple* Developer Account" If you have an updated agreement, be sure to accept it before you update or rebuild. - * [Apple 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. ![Screenshot: Account - Apple Developer](../build/img/license.png) 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). ![dexcom app settings to retrieve transmitter id](img/dexcom-g6-transmitter-id.svg){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. + +![Steps to add Eversense CGM](img/eversense-login-screen.png){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. ![Nightscout Remote CGM acknowledgement screen](img/nightscout-cgm-acknowledge.svg){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 `://`. ![Nightscout Remote CGM entry screen](img/nightscout-cgm-entry.svg){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 ![DanaRS-v3 version menu](img/danars-v3-version.jpeg){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) ![Full dana flow](img/dana-total.jpg){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 + +![Dana-i SN example](img/dana-i-sn.jpg){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 - -![Dana-i SN example](img/dana-i-sn.jpg){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! -![Dana pairing request example](img/dana-pairing.jpg){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. +![Dana pairing request example](img/dana-pairing.jpg){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. + + ![Medtrum REF](img/medtrum-ref.JPG){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 + +![Full Medtrum flow](img/medtrum-total.png){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: + +![Medtrum SN example](img/medtrum-sn.png){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: ![figure showing event history, reservoir and non-pump insulin tabs](img/insulin-detail.svg){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 + +> ![figure showing event details for bolus](img/insulin-event-detail-bolus.svg){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 + +> ![figure showing event details for a temporary basal rate](img/insulin-event-detail-tbr.svg){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 ![Active carbohydrate chart showing measured rise and fall based on entries and settings](img/carb_graph.jpg){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 | |---|---| |![low temp basal indicator plus pod reservoir above 50 U](img/nominal-pod-low-temp.svg){width="175"}|This nominal pump status graphic is for a Pod with temp basal less than scheduled basal rate and no reported reservoir level.| -|![scheduled basal indicator for partially full mdt reservoir](img/nominal-mdt-scheduled.svg){width="175"}|This nominal pump status graphic is for a Medtronic pump running scheduled basal rate and with a half-full reservoir.

For a Pod, the reservoir shows full until pod estimates reservoir is below 50 U remaining.| +|![scheduled basal indicator for partially full mdt reservoir](img/nominal-mdt-scheduled.svg){width="175"}|This nominal pump status graphic is for a pump running scheduled basal rate and with a half-full reservoir.

For a Pod, the reservoir shows full until pod estimates reservoir is below 50 U remaining.| |![high temp basal indicator with reservoir above notification level](img/nominal-pump-high-temp-reservoir.svg){width="175"}|This nominal pump status graphic is for a pump running a high temp basal rate with the reservoir level reported.

When the reservoir level is above the notification level, the reservoir graphic is orange.| |![high temp basal indicator with reservoir level below alert and clock icon](img/pump-alert-reservoir-tz.svg){width="175"}|This pump status graphic indicates 2 alerts: (1) the 15 U reservoir level is less than the notification level of 20 U selected by this user and (2) a small clock icon is added to the display to indicate the phone time zone and pump time zone do not match.

When the reservoir level is below the notification level, the reservoir graphic is yellow.

Follow the link for [time zone](#time-zone) information.| -|![pump alert - red exclamation point with phrase no insulin](img/pump-alert-no-insulin.svg){width="175"}|This No Insulin alert message indicates the reservoir reports 0 U. Although pumps will continue to deliver some insulin after this point (max of 4 U for pods, or until all insulin is gone for both pods and Medtronic), the user should be aware that insulin delivery could stop at any moment.

Note that if you see a display of 0 U in yellow, that means there is 0.5 U or less reported by the pump.| +|![pump alert - red exclamation point with phrase no insulin](img/pump-alert-no-insulin.svg){width="175"}|This No Insulin alert message indicates the reservoir reports 0 U. Although pumps will continue to deliver some insulin after this point (max of 4 U for pods, or until all insulin is gone for any pump), the user should be aware that insulin delivery could stop at any moment.

Note that if you see a display of 0 U in yellow, that means there is 0.5 U or less reported by the pump.| |![pump alert - yellow exclamation point with phrase no pod](img/pump-alert-no-pod.svg){width="175"}|The No Pod alert message indicates no pod is currently paired so no insulin is being delivered.

Tap on the icon to reach the pod setting screen and pair a new pod, or switch to a different source for providing insulin.| |![pump alert - yellow pause indicator that pump is suspended](img/pump-alert-suspended.svg){width="175"}|The Insulin Suspended alert message indicates all insulin delivery has been suspended.

A [Status Row](#hud-status-row) message appears to enable the user to resume delivery with one tap.

Alternatively, insulin can be resumed by tapping on the Pump Icon to enter the Pump Setting display and resume from that screen.| |![pump alert - yellow exclamation point with phrase manual basal](img/pump-alert-mtb.svg){width="175"}|The Manual Bolus alert message indicates the user has initiated a manual temp basal (MTB). While the MTB is active, the Loop Icon Status will also display an Open Loop symbol to indicate no automatic adjustments are made until MTB expires or is canceled.

The lifecycle indicator across the bottom of the pod status indicates a pod within the final 24 hours of nominal life.

Tapping on the icon takes the user to the pump settings display where the rate and duration of the MTB are displayed.| @@ -292,11 +331,13 @@ The table below shows examples for a few nominal Pump Status Icons and Alert mes ### Time Zone -Loop allows your pump to have a different time zone from your phone. +Loop allows your pump to have a different time zone from your phone. This allows you to choose when, or if, you want your pump basal, CR, ISF and correct target schedule to match you current phone time zone. -* For Medtronic - the pump time shows on the pump display +* For pumps like Medtronic or Dana - the pump time shows on the pump display * Always use Loop to set your pump time -* For Omnipod Common - there isn't a clock on pods, but Loop has a concept of "pump" time for that pod +* For pumps without a display screen - there isn't a time shown outside the *app*, but *Loop* has a concept of "pump" time for that pump + +> For Trio users - this is not the case - pump time and phone time are always kept aligned. Your daily schedule for basal rates, correction ranges, insulin sensitivity factors and carb ratios is displayed with respect to midnight on "pump time". When you first [Add Pump](add-pump.md#add-pump) to Loop, the pump and phone are in the same time zone, but it's important to understand what happens when the time zone changes on the phone. diff --git a/docs/loop-3/eversense.md b/docs/loop-3/eversense.md new file mode 100644 index 00000000000..ee33afdf7dd --- /dev/null +++ b/docs/loop-3/eversense.md @@ -0,0 +1,45 @@ +!!! warning "🚧 Documentation Under Construction 🚧" + + This page is under development. + + The addition of the Eversense CGM to iOS Open-Source Automated Insulin Delivery systems is new. + + Please review the [EversenseKit Issues](https://github.com/bastiaanv/EversenseKit/issues) page for open issues reported for the EversenseKit CGM Manager. + +## Testing Eversense with the *Loop* App + +* The branch needed to get Eversense in *Loop* is: `feat/eversense` + * This branch is subject to rapid updates + * This 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. + +## Eversense 365 Screen + +The user interface for the 365 sensor is shown below. + +![consolidated view of the status and command screen for eversense main screen](img/eversense-user-interface.svg){width="300"} +{align="center"} + +## Calibration and Battery Indicators + +* Once stabilized, the Eversense Transmitter requires weekly calibrations + * The Eversense will stop reporting glucose readings if the required calibration is more than 24 hours late +* The Eversense Transmitter requires charging every 2 to 3 days + +The calibration status and battery level is highlighted at the top of the Eversense screen. + + +![eversense calibration status](img/eversense-calibration-required.png){width="600"} +{align="center"} + +* The left screenshot shows an orange line indicating a calibration is due in less than 24 hours +* The right screenshot is after calibration + +## *Loop* Main Screen + +When calibration required is within 24 hours, the orange line is echoed on the top of the *Loop* main screen under the CGM icon to serve as a reminder to calibrate soon. + +Once the calibration is due, there is a 24-hour grace period before transmitter stops reporting glucose values. During that time, the "Next calibration in" line is red. This red line is also echoed on the top of the *Loop* main screen under the CGM icon. + +As usual for calibrating a CGM, choose a time when glucose is stable to measure glucose with a finger-stick and enter the value into the user interface. The calibration takes 15 minutes to process. \ No newline at end of file diff --git a/docs/loop-3/features.md b/docs/loop-3/features.md index b4989e00c79..1cfbfc023a7 100644 --- a/docs/loop-3/features.md +++ b/docs/loop-3/features.md @@ -1,20 +1,22 @@ -## New with Loop 3 +## **New with Loop 3** This page discusses some features new with Loop 3. +- - - + ## Remote Carb / Bolus -Loop 3 has a Remote Carb and Remote Bolus feature to enable remote caregivers to better assist the person who needs support managing with Loop. This requires the Loop user have a Nightscout site. Please review these pages: +!!! tip "Companion Apps for Remote Control" + There are 2 ways to send remote commands: + + * [Remote Control with *LoopFollow*](#remote-control-with-loopfollow) + * [Remote Control with LoopCaregiver or Nighstcout](#remote-control-with-loopcaregiver-or-nightscout) -* [Remote Overview](../nightscout/remote-overview.md) -* [Remote Configuration](../nightscout/remote-config.md) -* [Remote Commands](../nightscout/remote-commands.md) -* [Remote Errors](../nightscout/remote-errors.md) -* [LoopCaregiver App](../nightscout/loop-caregiver.md) +The remote features were originally developed in coordination with the development of *LoopCaregiver* and updates to *Nightscout* were added at that time to support these remote features. Subsequent to that, [LoopFollow]() added code to directly send *Apple* push notifications to the *Loop* app, so offers a separate path for providing remote control for caregivers. !!! warning "WARNING" - You will be using this feature at your own risk, like any other Loop code you build. It is very important you completely read and re-read the links listed above before getting started. + You will be using this feature at your own risk, like any other Loop code you build. It is very important you completely read and re-read the links listed below before getting started. Be aware: @@ -23,10 +25,90 @@ Loop 3 has a Remote Carb and Remote Bolus feature to enable remote caregivers to * There is no published limit, but consider limiting it to 1 or 2 per hour * When on cellular data, there may be further limitations to protect your data usage + The *Apple* limits on push notifications will limit *LoopFollow*, *LoopCaregiver* and direct use of the *Nightscout* `careportal`. + +### Remote Control with *LoopFollow* + +The *LoopFollow* app is very popular with caregivers and with people who use OS-AID for themselves because of the overview display and extensive, flexible alarm features. This can only be used on an iOS device: an iPhone, iPad or Mac. You can have copies of *LoopFollow* on multiple devices and share responsibility with multiple caregivers. So be careful in your usage. + +Please refer to: + +* [LoopFollowDocs](https://loopfollowdocs.org/) +* [LoopFollowDocs: Remote Control](https://loopfollowdocs.org/remote/remote-control-overview/) + + +### Remote Control with *LoopCaregiver* or *Nightscout* + +Loop 3 supports Remote Carb and Remote Bolus feature to enable remote caregivers to better assist the person who needs support managing with Loop. This requires the Loop user have a Nightscout site. Please review these pages housed in *LoopDocs*: + +* [Remote Overview](../nightscout/remote-overview.md){: target="_blank" } +* [Remote Configuration](../nightscout/remote-config.md){: target="_blank" } +* [Remote Commands](../nightscout/remote-commands.md){: target="_blank" } +* [Remote Errors](../nightscout/remote-errors.md){: target="_blank" } +* [LoopCaregiver App](../nightscout/loop-caregiver.md){: target="_blank" } + +### Remote Control of More than One Person + +You can use the same *Apple* push notification credentials to support more than one person. + +* Each person must have their own unique *Nightscout* URL +* For LoopFollow, each person has their own app and you can personalize that app with their name and icon + * Refer to [LoopFollowDocs: Multiple People]() +* For LoopCaregiver, each person is added to the same *LoopCaregiver* app and you switch between people in the app + +- - - + +## Non-Pump Insulin + +If insulin is taken from a different source and the user wants to let Loop know, there is a new method in Loop 3. + +With Loop 2.2.x, the user manually entered the Insulin dose into the Apple Health app. Loop then imported that value. + +With Loop 3, the "old" method still works, but there is a new method for entering this information. This method enables the user to indicate the type of insulin so that the appropriate model is used by Loop. An updated `Glucose` prediction chart is displayed prior to saving the dose. + +### Enter non-pump insulin before carbs + +!!! warning "WARNING" + If you are planning to enter non-pump insulin to cover carbs and you do NOT want Loop to automatically start increasing insulin based on the carb entry, enter the non-pump insulin first and then add the carbs. + + To find out what Loop recommends, without actually dosing with Loop: + + * Wait for a CGM entry (or fingerstick) to appear in the HUD + * Enter the carbs and continue to the bolus screen, i.e., do not save carbs + * Note the recommended bolus, but do not actually bolus + * Back up to the carb entry screen and `Cancel` + * Go to the non-pump insulin screen and enter the bolus amount you've decided to take, and select the model if it's different from your pump + * Don't forget to actually take the insulin + * Add the carb entry and save the carbs without bolusing + +1. Tap on either of the insulin charts (Active Insulin or Insulin Delivery) on the home screen to display the `Insulin Delivery Screen`. This screen has 3 tabs. + * **Event History** (default) lists delivery events from the Pump (does not include times when pump is returned to Scheduled Basal Rates) + * **Reservoir** This is the reservoir level reported by the attached pump. Pods are treated differently from other pumps because the reservoir does not begin to report until the pod has reached 50 U or below. You may see the previous pod reservoir levels following a pod change. + * **Non-Pump Insulin** injections can be recorded or edited here + +2. Select the `Non-Pump Insulin` tab to bring up the graphic shown below + * Tap on the + sign (green solid lines) + * `Log Dose` screen is displayed showing the current `Glucose` prediction + * The default insulin type is that used by the pump + * To modify Insulin Type, tap on that row (red dashed lines) + * Picker wheel allows other insulin types to be selected + * Note that some insulin types, such as Afrezza are only available for non-pump insulin selection + * Tap on the `Bolus` row (blue dash-dot lines) to bring up a keyboard + * The `Glucose` prediction chart updates automatically based on the value entered in the Bolus row + * Tip, add 0.001 to the actual dose to make it easier to see if reviewing in Apple Health + * Once the user selects `Done` on the keyboard display, the entered value is displayed on the `Bolus` row, and the `Log Dose` button changes from gray to blue + * Tap on `Log Dose` to record or `Cancel` to quit + +![entering non-pump insulin into Loop](img/non-pump-insulin.svg){width="500"} + +- - - + ## **New with Loop 3.4.0** Additional details about the 3.4.0 release are found here: [Version: Releases: 3.4.0](../version/releases.md#loop-v340){: target="_blank" } +- - - + ## Algorithm Experiments Two algorithm experiments are now available in the *Loop* app (version 3.4.0 or later). These are _Glucose Based Partial Application_ and _Integral Retrospective Correction_. They can be viewed on the Loop Settings screen just below Therapy Settings and Usage Data Sharing as shown in the graphic below: @@ -157,6 +239,8 @@ The Retrospective Correction section of the [Predicted Glucose Chart](../loop-3/ * Responses to unannounced meals - spikes should in general be somewhat lower than with standard Loop, but there should also be no follow-up lows * Nighttime responses over a few weeks - highs or lows should be less frequent compared to standard Loop; at the wake-up time blood glucose should in general be closer to the correction range. +- - - + ## Favorite Foods This feature allows you to save _Favorite Foods_. @@ -178,45 +262,83 @@ At this point the meal can be saved by tapping the Continue button, or the user Note that to create a _Favorite Food_ on the _Carb Entry_ screen, an icon must be selected by typing on the plate icon and choosing one of the specific food emoji icons. The standard Lollipop, Taco, Pizza icons can be selected at that level, but choosing them at the top level is not sufficient to enable the _Save as Favorite_ button. The favorite food examples seen in the graphic above were created in the Favorite Foods Settings row. The taco was chosen to go with the absorption time chosen. -## Non-Pump Insulin +- - - -If insulin is taken from a different source and the user wants to let Loop know, there is a new method in Loop 3. +## **New with Loop v3.10.0** -With Loop 2.2.x, the user manually entered the Insulin dose into the Apple Health app. Loop then imported that value. +Additional details about the 3.10.0 release are found here: [Version: Releases: 3.10.0](../version/releases.md#loop-v3100){: target="_blank" }. -With Loop 3, the "old" method still works, but there is a new method for entering this information. This method enables the user to indicate the type of insulin so that the appropriate model is used by Loop. An updated `Glucose` prediction chart is displayed prior to saving the dose. +## Live Activity -### Enter non-pump insulin before carbs +Live Activity was added to Loop with [Loop PR 2919](https://github.com/LoopKit/Loop/pull/2191#issuecomment-3565473537) in a development branch and released with version 3.10.0. -!!! warning "WARNING" - If you are planning to enter non-pump insulin to cover carbs and you do NOT want Loop to automatically start increasing insulin based on the carb entry, enter the non-pump insulin first and then add the carbs. - - To find out what Loop recommends, without actually dosing with Loop: - - * Wait for a CGM entry (or fingerstick) to appear in the HUD - * Enter the carbs and continue to the bolus screen, i.e., do not save carbs - * Note the recommended bolus, but do not actually bolus - * Back up to the carb entry screen and `Cancel` - * Go to the non-pump insulin screen and enter the bolus amount you've decided to take, and select the model if it's different from your pump - * Don't forget to actually take the insulin - * Add the carb entry and save the carbs without bolusing +!!! warning "Customization Users; Browser Builders" + Many people have been using Live Activity as a customization. If you used the customization - you need to remove `live_activity` from your customization list in your build_loop.yml file of your fork or your build will fail. -1. Tap on either of the insulin charts (Active Insulin or Insulin Delivery) on the home screen to display the `Insulin Delivery Screen`. This screen has 3 tabs. - * **Event History** (default) lists delivery events from the Pump (does not include times when pump is returned to Scheduled Basal Rates) - * **Reservoir** This is the reservoir level reported by the attached pump. Pods are treated differently from other pumps because the reservoir does not begin to report until the pod has reached 50 U or below. You may see the previous pod reservoir levels following a pod change. - * **Non-Pump Insulin** injections can be recorded or edited here +### Requirements for Live Activity -2. Select the `Non-Pump Insulin` tab to bring up the graphic shown below - * Tap on the + sign (green solid lines) - * `Log Dose` screen is displayed showing the current `Glucose` prediction - * The default insulin type is that used by the pump - * To modify Insulin Type, tap on that row (red dashed lines) - * Picker wheel allows other insulin types to be selected - * Note that some insulin types, such as Afrezza are only available for non-pump insulin selection - * Tap on the `Bolus` row (blue dash-dot lines) to bring up a keyboard - * The `Glucose` prediction chart updates automatically based on the value entered in the Bolus row - * Tip, add 0.001 to the actual dose to make it easier to see if reviewing in Apple Health - * Once the user selects `Done` on the keyboard display, the entered value is displayed on the `Bolus` row, and the `Log Dose` button changes from gray to blue - * Tap on `Log Dose` to record or `Cancel` to quit +* The dynamic island is only available for iPhone versions 14 pro and newer; but Live Activity on the Lock Screen is supported for older phones running iOS 16 or newer +* iOS 18 and watchOS 10 or newer are required for Live Activity to appear in the Smart Stack on the Apple Watch +* iOS 26 or newer is required to have Live Activity appear in the CarPlay view -![entering non-pump insulin into Loop](img/non-pump-insulin.svg){width="500"} + !!! tip "Dynamic Island" + If your phone supports [Dynamic Island](https://support.apple.com/guide/iphone/view-live-activities-in-the-dynamic-island-iph28f50d10d/ios) and you enable Live Activity, then Dynamic Island is displayed. + + There is no separate control to enable one without the other. + +### Enable Live Activity + +* The configuration for the *Loop* Live Activity widget on the lock screen is found under *Loop*, Settings, Notifications, Live Activity + * Live Activity will be displayed when enabled here and on the iPhone itself +* You must also enable Live Activity under iPhone settings, Loop, tap on Live Activites and enable both Allow Live Activites and More Frequent Update + +![enable Live Activity](img/liveactivity-enable.svg){width="700"} +{align="center"} + +After you enable Live Activity, lock your screen. + +* If you don't see the Live Activity, you may need to quit and restart the Loop App +* Sometimes after a reboot, you may need open the Loop app before Live Activity for Loop shows up + * You might need to disable and then enable Live Activity + +### Configure Live Activity + +To configure what is shown on your Lock Screen, and CarPlay when supported: + +* You can select Large (with a plot) or Small `Mode` +* You can enable or disable the predictive line display (when Large is selected) +* You can modify the values of glucose to indicate high or low levels +* You can choose to show glucose with a single color (*Loop* blue) or using different colors for different levels +* You can configure details displayed in the widget by tapping on the `Bottom row configuration` (indicated by the blue rectangle in the graphic above) + +#### Effect of `Use BG coloring` + +`Use BG coloring` is disabled for the graphic on the left and enabled for the one on the right. + +![Live Activity example using BG color](img/liveactivity-glucose-color.png){width="500"} + +#### Example Lock and Watch / CarPlay Displays + +Example screens are shown below. + +![Live Activity example for lock screen and carplay](img/liveactivity-lock-car.png){width="500"} + +#### Widget Layout using `Bottom row configuration` + +You can configure the details displayed in the Lock Screen widget by tapping on the `Bottom row configuration` in the *Loop* Live Activity settings screen. + +![Configure Live Activity Display](img/liveactivity-bottom-row.svg){width="500"} +{align="center"} + +Only 4 items can be displayed at one time. If you want a different set of items, make sure 3 or fewer are selected. + +* Left side of graphic above: + * Tap on a minus sign (highlighted with red rectangle) to remove an item + * Drag items up or down using :material-menu: (highlighted with a blue rectangle). + * Tap on the plus sign (highlighted with blue rectangle) to display right side of graphic (only active when 3 or fewer items are selected) + +* Right side of graphic above: + * This display shows all available options with no indication which ones are selected + * If you touch an item it is added to your selection + * When your selection reaches 4 items you are automatically returned to the previous screen + * If you want fewer than 4 items, tap on any of the control icons on this screen to return to the previous screen diff --git a/docs/loop-3/img/eversense-calibration-required.png b/docs/loop-3/img/eversense-calibration-required.png new file mode 100644 index 00000000000..a948e1f8e50 Binary files /dev/null and b/docs/loop-3/img/eversense-calibration-required.png differ diff --git a/docs/loop-3/img/eversense-login-screen.png b/docs/loop-3/img/eversense-login-screen.png new file mode 100644 index 00000000000..b692a2755b3 Binary files /dev/null and b/docs/loop-3/img/eversense-login-screen.png differ diff --git a/docs/loop-3/img/eversense-user-interface.svg b/docs/loop-3/img/eversense-user-interface.svg new file mode 100644 index 00000000000..9200fb6434a --- /dev/null +++ b/docs/loop-3/img/eversense-user-interface.svg @@ -0,0 +1,116 @@ + + + + diff --git a/docs/loop-3/img/insulin-detail.svg b/docs/loop-3/img/insulin-detail.svg index 8b20a276344..ced5405120f 100644 --- a/docs/loop-3/img/insulin-detail.svg +++ b/docs/loop-3/img/insulin-detail.svg @@ -1,12 +1,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - image/svg+xml - - - + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu4AAAU2EAIAAAAVJXgSAAABdWlDQ1BrQ0dDb2xvclNwYWNlRGlz cGxheVAzAAAokXWQvUvDUBTFT6tS0DqIDh0cMolD1NIKdnFoKxRFMFQFq1OafgltfCQpUnETVyn4 H1jBWXCwiFRwcXAQRAcR3Zw6KbhoeN6XVNoi3sfl/Ticc7lcwBtQGSv2AijplpFMxKS11Lrke4OH nlOqZrKooiwK/v276/PR9d5PiFlNu3YQ2U9cl84ul3aeAlN//V3Vn8maGv3f1EGNGRbgkYmVbYsJ 3iUeMWgp4qrgvMvHgtMunzuelWSc+JZY0gpqhrhJLKc79HwHl4plrbWD2N6f1VeXxRzqUcxhEyYY ilBRgQQF4X/8044/ji1yV2BQLo8CLMpESRETssTz0KFhEjJxCEHqkLhz634PrfvJbW3vFZhtcM4v 2tpCAzidoZPV29p4BBgaAG7qTDVUR+qh9uZywPsJMJgChu8os2HmwiF3e38M6Hvh/GMM8B0CdpXz ryPO7RqFn4Er/QcXKWq8UwZBywAAAIJlWElmTU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAAB AAAAJgAAAAAABJADAAIAAAAUAAAAXJKGAAcAAAASAAAAcKACAAQAAAABAAAC7qADAAQAAAABAAAF NgAAAAAyMDI2OjAyOjI0IDA3OjIwOjAwAEFTQ0lJAAAAU2NyZWVuc2hvdIGH/1sAAAHvaVRYdFhN TDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4 OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3 dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRp b24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5j b20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9i ZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5z aG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICAgICA8cGhvdG9zaG9wOkRhdGVDcmVhdGVkPjIw MjYtMDItMjRUMDc6MjA6MDA8L3Bob3Rvc2hvcDpEYXRlQ3JlYXRlZD4KICAgICAgPC9yZGY6RGVz Y3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Ch+KTnkAAEAASURBVHgB7J0JuCRV ffYHIWS+ZJLcxCReE/NUJ/mSkORL0tlkp66Ixt3RaNw9464oyeCKgJ4RERG3EYkgCDXssjrsi0IN yL4O+yJYF9n3uffO3P12ff2/L+p/OHPqVnd1d3Xffud9nuZw+tRZflW3qs7bZ1mSWooESIAESIAE SIAESIAESIAESIAESIAESKDTBJZ0ukCWRwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkFqaMhwpRAIk QAIkQAIkQAIkQAIkQAIkQAIkQAIlEKApUwJ0uoEkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQFOGpgwJ kAAJkAAJkAAJkAAJkAAJkAAJkAAJlECApkwJ0OkFkgAJkAAJkAAJkAAJkAAJkAAJkAAJkABNGZoy JEACJEACJEACJEACJEACJEACJEACJFACAZoyJUCnF0gCJEACJEACJEACJEACJEACJEACJNAogWdS 0c8TUaPHdmd6mjI0ZUiABEiABEiABEiABEiABEiABEiABBYgMJuK7jSic+Z1nBH9IBR9P55X+P2W 6MhYdK8R1axobF5L5v/9xtYimCyo1TVG1EDZ87VFzdEKtAitQ56dMXFoyixw2XXmNLCUXiHwgBVd bUQ/mtfhocgOiRBGPNIgfa+0jvUkARIgARIgARIgARIgARIgAZfARis6PRE1YHw0Zc8cGYpuMKI5 K4JF8sKDRTBlXrJahHpuSkWnGlGr6oaWotUujdbG0JShKUMCWyAwY0VXGNGnh0SVAdFvbysaWCr6 vXn91rairbcSIYx4pEF6HIt8fmpEyL+1f8zMjQRIgARIgARIgARIgARIgARaSwCGiLZjTjAijGGB bYE0tVTU2tKR21BFBDsGn1caUZGyUFvUHK24NxGhdTB30GqkKVJW9rElmDLPWNE6I7pnXhiMlF3R /N8+akUYvHSxEd01r3Eryp9PdspZK7rDiC6b14gVZR/VD9++uyp6x7xay7zd9HBOjw5FL1wq+t15 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 EiABEiABEiABEiABEiCBxUFgYypaHG3J3wqaMjRlSiCgl3+GHfPxqgiDwPNfvkxJAiRAAiRAAiRA AiRAAiRAAiRAAr1LgKZMCZZE714urar5GiP64bzuMKJW5cx8SIAESIAESIAESIAESIAESIAESKBX CNCUoSlDAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiUQoClTAvRecexYTxIgARIgARIgARIgARIgARIg ARIggfYRoClDU4YESIAESIAESIAESIAESIAESIAESIAESiBAU6YE6O3z2JgzCZAACZAACZAACZAA CZAACZAACZBArxCgKUNThgRIgARIgARIgARIgARIgARIgARIgARKIEBTpgToveLYsZ4kQAIkQAIk QAIkQAIkQAIkQAIkQALtI0BThqYMCZAACZAACZAACZAACZAACZAACZAACZRAgKZMCdDb57ExZxIg ARIgARIgARIgARIgARIgARIggV4hQFOGpgwJkAAJkAAJkAAJkAAJkAAJkAAJkAAJlECApkwJ0HvF sWM9SYAESIAESIAESIAESIAESIAESIAE2keApgxNGRIgARIgARIgARIgARIgARIgARIgARIogQBN mRKgt89jY84kQAIkQAIkQAIkQAIkQAIkQAIkQAK9QoCmDE0ZEiABEiABEiABEiABEiABEiABEiAB EiiBAE2ZEqD3imPHepIACZAACZAACZAACZAACZAACZAACbSPAE0ZmjIkQAIkQAIkQAIkQAIkQAIk QAIkQAIkUAIBmjIlQG+fx8acSYAESIAESIAESIAESIAESIAESIAEeoUATRmaMiRAAiRAAiRAAiRA AiRAAiRAAiRAAiRQAgGaMiVA7xXHjvUkARIgARIgARIgARIgARIgARIgARJoHwGaMjRlSIAESIAE SIAESIAESIAESIAESIAESKAEAjRlSoDePo+NOZMACZAACZAACZAACZAACZAACZAACfQKAZoyNGVI gARIgARIgARIgARIgARIgARIgARIoAQCNGVKgN4rjh3rSQIkQAIkQAIkQAIkQAIkQAIkQAIk0D4C NGVoypAACZAACZAACZAACZAACZAACZAACZBACQRoypQAvX0eG3MmARIgARIgARIgARIgARIgARIg ARLoFQI0ZWjKkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEAJBGjKlAC9Vxw71pMESIAESIAESIAESIAE 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 a8q0DxlzJgESIAESIAESIAESIAESIAESIAESIIHiBGjKcJYvCZAACZAACZAACZAACZAACZAACZAA CZRAgKZMCdCLe2nMgQRIgARIgARIgARIgARIgARIgARIoNcJ0JShKUMCJEACJEACJEACJEACJEAC JEACJEACJRCgKVMC9F538lh/EiABEiABEiABEiABEiABEiABEiCB4gRoytCUIQESIAESIAESIAES IAESIAESIAESIIESCNCUKQF6cS+NOZAACZAACZAACZAACZAACZAACZAACfQ6AZoyNGVIgARIgARI gARIgARIgARIgARIgARIoAQCNGVKgN7rTh7rTwIkQAIkQAIkQAIkQAIkQAIkQAIkUJwATRmaMiRA AiRAAiRAAiRAAiRAAiRAAiRAAiRQAgGaMiVAL+6lMQcSIAESIAESIAESIAESIAESIAESIIFeJ0BT hqYMCZAACZAACZAACZAACZAACZAACZAACZRAgKZMCdB73clj/UmABEiABEiABEiABEiABEiABEiA BIoToClDU4YESIAESIAESIAESIAESIAESIAESIAESiBAU6YE6MW9NOZAAiRAAiRAAiRAAiRAAiRA AiRAAiTQ6wRoytCUIQESIAESIAESIAESIAESIAESIAESIIESCNCUKQF6rzt5rD8JkAAJkAAJkAAJ kAAJkAAJkAAJkEBxAjRlaMqQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQAkEaMqUAL24l8YcSIAESIAE SIAESIAESIAESIAESIAEep0ATRmaMiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRQAgGaMiVA73Unj/Un ARIgARIgARIgARIgARIgARIgARIoToCmDE0ZEiABEiABEiABEiABEiABEiABEiABEiiBAE2ZEqAX 99KYAwmQAAmQAAmQAAmQAAmQAAmQAAmQQK8ToClDU4YESIAESIAESIAESIAESIAESIAESIAESiBA U6YE6L3u5LH+JEACJEACJEACJEACJEACJEACJEACxQnQlKEpQwIkQAIkQAIkQAIkQAIkQAIkQAIk QAIlEKApUwL04l4acyABEiABEiABEiABEiABEiABEiABEuh1AjRlaMqQAAmQAAmQAAmQAAmQAAmQ AAmQAAmQQAkEaMqUAL3XnTzWnwRIgARIgARIgARIgARIgARIgARIoDgBmjI0ZUiABEiABEiABEiA BEiABEiABEiABEigBAI0ZUqAXtxLYw4kQAIkQAIkQAIkQAIkQAIkQAIkQAK9ToCmDE0ZEiABEiAB EiABEiABEiABEiABEiABEiiBAE2ZEqD3upPH+pMACZAACZAACZAACZAACZAACZAACRQnQFOGpgwJ kAAJkAAJkAAJkAAJkAAJkAAJkAAJlECApkwJ0It7acyBBEiABEiABEiABEiABEiABEiABEig1wnQ lKEpQwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIlEKApUwL0XnfyWH8SIAESIAESIAESIAESIAESIAES IIHiBGjK0JQhARIgARIgARIgARIgARIgARIgARIggRII0JQpAXpxL405kAAJkAAJkAAJkAAJkAAJ kAAJkAAJ9DoBmjI0ZUiABEiABEiABEiABEiABEiABEiABEigBAI0ZUqA3utOHutPAiRAAiRAAiRA AiRAAiRAAiRAAiRQnABNGZoyJEACJEACJEACJEACJEACJEACJEACJFACAZoyJUAv7qUxBxIgARIg ARIgARIgARIgARIgARIggV4nQFOGpgwJkAAJkAAJkAAJkAAJkAAJkAAJkAAJlECApkwJ0HvdyWP9 SYAESIAESIAESIAESIAESIAESIAEihOgKUNThgRIgARIgARIgARIgARIgARIgARIgARKIEBTpgTo xb005kACJEACJEACJEACJEACJEACJEACJNDrBGjK0JQhARIgARIgARIgARIgARIgARIgARIggRII 0JQpAXqvO3msPwmQAAmQAAmQAAmQAAmQAAmQAAmQQHECNGVoypAACZAACZAACZAACZAACZAACZAA CZBACQRoypQAvbiXxhxIgARIgARIgARIgARIgARIgARIgAR6nQBNGZoyJEACJEACJEACJEACJEAC JEACJEACJFACAZoyJUDvdSeP9ScBEiABEiABEiABEiABEiABEiABEihOgKYMTRkSIAESIAESIAES IAESIAESIAESIAESKIEATZkSoBf30pgDCZAACZAACZAACZAACZAACZAACZBArxOgKUNThgRIgARI gARIgARIgARIgARIgARIgARKIEBTpgTove7ksf4kQAIkQAIkQAIkQAIkQAIkQAIkQALFCdCUoSlD AiRAAiRAAiRAAiRAAiRAAiRAAiRAAiUQoClTAvTiXhpzIAESIAESIAESIAESIAESIAESIAES6HUC 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 dAJrGth7Ho9dCC8tPCcWnWGpdbiV647YhUXGBVzZTu3hGF5z5iQBEggnQFGmkgdo+AVgThIgARIg ARIgARIgARIgARIgARIggalJgKIMRRkSIAESIAESIAESIAESIAESIAESIAESqIEARZkaoE9N/Y+t JgESIAESIAESIAESIAESIAESIAESkAQoylCUIQESIAESIAESIAESIAESIAESIAESIIEaCFCUqQG6 VMUYJwESIAESIAESIAESIAESIAESIAESmJoEKMpQlCEBEiABEiABEiABEiABEiABEiABEiCBGghQ lKkB+tTU/9hqEiABEiABEiABEiABEiABEiABEiABSYCiDEUZEiABEiABEiABEiABEiABEiABEiAB EqiBAEWZGqBLVYxxEiABEiABEiABEiABEiABEiABEiCBqUmAogxFGRIgARIgARIgARIgARIgARIg ARIgARKogQBFmRqgT039j60mARIgARIgARIgARIgARIgARIgARKQBCjKUJQhARIgARIgARIgARIg ARIgARIgARIggRoIUJSpAbpUxRgnARIgARIgARIgARIgARIgARIgARKYmgQoylCUIQESIAESIAES IAESIAESIAESIAESIIEaCFCUqQH61NT/2GoSIAESIAESIAESIAESIAESIAESIAFJgKIMRRkSIAES IAESIAESIAESIAESIAESIAESqIEARZkaoEtVrF/iB9OD6aF4vwvp8diFfqk560kCJEACJEACJEAC IIDxzIZ0Q7rRkgkJkAAJkAAJ9AIBijI1iAsQNV62L9s1UXu/a8waszbpZgeak8xJrknPjc6NLrDP mmfN81E3z+4714nUhe1xFtKnzdNmRXS3vdve25hv59v7m6jnrnRXurvDA68N8YZ4o5HXbku6Jd3a 4bP4Wt2P6WvtWrs+WmQX2aQx186185q4RsvsMvt0cjw9nr4WF7dLM5f8w+MQFovPFf7f7vTA8vTC W8ScJEACJDBZCRxJj6RH4wuTC5NLDMYzS8wS80RPjGcmLfP4SBbAGSO0283tZqSRmMQ8HG2ON8db TJm2u9KrLL/VulVdn6rLb7W9zE8CJNApAhRlJpgKnohd2JSFzQa/nbUN2RnvjHeNDQgwLGj1F0OK TnWCkHJ6TZR5LXXhNnubvaMZQu9x+7hdmoS0tDgP+sO5ybnJhVaeF0ON4mN74b9V923ZxmNxFtKb 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 UJSpAXoV6hrLJAESIAESIAESIAESIAESIAESIAES6C8CFGUoypAACZAACZAACZAACZAACZAACZAA CZBADQQoytQAvb90O9aWBEiABEiABEiABEiABEiABEiABEY4z/4AAEAASURBVEigCgIUZSjKkAAJ kAAJkAAJkAAJkAAJkAAJkAAJkEANBCjK1AC9CnWNZZIACZAACZAACZAACZAACZAACZAACfQXAYoy FGVIgARIgARIgARIgARIgARIgARIgARIoAYCFGVqgN5fuh1rSwIkQAIkQAIkQAIkQAIkQAIkQAIk UAUBijIUZUiABEiABEiABEiABEiABEiABEiABEigBgIUZWqAXoW6xjJJgARIgARIgARIgARIgARI gARIgAT6iwBFGYoyJEACJEACJEACJEACJEACJEACJEACJFADAYoyNUDvL92OtSUBEiABEiABEiAB EiABEiABEiABEqiCAEUZijIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkUAMBijI1QK9CXWOZJEACJEAC JEACJEACJEACJEACJEAC/UWAogxFGRIgARIgARIgARIgARIgARIgARIgARKogQBFmRqg95dux9qS AAmQAAmQAAmQAAmQAAmQAAmQAAlUQYCiDEUZEiABEiABEiABEiABEiABEiABEiABEqiBAEWZGqBX oa6xTBIgARIgARIgARIgARIgARIgARIggf4iQFGGogwJkAAJkAAJkAAJkAAJkAAJkAAJkAAJ1ECA okwN0PtLt2NtSYAESIAESIAESIAESIAESIAESIAEqiBAUYaiDAmQAAmQAAmQAAmQAAmQAAmQAAmQ AAnUQICiTA3Qq1DXWCYJkAAJkAAJkAAJkAAJkAAJkAAJkEB/EaAoQ1GGBEiABEiABEiABEiABEiA BEiABEiABGogQFGmBuj9pduxtiRAAiRAAiRAAiRAAiRAAiRAAiRAAlUQoChDUYYESIAESIAESIAE SIAESIAESIAESIAEaiBAUaYG6FWoayyTBEiABEiABEiABEiABEiABEiABEigvwhQlKEoQwIkQAIk QAIkQAIkQAIkQAIkQAIkQAI1EKAoUwP0/tLtWFsSIAESIAESIAESIAESIAESIAESIIEqCFCUoShD AiRAAiRAAiRAAiRAAiRAAiRAAiRAAjUQoChTA/Qq1DWWSQIkQAIkQAIkQAIkQAIkQAIkQAIk0F8E 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 a2mRTrwl+SXI9+oj3zHH/DF/vJicdUw8NpSiEaJnhT63p+qpdIm8at3o22/L6k3z4vWp8Rn12ia/ yW/piNgoIlqKyeykL0FRZnbg2prImkOudmXSJrlHwsq4Hg32ioPGZVGiB6ssU/IFkUGvpfy9lYrd LebCJnO64ugcVEKo+Q9aszLQUqxgMrrdBanrqkKOe/+6CEGSQTDPOz2GGkpGCf8It3aXxoUwLtuQ abaiefyEb03PuCC33VD8f6tD+NO5EP5qdQjBtHJ9EZbdPTsGns01GfSonAH3vlgW8lEVtvjeX2jz bC1g1PK9QUsmPwQgAAEILB8CmopocYHe0/TuZCfVk6MhLx66uiwjwrvH2246X/gn167lULJ8gmjh koSzZv9E42IiqaL3RlpPcyL93fq79XkvXzlaRiQJRktjJj1iVb7uTV1XddCSQ6VPX4hJ9anmfRI9 tdBMPo/sojPJKKkSRk+Xu2g9VeQrRzY103y+jd6KcZWAKDOwNcG40FMOBCAAAQhAAAIQgAAEIAAB CEAAAsuZAKIMogwEIAABCEAAAhCAAAQgAAEIQAACEGiBAKJMC9CXswpI2yEAAQhAAAIQgAAEIAAB CEAAAhAQAUQZRBkIQAACEIAABCAAAQhAAAIQgAAEINACAUSZFqCjCEIAAhCAAAQgAAEIQAACEIAA BCAAAUQZRBkIQAACEIAABCAAAQhAAAIQgAAEINACAUSZFqCjBUIAAhCAAAQgAAEIQAACEIAABCAA AUQZRBkIQAACEIAABCAAAQhAAAIQgAAEINACAUSZFqCjBUIAAhCAAAQgAAEIQAACEIAABCAAAUQZ RBkIQAACEIAABCAAAQhAAAIQgAAEINACAUSZFqCjBUIAAhCAAAQgAAEIQAACEIAABCAAAUQZRBkI QAACEIAABCAAAQhAAAIQgAAEINACAUSZFqCjBUIAAhCAAAQgAAEIQAACEIAABCAAAUQZRBkIQAAC EIAABCAAAQhAAAIQgAAEINACAUSZFqCjBUIAAhCAAAQgAAEIQAACEIAABCAAAUQZRBkIQAACEIAA BCAAAQhAAAIQgAAEINACAUSZFqCjBUIAAhCAAAQgAAEIQAACEIAABCAAAUQZRBkIQAACEIAABCAA AQhAAAIQgAAEINACAUSZFqCjBUIAAhCAAAQgAAEIQAACEIAABCAAAUQZRBkIQAACEIAABCAAAQhA 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 xivKxM8xRJnx9iClQQACEGgmsKZaU13vmt8SBz36sH/Y7+k0X3fSRxevKPNp/Wn9Wak380HJK/+T 7kl3rBgvYVniLEwyix9br9saVr7y+1vu9/G2+qP6o/rj8nH3uDswr9+n/FP+6Wq8V2kuTRZSzRN7 2ws2fq+/198/P4o0c6G+UL9TXl9cX9zY9zZor9Icl7A4O/Ygkx7Jshsarr8kd8oKqXlULN6jy0KU udvd7b7dCYtG7i/i3+1uu7uvs9ltdls61xXXFTdc4tbaUGwobqnfLUOYnc5GlGm3L151Ifz8ihBG UAwWTv3Jr4UQxucON812zUIrfliG8NWvhDA6ybgERJlpjiiuBQEIQGBpEIhFGS0S1zf54X4nIQoM SnsxijKSAG6rbqs21Xaie2txa/HNUkuWzpZny3NOC1hkDfFt9223o2PzKy4RYVBuqfwSI+xV4pGz 9ESZt+u36wt9M6Zvum+62+dTlMabrgUvsWXKJr/Jb+lo+dK79bv1ez44Czjr9vq9vurEcsBuv9vv 7QxaN5V8Q3FDcVMfAaXYJUvn6/P1m/65bjhZ7PK7/MPzdpwofqe70909cB0GrXNO/kmMZMlesnaJ 264Zuu5fLVySRVvlKvd4994Od7c966rqqmqNO94NJ6qcFi2uPMtClMn/wvwPZQgn3An3TNfe5osW N7PmsQVRpt2b7XdWhRBLAEqRxPCHcyHIm8yfz4XwM5eHkDrrZy8PoWc6WE6ndbPQCsmdKSajpyPK TGcscRUIQAACS4lAPLX+vP68XvzLSBejKCO7Bjs9u93d7r41L58yzaNOS0vsuYprat18bvNRLanQ IguVqWm5pDd7RUSZZpL5R2XNEU/XH3APuIc6+siXKs13/153sTRzrj5Xv+FTZ8XpW/wWv7VPXrnH 3eO2dz6rQ4jz2xTV4brqumqdsyOk2QZE7ZJg8ax71j1Xjde+ZnIj+Xn3vDtZ2ZaGOdG1Tr5+LJk4 3nMhUsdi1tXF1cW1/u/LbvgS2nGZs5yCKJOc+sqnjB1Gin9UhjALnYoo01YvPOxCSIkFsnnZ60KI axjU/TfKX1oRQqqEv1gdQnzueFNmpxXhm8bpJM+3yxDkDGy43/EuLFIvsHxpvKOR0iAAAQjMGgFE mVnokQ/LbqjtRFr9kiPH2PpLxLFv9aMLJXf5u/y2vsm5nJXKMmK817JtmYV4W5YysoKxbG+pbqlu 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 VlWrqrUu31+Dyo9txk+70+61Ir/lOTnfq9+r3/c9C+Ou3cRgQlKqRi3ah/nUctE+z3TPG521ZQ5j YWFbrmW8rat5G469VnF5zLElKN4symgs7FVyjRyXP9qU4/64f7lnPaI7JZ/nIX/IP1vZlud7U5J1 hr1WHnnyaxcNrYxsObIsk91cipjkNntVvq+Wydw7ark2Ydl2yulvv79mKk2uDGxpip+vz9cXfIrV /EpHlLnCwlXKZTBgO1wErxMrvZ0Eqff2siLRuUs2f1fN7TQfjy1ZZKvb6h7o2GvlX0NiTTyx+hVl VEJwr3t7bWvJ8Vuu5avMLO21iseijOqKTfJybHNEQ0dl27rkCivmoJTg5efknJf8VcUdtVwIH3FH 3NERPwrY2n97WQhWELFxWbv82UwIYU/vncXfLw/hZ68Pwea08Z+8LoTwL/DdK8xMW3uztc6fzoRg 8/cbb0uUUTtjt2eaCdpDm98X+SqK5ZhNbpPb3Mkvh5wQgAAEILA4CUxSlNGiLn4bLF9+zUs+LeSO +WO+d6OujsdOPYWmRBn9z9UytdkLiZZY8l1in9lkMZF/xkrO7JLvjPiIXC3Rc0qYZB49XVsmla/8 3rE8e2iM7FO6fJ2kxDjLQVLgjdWN1QpnW6t4syijORnb14zKG6Btp41rXq2r1lUbelY08tHTLGqo bbG9Sb61S/dU2bpHFizCwRQSwprvF/UiFixEO8fFr5gHU4DjlYS/HJl48veObK/sljr1Ub9vzfPK jrUOxtZ8tvNzGF9CtvzpiS8KUeZB96B7uLCOteK4jKy0TSkWYjQJJJE0W77odKF4ESgpJLRke0c/ 07Ks0ZYK2YDYqaYSmt8wDCbKBLuVau7HI/x82E+1JPw0v1R0d/0VYYvNsULpak9Xh+7o016bEmUk lNiciou27G4ulBfKt53sR064E+7lIpw8tbVjr9K7l/Cv5aKLbx79/AX9dW1tr7q8y7QMp+vEVw2f csqFENuqWJElP371VSEErX3zFfoYt1b+a1Ll//rSEOKr8lPaFWVSVmMa3/BAdmcdZuaOQtKbRENZ xHTfCs75Pfqs5yNdK9lOfovyaZATAhCAAAQWJ4FJijIifHkrivGaof9felaUM1fZNcg2RAu8eEOH lsrN9iOxKKNy7NYDCS6yLNBz6Sl/yr9aaLOSLCPs05eW96Ndlsvf4vpqfTXb86SnevUiZ5jPD+sP 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 /tWeZ9Stbqt7uJPK35wezmx9qqe01F2jM5vizTsa8ZT01lZr1et4XSxJpZlJ87c6Pc3O85Tr9OZy pvNbRJmyeWC6Pr17bhhNha4y2nNtfPyzTE+t95nmunSK07piXbHe2wmXsmfpV5T5qAzBlqxzkfK3 WR1xR9zRS9CIRRnZ9ex1e92THX0uOnYqg5rfzEHfhqPBPymtAJRjyqt3BaPyQpJqZ1jeb09uYvrp K0II5oUHXFyCDkr/2soQYjlGKX86F0J8rU151oWw8uoQbDkqOZwjdj6Lsy3TxtsSZQKf95ydpYrH tmm2tc3xYCPzfGHnkso8W54tz11ijJpL41sIQAACEFg+BOyyX/87xuHoVzxjryjdk0BLyQT5zHVa k7bb6DN2c5sSZW6tbq3WuXxPDSo5thY/7U6714r8NufnvFhfrN/3sgRZfFro2k0MJiel6tWifZhP LRcXW7jw7Hy97543Om/L1GI71Yb8dPnNsXX1uw1HHnNsCYo3izIaC3uVXCPnt3ywnCf8Cf+dnvWI 7pR8nof9Yf9MZVue41NJ90WPdNWde/3al0lGic8VkpeZFBMJbbbNzV5a2m3tAX/AH+ohLKe//f6a iYZcGdi+K36+Pl9f8CliSysdUeYSC1fZGgQDtiNF8DqxxttJkHpvLysSnbtk83fV3E7z8diSRba4 Le6hjr1W/jUk1sQTq19RRiUE97q31LaWHL/lWr7KzNJeq3gsyqiueCtKjm2OaOiobFtXsxodvPy8 vOAl/9bi9louhI+6o+7YWB4I1LvfXhWCFURsXNYufzwXQtjTe0fxV9eE8AtXh2Bz2vhXrwoh/At8 7xIz086BZmudP5oLwebvN96WKKN2aqzt6CuunbT5fZGvoliO2eg2uk2d/HLICQEIQAACy5PAJEUZ LSnjt8Hy5de84NQGqOP+uO/dqKvjseOn0JQoo/+2WqA2+x/R4kpeS+z/a9lK5J+ukj+v5EEjXspq iZ5fzmRy6unakql85feN5dlDI2Wf0uXkOBbj4r5LCryuuq5a7WxrFW8WZTQne0SKIshPo/IGGLdW KZpd8sBi2ywfPboXUteqbbHVSb4HIgmdtl61RPdUql6ld0+krddX66v5nrWYRKXma0U7GAGcqCT5 5QjEbbVWtld2S52I6feteV5ZDjoYW/PZMh/Gl5Atf3riy0KU2ea2uUcK61grjsvIStuUYiFGk0AS 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 NAyYbUO4bbCUsUTaiIcfF+9WrQihUYdJfnnl5SE84kJoowehzmnoxb+6KoQkpiG+eNGFMFq2wepp dc/vzGhFmfh3DFFmtCNIaRCAAARyCKyuVlc3u+ZnxX6/3el3+t2dnNrHl2fpijKf1p/Wn5V6Pu+X vPIfcUfc0WK0bGWJs7jULH5iw25bWPnK72t53Efb64/rj+tPSskK+nzWP+ufq0ZbS3NpspBqXt7b UbDxh/xD/pH5fqWZm4ubi9t6ngBtmf3GK1e5p0Y8G5uJpb4d9xw+7A67Z4rBRkpC55n6TP2GT7V/ qacvC1HmG+4b7pudsGnkkSL+3Oq2uoc797h73MbOTcVNxS2XuM3WFeuKO+uLZQjTM+SIMu2Oxesu hF9aEcIQisHipT91eQhhfm5zk+zXNPTiR2UIX74shOFJxiUgykxyRlEXBCAAgVkiEIsy2iqud/KD fY5DFOiX+VIUZSQB3F3dXW2o7dL3ruKu4uultiydLc+W55w2sMga4pvum25bx+ZXfLQWChIjbC3x zJk9Uead+p363Z5109fd19298/3OxsHya9tLbCclSxZtX7pYX6zf98FlwFm3x+/xVScWBXb5XX5P J6cNel61o7y2WFvcWW52m93WzmCfz7vn3YtFTu3jzjOOOSzBS9YulpviWqHrztXGJdmySajSfW2v uq66rlrtji2E49W4aUy+/GUhyuS/Yf7nMoTj7rh7fsHe5vMWN9PmsQVRZvI3jK3xd1aFEEsASpHE 8PtzIcibzJ/NhfBzV4WQuurnrwqhazpY2rrGF5+GXkjuTDEZPh1RZnzzh5IhAAEIzDaBeGn9/fr7 9dLfTLoURRnZNdhF2r3uXnf/vHzKNM/DvX6vryp7reJatDdf2/ytNlZoq4XKvKW4pbjdS3qzNSLK NJPM/1Y2HfGi/VH3qHu8I+kkVZpf+HvDxdLMufpc/aZPXaV0yYJ2TA+4A+7Q2CUV9UiCxQvuBfdi NVp/K+Obwy+5l9yJnvvu/2/v3GLtOtI6T3dnQoBIGIQGD9KwLQFC9ANzkBBo0MAyT4PQMIOYeWIk aoTQcBmkEWgkHga01A/AqDOJk3QuduJkd9xxt9MxzsXtxM5tJXbbcS5OnIudeyqxc793J92h6YE1 p9b/oP526tRyrX1b+/j8Tklbpdq16vKrWvus+q+vvgprooudvPy0025ciNT7/D6/f2iZX1hcWFzs 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 QAACEIAABCAAAQhAAAIQgAAEeiCAKNMDdBRBCEAAAhCAAAQgAAEIQAACEIAABCCAKIMoAwEIQAAC EIAABCAAAQhAAAIQgAAEeiCAKNMDdLRACEAAAhCAAAQgAAEIQAACEIAABCCAKIMoAwEIQAACEIAA BCAAAQhAAAIQgAAEeiCAKNMDdLRACEAAAhCAAAQgAAEIQAACEIAABCCAKIMoAwEIQAACEIAABCAA AQhAAAIQgAAEeiCAKNMDdLRACEAAAhCAAAQgAAEIQAACEIAABCCAKIMoAwEIQAACEIAABCAAAQhA AAIQgAAEeiCAKNMDdLRACEAAAhCAAAQgAAEIQAACEIAABCCAKIMoAwEIQAACEIAABCAAAQhAAAIQ gAAEeiCAKNMDdLRACEAAAhCAAAQgAAEIQAACEIAABCCAKIMoAwEIQAACEIAABCAAAQhAAAIQgAAE eiCAKNMDdLRACEAAAhCAAAQgAAEIQAACEIAABCCAKIMoAwEIQAACEIAABCAAAQhAAAIQgAAEeiCA KNMDdLRACEAAAhCAAAQgAAEIQAACEIAABCCAKIMoAwEIQAACEIAABCAAAQhAAAIQgAAEeiCAKNMD dLRACEAAAhCAAAQgAAEIQAACEIAABCCAKIMoAwEIQAACEIAABCAAAQhAAAIQgAAEeiCAKNMDdLRA CEAAAhCAAAQgAAEIQAACEIAABCCAKIMoAwEIQAACEIAABCAAAQhAAAIQgAAEeiCAKNMDdLRACEAA AhCAAAQgAAEIQAACEIAABCCAKIMoAwEIQAACEIAABCAAAQhAAAIQgAAEeiCAKNMDdLRACEAAAhCA AAQgAAEIQAACEIAABCCAKIMoAwEIQAACEIAABCAAAQhAAAIQgAAEeiCAKNMDdLRACEAAAhCAAAQg AAEIQAACEIAABCCAKIMoAwEIQAACEIAABCAAAQhAAAIQgAAEeiCAKNMDdLRACEAAAhCAAAQgAAEI QAACEIAABCCAKIMoAwEIQAACEIAABCAAAQhAAAIQgAAEeiCAKNMD9Glpge+V75Xvu88Xny8u9Prc 5Xa5GwfTKp9yxiPwQRnCARfCFUUIf7E5hP9bhHCzC+HlMoTxyucqCEAAAhCAAAQgMAmBd+t36/fK s+MZ8u/L5VA/555zz1fH/DH/aHHYH/b3V4/6R/1j1an6VH3a/1MdwiTEuHatEHi7fLt8xz29HJ6p 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 " + id="image1" + x="1610.6715" + y="959.13324" + clip-path="url(#clipPath1)" /> diff --git a/docs/loop-3/img/insulin-event-detail-bolus.svg b/docs/loop-3/img/insulin-event-detail-bolus.svg new file mode 100644 index 00000000000..70f5a651091 --- /dev/null +++ b/docs/loop-3/img/insulin-event-detail-bolus.svg @@ -0,0 +1,236 @@ + +image/svg+xml diff --git a/docs/loop-3/img/insulin-event-detail-tbr.svg b/docs/loop-3/img/insulin-event-detail-tbr.svg new file mode 100644 index 00000000000..55e90f0d086 --- /dev/null +++ b/docs/loop-3/img/insulin-event-detail-tbr.svg @@ -0,0 +1,332 @@ + +image/svg+xml diff --git a/docs/loop-3/img/liveactivity-bottom-row.svg b/docs/loop-3/img/liveactivity-bottom-row.svg new file mode 100644 index 00000000000..dab621e293e --- /dev/null +++ b/docs/loop-3/img/liveactivity-bottom-row.svg @@ -0,0 +1,92 @@ + + + + diff --git a/docs/loop-3/img/liveactivity-enable.svg b/docs/loop-3/img/liveactivity-enable.svg new file mode 100644 index 00000000000..bd3ae8378ec --- /dev/null +++ b/docs/loop-3/img/liveactivity-enable.svg @@ -0,0 +1,117 @@ + + + + diff --git a/docs/loop-3/img/liveactivity-glucose-color.png b/docs/loop-3/img/liveactivity-glucose-color.png new file mode 100644 index 00000000000..2d0992b6a30 Binary files /dev/null and b/docs/loop-3/img/liveactivity-glucose-color.png differ diff --git a/docs/loop-3/img/liveactivity-lock-car.png b/docs/loop-3/img/liveactivity-lock-car.png new file mode 100644 index 00000000000..f70a0a8f951 Binary files /dev/null and b/docs/loop-3/img/liveactivity-lock-car.png differ diff --git a/docs/loop-3/img/medtrum-connected.svg b/docs/loop-3/img/medtrum-connected.svg new file mode 100644 index 00000000000..e29ca3fedf7 --- /dev/null +++ b/docs/loop-3/img/medtrum-connected.svg @@ -0,0 +1,338 @@ + +image/svg+xml diff --git a/docs/loop-3/img/medtrum-device-details.svg b/docs/loop-3/img/medtrum-device-details.svg new file mode 100644 index 00000000000..ec432052f98 --- /dev/null +++ b/docs/loop-3/img/medtrum-device-details.svg @@ -0,0 +1,15384 @@ + +image/svg+xml diff --git a/docs/loop-3/img/medtrum-disconnected.svg b/docs/loop-3/img/medtrum-disconnected.svg new file mode 100644 index 00000000000..8bffc817d00 --- /dev/null +++ b/docs/loop-3/img/medtrum-disconnected.svg @@ -0,0 +1,311 @@ + +image/svg+xml diff --git a/docs/loop-3/img/medtrum-extended.svg b/docs/loop-3/img/medtrum-extended.svg new file mode 100644 index 00000000000..460875f490a --- /dev/null +++ b/docs/loop-3/img/medtrum-extended.svg @@ -0,0 +1,262 @@ + +image/svg+xml diff --git a/docs/loop-3/img/medtrum-ref.JPG b/docs/loop-3/img/medtrum-ref.JPG new file mode 100644 index 00000000000..b0edbadc7c3 Binary files /dev/null and b/docs/loop-3/img/medtrum-ref.JPG differ diff --git a/docs/loop-3/img/medtrum-screen.svg b/docs/loop-3/img/medtrum-screen.svg new file mode 100644 index 00000000000..c7d88d57a3d --- /dev/null +++ b/docs/loop-3/img/medtrum-screen.svg @@ -0,0 +1,330 @@ + +image/svg+xml diff --git a/docs/loop-3/img/medtrum-sn.png b/docs/loop-3/img/medtrum-sn.png new file mode 100644 index 00000000000..5b2a8ffaefc Binary files /dev/null and b/docs/loop-3/img/medtrum-sn.png differ diff --git a/docs/loop-3/img/medtrum-total.png b/docs/loop-3/img/medtrum-total.png new file mode 100644 index 00000000000..812f6c680c7 Binary files /dev/null and b/docs/loop-3/img/medtrum-total.png differ diff --git a/docs/loop-3/img/omnible-keep-alive-options.svg b/docs/loop-3/img/omnible-keep-alive-options.svg new file mode 100644 index 00000000000..0033fdb36e6 --- /dev/null +++ b/docs/loop-3/img/omnible-keep-alive-options.svg @@ -0,0 +1,7779 @@ + +image/svg+xml diff --git a/docs/loop-3/img/patch-activation-flow.svg b/docs/loop-3/img/patch-activation-flow.svg new file mode 100644 index 00000000000..2b8ad36e083 --- /dev/null +++ b/docs/loop-3/img/patch-activation-flow.svg @@ -0,0 +1,303 @@ + +image/svg+xml diff --git a/docs/loop-3/img/patch-status-details.svg b/docs/loop-3/img/patch-status-details.svg new file mode 100644 index 00000000000..b34fbd00237 --- /dev/null +++ b/docs/loop-3/img/patch-status-details.svg @@ -0,0 +1,322 @@ + +image/svg+xmlCommon diff --git a/docs/loop-3/medtrum.md b/docs/loop-3/medtrum.md new file mode 100644 index 00000000000..42773ccfadf --- /dev/null +++ b/docs/loop-3/medtrum.md @@ -0,0 +1,344 @@ +!!! warning "🚧 Documentation Under Construction 🚧" + + This page is under development. + + The addition of the Medtrum Nano pump to iOS Open-Source Automated Insulin Delivery systems is new. + + Please review the [MedtrumKit Issues](https://github.com/jbr7rr/MedtrumKit/issues) page for open issues reported for the MedtrumKit Pump Manager. In a few cases, the documentation on this page may anticipate some of the fixes planned for those minor issues. + +## Medtrum Nano Pump + +The Medtrum Nano Pump is supported using the *Loop* app built with a feature branch. See [Feature Branches](../version/development.md#how-to-build-feature-branches){: target="_blank" } for building instructions. + +* The pump patch is designed to be changed every 3 days +* The pump base is reusable - do not accidentally discard the base after removing the patch +* Versions 200U (MD0201 & MD8201) and 300U (MD8301) are supported + +### Testing Medtrum with the *Loop* App + +* The branch needed to get Medtrum 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. + +- - - + +## Medtrum Nano Screen + +The Medtrum Nano screen, shown in the graphic below, displays the patch status along with various options for adjusting settings. + +![consolidated view of the status and command screen for Metrum Nano pumps](img/medtrum-screen.svg){width="300"} +{align="center"} + +### Patch Life + +There is an 8-hour grace period following expiration. + +* Normal Life + * Patch expires at 72 hours + * Patch stops delivery at 80 hours + +!!! important "" + The patch can be operated with the [Extended Lifetime Setting](#extended-lifetime-setting), but this is not recommended. + +### Patch Summary + +There is a summary of the patch status at the top of the screen. + +* Just below the graphic of a Nano pump is an "Expires in:" line showing a graphical representaion of how long the patch has been operating and includes a text string reporting duration until expiration + * The solid bar is proportional to patch hours from activation through expiration + * It is blue for at least the first 48 hours + * The line turns orange to warn the patch is within 24 hours of expiration + * When the patch expires, the line turns red and the text indicates how much time until No Delivery + * The warning orange and red lifecycle lines also appear in the [HUD Pump Status](displays-v3.md#pump-status-icon){: target="_blank" } icon at the top of the *Loop* main screen +* The left side of the next row reports the current (absolute) basal rate +* The right side of the next row reports the reservoir level + +### Patch Alerts + +If [Patch Errors and Alerts](#patch-error-messages) occur, they will show up just below the Patch Summary. + +## Actions + +### Suspend Delivery + +Tapping on `Suspend Delivery` halts all insulin delivery from the patch for a duration of 2 hours. You can resume insulin delivery before that by tapping on resume delivery. + +* The user is alerted that pump is suspended by an icon on the OS-AID main screen header. +* The patch itself might vibrate or beep every 15 minutes + +![pump status icon when suspended](img/pump-alert-suspended.svg){width="150"} +{align="center"} + +* For the *Loop* app, the [HUD Status Row](displays-v3.md#hud-status-row){: target="_blank" } message can be tapped to resume delivery. + +![status row message when pump is suspended](img/status-row-pump-suspended.svg){width="300"} +{align="center"} + +#### No Manual Bolus While Patch is Suspended + +If you request a manual bolus with *Loop* while a patch is suspended, *Loop* will send a notification that Bolus Failed with instructions that Pump is Suspended, Resume Delivery. In other words, you must resume delivery before you will be allowed to bolus with pods. + +### Stop Temp Basal + +If a temporary basal rate is currently active, the Stop Temp Basal button is provided to immediately cancel that temporary basal and restore scheduled basal delivery. + +The graphic below shows a nominal display with scheduled basal running on the left and temporary basal running on the right. + +![Medtrum Nano screen when connected](img/medtrum-connected.svg){width="600"} +{align="center"} + +### Sync Patch Data + +If the last sync was in the far past, you can force an immediate sync by tapping on Sync patch data. + +!!! info "Items Updated by Sync" + * Patch state (active, reservoir empty, fault, etc) + * Patch datetime + * Reservoir levels + * Bolus/basal state + * Patch battery voltage + * Patch starttime + + +### Disconnect or Reconnect + +The Nano pump is normally always connected to the phone with Bluetooth. The action button will show Disconnect and the Status will report Connected with a green dot. (See [Stop Temp Basal](#stop-temp-basal) for example screenshots.) + +If you wanted to disconnect Bluetooth, tap on Disconnect and the display modifies as shown below. The action button will show Reconnect and the Status will report Disconnected with a red dot. + +![Medtrum Nano screen when disconnected](img/medtrum-disconnected.svg){width="400"} +{align="center"} + +If the phone and pump are within Bluetooth range, the app will reconnect them almost immediately. + +When the phone and pump are separated, the app will report Bluetooth is disconnected. It should reconnect promptly when the phone and pump are within range again. The Reconnect row allows you to hurry the process if desired. + +### Deactivate Patch + +The Deactivate Patch should only be tapped when you are ready to halt insulin permanently and remove the patch. Once you select this row, you are asked if you want to deactivate and then you must provide authentication to do so. + +Once the patch is deactivated, use the Medtrum-provided tool to retract the needle before removing the patch. Remove the patch and then promptly remove the pump base (brain) from the patch and put it in a safe place. The easiest way to remove the base is to turn the patch upside down and gently press on the plastic tab to release the base. + +### Patch State + +The Patch State refers to the patch itself, whereas [Status](#status) refers to the Bluetooth status. + +The icon shown in the *Loop* main screen may not be as specific as the string in the Patch State row. So if you see Patch Error with the stop sign on the main screen, tap on the icon to determine the exact issue. + +* **Active** (normal operation) +* **Fault** +* **Occlusion** +* **Battery Empty** +* **Suspended** (usually a manual action) +* **Suspended - Hourly max** (insulin delivered in the last hour exceeds patch setting) +* **Suspended - Daily max** (insulin delivered since midnight exceeds patch setting) +* **Expired** + +The Suspended states can be updated by resuming, or modifying the hourly or daily maximum values in [Patch Settings](#patch-settings) and then clearing the alert. + + +### Status + +The Status row reports the Bluetooth status: + +* **Connected** (normal configuration) +* **Disconnected** (out of Bluetooth range) +* **Reconnecting...** (after tap on Reconnect) + +- - - + +## Configuration + +The configuration section displays: + +* [**Insulin Type**](#insulin-type) shows the Insulin Brand selected; be sure to modify this between patches if you change your insulin +* [**Patch Settings**](#patch-settings) tap on this row to modify settings for the patch + + +### Insulin Type + +You selected [Insulin Type](add-pump.md#insulin-type){: target="_blank"} when connecting to this pump. + +Tap on this row if you switch to a different type of insulin. + +* The model used by *Loop* for all the rapid insulin brands are the same, but it's a good idea to record if you change brands - some people notice differences +* If you switch between rapid and ultra-rapid insulin, you need to let *Loop* know so it will use the appropriate model + +### Patch Settings + +Typically the default Patch Settings are selected during onboarding of the Medtrum Nano pump. However, you can modify these setting during or between pods. + +Any changes made to Patch Settings after onboarding requires authentication to be saved. + +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 (measured since midnight). +1. **Alarm setting**: The Medtrum Nano has the ability to make a beep if 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 is recommended to ensures the functioning of the patch and cannula. You can disable this limit but it is not recommended. See [Extended Lifetime Setting](#extended-lifetime-setting) for more information. +1. **Notification for expiration**: If the **Patch lifetime** setting is set to normal lifetime, you have the ability to update this setting. You can control at what point the patch will alert you that patch is nearing expiration. +1. **Notification for low reservoir**: You can select the reservoir level at which you want to be notified or disable the notification. + + +- - - + +## Information + +The next section on the Medtrum Nano screen reports information about the current patch and the previous patch: + +* **Cannula Age**: Time since the cannula was inserted (coming soon) +* **Activation**: Time at which patch was Activated +* **Expiration:** Time at which patch will Expire (8 hours before No Delivery time) +* **No Delivery**: Time at which patch will stop delivering insulin + * If using extended life, please read [Extended Lifetime Setting](#extended-lifetime-setting) + * If a Patch Fault was detected, this will give the time at which the fault was detected +* Access to [**Patch Details**](#patch-details) +* Access to [**Previous Patch Details**](#previous-patch-details) + +#### Patch Details + +Some additional details for the most recent patch are provided by tapping on this row. + +Some items reported: + +* Pump base serial number +* Pump base firmware version +* Pump base model +* Battery level (V) +* Insulin used (U) + +#### Previous Patch Details + +When you tap on the `Previous Patch Details` row, summary information is displayed about the patch before the one currently in use. + +## Patch Time + +Click on [Time Zone](displays-v3.md#time-zone){: target="_blank" } to understand how *Loop* treats "pump" time for pods. + +When the Pump time zone matches the phone time zone, the Pump Time is displayed with black font. + +When the phone time zone and pump time zone do not match, there is a clock icon on the main screen in the Pump Status Icon of the HUD. + +* Tap on the Pump Status Icon in the HUD (top red rectangle in graphic below) +* Information about Time Change is provided on the Nano screen +* The Pump Time displays the clock icon and yellow font + * The `Sync to Current Time` row appears + * Tap on the `Sync to Current Time` row to choose whether to make Pump Time match Phone Time or not (bottom red rectangle in graphic below) + +🚧 TODO: The graphic below will be prepared later 🚧 + +![graphic showing display when Medtrum Nano pump and phone time do not match](img/medtrum-timezone.svg){width="600"} +{align="center"} + +### Other Time Changes + +What about other time changes? Suppose the iOS -> General -> Time & Date is modified to manually change the time, but the time zone is not adjusted. (Sometimes this is done to defeat limits on games. **Do Not** do this on an OS-AID phone. If you have an "old" glucose reading in the "future" - *Loop* will not predict correctly which may have dangerous consequences.) There will not be an obvious display in the main display or Nano screen (which keys off time zone) but you will get regular warnings that phone does not have automatic time set. + +> When automatic time is disabled on the iPhone settings, *Loop* will not automatically modify insulin delivery and the pump will revert to scheduled basal after the last temporary basal rate duration completes. + +The *Loop* app will display this warning modal screen if it detects a problem with the Phone time. It leaves it up the user to decide what action should be taken. To make this warning stop, go to iOS -> General -> Time & Date and enable Set Automatically. + +![graphic warning user of a problem with the time on the phone](img/omnipod-time-change.svg){width="300"} +{align="center"} + +- - - + +## Prepare Patch + +!!! danger "Attach Pump Base Before Filling the Pump Patch with Insulin" + Make sure the pump base matches the patch. + + * 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 with that base if they do not match + + ![Medtrum REF](img/medtrum-ref.JPG){width="450"} + {align="center"} + + +### Activation flow + +!!! warning "IMPORTANT" + Connect your pump base to the patch before adding insulin to your patch. + Otherwise, you might corrupt the activation flow. + + +!!! abstract "" + The graphics walk you through each step of the filling, pairing, priming, attaching and insertion process. + + You will probably need to scroll up or down to see all the instructions on your phone. + +![activate a new patch](img/patch-activation-flow.svg){width="500"} +{align="center"} + +After the serial number prompt: + +1. Attach the base to the patch and then tap on Continue +2. Follow the visual guide in the *OS-AID* app to pull out air and fill the patch with insulin +3. Press "Start priming" to start priming the patch + +It is important to not attach the patch on your body before the priming process completes. + +!!! warning "IMPORTANT" + While the priming is running, DO NOT USE THE CANCEL BUTTON. + This might corrupt the activation flow, so please be patient while the priming process is running. + +After priming, follow the rest of the visual guide in the *OS-AID* app . +From here, you can attach the patch to your body and complete the activation process. + +* Do not forget to insert the cannula manually +* Press firmly until you feel and hear a click - make sure the cannula stays inserted when you let go +* Tap on activate and in a few seconds you will see the nominal [Medtrum Nano Screen](#medtrum-nano-screen) + +- - - + +## Patch Error Messages + +🚧 TODO: This section is under construction 🚧 + +Most Patch Error messages are for information and there is no action that can be taken other than to replace the patch. (This statement needs review) + +There are two states that can be handled by taking the appropriate action. + +### Alert: Suspended - Hourly Max + +The patch has an internal setting for the maximum amount of total insulin that can be delivered per hour. If this is exceeded then the patch indicates an alert and suspends insulin delivery. + +* Consider if there might be a cannula issue if your **Max hourly insulin** is reasonable and you do not think you should exceed that amount + * Remember to include scheduled basal rate, temporary basal rate and any boluses for that hour +* Go to the [Patch Settings](#patch-settings) + * Examine the current value for **Max hourly insulin** + * You can modify that value to a larger amount and save it + * Once a larger amount is saved, you can then return to the Nano screen and clear the alert at the top of the screen + * Insulin Delivery should resume providing normal close-loop operation + + +### Alert: Suspended - Daily max + +The patch has an internal setting for the maximum amount of total insulin that can be delivered in a day. If this is exceeded then the patch indicates an alert and suspends insulin delivery. Note that the insulin delivery is calculated from midnight local time. + +* Consider if there might be a cannula issue if your **Max daily insulin** is reasonable and you do not think you should exceed that amount + * Remember to include scheduled basal rate, temporary basal rate and any boluses for that day +* Go to the [Patch Settings](#patch-settings) + * Examine the current value for **Max daily insulin** + * You can modify that value to a larger amount and save it + * Once a larger amount is saved, you can then return to the Nano screen and clear the alert at the top of the screen + * Insulin Delivery should resume providing normal close-loop operation + +- - - + +## Extended Lifetime Setting + +!!! warning "Extended Life" + The Medtrum Nano allows operation using Extended Life, although this is not recommended. + + New firmware stictly limits delivery after 120 hours. After 120 hours, the patch will continue delivering scheduled basal rates until the batteries die. + + The OS-AID pump manager assumes this 120-hour limit is enforced and provides suitable messages. Older Medtrum brains might allow full operation to continue. Please be exceedly cautious if you choose to extend your pump operation past the recommended 80 hours. + + +* Exended Life + * Patch expires at 112 hours (this is an OS-AID notation) + * Patch might stop accepting bolus or temporary basal rate commands at 120 hours + +![extended life warning](img/medtrum-extended.svg){width="300"} +{align="center"} diff --git a/docs/loop-3/omnipod.md b/docs/loop-3/omnipod.md index f33ccf455eb..c2443aceefd 100644 --- a/docs/loop-3/omnipod.md +++ b/docs/loop-3/omnipod.md @@ -10,7 +10,7 @@ The information and user interface for Omnipod (Eros) and DASH pods is the same, If you overfill the pods, you may get a pod fault right after priming. !!! info "Pod Filling and Insertion" - The Pod filling and insertion instructions are the same with the Loop app as they are for the PDM. These videos: [Filling a Pod with Insulin](https://youtu.be/qJBN6rlvn_Y){: target="_blank" } and [Inserting the Cannula](https://youtu.be/ss1vpsmaLoI){: target="_blank" }, may be useful. + The Pod filling and insertion instructions are the same with the Loop app as they are for the PDM. These videos: [Filling a Pod with Insulin](https://youtu.be/qJBN6rlvn_Y) and [Inserting the Cannula](https://youtu.be/ss1vpsmaLoI), may be useful. For DASH Pods: @@ -36,7 +36,7 @@ Graphic below shows the Pair Pod screen for Omnipod (left) and Omnipod DASH (rig It makes sure you are really ready to do the insertion. - Please watch the [video of the *Loop* app screen when pairing a DASH pod](https://drive.google.com/file/d/1mN5s8-oorvoa-gbjAaYbnUnl_-vvuhNC/view?usp=sharing){: target="_blank" } to see the full process before pairing your first pod. In this video, once the pod starts priming, you may want to skip forward (it takes about a minute to prime). + Please watch the [video of the *Loop* app screen when pairing a DASH pod](https://drive.google.com/file/d/1mN5s8-oorvoa-gbjAaYbnUnl_-vvuhNC/view?usp=sharing) to see the full process before pairing your first pod. In this video, once the pod starts priming, you may want to skip forward (it takes about a minute to prime). !!! danger "Keep Gear Close" * Make sure the phone (and RileyLink if using one) are close to the pod before you tap Pair Pod @@ -110,7 +110,7 @@ Pods start reporting reservoir values when 50 U are left. | 0 U|Pod will attempt to deliver up to 4 U after it reports 0 U.

This is not guaranteed. The pod senses when it is not successful delivering pulses and that can happen before 4 U have been delivered.| -## Activity +## Actions ### Suspend Delivery @@ -384,4 +384,77 @@ The fault will appear on the Omnipod screen and more details will be shown when The fault information can still be found under [Previous Pod Details](#previous-pod-details) if you need to find it after you Deactivate the "screaming" pod. +- - - +## Pod Keep Alive Feature + +No better solution has been found for dealing with Atlas pods with iPhone 16 (all models) and iPhone 17e. Therefore, the features previously found just in the `feat/pod-keep-alive` branch of LoopWorkspace are part of the released code as of version 3.14.0. + +There is a new "Pod Keep Alive" option at the bottom of the "Omnipod DASH" screen. This is intended to assist users who have both an iPhone 16 (all models) or 17e and [DASH pods with a InPlay BLE (Atlas) board](../faqs/omnipod-faqs.md#atlas-or-inplay-dash-pods){: target="_blank" }. Model 17 phones, except for the 17e, do not exhibit this problem. No action is taken automatically unless both these cases are detected to be true. + +It was tested for LoopWorkspace and Trio. + +The concept is by choosing one of the Pod Keep Alive choices, the app sends a getStatus to the pod before the 3 minute disconnect happens. Therefore, so long as you and the pod stay close to the phone, the pod will be connected for any command (either manual or automatic) including bolus, temp basal, modify scheduled basal rates, suspend, or deactivate. + +The selection for Pod Keep Alive is found at the bottom of the Pod settings screen. + +The default value is Disabled. The graphic below shows the Pod Keep Alive screen that allows the user to choose an option. + +![Options available for Pod Keep Alive](img/omnible-keep-alive-options.svg){width="650"} +{align="center"} + +There are 4 choices for Pod Keep Alive: + +1. [Disabled](#disabled) (default) +2. [When Open](#when-open) +3. [Silent Tune](#silent-tune) +4. [RileyLink](#rileylink) + +### Disabled + +When Pod Keep Alive is disabled, the code behavior is unchanged from the nominal OmniBLE code. + +!!! warning "Automatic Change for iPhone 16 or 17e and Atlas DASH pod" + If your app has Pod Keep Alive set to disabled and you have an **iPhone 16** or **iPhone 17e** and the pod you just paired is an **InPlay (Atlas) pod**, the configuration **automatically** switches to **When Open**. + + The Pod Keep Alive configuration remains at **When Open** until you change it manually. + +All three criteria must be true or no automatic change to the setting takes place: + +* iPhone 16 (any model) or iPhone 17e +* pair a new pod that is InPlay BLE (Atlas) +* Pod Keep Alive is Disabled + +Note that during the time from pair to insert, the app keeps the screen open and unlocked unless you manually lock it. + +This means you can take all the time you need between pair/prime and insert. As long as you don't manually lock the phone or move it out of range of the pod, the pod stays connected until you insert the cannula. + +Once the pod is inserted, the phone auto-lock timing is restored to the value the user has selected. + +### When Open + +When the app is open, it will send a getStatus to the pod 2:40 (mm:ss) after the last pod message was exchanged. This means the pod does not disconnect from BLE and remains available to the phone. + +This is true as long as the phone and pod are in-range while the app is open with phone unlocked. + +> If the pod moves out of Bluetooth range, the pod disconnects. With iPhone 16 or 17e it might take several seconds to minutes before the app reconnects to the pod once it is back in range. This can cause disruptions until the reconnect happens. + +### Silent Tune + +A silent tune is played in the background which keeps the app alive even when the phone is locked. This will increase the battery usage on the phone. + +While Silent Tune is selected, the app will send a getStatus to the pod 2:40 (mm:ss) after the last pod message was exchanged. This means the pod does not disconnect from BLE and remains available for commands from the app so long as the phone and pod stay within Bluetooth range. + +> If the pod moves out of Bluetooth range, the pod disconnects. With iPhone 16 or 17e it might take several seconds to minutes before the app reconnects to the pod once it is back in range. This can cause disruptions until the reconnect happens. + +### RileyLink + +For those who have a RileyLink (OrangeLink, EmaLink, etc), you can use that instead of the Silent Tune but you must keep the link with the phone. + +While RileyLink is selected, the app is triggered by the RileyLink one minute heartbeat. The app will send a getStatus to the pod 2:00 (mm:ss) after the last pod message was exchanged. This means the pod does not disconnect from BLE and remains available for commands from the app so long as the phone and pod stay within Bluetooth range. + +> If the pod moves out of Bluetooth range, the pod disconnects. With iPhone 16 or 17e it might take several seconds to minutes before the app reconnects to the pod once it is back in range. This can cause disruptions until the reconnect happens. + +> If the phone moves out of RileyLink range, then the app is not triggered by the RileyLink heartbeat and the pod disconnects from BLE at the 3 minute cadence. With iPhone 16 or 17e it might take several seconds to minutes before the app reconnects to the pod once it is back in range. This can cause disruptions until the reconnect happens. + +- - - \ No newline at end of file diff --git a/docs/loop-3/onboarding.md b/docs/loop-3/onboarding.md index 24b7aa1c06e..a21ed513b20 100644 --- a/docs/loop-3/onboarding.md +++ b/docs/loop-3/onboarding.md @@ -46,7 +46,7 @@ Each onboarding step is presented in order on this page. Please follow this docu !!! abstract "Settings Help" Please stay in Open Loop until you verify that your settings (basal rates, insulin sensitivity, carb ratio, etc) are properly adjusted to work with the Loop algorithm. You may need time to evaluate and perhaps identify settings to adjust. - If you need help with your settings adjustment, you may find useful tips in the companion website, LoopTips at this link: [LoopTips: Settings](https://loopkit.github.io/looptips/settings/settings/){: target="_blank" } tab. + If you need help with your settings adjustment, you may find useful tips in the companion website, LoopTips at this link: [LoopTips: Settings](https://loopkit.github.io/looptips/settings/settings/) tab. ### Welcome to Loop @@ -262,9 +262,9 @@ Your [Insulin Sensitivity Factor](therapy-settings.md#insulin-sensitivities) is * At least one insulin sensitivity factor (ISF) must be entered * A daily schedule with varying ISF can be entered -Loop works best if you have [tested and optimized](https://loopkit.github.io/looptips/settings/settings/){: target="_blank" } your ISF settings for accuracy. Insulin sensitivities can change for many reasons including waiting too long to change your infusion set. Loop will not auto-detect changes in ISF. +Loop works best if you have [tested and optimized](https://loopkit.github.io/looptips/settings/settings/) your ISF settings for accuracy. Insulin sensitivities can change for many reasons including waiting too long to change your infusion set. Loop will not auto-detect changes in ISF. -Incorrectly set ISF is a common cause of roller coaster glucoses for new Loop users. You may need to raise (increase) your ISF value/number to help smooth a roller coaster glucose trend. You can read about that topic more over in LoopTips [here](https://loopkit.github.io/looptips/settings/settings/#insulin-sensitivity-factor){: target="_blank" }. +Incorrectly set ISF is a common cause of roller coaster glucoses for new Loop users. You may need to raise (increase) your ISF value/number to help smooth a roller coaster glucose trend. You can read about that topic more over in LoopTips [here](https://loopkit.github.io/looptips/settings/settings/#insulin-sensitivity-factor). ### Therapy Settings Review diff --git a/docs/loop-3/services.md b/docs/loop-3/services.md index 5b851016af8..880d5336b7a 100644 --- a/docs/loop-3/services.md +++ b/docs/loop-3/services.md @@ -13,7 +13,7 @@ The services are added by tapping on the + sign and choosing the service fr ## *Nightscout* -There is a whole section in *LoopDocs* about *Nightscout*. For more information, see [*Nightscout* Overview](../nightscout/overview.md){: target="_blank" }. That also has the links you might need to the official [*Nightscout* Documentation](https://nightscout.github.io/){: target="_blank" } (different website). +There is a whole section in *LoopDocs* about *Nightscout*. For more information, see [*Nightscout* Overview](../nightscout/overview.md){: target="_blank" }. That also has the links you might need to the official [*Nightscout* Documentation](https://nightscout.github.io/) (different website). If you have an existing *Nightscout* site, it's still a good idea to review that section, but here's the quick summary of how to add your Site URL and API_SECRET to have your Loop data transmitted to your *Nightscout* site. If you can’t remember your API_SECRET, it can be found under Settings, Reveal Config Vars for Heroku sites (or Application Settings, Connection Strings for Azure sites). @@ -51,7 +51,7 @@ The two most common errors in filling out this section are: 1. The first step depends on iOS Version: * For iOS 17 and earlier, use iOS Settings, Passwords - * For iOS 18 and newer, use the *Apple* [Password app](https://support.apple.com/en-us/104955){: target="_blank" } + * For iOS 18 and newer, use the *Apple* [Password app](https://support.apple.com/en-us/104955) 1. Tap + to add * Enter a name, e.g., "Nightscout" in the Title row * Enter the URL without the "https://" in the Website row @@ -72,7 +72,7 @@ The graphic below indicates how to remove your *Nightscout* site from the *Loop* Data can be directly uploaded from *Loop* to *Tidepool* by adding it as a Service. -Please refer to the [LoopTips: Data: *Tidepool*](https://loopkit.github.io/looptips/data/tidepool/){: target="_blank" } page for more information about *Tidepool*. +Please refer to the [LoopTips: Data: *Tidepool*](https://loopkit.github.io/looptips/data/tidepool/) page for more information about *Tidepool*. When you add the *Tidepool* Service to *Loop*, be sure to disable *Tidepool* Mobile ability to read from Apple Health. @@ -92,15 +92,15 @@ You can still use the note taking feature with *Tidepool* Mobile when Health is ## Loggly -[Loggly](https://loggly.com){: target="_blank" } is a free logging service. If you sign up for an account, you'll need to go under Source Setup and then Customer Tokens. Copy and paste your customer token into your *Loop* App settings for Loggly. -[Loggly](https://loggly.com){: target="_blank" } is a free logging service. If you sign up for an account, you'll need to go under Source Setup and then Customer Tokens. Copy and paste your customer token into your *Loop* App settings for Loggly. +[Loggly](https://loggly.com) is a free logging service. If you sign up for an account, you'll need to go under Source Setup and then Customer Tokens. Copy and paste your customer token into your *Loop* App settings for Loggly. +[Loggly](https://loggly.com) is a free logging service. If you sign up for an account, you'll need to go under Source Setup and then Customer Tokens. Copy and paste your customer token into your *Loop* App settings for Loggly. ![img/loggly.png](img/loggly.png){width="500"} {align="center"} ## Amplitude -[Amplitude](https://amplitude.com){: target="_blank" } is a remote event monitoring service and can be used to quickly identify errors and events with *Loop*. Amplitude stores the events and allows you to view those events as points in time. To retrieve the details of the events you will need to look at corresponding mLab data entries to get a complete picture of the issues. If you sign up for a free account with Amplitude, you will be given an API Key that you can enter here to have *Loop* integration setup. +[Amplitude](https://amplitude.com) is a remote event monitoring service and can be used to quickly identify errors and events with *Loop*. Amplitude stores the events and allows you to view those events as points in time. To retrieve the details of the events you will need to look at corresponding mLab data entries to get a complete picture of the issues. If you sign up for a free account with Amplitude, you will be given an API Key that you can enter here to have *Loop* integration setup. ![img/amplitude.png](img/amplitude.png){width="500"} {align="center"} diff --git a/docs/loop-3/settings.md b/docs/loop-3/settings.md index be1128005c4..4447ddf6b98 100644 --- a/docs/loop-3/settings.md +++ b/docs/loop-3/settings.md @@ -36,7 +36,7 @@ Based on this prediction, Loop calculates a modification to insulin dosing to br * When in Open Loop, no automated action is taken. * When in Closed Loop, automated action is taken based on the selected Dosing Strategy. -If you find this confusing, read how to [Think Like a Loop](https://loopkit.github.io/looptips/how-to/think-like-loop/){: target="_blank" } on the LoopTips website. +If you find this confusing, read how to [Think Like a Loop](https://loopkit.github.io/looptips/how-to/think-like-loop/) on the LoopTips website. ## Dosing Strategy @@ -160,7 +160,11 @@ The information about the pump section is detailed on several different pages. F * [Add or Modify Pump](add-pump.md) * [Omnipod or Omnipod DASH](omnipod.md) Status and Commands * [Medtronic](medtronic.md) Status and Commands -* [Dana Pumps](add-pump.md#dana-i-danars-v3) + +There are several new pump managers available when you [build a feature branch](../version/development.md#feature-branch-dana-and-medtrum-support){: target="_blank" }: + +* [Dana Pumps](dana.md) +* [Medtrum Pumps](medtrum.md) ### [CGM Settings](add-cgm.md) diff --git a/docs/nightscout/loop-caregiver.md b/docs/nightscout/loop-caregiver.md index 1e243a57cde..390e9f31129 100644 --- a/docs/nightscout/loop-caregiver.md +++ b/docs/nightscout/loop-caregiver.md @@ -26,7 +26,7 @@ The *LoopCaregiver* app is under development to make remote commands easier to i * Please take the time to update your *Nightscout* site to `master` * *Nightscout* 14.2.6 was released 30-Sep-2022 as `Classic Liquorice` -If you use *LoopCaregiver*, please join [*LoopCaregiver* App](https://loop.zulipchat.com/#narrow/stream/358458-Loop-Caregiver-App){: target="_blank" } *Zulipchat* stream. +If you use *LoopCaregiver*, please join [*LoopCaregiver* App](https://loop.zulipchat.com/#narrow/stream/358458-Loop-Caregiver-App) *Zulipchat* stream. **As with all development code, monitor *Zulipchat* for announcements, report any problems you experience, be prepared to build frequently, and pay attention.** diff --git a/docs/nightscout/new-user.md b/docs/nightscout/new-user.md index 12a263d9476..2bbaf010003 100644 --- a/docs/nightscout/new-user.md +++ b/docs/nightscout/new-user.md @@ -15,14 +15,14 @@ ## Setup Nightscout -Please visit [Nightscout: Documentation](https://nightscout.github.io){: target="_blank" } to read about Nightscout. There are several options, mentioned in that documentation, for setting up your Nightscout site. +Please visit [Nightscout: Documentation](https://nightscout.github.io) to read about Nightscout. There are several options, mentioned in that documentation, for setting up your Nightscout site. * You can choose one of many free (except for your time) DIY methods * You can choose one of many DIY methods where you pay a monthly fee for data storage * You can choose a managed site (for a monthly fee) that creates your site, keeps the software up to date and provides data storage * Social Media sites for announcements, help and discussion: - * [CGM in the Cloud](https://www.facebook.com/groups/CGMinthecloud){: target="_blank" } Facebook group - * [Nightscout Discord Channel](https://discord.gg/zg7CvCQ){: target="_blank" } + * [CGM in the Cloud](https://www.facebook.com/groups/CGMinthecloud) Facebook group + * [Nightscout Discord Channel](https://discord.gg/zg7CvCQ) Once your Nightscout site is operational and you've read the information about using your site, return to LoopDocs to follow the directions on the [LoopDocs: Nightscout with Loop](update-user.md) page. diff --git a/docs/nightscout/ns-crossref.md b/docs/nightscout/ns-crossref.md index aaff82fcb0d..8cde733676b 100644 --- a/docs/nightscout/ns-crossref.md +++ b/docs/nightscout/ns-crossref.md @@ -2,34 +2,34 @@ A number of pages that used to be in LoopDocs have been moved to the Nightscout documentation. To prevent duplication and inconsistency, those pages have been removed from LoopDocs. A cross-reference to the Nightscout pages is provided below. -* You can always use the search function of [Nightscout: Documentation](https://nightscout.github.io/){: target="_blank" } to find any topic +* You can always use the search function of [Nightscout: Documentation](https://nightscout.github.io/) to find any topic ## Remote Notifications While the Loop app sends notifications locally on the Loop user's iPhone, parents and caregivers may want those messages on their phones, too. We can achieve this functionality through a combination of Nightscout, IFTTT, Google, and Pushover. * Please see - * [Nightscout: Configurations: Pushover](https://nightscout.github.io/nightscout/setup_variables/#pushover){: target="_blank" } - * [Nightscout: Remote Notifications](https://nightscout.github.io/nightscout/pushover/){: target="_blank" } + * [Nightscout: Configurations: Pushover](https://nightscout.github.io/nightscout/setup_variables/#pushover) + * [Nightscout: Remote Notifications](https://nightscout.github.io/nightscout/pushover/) ### LoopFollow LoopFollow was created by Jon Fawcett who took ideas from multiple other apps to create a single app to assist in his caregiving role. It is popular with Loopers who like the display and notifications as well as Loop caregivers. It can work with just the Dexcom Share credentials and/or the Nightscout URL and allows for easy customization of alerts and alarms. Jon handed over maintenance of this app to the Loop and Learn team. * Please see - * [Loop and Learn: LoopFollow page](https://www.loopandlearn.org/loop-follow){: target="_blank" } - * [Loop and Learn Facebook group](https://www.facebook.com/groups/loopandlearn){: target="_blank" } + * [Loop and Learn: LoopFollow page](https://www.loopandlearn.org/loop-follow) + * [Loop and Learn Facebook group](https://www.facebook.com/groups/loopandlearn) ## Pebble Watch LoopDocs had a page specifically about the Pebble Watchface called `SkyLoop Predict`, which is no longer being supported. The Nightscout Documentation provides information about many methods for displaying your Nightscout data on a variety of wearable devices. * Please see - * [Nightscout: On Your Watch](https://nightscout.github.io/nightscout/wearable/){: target="_blank" } + * [Nightscout: On Your Watch](https://nightscout.github.io/nightscout/wearable/) ## Reports Nightscout offers some fantastic data-crunching report tools. * Please see - * [Nightscout: Reports](https://nightscout.github.io/nightscout/reports/){: target="_blank" } + * [Nightscout: Reports](https://nightscout.github.io/nightscout/reports/) diff --git a/docs/nightscout/overview.md b/docs/nightscout/overview.md index 9b3f06216e8..dcdf26c1a0c 100644 --- a/docs/nightscout/overview.md +++ b/docs/nightscout/overview.md @@ -22,7 +22,7 @@ For caregivers, *Nightscout* enables remote monitoring and even the ability to i *Nightscout* is useful for many who use *Loop*. Adults who take care of themselves find the reports and analysis methods from *Nightscout* provide effective tools to monitor their settings and provide reports for their health care provider. It also stores *Loop* configurations so they can be reviewed. With *Loop 3*, the saved *Nightscout* profiles can be downloaded to a new *Loop* installation or a new phone for quick onboarding, should you ever need to start fresh. -Setting up a *Nightscout* site is described in a separate web site: [*Nightscout*: Documentation](https://nightscout.github.io){: target="_blank" }. +Setting up a *Nightscout* site is described in a separate web site: [*Nightscout*: Documentation](https://nightscout.github.io). There are *Nightscout* apps in your iPhone App Store that allow you to view the *Nightscout* site after you've configured it, or you can use a web browser to view the data. The app alone is not enough - you need to follow the steps to configure your own *Nightscout* site and obtain your specific *Nightscout* URL. @@ -32,14 +32,14 @@ There are *Nightscout* apps in your iPhone App Store that allow you to view the ## *Nightscout* Documentation -There used to be a lot of *Nightscout* information found only in *LoopDocs*, but that was transferred and subsequently updated in [*Nightscout*: Documentation](https://nightscout.github.io){: target="_blank" }. The information that remains in *LoopDocs* about *Nightscout* is *Loop* specific. So you may be jumping back and forth between the two sets of documents. +There used to be a lot of *Nightscout* information found only in *LoopDocs*, but that was transferred and subsequently updated in [*Nightscout*: Documentation](https://nightscout.github.io). The information that remains in *LoopDocs* about *Nightscout* is *Loop* specific. So you may be jumping back and forth between the two sets of documents. !!! info "" * If you see the *Nightscout* Owl logo in upper left you are in the *Nightscout* website * If you see the *LoopDocs* green-loop logo in upper left you are in the *LoopDocs* website * While in the *Nightscout* tab of *LoopDocs*, most links have a *Nightscout* or *LoopDocs* in the link name - * Suggestion: open the [*Nightscout*: Documentation](https://nightscout.github.io){: target="_blank" } in a separate tab or window of your browser for easy access to both websites + * Suggestion: open the [*Nightscout*: Documentation](https://nightscout.github.io) in a separate tab or window of your browser for easy access to both websites ## *Nightscout* with *Loop* @@ -50,7 +50,7 @@ This page provides a general discussion about the *Nightscout* display, as well The *Nightscout* display updates when the *Loop* phone is connected to the internet via WiFi or cellular service. When the uploads stop, the *Loop* *pill* becomes "stale" (cannot open it) after 15 minutes. -*Pills* are the little information boxes. They are [*Nightscout*: Plugins](https://nightscout.github.io/nightscout/setup_variables/#plugins){: target="_blank" } that must be enabled with configuration variables and then the display for each *pill* can be turned on or off within your *Nightscout* site. +*Pills* are the little information boxes. They are [*Nightscout*: Plugins](https://nightscout.github.io/nightscout/setup_variables/#plugins) that must be enabled with configuration variables and then the display for each *pill* can be turned on or off within your *Nightscout* site. If upload to *Nightscout* is interrupted, *Loop 3* stores up to 7 days of *Nightscout* information in a local buffer on the phone, and will attempt to upload later when access is restored. Once access is restored, a stale *Loop* Pill may require 15 minutes before it will open to display additional *Loop* information. diff --git a/docs/nightscout/remote-commands.md b/docs/nightscout/remote-commands.md index 201a4217ef8..5935f7a2d55 100644 --- a/docs/nightscout/remote-commands.md +++ b/docs/nightscout/remote-commands.md @@ -54,7 +54,7 @@ On the Caregivers device (iPhone or Mac): * The first step depends on iOS version * For iOS 17 and earlier, use iOS Settings, Passwords - * For iOS 18 and newer, use the *Apple* [Password app](https://support.apple.com/en-us/104955){: target="_blank" } + * For iOS 18 and newer, use the *Apple* [Password app](https://support.apple.com/en-us/104955) * Tap the + Button up top to add a new Password @@ -69,7 +69,7 @@ On the Caregivers device (iPhone or Mac): * Next, you are offered a screen that allows you to set up a `Verification Code` * If you need to come back later, you can find that screen again * For iOS 17 and earlier, use iPhone Settings -> Passwords - * For iOS 18 and newer, use the *Apple* [Password app](https://support.apple.com/en-us/104955){: target="_blank" } + * For iOS 18 and newer, use the *Apple* [Password app](https://support.apple.com/en-us/104955) * -> Tap the row with your *Nightscout* URL * Tap “Setup Verification Code” * This is where you can scan your QR code from the _Loop_ phone or the saved QR screenshot @@ -109,7 +109,7 @@ Don't forget to read [*Loopdocs*: Overrides](../operation/features/overrides.md) For remote overrides in particular: -1. **Can I set a different override in *Nighscout* than I have programmed into _Loop_ app?** +1. **Can I set a different override in *Nightscout* than I have programmed into _Loop_ app?** **Answer**: No. You will only be able to enact override presets already programmed into the Loop app. 1. **If I didn't start the override in *Nightscout* (it was started in _Loop_ itself), can I still use *Nightscout* to cancel it?** @@ -215,7 +215,7 @@ Any remote carbohydrate entry from the *Nightscout* careportal using the same ho For more information, see: -* [Carb treatments disappearing in Nightscout](https://github.com/nightscout/cgm-remote-monitor/issues/8185){: target="_blank" } +* [Carb treatments disappearing in Nightscout](https://github.com/nightscout/cgm-remote-monitor/issues/8185) ## Using Remote Commands @@ -296,14 +296,14 @@ If you want to make your life SUPER AMAZING, check out using the iPhone's Shortc Click these links on your iPhone and you'll be prompted to download the premade shortcuts (assuming you open the links in Safari browser on iPhone): -[Comprehensive _Loop_ Shortcut](https://github.com/LoopKit/Loop/raw/4699417/Shortcuts/Loop.shortcut){: target="_blank" } +[Comprehensive _Loop_ Shortcut](https://github.com/LoopKit/Loop/raw/4699417/Shortcuts/Loop.shortcut) *includes Set Remote Override, Cancel Override, Loop Troubleshooting Tips, Quick Text options, Manual BG entry, Bookmarks to websites, etc.* And if you want to save one click to get to these one functions more directly: these shortcuts are simplified to offer only one function: -[Set Remote Override only shortcut](https://github.com/LoopKit/Loop/raw/4699417/Shortcuts/Loop Remote Overrides.shortcut){: target="_blank" } +[Set Remote Override only shortcut](https://github.com/LoopKit/Loop/raw/4699417/Shortcuts/Loop Remote Overrides.shortcut) -[Cancel Override  only shortcut](https://github.com/LoopKit/Loop/raw/4699417/Shortcuts/Cancel Override.shortcut){: target="_blank" } +[Cancel Override  only shortcut](https://github.com/LoopKit/Loop/raw/4699417/Shortcuts/Cancel Override.shortcut) !!! note "A couple notes about these shortcuts:" You need to open those links in the *Safari* browser on your iPhone. A confirmation will show to initiate the download. @@ -320,6 +320,6 @@ And if you want to save one click to get to these one functions more directly: t If you want to walk uphill both ways in the snow carrying bags of uneven groceries, you can also set overrides remotely by using If This, Then That (IFTTT) integration. By using IFTTT, you can have single button presses on your phone that will set an override, log a cannula change, log a sensor change and much more. * Please see - * [Nightscout: Configurations: IFTTT Maker](https://nightscout.github.io/nightscout/setup_variables/#ifttt-maker){: target="_blank" } - * [Nightscout: IFTTT](https://nightscout.github.io/nightscout/ifttt/){: target="_blank" } + * [Nightscout: Configurations: IFTTT Maker](https://nightscout.github.io/nightscout/setup_variables/#ifttt-maker) + * [Nightscout: IFTTT](https://nightscout.github.io/nightscout/ifttt/) diff --git a/docs/nightscout/remote-config.md b/docs/nightscout/remote-config.md index b0ee9f8139a..21907f0af50 100644 --- a/docs/nightscout/remote-config.md +++ b/docs/nightscout/remote-config.md @@ -91,7 +91,7 @@ After you complete the configuration, read the entire [Remote Commands](remote-c * There are many choices for building your own or paying someone to build a *Nightscout* site * The directions for only one of the options is documented on this page * Use that as a guide for your site - * [Nightscout Docs: Comparison Table](https://nightscout.github.io/nightscout/new_user/#vendors-comparison-table){: target="_blank" } + * [Nightscout Docs: Comparison Table](https://nightscout.github.io/nightscout/new_user/#vendors-comparison-table) * **Warning: examine the `Loop remote carbs/bolus` row: subscription refers to a monthly fee** * If a green check is missing, it might just be too new for evaluation @@ -101,7 +101,7 @@ There are several options to pay for a turn-key *Nightscout* service. * In order to enable remote commanding, your *Nightscout* site must be configured with information associated with the *Apple Developer ID* used to build the *Loop* app * Most *Nightscout* options allow you full access to your *Nightscout* configuration variables so you can add the required information -* Please check out [*Nightscout*: New User](https://nightscout.github.io/nightscout/new_user/){: target="_blank" } for up-to-date information about your *Nightscout* options +* Please check out [*Nightscout*: New User](https://nightscout.github.io/nightscout/new_user/) for up-to-date information about your *Nightscout* options * If you use the wizard, you can see more options when you select No to the question about contributing to research and development * If you choose *T1Pal* and want to use remote commands, you must also purchase your *Loop* app from them for an additional monthly fee - contact *T1Pal* for details @@ -136,7 +136,7 @@ The step is required for the *Loop* app to give permissions to your *Nightscout* When creating new APN keys, you have the option for "Sandbox", "Production" or "Sandbox & Production". Be sure to choose "Sandbox & Production". -1. To get started, go to the `Keys` section under Apple Developer's [`Certificates, Identifiers & Profiles`](https://developer.apple.com/account/resources/authkeys/list){: target="_blank" } and login with the *Apple ID* associated with your developer team that you used to build the *Loop* app. +1. To get started, go to the `Keys` section under Apple Developer's [`Certificates, Identifiers & Profiles`](https://developer.apple.com/account/resources/authkeys/list) and login with the *Apple ID* associated with your developer team that you used to build the *Loop* app. 2. If not already open in your browser (compare with the below screenshot), - Click on **`Keys`** (located in the left-hand column). - Either click on the blue **`Create a new key`** button **OR** the plus button (:material-plus-circle:) to add a new key. @@ -183,15 +183,15 @@ You'll need to make sure your *Nightscout* site version is version `13.0.1` or n - **Scroll** to the very bottom of this menu. - The **version** is located in the **`About`** section after the `Settings` section, (below the `Save` button). -This link should be used if you want to [Nightscout: Update](https://nightscout.github.io/update/update/){: target="_blank" } your *Nightscout* site. +This link should be used if you want to [Nightscout: Update](https://nightscout.github.io/update/update/) your *Nightscout* site. !!! note "Note for *Google Cloud* Users" - The [*Nightscout* with *Google Cloud*](https://navid200.github.io/xDrip/docs/Nightscout/GoogleCloud.html){: target="_blank" } instructions include information about updating your site. + The [*Nightscout* with *Google Cloud*](https://navid200.github.io/xDrip/docs/Nightscout/GoogleCloud.html) instructions include information about updating your site. Scroll down to the line (on that page) that says `Update Nightscout`. ### Add APN Variables to *Nightscout* -In order to use remote overrides, you must add a couple of new variables. If you don't know how to update your *Nightscout* configuration, review [Nightscout: Setup Variables](https://nightscout.github.io/nightscout/setup_variables/){: target="_blank" } and then come back. +In order to use remote overrides, you must add a couple of new variables. If you don't know how to update your *Nightscout* configuration, review [Nightscout: Setup Variables](https://nightscout.github.io/nightscout/setup_variables/) and then come back. The instructions in this section show *Heroku* images. If you are using a different method, you should be able to "translate" the steps. @@ -214,7 +214,7 @@ Scroll down the bottom of the `Config Vars` lines until you find the last blank #### Remote Build Config Var Requirement -That last row of the table above is needed if you are using a remote build option such as [LoopDocs: GitHub Build Actions](../browser/bb-overview.md) or downloaded an archived file via [Loop and Learn: Remote Build with Diawi](https://www.loopandlearn.org/remote-build/){: target="_blank" }. If you later return to a direct *Xcode* build to your phone, you must remove that config var or remote commands will not work. +That last row of the table above is needed if you are using a remote build option such as [LoopDocs: GitHub Build Actions](../browser/bb-overview.md) or downloaded an archived file via [Loop and Learn: Remote Build with Diawi](https://www.loopandlearn.org/remote-build/). If you later return to a direct *Xcode* build to your phone, you must remove that config var or remote commands will not work. When executed properly, you should have something that looks like this for the three (or four) new variables that you added: diff --git a/docs/nightscout/remote-errors.md b/docs/nightscout/remote-errors.md index 9ca10f6e40c..f87dd85ca92 100644 --- a/docs/nightscout/remote-errors.md +++ b/docs/nightscout/remote-errors.md @@ -12,7 +12,7 @@ This section is for people who were using remote commands and they suddenly stop If you are using LoopCaregiver, try the remote command directly from Nightscout to see if they work there. If they are not working there as well, check out your account status first before attempting the fixes on the rest of this page. * Your *Apple Developer* account must be in good standing for the push notifications to work -* Log in to your [*Apple Developer* account](https://developer.apple.com/account){: target="_blank" } and see if there are agreements you need to accept +* Log in to your [*Apple Developer* account](https://developer.apple.com/account) and see if there are agreements you need to accept ## Improper Configuration diff --git a/docs/nightscout/remote-overview.md b/docs/nightscout/remote-overview.md index c5a92f7e99e..657985ebcaf 100644 --- a/docs/nightscout/remote-overview.md +++ b/docs/nightscout/remote-overview.md @@ -28,8 +28,8 @@ _Loop_ and *Nightscout* work using  Apple Developer ID  used to build the _Loop_ app must be configured to enable  Apple Push Notifications * If you built *Nightscout* and _Loop_ yourself, follow the directions to set up [Remote Configuration](remote-config.md) * Most providers who supply `Nightscout as a service` or `Hosted Nightscout` will assist you, if needed, in getting your APN information added to your *Nightscout* variables - * [Nightscout Docs: New User](https://nightscout.github.io/nightscout/new_user){: target="_blank" } - * [Nightscout Docs: Comparison Table](https://nightscout.github.io/nightscout/new_user/#vendors-comparison-table){: target="_blank" } + * [Nightscout Docs: New User](https://nightscout.github.io/nightscout/new_user) + * [Nightscout Docs: Comparison Table](https://nightscout.github.io/nightscout/new_user/#vendors-comparison-table) * **Warning: examine the `Loop remote carbs/bolus` row: subscription refers to a monthly fee** ## Warning: *Nightscout* Remote Carbohydrate Entries diff --git a/docs/nightscout/troubleshoot.md b/docs/nightscout/troubleshoot.md index 16ef84f23e3..15853337c9f 100644 --- a/docs/nightscout/troubleshoot.md +++ b/docs/nightscout/troubleshoot.md @@ -1,10 +1,10 @@ ## Setup Troubleshooting -If you have just tried to set up your Nightscout site and have problems with seeing all your data, please check out the [Nightscout: Troubleshooting](https://nightscout.github.io/troubleshoot/troubleshoot){: target="_blank" } page. +If you have just tried to set up your Nightscout site and have problems with seeing all your data, please check out the [Nightscout: Troubleshooting](https://nightscout.github.io/troubleshoot/troubleshoot) page. ## Dexcom data not showing -If you use a Dexcom and get your CGM data into Nightscout using Dexcom Share (bridge in Nightscout) and everything is working but the Dexcom data stops showing, please review [Nightscout: Dexcom bridge Troubleshooting](https://nightscout.github.io/troubleshoot/dexcom_bridge/){: target="_blank" }. +If you use a Dexcom and get your CGM data into Nightscout using Dexcom Share (bridge in Nightscout) and everything is working but the Dexcom data stops showing, please review [Nightscout: Dexcom bridge Troubleshooting](https://nightscout.github.io/troubleshoot/dexcom_bridge/). As part of that troubleshooting, you may need to remove the Nightscout service credentials from Loop. You may need to remove Dexcom credentials from all third-party apps that get data from Dexcom Share. Be sure to add them back after the CGM data to Nightscout is restored. diff --git a/docs/nightscout/update-user.md b/docs/nightscout/update-user.md index ede1dfd89f4..5fe87cfa712 100644 --- a/docs/nightscout/update-user.md +++ b/docs/nightscout/update-user.md @@ -18,7 +18,7 @@ Once you have created a Nightscout site, there are some Nightscout Config Vars s These instructions are for people using Heroku, because that is the most common choice. If your Nightscout site is not on Heroku, this page provides a guide for the Config Vars used by Loop. -[Login to your Heroku account](https://id.heroku.com/login){: target="_blank" }, select the `Settings` tab near the top of the screen on your Heroku app. +[Login to your Heroku account](https://id.heroku.com/login), select the `Settings` tab near the top of the screen on your Heroku app. ![img/heroku5.png](img/heroku5.png){width="600"} {align="center"} @@ -142,7 +142,7 @@ If the current display of your NS site has been not authenticated, you will not The use of tokens is documented at this link to the security page in the Nightscout documentation. -* Please see [Nightscout: Tokens](http://nightscout.github.io/nightscout/security/#create-authentication-tokens-for-users){: target="_blank" } +* Please see [Nightscout: Tokens](http://nightscout.github.io/nightscout/security/#create-authentication-tokens-for-users) You can authenticate with your API_SECRET using either of these methods: @@ -155,11 +155,11 @@ An authenticated site, with careportal plugin enabled, will show a + at upp ## Nightscout Version Update -If you are new to Loop and haven’t updated your Nightscout site for a while, check to see if there's an available update. Visit [Nightscout: Update Instructions](https://nightscout.github.io/update/update/){: target="_blank" } for directions on updating. +If you are new to Loop and haven’t updated your Nightscout site for a while, check to see if there's an available update. Visit [Nightscout: Update Instructions](https://nightscout.github.io/update/update/) for directions on updating. ## More Variables for Loopers The list of [Variables for Loopers](#variables-for-loopers) above can be expanded if you want your site to automatically open with specific values and alarm settings. -This [Loop and Learn: Nightscout Variables](https://www.loopandlearn.org/nightscout-variables/){: target="_blank" } page, created for folks using the Google Cloud method to create a Nightscout site, has a convenient, expanded list. \ No newline at end of file +This [Loop and Learn: Nightscout Variables](https://www.loopandlearn.org/nightscout-variables/) page, created for folks using the Google Cloud method to create a Nightscout site, has a convenient, expanded list. \ No newline at end of file diff --git a/docs/operation/features/bolus.md b/docs/operation/features/bolus.md index eb049651103..b47b93cf3d8 100644 --- a/docs/operation/features/bolus.md +++ b/docs/operation/features/bolus.md @@ -119,7 +119,7 @@ If an "uncertain" delivery is not resolved: * Make sure the RileyLink compatible device is communicating properly * You can try to turn off Bluetooth and then turn it back on again -* [Quit the Loop app](https://support.apple.com/en-us/HT201330){: target="_blank" } and restart it. (Note - this is different from a power cycle of the phone which remembers settings within an app that was running before the power cycle.) +* [Quit the Loop app](https://support.apple.com/en-us/HT201330) and restart it. (Note - this is different from a power cycle of the phone which remembers settings within an app that was running before the power cycle.) If that does not resolve the issue, please tap on Loop Settings, Issue Report and email it to yourself. Then [post](../../intro/loopdocs-how-to.md#how-to-find-help) on Facebook or Zulipchat, explain what happened and say you have an Issue Report. Someone should reach out to you. diff --git a/docs/operation/features/ice.md b/docs/operation/features/ice.md index 8bf4e0bfbc4..27ad54d7d96 100644 --- a/docs/operation/features/ice.md +++ b/docs/operation/features/ice.md @@ -54,7 +54,7 @@ Some practical use of the ICE screen is provided in the [Meal Entries: Review Ca * Some people enter typical values for themselves for a given meal and let Loop handle the rest * Some people guess and then carb surf if their glucose goes higher than they like -The rest of this page was written by Katie DiSimone before the non-linear carb model was added to Loop in 2019. You may also want to review her blog post from 2017: [Loop: Dynamic Carb Absorption](https://web.archive.org/web/20231130033719/https://seemycgm.com/2017/07/25/loop-dynamic-carb-absorption/){: target="_blank" }. +The rest of this page was written by Katie DiSimone before the non-linear carb model was added to Loop in 2019. You may also want to review her blog post from 2017: [Loop: Dynamic Carb Absorption](https://web.archive.org/web/20231130033719/https://seemycgm.com/2017/07/25/loop-dynamic-carb-absorption/). A lot of the information is still relevant although some of the Loop carb modeling and prediction details have been updated over the years. diff --git a/docs/operation/features/notifications.md b/docs/operation/features/notifications.md index 2a5ecfcaeac..c6fde67c730 100644 --- a/docs/operation/features/notifications.md +++ b/docs/operation/features/notifications.md @@ -167,4 +167,4 @@ Many people use additional apps to assist in following a loved one or to support ![loop follow graphic from the README page](img/loop-follow.png) -For more information, please read the [LoopFollow](https://www.loopandlearn.org/loop-follow){: target="_blank" } documentation. You can build LoopFollow using the same [Build Select Script](../../build/build-app.md#build-select-script) you used to build the Loop app or using the [GitHub Browser Build Method](../../browser/other-apps.md). +For more information, please read the [LoopFollow](https://www.loopandlearn.org/loop-follow) documentation. You can build LoopFollow using the same [Build Select Script](../../build/build-app.md#build-select-script) you used to build the Loop app or using the [GitHub Browser Build Method](../../browser/other-apps.md). diff --git a/docs/operation/features/premeal.md b/docs/operation/features/premeal.md index feb00cb4085..8f752808d7e 100644 --- a/docs/operation/features/premeal.md +++ b/docs/operation/features/premeal.md @@ -21,7 +21,7 @@ Loop will adjust any insulin bolus as needed based on the extra insulin provided ## Assessing the impact of pre-meal -The intent of the pre-meal icon on the toolbar is to [provide an eating-soon mode in Loop](https://diyps.org/2016/07/11/picture-this-how-to-do-eating-soon-mode/){: target="_blank" }. +The intent of the pre-meal icon on the toolbar is to [provide an eating-soon mode in Loop](https://diyps.org/2016/07/11/picture-this-how-to-do-eating-soon-mode/). Do not set pre-meal limits to any hypoglycemic ranges that may require treatment. diff --git a/docs/operation/features/widget.md b/docs/operation/features/widget.md index 55723b09905..aa442c4f7c0 100644 --- a/docs/operation/features/widget.md +++ b/docs/operation/features/widget.md @@ -2,7 +2,7 @@ The *Loop* app uses the new-style widgets. With the advent of iOS 16 and 17, you can add widgets that show up on the lock screen without need to swipe to view. But only some widgets can do this and there is very limited space for those lock screen widgets. You can add more widgets to the Today View, where you do need to swipe right from the Home View or Lock Screen. -The example graphic below shows the *Loop* widget on the top row, with the *LoopCaregiver* widget next to a [Scriptable widget](https://niepi.org/2020/10/25/ios-14-nightscout-widget/){: target="_blank" } that is fed from my Nightscout site on the middle row. Below that is the Dexcom G7 widget next to a weather widget. This Today View requires a swipe right from the Lock Screen or the Home screen. The scriptable widget is also on my lock screen. The update rate for these widgets is similar to watch complications, some will grey out when stale. If they are greyed out, tap on them to go to the app directly. +The example graphic below shows the *Loop* widget on the top row, with the *LoopCaregiver* widget next to a [Scriptable widget](https://niepi.org/2020/10/25/ios-14-nightscout-widget/) that is fed from my Nightscout site on the middle row. Below that is the Dexcom G7 widget next to a weather widget. This Today View requires a swipe right from the Lock Screen or the Home screen. The scriptable widget is also on my lock screen. The update rate for these widgets is similar to watch complications, some will grey out when stale. If they are greyed out, tap on them to go to the app directly. The Scriptable widget includes the time of the last update, 11:25 am, so is 11 minutes old at the current time of 11:36 am. diff --git a/docs/operation/loop/looptips.md b/docs/operation/loop/looptips.md index 35c7dca56da..7a517cf1573 100644 --- a/docs/operation/loop/looptips.md +++ b/docs/operation/loop/looptips.md @@ -11,7 +11,7 @@ Things such as: * What about pizza boluses? * What do I do when I shower or swim? -All of those usability questions and more are addressed over in the companion site called [LoopTips](https://loopkit.github.io/looptips){: target="_blank" }. +All of those usability questions and more are addressed over in the companion site called [LoopTips](https://loopkit.github.io/looptips). Please head over to Looptips in order to read some really helpful tips to make your Looping easier. diff --git a/docs/operation/loop/open-loop.md b/docs/operation/loop/open-loop.md index 78847bc3996..58e00f68e39 100644 --- a/docs/operation/loop/open-loop.md +++ b/docs/operation/loop/open-loop.md @@ -142,13 +142,13 @@ A menu item to set an extended bolus is not a feature provided by the *Loop* app Consider a desired total bolus $(BolusTotal)$ given over an extended time with a prompt amount $(PromptAmount)$ now and the balance $(Balance)$ delivered over the next $(H)$ hours with a current scheduled basal rate $(BR)$. -First the equations to calculate the desired rate $(MTB)$ to enter into the 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
    symbols: diff --git a/docs/translate.md b/docs/translate.md index 09beb68c8ae..78132a6e80f 100644 --- a/docs/translate.md +++ b/docs/translate.md @@ -1,64 +1,76 @@ +The lanuage list below provides automatic translation for `LoopDocs`. + +To assist with translation for the app on your phone, please see [App Translation](faqs/app-translation.md){: target="_blank" }. + ## Language List -[عربي](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ar){: target="_blank" } +[عربي](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ar) + +[Български](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=bg) + +[Нохчийн](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ce) -[Български](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=bg){: target="_blank" } +[Čeština](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=cs) -[Čeština](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=cs){: target="_blank" } +[Dansk](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=da) -[Deutsch](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=de){: target="_blank" } +[Deutsch](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=de) -[Dansk](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=da){: target="_blank" } +[Ελληνικά](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=el) -[Ελληνικά](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=el){: target="_blank" } +[Español](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=es) -[Español](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=es){: target="_blank" } +[日本](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ja) -[日本](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ja){: target="_blank" } +[Suomi](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=fi) -[Suomi](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=fi){: target="_blank" } +[Français](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=fr) -[Français](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=fr){: target="_blank" } +[עברית](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=iw) -[עברית](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=iw){: target="_blank" } +[Hrvatski](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=hr) -[Hrvatski](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=hr){: target="_blank" } +[हिंदी](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=hi) -[हिंदी](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=hi){: target="_blank" } +[Italiano](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=it) -[Italiano](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=it){: target="_blank" } +[한국어](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ko) -[한국어](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ko){: target="_blank" } +[Norsk](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=no) -[Norsk](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=no){: target="_blank" } +[Nederlands](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=nl) -[Nederlands](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=nl){: target="_blank" } +[Polski](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=pl) -[Polski](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=pl){: target="_blank" } +[Português](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=pt) -[Português](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=pt){: target="_blank" } +[Română](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ro) -[Română](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ro){: target="_blank" } +[Русский](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ru) -[Русский](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ru){: target="_blank" } +[Slovenčina](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=sk) -[Slovenčina](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=sk){: target="_blank" } +[Svenska](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=sv) -[Svenska](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=sv){: target="_blank" } +[Turkish](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=tr) -[Turkish](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=tr){: target="_blank" } +[українська](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=uk) -中文([简体](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=zh-CN){: target="_blank" }) +[Tiếng Việt](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=vi) -中文([繁體](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=zh-TW){: target="_blank" }) +([中国人](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=zh-HAN)) + +中文([简体](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=zh-CN)) + +中文([繁體](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=zh-TW)) ## Google Translate Links -Click on a language on the list of links above to turn on Google's automatic translation. +Click on a language on the list of links above to turn on Google's automatic translation. This opens in a new browser tab. To return to English, switch back to the original tab. -## Change Language +### Change Language -To modify the language choice for the whole site, copy the line below, and paste it into the URL, and then choose the desired language from the list above. +To modify the language choice for the whole site you can return to the original tab (which is in English). If you closed that tab and are on a translated page, then you can copy the line below, and paste it into the URL, and then choose the desired language from the list. ``` { .bash .copy title="Copy and Paste in Browser URL to return to original version" } https://loopkit.github.io/loopdocs/translate @@ -74,7 +86,7 @@ Use the Google Translation three-dot menu and select `Go to Original URL` while * The Google Translate Tool will appear at the top of each page * LoopDocs how-to: [Google Translate Tool Instructions](#google-translate-tool-instructions) - * Google how-to: [Google Translate Help Link](https://support.google.com/translate/answer/2534559?hl=en&co=GENIE.Platform%3DDesktop){: target="_blank" } + * Google how-to: [Google Translate Help Link](https://support.google.com/translate/answer/2534559?hl=en&co=GENIE.Platform%3DDesktop) !!! danger "Automatic Translation" These links connect this site to the Google Translation service. @@ -96,3 +108,7 @@ The graphic below shows the Google Translate Tool when maximized (default) for a ![various display options for the google translation tool](img/google-xlate.svg){width="600"} {align="center"} + +## Code Translation + +The information about code translation has moved. Please see [App Translation](faqs/app-translation.md). diff --git a/docs/troubleshooting/dana-faq.md b/docs/troubleshooting/dana-faq.md index 4f84e492c7f..04c87fbb33c 100644 --- a/docs/troubleshooting/dana-faq.md +++ b/docs/troubleshooting/dana-faq.md @@ -1,5 +1,34 @@ # Dana (RS/-i) FAQ +## Dana is a new Pump Manager + +* Most of the issues have been identified and fixed, but a few are still known +* Be sure to check this site frequently for open issues: + * [DanaKit Issues](https://github.com/bastiaanv/DanaKit/issues) +* 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) + * Note that pump managers are separately tested for Trio and Loop + +## Branch for Dana + +You may choose one of two feature branches to get Dana in Loop + +* `feat/dev-dana-medtrum`: adds support for Dana and Medtrum pumps +* `feat/eversense`: adds support for the Eversense CGM in addition to the Dana and Medtrum pumps + + +These branches are subject to rapid updates. Any updates to Dana and Medtrum pumps are found in both branches. + +## Q: How long should the Dana pump last on a battery? + +It is considerd normal for a Dana-I pump to last 14-16 days while using closed Loop on a single AAA-battery. +This is strongly infuenced by your pump settings and quality of the batteries. + +Some tips to extend the battery life: + +- Make sure to use good quality batteries, an example is the Energizer Max AAA (this can also decrease time drifting on the pump) +- Try to decrease the screen timeouts, items 5 & 6 in the User Option menu. +- [Silence your pump](#q-can-i-fully-silence-the-pump) + ## Q: Help I frequently encounter signal loss or orange loops First of all, lets check you CGM, since the dana driver trusts your CGM to provide a heartbeat. @@ -7,8 +36,8 @@ First of all, lets check you CGM, since the dana driver trusts your CGM to provi If you are using an internet CGM (like NightScout remote CGM, Dexcom Share), you lack a heartbeat inside the *Loop* app. You must look into one of the heartbeat modes of the Dana driver: -- Continuous mode - [Please read this paragraph before activating it](#continuous-bluetooth-mode). This mode will keep a connection at all times, this will decrease your pump's & phone's battery life by a bit -- Background sound - [link](#background-sound). This mode will keep loop alive by playing soundless music in the background. This has a big impact on your phone's battery, but little to no impact on your pumps battery life. +- Continuous mode - [Please read this paragraph before activating it](#continuous-bluetooth-mode). This mode will keep a connection at all times, which will decrease the battery life for your pump and phone by a small amount +- Background sound - [link](#background-sound). This mode will keep loop alive by playing soundless music in the background. This has a big impact on your phone battery life, but little to no impact on your pump battery life. If you are running a bluetooth CGM, it might be worth to look into [continuous heartbeat mode](#continuous-bluetooth-mode). Some Dexcom users have reported to have less issue/orange loops using the continuous mode, then in normal mode. @@ -60,53 +89,105 @@ You will get a full wizard based on the type of refill you want to do! ![Dana Blind refill](./img/dana-blind-refill.png){width="250"} {align="center"} +## Q: Why does the Dana pump not update my Bolus/Basal limits? + +The dana pump only allows these limits to be read, not writen. +You need to enter the doctor mode on the pump itself in order to update these limits. + +#### How to enter Doctor mode? + +First, you need to find the production **day** of your pump: + +- Go to the main menu and enter Review +- Go to Shipping information and see the production date in item 3 + +![Dana Menu](./img/dana_shipping_information_menu.png){width="600"} +{align="center"} + +![Dana Shipping Information Menu](./img/dana_shipping_information.png){width="250"} +{align="center"} + +Now, we can enter doctor mode: + +- Make sure you are at the starting screen of your pump +- Now press the following three buttons at the same time: + (plus), - (minus), > (play) + +![Dana Password Menu](./img/dana_enter_password_menu.png){width="600"} +{align="center"} + +- Enter the following password: *30XY*, where XY equals the production day of your pump +- You should have entered the Doctor mode. If nothing happend, you have entered your password incorrectly. Double check the production day or contact your Dana distributor. + +![Dana Doctor Menu](./img/dana_doctor_mode_settings.png){width="300"} +{align="center"} + +- The max basal limit is item 9 and the max bolus limit is item 10 in this menu + +## Q: Can I fully silence the pump? + +Yes, the dana pump has a secret menu which allows you to fully silence the pump. +The pump will not vibrate nor beep after every bolus. + +First, make sure your pump has the correct alarm setting: + +- Go to the main menu and enter Option +- Go to User Option and Scroll down to item 4 ALARM +- Make sure this setting is on **Sound** + +![Dana Option Menu](./img/dana_options_menu.png){width="600"} +{align="center"} + +![Dana Options](./img/dana_options.png){width="250"} +{align="center"} + +Next, we need to go to Engineering mode: + +!!! warning "Entering Engineering mode is dangerous!" + You will be able to adjust very dangerous pump settings. DO NOT CHANGE THOSE!!! If you changed something else here, contact your Dana distributor to restore that setting + +- Make sure you are at the starting screen of your pump +- Now press the following three buttons at the same time: + (plus), - (minus), > (play) + +![Dana Password Menu](./img/dana_enter_password_menu.png){width="600"} +{align="center"} + +- Enter the following password: **1013**, but make sure you enter the fourth digit first (3). Then enter the first digit second (1), the second digit (0), and finaly, enter the third digit (1). If done correctly, the pump will say: "Engineering mode pw" (or something similar) +- Now press the following three buttons again at the same time: + (plus), - (minus), > (play) +- Enter the following password: **1216**, but make sure you enter the second digit first (2), follow this with the third digit (1), fourth digit (6), first digit (1). +- You should have entered the Engineering mode: + +![Dana Engineering Menu](./img/dana_engineering_mode.JPG){width="500"} +{align="center"} + +- Go to option 4 and set Silent mode to ON + +![Dana Engineering Menu](./img/dana_silent_mode.JPG){width="500"} +{align="center"} + +- Go back by pressing OK and use option 8 to leave the Engineering mode + ## Heartbeat modes ### Background sound -An extra feature available for the Dana pumps is the background sound. -This feature was developed in order to keep the *Loop* app running in the background. - -Normally, your CGM will have an active Bluetooth connection, which prevent the *Loop* app from being put into a suspended state. -But when you are planning on using a CGM, like [NightScout remote CGM](../loop-3/add-cgm.md#nightscout-remote-cgm), [Dexcom Share](../loop-3/add-cgm.md#dexcom-share-as-a-cgm), etc, you rely on a active internet connection, and not on an active Bluetooth connection. - -In order to activate, follow these steps: - -1. Activate the [UIBackgroundMode - audio](https://developer.apple.com/documentation/bundleresources/information_property_list/uibackgroundmodes): - * When [building with Mac](../build/overview.md), go to the LoopWorkspace Xcode project and select the Loop project. - Go to "Targets" -> "Loop" -> "Signing & Capabilities" and scroll down to "Background modes". - Enable the checkbox for "Audio, AirPlay, and Picture in Picture". - Then rebuild the app and go to step 2. - ![Xcode background sound example](./img/background-sound-xcode.png) - - * When [building with Browser](../browser/bb-overview.md), you will need to make a change to the GitHub Actions workflow. - Go to your LoopWorkspace fork on GitHub and press `.` on your keyboard. - You will be redirected to a `github.dev` page with the code of your LoopWorkspace. - Now go to ".github" -> "workflows" -> "build_loop.yml". - Scroll down till you see the `- name: Fastlane Build & Archive` command. - Just before this command, add the following to this script ([example](https://github.com/bastiaanv/LoopWorkspace/commit/67a1e42b9b771550afc14adf914ff98c37d96e67)): - - ``` - - name: Update entitlement background sound - run: sed -i -e 's/bluetooth-central<\/string>/bluetooth-central<\/string>audio<\/string>/g' Loop/Loop/Info.plist - ``` - - * To save your changes to the "build_loop.yml", go to the Source Control tab on the left (should show up with a blue 1, see image below). - Enter a message and press the green "Commit & Push"-button. - By pressing this button, GitHub will automatically make a new browser build for you and push it to TestFlight - ![Github web ide example](./img/background-sound-web-ide.png) - -2. After you have done the onboarding of the pump (see steps above), go to the pump settings. - Scroll down the "Pump name" and long-press this row. - A modal should pop-up with the question, whether you want to toggle Silent tones. - - In order to activate this feature, the modal should say something like: `Yes, Enable silent tones`. - When it says: `Yes, Disable silent tones`, it will disable the background sounds. - ![Loop example background sound](./img/background-sound-loop.jpeg){width="250"} +An optional feature for Dana, useful when using a CGM without a heartbeat, is to play a silent audio to keep the *Loop* app active when in the background or when the phone is locked. + +Normally, your CGM will have an active Bluetooth connection, which prevents the *Loop* app from being put into a suspended state. +But when you use a CGM like [NightScout remote CGM](../loop-3/add-cgm.md#nightscout-remote-cgm), [Dexcom Share](../loop-3/add-cgm.md#dexcom-share-as-a-cgm), etc, you rely on a active internet connection, and not on an active Bluetooth connection. + +After you have onboarded the Dana pump, go to the pump settings. + +* Scroll down to the "Pump name" and long-press this row. + * A modal should pop-up with the question, whether you want to toggle Silent tones. + * In order to activate this feature, the modal should say something like: `Yes, Enable silent tones`. + * When it says: `Yes, Disable silent tones`, it will disable the background sounds. + + > ![Loop example background sound](./img/background-sound-loop.jpeg){width="250"} {align="center"} -3. Done! - Every time you put the *Loop* app in the background, it will play a toneless sound, which prevents it from suspending the *Loop* app +* Done! + Every time you put the *Loop* app in the background or lock the phone, it will play a toneless sound, which prevents it from suspending the *Loop* app +* Warning - this will affect your phone battery life ### Continuous bluetooth mode diff --git a/docs/troubleshooting/img/dana_doctor_mode_settings.png b/docs/troubleshooting/img/dana_doctor_mode_settings.png new file mode 100644 index 00000000000..315667dcbf2 Binary files /dev/null and b/docs/troubleshooting/img/dana_doctor_mode_settings.png differ diff --git a/docs/troubleshooting/img/dana_engineering_mode.JPG b/docs/troubleshooting/img/dana_engineering_mode.JPG new file mode 100644 index 00000000000..5c9033d7507 Binary files /dev/null and b/docs/troubleshooting/img/dana_engineering_mode.JPG differ diff --git a/docs/troubleshooting/img/dana_enter_password_menu.png b/docs/troubleshooting/img/dana_enter_password_menu.png new file mode 100644 index 00000000000..6a2682879d3 Binary files /dev/null and b/docs/troubleshooting/img/dana_enter_password_menu.png differ diff --git a/docs/troubleshooting/img/dana_options.png b/docs/troubleshooting/img/dana_options.png new file mode 100644 index 00000000000..608b7f40841 Binary files /dev/null and b/docs/troubleshooting/img/dana_options.png differ diff --git a/docs/troubleshooting/img/dana_options_menu.png b/docs/troubleshooting/img/dana_options_menu.png new file mode 100644 index 00000000000..2852478407d Binary files /dev/null and b/docs/troubleshooting/img/dana_options_menu.png differ diff --git a/docs/troubleshooting/img/dana_shipping_information.png b/docs/troubleshooting/img/dana_shipping_information.png new file mode 100644 index 00000000000..9e6801aebdb Binary files /dev/null and b/docs/troubleshooting/img/dana_shipping_information.png differ diff --git a/docs/troubleshooting/img/dana_shipping_information_menu.png b/docs/troubleshooting/img/dana_shipping_information_menu.png new file mode 100644 index 00000000000..27d73c2f868 Binary files /dev/null and b/docs/troubleshooting/img/dana_shipping_information_menu.png differ diff --git a/docs/troubleshooting/img/dana_silent_mode.JPG b/docs/troubleshooting/img/dana_silent_mode.JPG new file mode 100644 index 00000000000..f5d75b45055 Binary files /dev/null and b/docs/troubleshooting/img/dana_silent_mode.JPG differ diff --git a/docs/troubleshooting/loop-crashing.md b/docs/troubleshooting/loop-crashing.md index e23d4356a72..ba5c5485e4c 100644 --- a/docs/troubleshooting/loop-crashing.md +++ b/docs/troubleshooting/loop-crashing.md @@ -19,9 +19,7 @@ Your Loop app has an expiration date. The expiration date will depend on the bui ### Browser Build -> Update to version 3.4 as soon as possible. The builds will then be automatic. So all you will need to do in install the latest build from *TestFlight* on your phone. - -If you are running an older version, you do not get prior warning that the app is about to expire, although you can look in the *TestFlight* app and it will tell you. An in-app warning is supplied with version 3.4. +> With *Loop* 3.4 and newer, you will get an in-app notification when your build is about to expire. For many people, GitHub is disabling the automatic build once a month feature for Loop. Be sure to check once a month and kick off the build action if needed to make sure you always have a valid build in TestFlight. Please follow these steps to ensure you can build the app again: [How to Update or Rebuild](../browser/bb-update.md#how-to-update-or-rebuild){: target="_blank" }. @@ -57,7 +55,7 @@ Remember that switching from free to paid changes the developer name incorporate If you experience a crash for any other reason, please gather all the information you can about what was happening before the crash and report it to your favorite [Loop Social Media](../intro/loopdocs-how-to.md#how-to-find-help){: target="_blank" } help site - you will need to get some personalized help. Please - choose one site for your post and wait for someone to get back to you. While you are waiting, search on any of the sites and, if on Facebook, read all the announcements. ### Save and Submit your Crash Logs -If you have continuous crashes, please save the crash logs so the developers can look at it. If you can, log into [Zulipchat](https://loop.zulipchat.com/){: target="_blank" } and post it directly. +If you have continuous crashes, please save the crash logs so the developers can look at it. If you can, log into [Zulipchat](https://loop.zulipchat.com/) and post it directly. * The crash logs can be found under Settings --> Privacy & Security --> Analytics & Improvements --> Analytics Data * Scroll to find the file Loop_`DateTime`.ips for crash reports diff --git a/docs/troubleshooting/omnipod-faults.md b/docs/troubleshooting/omnipod-faults.md index 68bc69efacb..a21bc5ea310 100644 --- a/docs/troubleshooting/omnipod-faults.md +++ b/docs/troubleshooting/omnipod-faults.md @@ -60,7 +60,7 @@ The sole exception to reporting to Insulet is if you get a fault ending in `049` ## Known Pod Fault Codes -The currently known pod faults are listed here on the openomni wiki page: [Pod Fault codes](https://github.com/openaps/openomni/wiki/Fault-event-codes){: target="_blank" } +The currently known pod faults are listed here on the openomni wiki page: [Pod Fault codes](https://github.com/openaps/openomni/wiki/Fault-event-codes) ## Ways to Reduce Likelihood of a Fault diff --git a/docs/troubleshooting/overview.md b/docs/troubleshooting/overview.md index 2a238b520bf..2b391900710 100644 --- a/docs/troubleshooting/overview.md +++ b/docs/troubleshooting/overview.md @@ -24,7 +24,7 @@ The Loop Report (a text file) contains important information about actions and s ### GitHub Issues -Check the current list of [GitHub Loop Issues](https://github.com/LoopKit/Loop/issues){: target="_blank" } for known issues. Many times other users have noticed the same issue previously and opened an Issue so that more information can be added to help develop a solution. If you see the same issue has already been reported, please add it to the open issue instead of creating a new one. +Check the current list of [GitHub Loop Issues](https://github.com/LoopKit/Loop/issues) for known issues. Many times other users have noticed the same issue previously and opened an Issue so that more information can be added to help develop a solution. If you see the same issue has already been reported, please add it to the open issue instead of creating a new one. There is a nice search feature on GitHub issues - type a keyword into the box next to Filters: where it says "is:issue is:open" in the graphic and the display will show just those open issues that contain the keyword in the title. @@ -33,7 +33,7 @@ There is a nice search feature on GitHub issues - type a keyword into the box ne ### Zulipchat and Facebook -Search in [Zulipchat]( https://loop.zulipchat.com){: target="_blank" }, [Looped Facebook Group](https://www.facebook.com/groups/TheLoopedGroup){: target="_blank" } or [LoopandLearn Facebook Group](https://www.facebook.com/groups/LOOPandLEARN){: target="_blank" }. Quite possibly someone else has already posted about the same issue and perhaps a resolution has already been provided. +Search in [Zulipchat]( https://loop.zulipchat.com), [Looped Facebook Group](https://www.facebook.com/groups/TheLoopedGroup) or [LoopandLearn Facebook Group](https://www.facebook.com/groups/LOOPandLEARN). Quite possibly someone else has already posted about the same issue and perhaps a resolution has already been provided. ## Ask for Help diff --git a/docs/troubleshooting/pod-pairing.md b/docs/troubleshooting/pod-pairing.md index 8e7337401dd..f7f06992b49 100644 --- a/docs/troubleshooting/pod-pairing.md +++ b/docs/troubleshooting/pod-pairing.md @@ -100,7 +100,7 @@ Hopefully, your pod pairing continues uneventfully at this point. You'll press t The DASH pod can be left in the tray and placed right next to the phone. If the first attempt to pair shows the "No pods found" message, place the tray on top of the phone or move the pod a little further away from the phone, then try again. -If you see the [Verbose Message, Hard to Interpret](#verbose-message-hard-to-interpret) Pairing exception message as shown in the link above, you need to toggle Bluetooth on the phone: +If you see an error message indicating a Bluetooth issue, you need to toggle Bluetooth on the phone: * In your phone settings, turn off Bluetooth * Turn on Bluetooth diff --git a/docs/troubleshooting/pump-errors.md b/docs/troubleshooting/pump-errors.md index 6716649635f..7264dd1873b 100644 --- a/docs/troubleshooting/pump-errors.md +++ b/docs/troubleshooting/pump-errors.md @@ -22,7 +22,7 @@ This error message "battery out of limits" has to do with the internal pump batt ## Button Error -The Button Error message usually happens from water, moisture, or dust getting under the pump's button pad and causing button(s) to fail. The fix luckily is quite straight-forward and takes less than 30 minutes. Check out the fix [here for a YouTube video](https://www.youtube.com/watch?v=nWRVSHXN5cQ){: target="_blank" } or [here for photo gallery](https://imgur.com/a/iOXAP){: target="_blank" }. There is also a detailed page in the [OpenAPS docs](https://openaps.readthedocs.io/en/latest/docs/Resources/Medtronic-Button-Errors.html#medtronic-button-error-troubleshooting){: target="_blank" }. +The Button Error message usually happens from water, moisture, or dust getting under the pump's button pad and causing button(s) to fail. The fix luckily is quite straight-forward and takes less than 30 minutes. Check out the fix [here for a YouTube video](https://www.youtube.com/watch?v=nWRVSHXN5cQ) or [here for photo gallery](https://imgur.com/a/iOXAP). There is also a detailed page in the [OpenAPS docs](https://openaps.readthedocs.io/en/latest/docs/Resources/Medtronic-Button-Errors.html#medtronic-button-error-troubleshooting). ![img/button-error.jpg](img/button-error.jpg){width="400"} {align="center"} @@ -44,11 +44,11 @@ After you finish your fix, another excellent idea is to make sure you add a leng ## Crack/Missing Piece Repairs -Another common issue on these Medtronic pumps are cracks and/or missing bits of plastic near the battery cap or reservoir sleeve. You can repair these fairly easily. For filling small cracks, [Testor's plastic cement](https://www.amazon.com/Cement-Glue-Value-Testors-tubes/dp/B0013D53CS/ref=sr_1_2?s=toys-and-games&ie=UTF8&qid=1550883077&sr=1-2&keywords=testors+plastic+cement){: target="_blank" } or [Gorilla epoxy](https://www.amazon.com/Gorilla-Epoxy-Minute-ounce-Syringe/dp/B001Z3C3AG/ref=sr_1_1_sspa?ie=UTF8&qid=1550883118&sr=8-1-spons&keywords=gorilla+epoxy&psc=1){: target="_blank" } are good choices. +Another common issue on these Medtronic pumps are cracks and/or missing bits of plastic near the battery cap or reservoir sleeve. You can repair these fairly easily. For filling small cracks, [Testor's plastic cement](https://www.amazon.com/Cement-Glue-Value-Testors-tubes/dp/B0013D53CS/ref=sr_1_2?s=toys-and-games&ie=UTF8&qid=1550883077&sr=1-2&keywords=testors+plastic+cement) or [Gorilla epoxy](https://www.amazon.com/Gorilla-Epoxy-Minute-ounce-Syringe/dp/B001Z3C3AG/ref=sr_1_1_sspa?ie=UTF8&qid=1550883118&sr=8-1-spons&keywords=gorilla+epoxy&psc=1) are good choices. -For more extensive repairs to replace missing chunks of plastic, [Gorilla epoxy](https://www.amazon.com/Gorilla-Epoxy-Minute-ounce-Syringe/dp/B001Z3C3AG/ref=sr_1_1_sspa?ie=UTF8&qid=1550883118&sr=8-1-spons&keywords=gorilla+epoxy&psc=1){: target="_blank" } or [Sugru](https://www.amazon.com/Sugru-Mouldable-Glue-Original-Formula/dp/B01BFE0KNQ/ref=sr_1_4?ie=UTF8&qid=1550883178&sr=8-4&keywords=sugru){: target="_blank" } are excellent choices. +For more extensive repairs to replace missing chunks of plastic, [Gorilla epoxy](https://www.amazon.com/Gorilla-Epoxy-Minute-ounce-Syringe/dp/B001Z3C3AG/ref=sr_1_1_sspa?ie=UTF8&qid=1550883118&sr=8-1-spons&keywords=gorilla+epoxy&psc=1) or [Sugru](https://www.amazon.com/Sugru-Mouldable-Glue-Original-Formula/dp/B01BFE0KNQ/ref=sr_1_4?ie=UTF8&qid=1550883178&sr=8-4&keywords=sugru) are excellent choices. -You can use [teflon thread tape](https://www.amazon.com/LASCO-11-1033-Sealant-2-Inch-100-Inch/dp/B00ITPHXZI/ref=sr_1_17?ie=UTF8&qid=1550883881&sr=8-17&keywords=teflon+thread+tape){: target="_blank" } on the battery cap to make sure the epoxy or Sugru don't stick to the battery cap, but still recreate the threads. The first photos are of a Sugru repair and second set of photos are Gorilla epoxy repair. +You can use [teflon thread tape](https://www.amazon.com/LASCO-11-1033-Sealant-2-Inch-100-Inch/dp/B00ITPHXZI/ref=sr_1_17?ie=UTF8&qid=1550883881&sr=8-17&keywords=teflon+thread+tape) on the battery cap to make sure the epoxy or Sugru don't stick to the battery cap, but still recreate the threads. The first photos are of a Sugru repair and second set of photos are Gorilla epoxy repair. ![img/after-sugru.jpg](img/after-sugru.jpg){width="750"} {align="center"} diff --git a/docs/troubleshooting/red-loop.md b/docs/troubleshooting/red-loop.md index 564f373831b..fbddc05bd14 100644 --- a/docs/troubleshooting/red-loop.md +++ b/docs/troubleshooting/red-loop.md @@ -106,7 +106,7 @@ If you have not enabled background app refresh on your phone, then Loop is likel 1. While you are there - check your CGM app as well -For iOS 15 and later, there is a new feature described by [Dexcom](https://www.dexcom.com/faqs/what-are-the-recommended-iphone-settings){: target="_blank" } +For iOS 15 and later, there is a new feature described by [Dexcom](https://www.dexcom.com/faqs/what-are-the-recommended-iphone-settings) 1. Phone Settings -> Screen Time -> choose Always Allowed -> select an app, tap the plus icon to add to Always Allowed list - add Dexcom @@ -122,7 +122,7 @@ If you added your Nightscout URL to Loop and are uploading information to Nights 1. Check that Nightscout database size isn't full (more details below) 1. If Red Loops are resolved by removing the Nightscout URL from Loop; you need to figure out if it's the connection or the database or some other issue -If you opted for the free DIY Nightscout, you will need to clean your database once or twice a year. Follow the [Nightscout Database cleanup steps](https://nightscout.github.io/troubleshoot/troubleshoot/#database-full){: target="_blank" }. Make sure you are periodically checking your database size (and that the **dbsize** keyword is in your [ENABLE list](../nightscout/update-user.md#editadd-config-vars) and cleaning it. +If you opted for the free DIY Nightscout, you will need to clean your database once or twice a year. Follow the [Nightscout Database cleanup steps](https://nightscout.github.io/troubleshoot/troubleshoot/#database-full). Make sure you are periodically checking your database size (and that the **dbsize** keyword is in your [ENABLE list](../nightscout/update-user.md#editadd-config-vars){: target="_blank" } and cleaning it. ### Phone Storage is Full @@ -192,7 +192,7 @@ There are a few other things to consider: ### RileyLink is Broken -How can you tell if your RileyLink has a problem? The answer is mostly within the LED lights that display on the board. Some information is listed below, but also review the [FAQs at getrileylink.org](https://getrileylink.org/faq){: target="_blank" }. +How can you tell if your RileyLink has a problem? The answer is mostly within the LED lights that display on the board. Some information is listed below, but also review the [FAQs at getrileylink.org](https://getrileylink.org/faq). If you have a different RileyLink compatible device, please check the appropriate site for troubleshooting help. @@ -200,13 +200,13 @@ If you have a different RileyLink compatible device, please check the appropriat **Green light**: Indicates an active BT connection with the phone. You want the green light to stay on all the time on the RileyLink. If the green light is not on, then make sure your iPhone's bluetooth is still switched on. -**Blue light**: The blue light will flash off/on periodically when the RileyLink and pump are actively communicating...it should NOT be always on. If your blue light is stuck on, that is an indication of a problem on the board. Try looking for signs of damage or debris that may be causing a short on the board. Clean the board with rubbing alcohol [(unplug the battery first](https://youtu.be/s2qNPLpfwww){: target="_blank" }). If you still can't get the blue light off, then contact GetRileyLink for help or check out [RileyLink Compatible Devices](../build/rileylink.md#rileylink-compatible-devices) for replacement options. +**Blue light**: The blue light will flash off/on periodically when the RileyLink and pump are actively communicating...it should NOT be always on. If your blue light is stuck on, that is an indication of a problem on the board. Try looking for signs of damage or debris that may be causing a short on the board. Clean the board with rubbing alcohol [(unplug the battery first](https://youtu.be/s2qNPLpfwww)). If you still can't get the blue light off, then contact GetRileyLink for help or check out [RileyLink Compatible Devices](../build/rileylink.md#rileylink-compatible-devices) for replacement options. ### Battery has Failed -Both [RileyLink](https://getrileylink.org/faq){: target="_blank" } and [EmaLink](https://github.com/sks01/EmaLink/wiki/Battery-swelling){: target="_blank" } use LiPo batteries. If they stop holding charge for as long as they used to, or if they swell (often first noticed as bowing of the case), stop using the battery and replace it as soon as possible. +Both [RileyLink](https://getrileylink.org/faq) and [EmaLink](https://github.com/sks01/EmaLink/wiki/Battery-swelling) use LiPo batteries. If they stop holding charge for as long as they used to, or if they swell (often first noticed as bowing of the case), stop using the battery and replace it as soon as possible. -[OrangeLink](https://getrileylink.org/faq){: target="_blank" } uses regular batteries, so just change them out. +[OrangeLink](https://getrileylink.org/faq) uses regular batteries, so just change them out. ### OrangeLink Firmware diff --git a/docs/version/build-dev.md b/docs/version/build-dev.md index 8c356851cbe..7b31470c350 100644 --- a/docs/version/build-dev.md +++ b/docs/version/build-dev.md @@ -8,23 +8,15 @@ There are several methods to build Loop-dev. First review the general informatio ## Update Frequently -While Loop-dev is under active development, you should monitor zulipchat and update frequently. Sometimes the `dev` branch is quiet for a month or more and other times it gets updated daily. Please pay attention. +While Loop-dev is under active development, you should monitor zulipchat and update frequently. Sometimes the `dev` branch is quiet for months at a time and other times there are more frequent changes. Please pay attention. -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. ## Loop-dev Version -The version of code that shows up under the Loop Settings screen does not change when the `dev branch` is modified. +The version of code that shows up under the Loop Settings screen is incremented whenever the `dev branch` is modified, as explained in [Loop Version Numbering](releases.md#loop-version-numbering){: target="_blank" }. -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) - -* [`Loop` Version Numbering](releases.md#loop-version-numbering) - -### Identify Loop-dev Version - -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. - -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. +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. ## Build `Loop` `dev` diff --git a/docs/version/build-time-flag.md b/docs/version/build-time-flag.md index f455a9cd81d..42f002169ad 100644 --- a/docs/version/build-time-flag.md +++ b/docs/version/build-time-flag.md @@ -54,7 +54,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(SWIFT_ACTIVE_COMPILATION_CONDITIONS) SIR |OBSERVE_HEALTH_KIT_CARB_SAMPLES_FROM_OTHER_APPS_ENABLED|Turns on ability for Loop to read third party carb entries. You must also make sure Health permissions allow Loop to read carbs from Health. Be vigilant if you select this; added carbs lead to added insulin dosing when closed loop is enabled| |SHOW_EVENTUAL_BLOOD_GLUCOSE_ON_WATCH_DISABLED|The Apple Watch screens show current glucose, trend arrow and eventual glucose by default. This flag disables the display of eventual glucose on the watch if you find the display distracting.| |PREDICTED_GLUCOSE_CHART_CLAMP_ENABLED|[Chart Clamp](#chart-clamp)| -|ALLOW_ALGORITHM_EXPERIMENTS|**dev branch only**

    This is enabled by default to show Algorithm Experiments below the Therapy Settings row. This enables the user to separately enable or disable Glucose Based Partial Application and Integral Retrospective Correction| +|ALLOW_ALGORITHM_EXPERIMENTS|This is enabled by default to show Algorithm Experiments below the Therapy Settings row. This enables the user to separately enable or disable Glucose Based Partial Application and Integral Retrospective Correction| ### Chart Clamp diff --git a/docs/version/code-custom-edits.md b/docs/version/code-custom-edits.md index ce8d63efcba..9b991df1c25 100644 --- a/docs/version/code-custom-edits.md +++ b/docs/version/code-custom-edits.md @@ -2,7 +2,7 @@ For new Loopers, please build the code before you make any changes. Start with Open Loop and familiarize yourself with the interface. Later, you can make the customization(s) you desire and build again. The second build will be much easier than your first build. -These customizations require you modify the *Loop* app code and then build the app after making these customizations. This page supports version 3 and greater for the *Loop* app. +These customizations require you to modify the *Loop* app code and then build the app after making these customizations. This page supports version 3 and greater for the *Loop* app. ## Customization Options @@ -29,20 +29,20 @@ The instructions on this page identify the module, `Key_Phrase` or file and line !!! question "Why do I have to jump between pages?" * The code changes are defined on this page - * The method to make code changes depends on build method and are found at: + * The method to make code changes depends on build method and is found at: * [Custom Edits with Browser](../browser/edit-browser.md){: target="_blank" } * [Custom Edits with *Mac*](../build/edit-mac.md){: target="_blank" } !!! info "Line numbers may change" - Every effort will be made to update the line numbers as the code is updated, but there may be times where the screenshots and line numbers differ from the current version of Loop code. + Every effort will be made to update the line numbers as the code is updated, but there may be times when the screenshots and line numbers differ from the current version of Loop code. * You may notice some customizations list line numbers for different branches * If you cannot identify a line that looks exactly like the example - do not guess - go to your favorite social media group and ask for help - * Sometimes there is a bigger change than just line numbers. The git software is really good about finding the "right" code that is just at a different line number. When you see the notation `Stable: Changed on date`, that means you must select the correct version when making your personal customization depending on which version you are modifying. + * Sometimes there is a bigger change than just line numbers. The *git* software is really good about finding the "right" code that is just at a different line number. When you see the notation `Stable: Changed on date`, that means you must select the correct version when making your personal customization depending on which version you are modifying. * With the release of 3.4.x, no customizations fall into this category - * The notation is kept to handle future changes that might happen when development start again + * The notation is kept to handle future changes that might happen when development starts again This page is broken into two halves: @@ -50,7 +50,7 @@ This page is broken into two halves: * The first half of this page is for customizations that require you to edit your own code * [Custom Edits Optional](#custom-edits-optional): - * The second half of this page provides instructions for some of the prepared customizations included in the [*Loop and Learn*: Customization Select Script](https://www.loopandlearn.org/custom-code){: target="_blank" } + * The second half of this page provides instructions for some of the prepared customizations included in the [*Loop and Learn*: Customization Select Script](https://www.loopandlearn.org/custom-code) * Some people prefer to make all their own edits For each customization, you will be given landmarks to find the correct location in the code. You can choose to search using the `Key_Phrase` or navigate to the file in the folder structure and look for the line number. @@ -58,21 +58,21 @@ For each customization, you will be given landmarks to find the correct location ### Key_Phrase ``` { .txt .copy title="Example of a Key_Phrase" } -use the copy button at right, paste into search -The copy button for this exampe is just for practice +use the copy button at right, paste it into the search box +The copy button for this example is just for practice Do not paste the result anywhere ``` To search using the `Key_Phrase` (see graphic above for an example): -* A copy button is available when you hover your mouse in the right-hand side +* A copy button is available when you hover your mouse on the right-hand side of the block below the title `Key_Phrase`; click on it to copy the phrase into your paste buffer * You can paste this into the search function of the tool you are using if desired (warning, you may have to hit back-space to remove a return character from the pasted text) -* Alternatively, navigate to the required file using Module, Folder, File and line number +* Alternatively, navigate to the required file using Module, Folder, File, and line number ### Module, Folder, File -Each customization provides the Module, Folder and File bullet below the key phrase. +Each customization provides the Module, Folder, and File bullet below the key phrase. * Module: Loop * Folder: Loop/subfolder1/subfolder2/etc. @@ -112,9 +112,9 @@ At the current time, all customizations are stable. It has been more than a year ![img/carb_screen.png](img/carb_screen.png){width="200"} {align="center"} -In prior versions of the *Loop* app, for example version 2.2.x, the lollipop (fast) icon was set for 2 hours, taco (medium) icon for 3 hours, and pizza (slow) icon for 4 hours. This is modified for `the *Loop* app` to 30 minutes, 3 hours and 5 hours respectively. Some people prefer different values. +In prior versions of the *Loop* app, for example version 2.2.x, the lollipop (fast) icon was set for 2 hours, taco (medium) icon for 3 hours, and pizza (slow) icon for 4 hours. This is modified for `the *Loop* app` to 30 minutes, 3 hours, and 5 hours respectively. Some people prefer different values. -If you want to change this to 2, 3 and 5 hours - that is available as a standard customization using the [*Loop and Learn*: Customization Select Script](https://www.loopandlearn.org/custom-code/#custom-list){: target="_blank" } +If you want to change this to 2, 3, and 5 hours - that is available as a standard customization using the [*Loop and Learn*: Customization Select Script](https://www.loopandlearn.org/custom-code/#custom-list) ??? question "Do you want to know more? (Click to open/close)" The developers did this because they expect fast to only be used for rapid-acting low treatments. The medium and slow values are for moderate and higher-fat or large meals. @@ -145,7 +145,7 @@ Note that if you change `fast` from 30 minutes to 1.5 hours, you must also chang With version 3.2.0, a new safety feature was added. This limits automatic dosing so IOB is no more than two times the $\mathit{maximumBolus}$ set in your Delivery Limits. (The term automatic dosing refers to insulin the app automatically delivers above your scheduled basal rate.) Manual Bolus, where you initiate the bolus yourself, is not subject to this limit. Please read [How do Delivery Limits Affect Automatic Dosing?](../faqs/algorithm-faqs.md#how-do-delivery-limits-affect-automatic-dosing) for detailed information on how this safety feature works. -The default value ($\mathit{2*maximumBolus}$) used for this feature is good for the majority of people who use the app. However, there are some individuals who might need to limit the size of any single bolus independent from the maximum IOB they want to set for their app. This is particularly true for those who find large boluses give rise to tunneling and the insulin leaks out along the cannula. +The default value ($\mathit{2*maximumBolus}$) used for this feature is good for the majority of people who use the app. However, some individuals might need to limit the size of any single bolus independent of the maximum IOB they want to set for their app. This is particularly true for those who find large boluses give rise to tunneling, and the insulin leaks out along the cannula. ``` { .txt .copy title="Key_Phrase" } automaticDosingIOBLimit = maxBolus @@ -178,7 +178,7 @@ If you are mostly happy with the Dosing Strategy of Automatic Bolus but wish it This customization changes the percent of the recommended bolus used for automatic delivery. The method for calculating that recommendation is not changed by this modification. The default value is 40% (0.4). It is recommended you take small changes of 0.1 at a time. Once you modify it once and try it out for a while, it’s easy to go back and change it again. -**Change just the number and double check that the value is less than 1.** +**Change just the number and double-check that the value is less than 1.** ``` { .txt .copy title="Key_Phrase" } let bolusPartialApplicationFactor @@ -293,7 +293,7 @@ static let carbRatio = Guardrail( The *Loop* app limits to 1 hour the amount of time in the future that carbs can be entered. -* The [*Loop and Learn*: Customization Select Script](https://www.loopandlearn.org/custom-code){: target="_blank" } has a customization that changes this to 4 hours in the future +* The [*Loop and Learn*: Customization Select Script](https://www.loopandlearn.org/custom-code) has a customization that changes this to 4 hours in the future * If you want something other than 1 hour or 4 hours, you must create a personal customization * Module: Loop @@ -414,7 +414,7 @@ An example change that a Free Loop App user (who has to build once a week) might ``` > .hours(4) ? .days(10) : .hours(2) ``` -Combined with an ```.hours(12)``` on line 16, they would get notified at 12 hours, 4 hours and 2 hours before expiration on the day of expiration and only when the app is opened. Since you'll be building once a week, you can play around with these values until you are happy. +Combined with an ```.hours(12)``` on line 16, they would get notified at 12 hours, 4 hours, and 2 hours before expiration on the day of expiration and only when the app is opened. Since you'll be building once a week, you can play around with these values until you are happy. ### Enable Child Model @@ -428,7 +428,7 @@ Each exponential model has 3 parameters that can be adjusted: * peakActivity: Peak of insulin activity (minutes) * delay: Delay before insulin begins to acts after delivery starts (minutes) -Please read the nitty-gritty discussion that went into the development of the "exponential insulin models" in this [Comment](https://github.com/LoopKit/Loop/issues/388#issuecomment-317938473){: target="_blank" }. +Please read the nitty-gritty discussion that went into the development of the "exponential insulin models" in this [Comment](https://github.com/LoopKit/Loop/issues/388#issuecomment-317938473). If you wish to customize these values, please make sure you know what you are doing. This is not a modification recommended for Loop novices. @@ -463,7 +463,7 @@ This *Loop* table of default values is provided for convenience. The times are a !!! warning "*Mac* Instructions" This can be done with Build with Browser but the instructions might need to be adjusted for that case. -If you want an app logo other than the default green circle for your Loop app, you can easily customize this. To make it easy to generate the correct sizes of icons, you can use a site like [appicon.build](http://www.appicon.build/){: target="_blank" } or [appicon.co](https://appicon.co/){: target="_blank" } and just drag and drop your source image. The source image needs to be 1024 pixels x 1024 pixels. The site will email you a zip file or automatically download a set of files. Highlight and copy the contents of the Appicon.appiconset that you are sent, including the Contents.json file +If you want an app logo other than the default green circle for your Loop app, you can easily customize this. To make it easy to generate the correct sizes of icons, you can use a site like [makeappicon.com](https://makeappicon.com/) or [appicon.co](https://appicon.co/) and just drag and drop your source image. The source image needs to be 1024 pixels x 1024 pixels. The site will email you a zip file or automatically download a set of files. Highlight and copy the contents of the Appicon.appiconset that you are sent, including the Contents.json file 1. Navigate to the LoopWorkspace folder 1. Open the OverrideAssetsLoop.xcassets folder @@ -477,9 +477,9 @@ And now you'll be the proud new owner of a custom Loop icon. ## Custom Edits Optional -The customizations listed below are incorporated into the [*Loop and Learn*: Customization Select Script](https://www.loopandlearn.org/custom-code){: target="_blank" }. +The customizations listed below are available already prepared - please review [*Loop and Learn*: Customization](https://www.loopandlearn.org/custom-code/#custom-list). -You can use that script or make your own edit by following these directions. +You can use the prepared customizations or make your own edit by following these directions. ### Disable Authentication for Bolusing @@ -565,7 +565,7 @@ _Code Before Modification_ #### `"low_carb_limit"` -This first example might be used by a parent for a child with very small carb entries. It is provided as one of the prepared customizations supplied by the [*Loop and Learn* Customization as `"low_carb_limit`"](https://www.loopandlearn.org/custom-code/#custom-list){: target="_blank" }. +This first example might be used by a parent for a child with very small carb entries. It is provided as one of the prepared customizations supplied by the [*Loop and Learn* Customization as `"low_carb_limit`"](https://www.loopandlearn.org/custom-code/#custom-list). _Code After Modification to enable the warning at lower levels and limit maximum_ @@ -575,7 +575,7 @@ _Code After Modification to enable the warning at lower levels and limit maximum #### `"high_carb_limit"` -This second example might be used by a person who routinely enters large meals and does not want to be warned with every meal. It is provided as one of the prepared customizations supplied by the [*Loop and Learn* Customization as `"high_carb_limit`"](https://www.loopandlearn.org/custom-code/#custom-list){: target="_blank" }. +This second example might be used by a person who routinely enters large meals and does not want to be warned with every meal. It is provided as one of the prepared customizations supplied by the [*Loop and Learn* Customization as `"high_carb_limit`"](https://www.loopandlearn.org/custom-code/#custom-list). _Code After Modification to warn if entry is between 201 and 300g_ diff --git a/docs/version/development.md b/docs/version/development.md index 0c76e00cdba..365f80b3c91 100644 --- a/docs/version/development.md +++ b/docs/version/development.md @@ -4,7 +4,9 @@ The early history of the *Loop* app was touched on in the introductory [*LoopDoc The [*Loop* Releases](../version/releases.md) page lists releases since version 2.0 in reverse chronological order. -The next version of the *Loop* app is developed using branch(es), independent of the released *Loop* version, which is found in the `main` branch. The `dev` branch is used by the developers to push out changes for users to test. You should only test a development branch if you are willing to be both an active participant with the developers to monitor announcements and provide feedback and to build frequently to obtain the latest feature or bug-fix that is being tested. If you are willing to help out - this is the way the next release of *Loop* is improved. +The next version of the *Loop* app is developed using branch(es), independent of the released *Loop* version, which is found in the `main` branch. + +The `dev` branch is used by the developers to push out changes for users to test. You should only test a development branch if you are willing to be both an active participant with the developers to monitor announcements and provide feedback and to build frequently to obtain the latest feature or bug-fix that is being tested. If you are willing to help out - this is the way the next release of *Loop* is improved. If you choose to use `dev`, you accept that this code is not released. @@ -12,127 +14,389 @@ Please read this entire page before using any version of *Loop* other than the r ## Updates in `dev` -This section provides an overview of changes to `dev` compared to `Loop 3.6.0`. +This section provides an overview of changes to `dev` compared to `Loop v3.14.0`. -There are no updates at this time, but that can change without warning. Be very cautious building `dev` branch. +The current version of `dev` is v3.14.0 with code identical to that in the `main` branch. -## Updates from 3.4 to 3.6 +Please check the [development channel in zulipchat](https://loop.zulipchat.com/#narrow/channel/144182-development) for notifications when an update to the `dev` branch is expected so you will be prepared. Do this **before** you install a `dev` build from TestFlight. -All updates are reported in [`Loop 3.6.0`](releases.md#loop-v360){: target="_blank" } +### Branches -## Updates from 3.2 to 3.4 +In addition to the main and dev branches, which are tightly controlled and only updated through a formal pull request and approval process, there are also some feature and update branches. These branches are subject to more frequent updates, so users testing these branches should follow along in zulipchat for information. -Most features, originally in the Updates in `dev` section before the release of version 3.4, have been inserted into the appropriate part of the *LoopDocs* website (indicated by the up-right arrow after the link). A few items are still in this section. +* The `update_dev_to_M.m.#` is where the next version of dev is tested before becoming part of `dev` and later being released as `main` +* The branches starting with `feat/` have one or more special features, like support for new pumps, CGM or the new universal pump manager for all types of Omnipods -* [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" } -* [GitHub Browser Build Updates](#github-browser-build-updates) -* [Miscellaneous Code Fixes](#miscellaneous-code-fixes) +The graphic below shows the `main` and `dev` branches along with some feature branches and an update branch. + +> ![Active branches for LoopWorkspace](img/loop-development-branches.png ){width="750"} +{align="center"} + + +??? tip "Updates in Progress (Click to open/close)" + * Sometimes there is a work-in-progress branch, `update_dev_to_M.m.#` used to collect new items in preparation for the next `dev` branch. This allows people to test and comment on the updates before they land in the `dev` branch. + * There are also feature branches for items like new pumps and new CGMs: + * The feature branches typically spin off of `dev`, but if a `updates_dev_to_ . . .` branch is in work, it is merged into the feature branches as items get included + +#### Table of Active Branches + +The table below lists active branches. Note that updates may occur and be announced in zulipchat a day or two before updates propogate to *LoopDocs*. + +|
    branch | version # |
    last updated | comments | +|:--|:--|:--|:--| +| main | 3.14.0 | 14 May 2026 | release | +| dev | 3.14.0 | 14 May 2026 | code is currently the same as `main` | +| [feat/dev-dana-medtrum](#feature-branch-dana-and-medtrum-support)
    - SHA `638d351` | 3.14.0 | 14 May 2026 | - adds support for Dana and Medtrum pumps
    - SHA for DanaKit is `c544c42`
    - SHA for MedtrumKit is `6060747`
    **Medtrum User Interface Redesigned** to be more like the Omnipod User Interac.
    Several fixes added for MedtrumKit, not yet in DanaKit | +| [feat/eversense](#feature-branch-eversense-support)
    - SHA `059caf5` | 3.14.0 | 15 May 2026 | - adds experimental support for Eversense (includes Dana and Medtrum pumps support - same SHA as above)
    - this branch is ready for use to evaluate and report back
    - SHA for Eversense is `fe322a6` | +| [feat/omnipodkit](#feature-branch-omnipodkit-pump-manager)
    - SHA `553bf36` | 3.14.0 | 15 May 2026| The new OmnipodKit pump manager, controls all Types of pods. Initially only the Eros and DASH pod types are available for feature branch testers
    - SHA for OmnipodKit is `9bf676e`
    **Please read [Feature Branch: OmnipodKit Pump Manager](#feature-branch-omnipodkit-pump-manager)** | + +!!! important "Eversense Support" + The Eversense CGM is now supported by the *Loop* app in a feature branch. To simplify maintenance, the branch which supports Eversense also supports the two new pumps: Dana and Medtrum. + + The branch which support Evensense E3 and E365 CGM is simply called `feat/eversense`. + +??? question "What is SHA? (Click to Open/Close)" + SHA-1 means Secure Hash Algorithm 1. This is used to generate an alphanumeric code to identify which version of a repository is used. + + Each time you save a change to your GitHub repository, a unique SHA-1 is created. That identifier is used to tell *GitHub* a specific change that you want applied or identifies a specific version for that 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. -![img/loopkit.png](img/loopkit.png){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. ![img/zulipchat.png](img/zulipchat.png){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.) ![img/commit.png](img/commit.png){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. ![img/watching.png](img/watching.png){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. ![there has been an update in three submodules](img/zulipchat-github.svg){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. -![Determine current app version on app settings screen](img/app-version.jpg){width="400"} +![Determine current app version on app settings screen](img/app-version.png){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* _