Skip to content
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
f08cd7a
fix broken links in docs
gniezen May 11, 2026
847f14b
fix more links
gniezen May 11, 2026
5672a1d
remove guides that were never written
gniezen May 11, 2026
2b6b4f4
remove old readme
gniezen May 11, 2026
194d076
Merge branch 'develop' into fix-docs
gniezen May 14, 2026
3014558
Merge pull request #1746 from tidepool-org/fix-docs
gniezen May 18, 2026
a4c5e4a
display POST records in debug mode for all devices
gniezen May 19, 2026
0ca7146
v2.66.0-add-post-data.1
gniezen May 19, 2026
6566a13
fix linting errors from install_tools check
gniezen May 28, 2026
4f1a1b2
Merge pull request #1751 from tidepool-org/fix-checks-docs
gniezen May 28, 2026
86db02b
bump ble-glucose
gniezen Jun 8, 2026
0e9af52
add prodigy voice and prodigy pocket
gniezen Jun 8, 2026
20c0229
v2.66.0-add-more-prodigy.1
gniezen Jun 8, 2026
8048004
update dependencies
gniezen Jun 9, 2026
966e2fa
v2.66.0-dep-updates-jun26.1
gniezen Jun 9, 2026
5290124
fix typo
gniezen Jun 9, 2026
1a9f340
Merge pull request #1753 from tidepool-org/dep-updates-jun26
gniezen Jul 2, 2026
2173f8e
Merge branch 'develop' into add-post-data
gniezen Jul 2, 2026
6ba39bd
Merge pull request #1749 from tidepool-org/add-post-data
gniezen Jul 2, 2026
4e05775
Merge branch 'develop' into add-more-prodigy
gniezen Jul 2, 2026
6c10845
Merge pull request #1752 from tidepool-org/add-more-prodigy
gniezen Jul 2, 2026
d791dd4
v2.67.0
gniezen Jul 2, 2026
78e3fa3
bump electron-builder patch version
gniezen Jul 2, 2026
cdd61fe
update yarn.lock files
gniezen Jul 2, 2026
7a11e4d
prevent duplicate draft releases
gniezen Jul 6, 2026
7b5a17e
Merge pull request #1760 from tidepool-org/release-2.67.0
gniezen Jul 9, 2026
8f43dd0
Merge branch 'main' into develop
gniezen Jul 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions app/components/Upload.js
Original file line number Diff line number Diff line change
Expand Up @@ -363,14 +363,16 @@ export default class Upload extends Component {

let post_link = null;

if(_.isArray(data) || _.isArray(data.post_records)) {
if(_.isArray(data) || _.isArray(data.post_records) || _.isArray(data.postRecords)) {

let filename = 'uploader-processed-records.json';
let jsonData = null;
if (_.isArray(data)) {
jsonData = JSON.stringify(data, undefined, 4);
} else {
} else if (_.isArray(data.post_records)) {
jsonData = JSON.stringify(data.post_records, undefined, 4);
} else {
jsonData = JSON.stringify(data.postRecords, undefined, 4);
}
let blob = new Blob([jsonData], {type: 'text/json'});
let dataHref = URL.createObjectURL(blob);
Expand Down
2 changes: 1 addition & 1 deletion app/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "tidepool-uploader",
"productName": "tidepool-uploader",
"version": "2.66.0",
"version": "2.66.0-add-more-prodigy.1",
"description": "Tidepool Project Universal Uploader",
"main": "./main.prod.js",
"author": {
Expand Down
14 changes: 14 additions & 0 deletions app/reducers/devices.js
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,20 @@ const devices = {
source: {type: 'device', driverId: 'ProdigyAutocode'},
enabled: {mac: true, win: true, linux: true}
},
prodigypocket: {
instructions: i18n.t('Plug in meter with mini-USB cable'),
name: 'Prodigy Pocket',
key: 'prodigypocket',
source: {type: 'device', driverId: 'ProdigyPocket'},
enabled: {mac: true, win: true, linux: true}
},
prodigyvoice: {
instructions: i18n.t('Plug in meter with mini-USB cable'),
name: 'Prodigy VOICE',
key: 'prodigyvoice',
source: {type: 'device', driverId: 'ProdigyVoice'},
enabled: {mac: true, win: true, linux: true}
},
relionplatinum: {
instructions: i18n.t('Plug in meter with micro-USB cable'),
name: 'ReliOn Platinum (Connect with USB)',
Expand Down
14 changes: 8 additions & 6 deletions docs/BootstrappingToUTC.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<!-- NB: this markdown file is linked directly from a Tidepool blog post, DON'T MOVE -->

# Bootstrapping To UTC

## Background

At present, no diabetes device that Tidepool knows about represents the date & time at which device events occur in either UTC time or in a way that is anchored to UTC time - i.e., providing timezone and/or offset-from-UTC information. Because we are correlating data from many different sources for each user, we rely on UTC time as the absolute scale on which to place all the time series data ingested by the Tidepool platform.
Expand Down Expand Up @@ -61,17 +63,17 @@ _.each(data, function(datum) {
});
```

Each instance of the `TimezoneOffsetUtil` keeps track of which method for generating the `time` field is being employed - either across-the-board application of a timezone (when no date & time settings changes were provided to the constructor) or "bootstrapping" to UTC. The method of `time` generation is publicly available through the `type` property on the instance (i.e., `cfg.tzoUtil.type`) and must be retrieved and provided as the `timeProcessing` field of the [upload metadata](http://developer.tidepool.io/data-model/v1/upload/).
Each instance of the `TimezoneOffsetUtil` keeps track of which method for generating the `time` field is being employed - either across-the-board application of a timezone (when no date & time settings changes were provided to the constructor) or "bootstrapping" to UTC. The method of `time` generation is publicly available through the `type` property on the instance (i.e., `cfg.tzoUtil.type`) and must be retrieved and provided as the `timeProcessing` field of the [upload metadata](http://developer.tidepool.org/data-model/device-data/types/upload.html).

#### Expectations for `timeChange` events

The partially built `timeChange` events composing the array of `changes` provided as the third argument to a new `TimezoneOffsetUtil` instance should have the following listed fields set through use of the uploader's [objectBuilder](https://github.com/tidepool-org/uploader/blob/master/lib/objectBuilder.js). All timestamps should be [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601 'Wikipedia: ISO 8601')-formatted, without timezone offset information - e.g., `2015-01-01T12:00:00`.

- `deviceTime` = timestamp
- `change` = an object that itself has the following fields:
+ `from` = timestamp
+ `to` = timestamp
+ `agent` = string (*optional*, can have values such as `manual` or `automatic`)
- `from` = timestamp
- `to` = timestamp
- `agent` = string (*optional*, can have values such as `manual` or `automatic`)
- `jsDate` = a JavaScript Date constructed from the `to` time
- `index` = an index (with an expectation that all indices be monotonically increasing with event order) for the datum that allows it to be sorted with respect to all other events on the device in the order that the events actually happened (which will *not* match `deviceTime` order in the case of date & time settings changes on the device)

Expand Down Expand Up @@ -133,13 +135,13 @@ A timezone offset is an integer, positive or negative, giving the number of minu

Overall, the relationship between the fields `deviceTime`, `time`, and `timezoneOffset` in the Tidepool data model can be generalized as follows (assuming all appropriate unit conversions have been made):

```
```Javascript
deviceTime = time + timezoneOffset
```

In the second version of BtUTC we are adding a `conversionOffset` to the data model to handle a wider range of use cases, and so the *new* generalization is:

```
```Javascript
deviceTime = time + timezoneOffset + conversionOffset
```

Expand Down
10 changes: 0 additions & 10 deletions docs/README.md

This file was deleted.

56 changes: 29 additions & 27 deletions docs/checklists/README.md
Original file line number Diff line number Diff line change
@@ -1,29 +1,31 @@
# README.md

Checklists for the implementation of drivers for reading data from diabetes devices currently supported or in development.

* [Abbott FreeStyle Lite & Freedom Lite (BGM)](abbottFreeStyleLite.md)
* [Abbott FreeStyle Libre (CGM & BGM data)](abbottFreeStyleLibre.md)
* [Abbott FreeStyle Neo (BGM)](abbottFreeStyleNeo.md)
* [Abbott Precision Xtra (blood glucose & ketone meter)](abbottPrecisionXtra.md)
* [Accu-chek Aviva Connect, Guide & Guide Me (BGM)](avivaConnectAndGuide.md)
* [Ascensia/Bayer Contour (BGM)](bayerContour.md)
* [Ascensia/Bayer Contour Next (BGM)](bayerContourNext.md)
* [CareSens N Premier & Dual (BGM)](caresensUSB.md)
* [CareSens N Premier & Dual over Bluetooth (BGM)](caresensNPremierBluetooth.md)
* [Dexcom CGM](dexcom.md)
* [GLUCOCARD Shine, Shine XL, Shine Connex & Shine Express (GBM)](glucocard.md)
* [GLUCOCARD Expression (BGM)](glucocardExpression.md)
* [Insulet OmniPod Insulin Delivery System](insuletOmniPod.md)
* [Medtronic 5/7-series (pump data)](medtronic.md)
* [Medtronic 5/7-series (CGM data)](medtronicCGM.md)
* [Medtronic 6-series (pump data)](medtronic600.md)
* [Medtronic 6-series (CGM data)](medtronic600CGM.md)
* [MicroTech Equil Pump](microTechEquil.md)
* [OneTouch Ultra 2 (BGM)](oneTouchUltra2.md)
* [OneTouch UltraMini (BGM)](oneTouchUltraMini.md)
* [OneTouch Verio, Verio Flex and Verio Reflect (BGM))](oneTouchVerio.md)
* [OneTouch Verio Flex and Verio Reflect oover Bluetooth (BGM))](oneTouchVerio.md)
* [OneTouch VerioIQ (BGM)](oneTouchVerioIQ.md)
* [ReliOn Premier (BGM)](reliOnPremier.md)
* [Tandem Insulin Pumps](tandem.md)
* [Tandem (CGM data)](tandemCGM.md)
* [Trividia TRUE METRIX (BGM)](trividiaTrueMetrix.md)
* [Abbott FreeStyle Lite & Freedom Lite (BGM)](abbottFreeStyleLite.md)
* [Abbott FreeStyle Libre (CGM & BGM data)](abbottFreeStyleLibre.md)
* [Abbott FreeStyle Neo (BGM)](abbottFreeStyleNeo.md)
* [Abbott Precision Xtra (blood glucose & ketone meter)](abbottPrecisionXtra.md)
* [Accu-chek Aviva Connect, Guide & Guide Me (BGM)](avivaConnectAndGuide.md)
* [Ascensia/Bayer Contour (BGM)](bayerContour.md)
* [Ascensia/Bayer Contour Next (BGM)](bayerContourNext.md)
* [CareSens N Premier & Dual (BGM)](careSensUSB.md)
* [CareSens N Premier & Dual over Bluetooth (BGM)](caresensNPremierBluetooth.md)
* [Dexcom CGM](dexcom.md)
* [GLUCOCARD Shine, Shine XL, Shine Connex & Shine Express (GBM)](glucocard.md)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the visible label typos in the device list.

GBM on Line 15 looks like a typo for BGM, and the OneTouch Verio labels on Lines 25-26 still have an extra ) in the visible text. These are small but user-facing Markdown defects.

Proposed fix
-* [GLUCOCARD Shine, Shine XL, Shine Connex & Shine Express (GBM)](glucocard.md)
+* [GLUCOCARD Shine, Shine XL, Shine Connex & Shine Express (BGM)](glucocard.md)
-* [OneTouch Verio, Verio Flex and Verio Reflect (BGM))](oneTouchVerio.md)
-* [OneTouch Verio Flex and Verio Reflect over Bluetooth (BGM))](oneTouchVerio.md)
+* [OneTouch Verio, Verio Flex and Verio Reflect (BGM)](oneTouchVerio.md)
+* [OneTouch Verio Flex and Verio Reflect over Bluetooth (BGM)](oneTouchVerio.md)

Also applies to: 25-26

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/checklists/README.md` at line 15, Fix the user-facing Markdown labels in
the checklist device list by correcting the GLUCOCARD entry text from GBM to BGM
and removing the extra closing parenthesis from the OneTouch Verio visible
labels. Update the affected bullet items in the checklist README so the
displayed names read cleanly while keeping the links unchanged.

* [GLUCOCARD Expression (BGM)](glucocardExpression.md)
* [Insulet OmniPod Insulin Delivery System](insuletOmniPod.md)
* [Medtronic 5/7-series (pump data)](medtronic.md)
* [Medtronic 5/7-series (CGM data)](medtronicCGM.md)
* [Medtronic 6-series (pump data)](medtronic600.md)
* [Medtronic 6-series (CGM data)](medtronic600CGM.md)
* [MicroTech Equil Pump](microTechEquil.md)
* [OneTouch Ultra 2 (BGM)](oneTouchUltra2.md)
* [OneTouch UltraMini (BGM)](oneTouchUltraMini.md)
* [OneTouch Verio, Verio Flex and Verio Reflect (BGM))](oneTouchVerio.md)
* [OneTouch Verio Flex and Verio Reflect over Bluetooth (BGM))](oneTouchVerio.md)
* [OneTouch VerioIQ (BGM)](oneTouchVerioIQ.md)
* [ReliOn Premier (BGM)](reliOnPremier.md)
* [Tandem Insulin Pumps](tandem.md)
* [Tandem (CGM data)](tandemCGM.md)
* [Trividia TRUE METRIX (BGM)](trividiaTrueMetrix.md)
161 changes: 82 additions & 79 deletions docs/checklists/abbottFreeStyleLibre.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,117 +4,119 @@

(Key:

- `[x]` available in data protocol/documented in spec and implemented
- `[-]` available in data protocol/documented in spec but *not* yet implemented
- `[?]` unknown whether available in data protocol/documented in spec; *not* yet implemented
- `*[ ]` TODO: needs implementation!
- `[ ]` unavailable in data protocol and/or not documented in spec and not yet implemented)
- `[x]` available in data protocol/documented in spec and implemented
- `[-]` available in data protocol/documented in spec but *not* yet implemented
- `[?]` unknown whether available in data protocol/documented in spec; *not* yet implemented
- `*[ ]` TODO: needs implementation!
- `[ ]` unavailable in data protocol and/or not documented in spec and not yet implemented)

### Required if Present
### Required if Present (CGM)

#### CBG

- `[x]` cbg values
- `[ ]` units of cbg values (read from device, not hard-coded)
- `[x]` out-of-range values (LO or HI)
- `[x]` out-of-range value thresholds (e.g., often 40 for low and 400 for high on CGMs)
- `[x]` cbg values
- `[ ]` units of cbg values (read from device, not hard-coded)
- `[x]` out-of-range values (LO or HI)
- `[x]` out-of-range value thresholds (e.g., often 40 for low and 400 for high on CGMs)

Device-specific? (Add any device-specific notes/additions here.)
- internal glucose unit is always mg/dL for this device, independent of display unit
- out-of-range thresholds are 41 mg/dL and 499 mg/dL
- out-of-range measurements are reported as values 40 or 500 respectively

- internal glucose unit is always mg/dL for this device, independent of display unit
- out-of-range thresholds are 41 mg/dL and 499 mg/dL
- out-of-range measurements are reported as values 40 or 500 respectively

#### Device Events
- `[ ]` calibrations
- `[ ]` calibration value
- `[ ]` units of calibration value (read from device, not hard-coded)
- `[x]` time changes (presence of which is also in the [BtUTC section](#bootstrapping-to-utc) below)
- `[x]` device display time `from` (before change) and `to` (result of change)
- `[x]` agent of change (`automatic` or `manual`)
- `[ ]` timezone
- `[ ]` reason for change (read from device)

- `[ ]` calibrations
- `[ ]` calibration value
- `[ ]` units of calibration value (read from device, not hard-coded)
- `[x]` time changes (presence of which is also in the [BtUTC section](#bootstrapping-to-utc) below)
- `[x]` device display time `from` (before change) and `to` (result of change)
- `[x]` agent of change (`automatic` or `manual`)
- `[ ]` timezone
- `[ ]` reason for change (read from device)

Device-specific? (Add any device-specific notes/additions here.)
- device does not need calibration

- device does not need calibration

#### Settings

- `[x]` units preference for BG display
- `[x]` units of data being uploaded (will be mutated to mmol/L storage units if not mmol/L)
- `[x]` transmitter ID
- `[ ]` low alert settings
- `[x]` units preference for BG display
- `[x]` units of data being uploaded (will be mutated to mmol/L storage units if not mmol/L)
- `[x]` transmitter ID
- `[ ]` low alert settings
- `[ ]` enabled
- `[ ]` level/threshold
- `[ ]` snooze threshold
- `[ ]` high alert settings
- `[ ]` enabled
- `[ ]` level/threshold
- `[ ]` snooze threshold
- `[ ]` rate-of-change alerts
- `[ ]` fall rate alert
- `[ ]` enabled
- `[ ]` rate threshold for alerting
- `[ ]` rise rate alert
- `[ ]` enabled
- `[ ]` level/threshold
- `[ ]` snooze threshold
- `[ ]` high alert settings
- `[ ]` rate threshold for alerting
- `[ ]` out-of-range alerts
- `[ ]` enabled
- `[ ]` snooze time between alerts
- `[ ]` predictive alerts
- `[ ]` low prediction
- `[ ]` enabled
- `[ ]` level/threshold
- `[ ]` snooze threshold
- `[ ]` rate-of-change alerts
- `[ ]` fall rate alert
- `[ ]` enabled
- `[ ]` rate threshold for alerting
- `[ ]` rise rate alert
- `[ ]` enabled
- `[ ]` rate threshold for alerting
- `[ ]` out-of-range alerts
- `[ ]` time sensitivity (minutes to predicted low for alerting)
- `[ ]` high prediction
- `[ ]` enabled
- `[ ]` snooze time between alerts
- `[ ]` predictive alerts
- `[ ]` low prediction
- `[ ]` enabled
- `[ ]` time sensitivity (minutes to predicted low for alerting)
- `[ ]` high prediction
- `[ ]` enabled
- `[ ]` time sensitivity (minutes to predicted high for alerting)
- `[ ]` calibration alerts/reminders
- `[ ]` pre-reminder
- `[ ]` overdue alert
- `[ ]` time sensitivity (minutes to predicted high for alerting)
- `[ ]` calibration alerts/reminders
- `[ ]` pre-reminder
- `[ ]` overdue alert

Settings history:

- `[ ]` device stores all changes to settings OR
- `[x]` device only returns current settings at time of upload
- `[ ]` device stores all changes to settings OR
- `[x]` device only returns current settings at time of upload

No Tidepool data model (yet): volume and/or vibrate mode of all alerts (can/should go in `payload`).

Device-specific? (Add any device-specific notes/additions here.)

#### "Bootstrapping" to UTC

- `[x]` index
- `[ ]` UTC timestamp (*Hey, one can dream!*) OR
- `[x]` internal timestamp or persistent log index (across device communication sessions) to order all pump events (regardless of type), independent of device display time OR
- `[ ]` ephemeral log index (does not persist across device communication sessions) to order all pump events (regardless of type), independent of device display time
- `[x]` date & time settings changes
- `[x]` use `common.checkDeviceTime(currentDeviceTime, timezone, cb)` to check against server time
- `[x]` index
- `[ ]` UTC timestamp (*Hey, one can dream!*) OR
- `[x]` internal timestamp or persistent log index (across device communication sessions) to order all pump events (regardless of type), independent of device display time OR
- `[ ]` ephemeral log index (does not persist across device communication sessions) to order all pump events (regardless of type), independent of device display time
- `[x]` date & time settings changes
- `[x]` use `common.checkDeviceTime(currentDeviceTime, timezone, cb)` to check against server time

Device-specific? (Add any device-specific notes/additions here.)

### No Tidepool Data Model Yet
### No Tidepool Data Model Yet (CGM)

> **NB:** You can and should add to this section if there are other data types documented in the device's data protocol specification but not part of Tidepool's data model (yet).

- `[-]` activity/exercise
- `[-]` food (e.g., Dexcom allows logging carb events)
- `[-]` notes/other events
- `[-]` insulin (rapid acting, long term)
- `[-]` activity/exercise
- `[-]` food (e.g., Dexcom allows logging carb events)
- `[-]` notes/other events
- `[-]` insulin (rapid acting, long term)

### Tidepool ingestion API
### Tidepool ingestion API (CGM)

Choose one of the following:

- `[x]` legacy "jellyfish" ingestion API
- `*[ ]` platform ingestion API
- `[x]` legacy "jellyfish" ingestion API
- `*[ ]` platform ingestion API

### Known implementation issues/TODOs
### Known implementation issues/TODOs (CGM)

*Use this space to describe device-specific known issues or implementation TODOs **not** contained in the above datatype-specific sections.*

## Checklist for BGM Implementation

## Checklist for Blood Glucose Meter Implementation

### Required if Present
### Required if Present (BGM)

- `[x]` smbg values
- `[ ]` units of smbg values (read from device, not hard-coded)
Expand All @@ -128,24 +130,25 @@ Choose one of the following:
- `[x]` use `common.checkDeviceTime(currentDeviceTime, timezone, cb)` to check against server time

Device-specific? (Add any device-specific notes/additions here.)
- internal glucose unit is always mg/dL for this device, independent of display unit
- glucose out-of-range thresholds are 41 mg/dL and 499 mg/dL
- glucose out-of-range measurements are reported as values 40 or 500 respectively
- ketone out-of-range upper threshold is 8.0 mmol/L

### No Tidepool Data Model Yet
- internal glucose unit is always mg/dL for this device, independent of display unit
- glucose out-of-range thresholds are 41 mg/dL and 499 mg/dL
- glucose out-of-range measurements are reported as values 40 or 500 respectively
- ketone out-of-range upper threshold is 8.0 mmol/L

### No Tidepool Data Model Yet (BGM)

- `[x]` control (solution) tests (whether marked in UI or auto-detected) - until we have a data model, these should be discarded
- `[-]` device settings, other than date & time (e.g., target blood glucose range)
- `[-]` tag/note (e.g., pre- vs. post-meal)

### Tidepool ingestion API
### Tidepool ingestion API (BGM)

Choose one of the following:

- `[x]` legacy "jellyfish" ingestion API
- `*[ ]` platform ingestion API
- `[x]` legacy "jellyfish" ingestion API
- `*[ ]` platform ingestion API

### Known implementation issues/TODOs
### Known implementation issues/TODOs (BGM)

*Use this space to describe device-specific known issues or implementation TODOs **not** contained in the above datatype-specific sections.*
Loading
Loading