Back to Wiki
Wiki / Development and Tools
Developer Ideas
Scratchpad for side projects and features I want to build. Each idea gets a short problem
statement, why it matters, and a practical build plan so I can pick it back up later
without starting from zero.
Ideas
- Garmin + Libre 3 glucose - Show continuous glucose on my Garmin watch (plan below)
Garmin watch: Libre 3 blood sugar on wrist
Goal: glance at my Garmin and see current glucose from my
FreeStyle Libre 3 sensor, including trend, without digging
through the phone. Useful for workouts, skiing, driving, and anything where the phone
stays in a pocket while managing Type 1 Diabetes.
Hard constraint: Abbott does not offer an official Garmin integration or a public
Libre 3 Bluetooth API for third-party developers. Anything we build goes through
LibreLinkUp cloud sharing or community tooling, not a direct sensor handshake.
Architecture options
-
A. Cloud follower path (best for iPhone) -
Libre 3 app shares readings to LibreLinkUp. A Connect IQ app (or phone companion)
polls Abbott's follower API and pushes the latest value to the watch. Works on
iOS. Typical update cadence is about every 1 to 5 minutes, and needs phone
internet.
-
B. Android BLE bridge (best realtime) -
Community apps like Juggluco can talk to the sensor over Bluetooth on Android,
then push minute-by-minute values to a Garmin app such as Kerfstok. Faster and
more direct, but Android-first. Not a great fit if the daily driver is iPhone.
-
C. Build my own Connect IQ surface -
Write a Monkey C watch app, watch face complication, or activity data field that
displays mg/dL, trend arrow, and stale-data warnings. Still needs path A or B
for the actual glucose numbers.
Recommended for me: A + C. Keep using the official Libre 3 app on
iPhone, share to LibreLinkUp (follower can be myself), then build a custom Garmin
Connect IQ view fed by that follower feed.
Tomorrow-night target
Definition of done by tomorrow night: glance at the Garmin and see a trustworthy
glucose number, trend, and freshness without opening the phone. Prefer working
over perfect. Custom Monkey C UI is a stretch; a working wrist display via an
existing Connect IQ CGM app counts as a win if custom code slips.
- Must ship - LibreLinkUp sharing live, glucose visible on watch, delay measured
- Should ship - Refresh that feels usable during a short workout or walk
- Stretch - Sideloaded custom Monkey C widget with my own layout
- Out of scope - dosing advice, replacing Libre alarms, Connect IQ Store publish
Hour-by-hour plan
Block 0: Inventory (15 min)
- Confirm Garmin model and that it supports Connect IQ apps / data fields
- Confirm phone is iPhone with official Libre 3 app already receiving readings
- Confirm watch pairs to that phone and has internet while paired (cellular or phone hotspot path)
Block 1: Unlock the data (45 to 90 min)
- In Libre 3 app: Connected Apps / Share → LibreLinkUp → Add Connection
- Use a second email you control (follower account). Do not reuse the primary Libre login as the follower password store.
- Accept the invite, open LibreLinkUp, confirm your own graph appears there
- Write down: follower email, password, region (US for me), units (mg/dL)
Block 2: Prove on wrist without writing code (1 to 2 hr)
- Install Garmin Connect IQ mobile app if missing
- Install an existing LibreLinkUp-compatible Connect IQ CGM app (examples: CGM+ GB, or similar current store apps)
- Settings: Libre / LibreLinkUp, enter FOLLOWER credentials (not primary Libre account)
- Sync to watch, wait for first reading
- Run a 20-minute reliability check: note update lag vs Libre 3 app, dropouts when phone locks, behavior with poor LTE
If Block 2 works, tomorrow-night goal is already met. Everything after is optional
polish or custom build.
Block 3: Decide path for remaining time
- If store app is good enough - stop. Tune watch face / glance widgets. Done.
- If store app is ugly but data works - build custom UI that reuses the proven LibreLinkUp path
- If store app fails auth - debug credentials/region before writing Monkey C. Most failures are wrong account, wrong region, or Terms acceptance pending on LibreLinkUp login.
Block 4: Custom build stretch (afternoon / evening)
- Install Connect IQ SDK + VS Code Monkey C extension + Garmin developer key
- Target ONE watch model in manifest.xml
- Do not call LibreLinkUp login from the watch directly for v1. Prefer a tiny phone bridge or serverless proxy that returns a simple JSON payload: glucose, trend, timestamp, stale flag.
- Watch only: Communications.makeWebRequest to that bridge every background cycle, render large number + trend + age
- Sideload to device; skip Store submission
Why a bridge: since late 2025 LibreLinkUp requires headers that are painful on-watch
(version 4.16.0+, product llu.android, and Account-Id = SHA-256 of user id). Monkey C
has no convenient crypto library, multi-step login+connections+graph is fragile inside
a 30-second background slot, and Garmin makeWebRequest error handling is rough.
What v1 should show
- Current glucose - large number in preferred units
- Trend - rising, falling, or steady
- Freshness - how old the reading is
- Connection status - phone linked, cloud reachable, or stale
Explicit non-goals for v1: insulin dosing advice, predictive algos, medical alarms
that replace Libre's urgent low, or App Store distribution. This is a personal
wrist glance tool.
Holes and failure modes
-
Wrong credentials -
Watch apps need LibreLinkUp follower credentials, not the main Libre 3 account.
Symptom: login fails or empty connections list.
-
Invite / ToS traps -
Follower invite not accepted, or LibreLinkUp API returns terms-of-use / privacy /
verify-email steps until you finish them in the official app. Symptom: weird
auth responses, no graph.
-
Region mismatch -
US vs EU (and EU2, etc.) hosts differ. Login can redirect to another regional API.
Symptom: works in one client, 401/empty in another until region is set to US.
-
API 4.16.0 auth break -
Older unofficial clients fail with 403 unless they send Account-Id (SHA-256 of
user id) and updated version/product headers. If a store app has not updated,
numbers never load even with correct passwords.
-
5-minute floor -
Connect IQ background temporal events generally cannot refresh faster than about
every 5 minutes, and each background run is capped around 30 seconds. Expect
stale-looking numbers during fast drops. Design UI accordingly.
-
Phone dependency -
Watch has no private Libre radio link in this architecture. Phone must stay
nearby, Libre 3 must keep talking to the phone, phone needs internet for
LibreLinkUp cloud, then BLE to the watch. Leaving the phone in the car breaks it.
-
Latency stack -
Sensor → phone → Abbott cloud → poll → watch. Often a few minutes behind the
Libre 3 app. Fine for glances, bad as the only low alarm.
-
Unknown watch model -
Not every Garmin supports Connect IQ the same way. Confirm app/data field
support before spending an afternoon on SDK setup.
-
Custom-from-scratch time trap -
Learning Monkey C, handling auth, and fighting background limits in one day is
how the night ends with nothing on the wrist. Prove store-app path first.
-
Medical safety -
This is not a device. Never dose off the watch alone. Keep Libre urgent-low
alarms on the phone.
Checklist for tomorrow night
- LibreLinkUp self-follower graph shows live readings
- Garmin shows glucose at least once without errors
- I know my typical lag in minutes vs the Libre 3 app
- I know what fails if phone is locked / offline / out of range
- If custom build: sideloaded widget opens and shows last good value or clear stale state
- Libre phone alarms still enabled
Useful references
- Garmin Connect IQ - official SDK and Monkey C getting started docs
- LibreLinkUp - Abbott follower/sharing path used by most watch bridges
- LibreLinkUp API notes - login → connections → graph; regional hosts; Account-Id header since 2025
- Juggluco + Kerfstok - Android realtime BLE option if I ever keep an Android phone in the stack
- LibreGlucoseWatcher - open-source Garmin + LibreLinkUp patterns (verify it matches current API headers before relying on it)
Next action (tonight)
Do Blocks 0 to 2 tonight if possible: set up LibreLinkUp self-follower, install an
existing Connect IQ LibreLinkUp CGM app, and get a number on the watch. Tomorrow is
then either "use it" or "custom UI on a proven pipe," instead of debugging sharing
and SDK at the same time.