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.
iMessage Ideas
Concepts that feel useful or funny enough that I would actually open them in a
group chat. Not sure any of these is the explode-level hit yet, but they are the
ones I liked enough to keep.
Petty Bank
Unofficial points for the friend group: who shows up to events, who cancels, who
was late, who covered the bill. Post +1 / -1 in the thread, keep a leaderboard per
chat, optional monthly reset or “bankruptcy” night.
- Why - Groups already do this with messy texts. Making it official is funny and sticky.
- Core loop - Tap someone, add or subtract points with a reason, scoreboard bubble lands in chat.
- v1 - Per-chat ledger, simple leaderboard card, event attendance mode, no accounts beyond the thread.
- Later - Seasons, categories (attendance, clutch, chaos), rematch nights, export as Wrapped-style cards.
Taste Ranker / message stars
Rate stuff in the chat on a 1 to 5 scale. Rank a take, a photo, a restaurant pick,
or just react to a message like a review. Average score posts as a bubble. Feels
like Letterboxd energy for whatever the group is arguing about.
- Why - Reactions are binary. Stars create comedy, debate, and a permanent roast record.
- Core loop - Attach a rating to a message or topic, friends pile on, reveal average + spread.
- v1 - 1 to 5 star card, optional short label (“this take”, “fit check”), running “worst take” / “best taste” board.
- Later - Daily prompt packs, anonymous mode, taste compatibility between two people.
Memory Capsule
Not a notes app. A moment catcher for the chat: save a night, trip, or bit as a
card, collect the messages and photos people pin to it, resurface later as
“remember this?”
- Why - Chats are where life happens, then it disappears into scroll. Groups want memory without leaving Messages.
- Core loop - Start a capsule, people add receipts, reopen months later as a shared scrapbook bubble.
- v1 - Title + date + manual pin of text/photo refs, list of capsules per chat, shareable recap card.
- Later - On-this-day nudges, trip mode, year-end Wrapped for the group.
Snapchat-for-Messages is probably a trap: people who want that already have Snap.
The better wedge is something that only makes sense because the group already
lives in iMessage (status, memory, ritual), not a clone of another social app.
Boggle for iMessage
Parked for now. App Store already has fine versions. Kept as a note in case the
GeoText pipeline wants another daily grid later. Friends get the same letter grid,
find words by chaining adjacent letters, and share scores as interactive bubbles
in the chat.
- Why - Word games travel well in group chats. Daily or rematch modes keep people coming back without leaving iMessage.
- Core loop - Shared board, timed find, score by word length, optional daily seed so everyone plays the same grid.
- Build shape - iMessage app extension + dictionary validation + seeded RNG for daily boards. Reuse GeoText patterns for scoring cards, midnight reset, and App Store packaging.
- v1 - Daily board, solo score share, 4x4 grid, English word list, basic anti-cheat via server- or seed-validated scores.
- Later - Live rematch in-thread, 5x5, custom timers, leaderboards per chat.
Start from the GeoText iMessage pipeline. The hard parts are dictionary quality,
fair seeding, and a board UI that feels good on a small Messages canvas, not
inventing a new distribution channel.
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.