Skip to content

Repository files navigation

Glucomarchy

A bar widget for Omarchy Quattro showing live blood glucose readings from a FreeStyle Libre sensor (via LibreLinkUp) — current value, trend arrow, and range status at a glance.

The bar shows the current reading and a trend arrow, colored yellow (low), green (in range), or red (high) against your target range; it flashes a few times whenever a reading crosses into or out of range. Click it for a panel with a history graph (area fill + smoothed trend line, axis labels), the share of time in range, min/max/average, and remaining sensor life.

Bar widget: current reading and trend arrow

Panel: reading, trend, history graph, time-in-range stats, sensor life

How it works

FreeStyle Libre's LibreView site only supports uploading a sensor's history, not live polling. LibreLinkUp — the companion app diabetics use to share readings with a caregiver — does have a (reverse-engineered, unofficial) API, and that's what this plugin polls.

You do not use your main FreeStyle Libre account here. You need a separate LibreLinkUp follower account:

  1. Open the FreeStyle Libre / LibreLink app on the phone paired with the sensor.
  2. Go to Settings → "LibreLinkUp" / "Share my data" → invite a follower.
  3. Accept that invite using a different email address — that's your LibreLinkUp account (install the LibreLinkUp app, or use the emailed link, to set its password).
  4. Use that account's email + password for this plugin, not your main one.

The poller script (bin/glucose-status.sh) logs in, caches the session token (valid for months) in ~/.cache/omarchy-glucose/, and on every poll makes a single read-only API call. Nothing is ever written back to LibreView/LibreLinkUp.

Setup

  1. Create a credentials file (not inside this plugin folder):

    mkdir -p ~/.config/omarchy/glucose
    cat > ~/.config/omarchy/glucose/credentials <<'EOF'
    LIBRELINKUP_EMAIL=you@example.com
    LIBRELINKUP_PASSWORD=your-librelinkup-password
    EOF
    chmod 600 ~/.config/omarchy/glucose/credentials
    
  2. Enable the widget:

    omarchy plugin enable io.github.boyoyooo.glucomarchy --section right
    
  3. Point it at your credentials file — edit the widget's entry in ~/.config/omarchy/shell.json (bar.layout.right) and add:

    { "id": "io.github.boyoyooo.glucomarchy", "credentialsFile": "/home/you/.config/omarchy/glucose/credentials" }

Settings

KeyDefaultDescription
credentialsFile(required)Path to the file with LIBRELINKUP_EMAIL / LIBRELINKUP_PASSWORD
interval60Poll interval in seconds (floored at 20s)
label(none)Optional label shown in the panel title and tooltip
targetLow0Low threshold override in mg/dL. 0 = use the range configured on your LibreView account
targetHigh0High threshold override in mg/dL. 0 = use the range configured on your LibreView account
sensorLifetimeDays14Sensor duration used to compute "days left" — check your sensor's box/app, it varies by model and region (commonly 14, 15, or 16)
notifyOnRangeChangefalseAlso send a desktop notification when crossing into/out of range (the bar flash always happens)

Removal

omarchy plugin remove io.github.boyoyooo.glucomarchy

Then delete ~/.config/omarchy/glucose/ and ~/.cache/omarchy-glucose/ if you want the credentials file and cached session token gone too — neither is touched by plugin remove since they live outside the plugin folder.

Security notes

  • Credentials are read from a file you control, sourced into shell variables — never exported to the environment, never passed as a command-line argument. Neither is readable by another process on the same machine via /proc/<pid>/environ or /proc/<pid>/cmdline. The poller refuses to run if that file is owned by someone else or writable by group/other, since sourcing it is effectively running it.
  • The session token is cached per-account (~/.cache/omarchy-glucose/, chmod 600, directory chmod 700, umask 077 for the whole script) so your password is sent to Abbott's servers only on first run or after the cached token expires — not on every poll. A rejected login (e.g. a typo'd password) backs off for up to an hour instead of retrying — and resending the password — on every single poll.
  • No glucose data is ever written to disk outside of QML's in-memory state; the only thing this plugin persists is the session token.
  • The only write request this plugin ever makes is the LibreLinkUp authentication call itself (email + password, over TLS, to Abbott's own servers). Every other request is a read-only GET. Nothing is ever uploaded to or modified on your LibreView/LibreLinkUp account.
  • A missing current reading (sensor warming up, momentarily no data) is reported as an error, never displayed as a fabricated 0 mg/dL — for a glucose widget, a false low is a worse failure than showing nothing.

This is an unofficial, community-built integration. It has no affiliation with Abbott, FreeStyle Libre, or LibreView; it uses the same reverse-engineered API relied on by other open-source glucose tools (e.g. Nightscout bridges). Abbott can change or break that API at any time.

License

MIT

About

Live blood glucose (FreeStyle Libre / LibreLinkUp) in the Omarchy bar

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages