Skip to content

Releases: ronaldlokers/sugarrush

2026.8.3

Choose a tag to compare

@github-actions github-actions released this 24 Aug 23:46
v2026.8.3
63e1b58

Release Notes

This release is mostly about the Quickshell panel, which grew from three cards
to ten: it now opens on last night's window, draws carbs and insulin under the
trace, reads today against your own fortnight, shows a fortnight of time in
range one bar per day, and lets you tap an hour of the profile to see the
individual days the median hides. It can also act — snooze the alarm that woke
you, or log a treatment — and it says what the alarm actually did, including a
delivery that never arrived. The bar pill wears your theme's colour only when
something is wrong, and each of its parts can be switched off. Two fixes worth
naming: sugarrush config units mgdl used to be refused outright because it
reinterpreted your thresholds rather than converting them, and the panel
ignored the colourblind palette entirely.

Changed

  • Views cross-fade instead of popping. One set of cards used to vanish and
    another appear in the same frame, which reads as a redraw rather than a move.
    animations false turns it off.

  • The panel uses the width it has. It was one 380px column in a scroll
    view, on a desktop, and it has grown from three cards to nine — the Glucose
    view scrolled past its own statistics and the Profile view past its patterns.
    On a horizontal bar it is wider now, with the reading beside the last 24
    hours and the clinical summary beside the alarms; the charts keep full rows. A vertical bar keeps the narrow
    column, where it is the right answer, and wideLayout false turns it off.

  • The stats card admits when its window is full of holes. A percentage
    computed over a day with half its readings missing drew exactly the same
    confident stripe as a complete one. The document now carries how many
    readings each figure stands on, and below 70% of a full window the card is
    marked "partial" and says how much of it is a gap rather than time in range.

  • The alarm thresholds are one band, not four steppers. The Settings view
    draws all five zones with a handle at each threshold, in the colours the
    reading itself uses. The handles cannot cross, so the crossed-threshold
    configuration sugarrush config refuses is now unreachable rather than
    rejected. The four stepper rows are gone — a handle lands on a tenth of a
    mmol/L in about two pixels, so they were rows buying nothing.

  • The panel draws itself while it loads. A cold open used to collapse the
    whole panel to the line "waiting for the first reading" for as long as
    Nightscout took, which looks like a failure rather than a wait. It now draws
    the cards it is about to fill.

  • The reading rides in the panel's header. The wordmark was sized to half
    the panel width, and the number you opened it for scrolled off the top — on
    the Settings view it was not on screen at all. The mark is a third now, with
    the reading and its arrow beside it, so it survives scrolling and view
    switches.

  • The panel's settings no longer claim a state they have not read. Every
    switch showed "on" until sugarrush config answered, so for a moment the
    Status bar card asserted four settings were enabled when two of them were
    not. Those cards are dimmed and inert until the file has actually been read.

  • The Quickshell panel obeys your theme. Its chart, profile, time-in-range
    bar, sensor countdown and alarm chip all carried a hard-coded copy of the
    default palette, so anyone on the colourblind preset — the one setting whose
    entire purpose is that red and green are the wrong pair — got an accessible
    bar and an inaccessible panel. The snapshot now carries the resolved palette
    and the panel paints from it. Low and high are separate colours there too,
    as they always have been everywhere else.

  • A stale reading in the panel looks stale. The age sat in the same grey
    pill at 3 minutes and at 40. Past your own stale_minutes, the reading greys
    out, the pill turns red and says "no reading for 26 min", and the caption
    gives the clock time it was last seen — at 3am the number is not wrong, it is
    absent, and the panel was presenting absence as a value.

  • The panel's forecast stopped jumping sideways. The projection was
    anchored to the reading's rendered width, so gaining or losing a digit moved
    it. The reading now reserves room for the widest value its units can produce.

  • The Quickshell pill wears the bar's colour until something is wrong. It
    used to paint the whole reading — number, unit, arrow, delta and trace — in
    the alert colour at all times, so a perfectly ordinary reading sat on the bar
    as a green light. Now only the number takes colour, and only when it is out
    of range or a forecast crossing is coming; everything else stays in the bar's
    own foreground. Stale data is carried by its ? marker alone.

  • The panel's threshold lines are scale marks again. They were drawn in
    their alert colours, so a red rule ran across the chart whether or not the
    reading ever went near it. The line already turns amber or red where it
    crosses one; the rules are now the panel's foreground, with the urgent pair
    fainter than low and high so the target band reads first.

Added

  • The Status bar card shows the pill it is describing. Four switches that
    changed something at the other end of the screen now draw it: the reading,
    the unit, the arrow, the delta and the sparkline, in the pill's own colours,
    updating as you flip them. You no longer have to look away to see what you
    did.

  • Units are switchable from the panel. A mmol/L · mg/dL choice above the
    threshold band, which converts the thresholds with it.

  • Last night, as one card. Nobody opens a CGM panel in the morning to
    browse six hours of chart — they open it to find out whether the night was
    fine. The Glucose view now leads with 23:00–07:00 in your own timezone: the
    shape of it, time in range, the lowest reading, and what the alarm did, with
    every excursion below range marked rather than only the worst one. Before
    07:00 it says "tonight so far" and stops at now, because reporting a night as
    finished before it is would be a claim about hours that have not happened.

  • The panel shows what the alarm actually did. sugarrush alerts has been
    recording every episode and every delivery attempt since it was written, and
    nothing displayed any of it. The Profile view now lists recent alarms with
    how long each lasted — and, in red, any whose delivery never arrived. A push
    that failed means an alarm was raised and nobody was told, which was until
    now the least visible line in the whole system.

  • Tap an hour of the profile to see the days behind it. A percentile band
    says the middle half of your evenings look fine; it cannot say that three of
    the fourteen went low, which is the finding that changes a basal rate. Tapping
    an hour marks it, draws each day's value for that hour as a dot, and says the
    median, the spread and how many days fell out of range. Tapping it again
    clears it.

  • The panel keeps itself current while it is open. It used to fetch once on
    open and then sit there — watch a low come up and the panel quietly stopped
    being true while the pill behind it kept updating, the two disagreeing with
    the bigger surface being the wrong one. It now refetches at the pill's own
    interval for as long as it is on screen, and the header counts down to the
    next one: what a spinner should have said all along is not that something is
    happening, but when.

  • The clinical summary is on screen before it is on the clipboard. The
    Profile view shows the same figures sugarrush export writes — mean, GMI, CV
    and the five bands with their boundaries spelled out — so you are not sending
    a clinician a block of text you have never read.

  • The panel takes the keyboard. 1 2 3 jump to a view, step
    between them, r fetches, d opens the dashboard, Esc closes, and ?
    shows the list. It ships to people running Hyprland, where the mouse is a
    last resort, and every view and settings row needed a pointer to reach.

  • A fortnight of time in range, one bar per day. The Profile view gains a
    strip of stacked daily bars, oldest on the left, under the typical-day chart.
    The profile answers "what do my nights look like"; this answers the other
    question people track — whether it is getting better — and neither can be
    read off the other. Days grouped at local midnight, so a night is not cut in
    half by a UTC boundary. A day with too few readings to trust is drawn faded
    rather than as a full bar, since one thin morning would otherwise read as the
    best day of the fortnight.

  • The panel says whether today is better than usual. "76% in range" is a
    number with no scale, and the comparison that changes what someone does is
    against themselves a fortnight ago. The stats card now reads time in range,
    time below range, mean and CV against the whole history window, with the
    change named and coloured — where there is a better direction. Mean has none:
    a lower average bought with lows is not an improvement, so its change is
    stated rather than judged.

  • The panel's chart shows what you did, not only what happened. Carbs and
    insulin logged on the site are drawn in their own lane along the foot of the
    chart — a dot sized by the amount for carbs, a triangle for insulin, labelled
    where there is room — and the card title totals the window: Last 6 hours · 45g · 5.7u. A rise from 5 to 12 means one thing after 60g of pasta and
    another with nothing logged, and the chart could only ever show the rise.
    sugarrush had been fetching and discarding this all along.

  • You can log carbs and insulin from the panel. A Log button beside the
    snooze pair opens two steppers; Review in terminal hands the amounts to
    sugarrush treatment, which prints what it is about to write and asks for
    the person's name before i...

Read more

2026.8.2

Choose a tag to compare

@github-actions github-actions released this 22 Aug 01:04
v2026.8.2
93aba90

Release Notes

This release turns sugarrush from a dashboard you watch into something that
watches for you. sugarrush watch runs the alarm headless, so a nocturnal low
still wakes you when no terminal is open, and it now follows every configured
person at once — each with its own alert episode, its own snooze, and a record
of what the alarm actually did. You can log carbs and insulin back to
Nightscout behind an explicit confirmation, keep a private local history, and
export a clinical window as CSV plus a plain-language summary. Bars are
first-class too: one JSON line for Waybar, tmux, polybar and i3blocks, and a
full Quickshell widget for Omarchy 4 whose panel charts the last hours against
a typical day, the day's time in range, and the times of day where lows keep
happening.

Added

  • sugarrush has a face. The running sugar cube is now the app icon
    (assets/icon.png), the wordmark opens the README and leads the Quickshell
    panel, and a silhouette of the cube rides in the bar beside the reading.
  • The Quickshell widget has a popup panel. Clicking the bar pill opens a
    panel of labelled cards: the reading now, the last hours as a chart — your
    line over a typical day for the same hours, changing colour as it crosses a
    threshold, thresholds in their own colours, values and clock on the axes —
    the day's five time-in-range bands, and the pattern insights. Hovering the
    chart reads out the value and time under the pointer. Each card names
    the window it covers, so a 24-hour average is never read as a six-hour one — the parts of the dashboard worth a glance without opening
    the TUI. Right click still opens the full app. It fetches only while open,
    and reuses its last reading for a few minutes, so the multi-day history the
    patterns need is paid for only when someone is looking.
  • sugarrush snapshot prints the whole picture as JSON. One document with
    the current reading, a series for a chart, time in range and patterns, in
    your display units. Built for the panel; useful to anything that wants
    sugarrush's numbers without scraping a bar line. --demo renders it from
    synthetic data with no site configured. The document also carries a
    typical-day band (median and 25–75% per quarter hour, over the requested
    history) for anything that wants to draw today against a usual day.
  • A bar widget for Quickshell. Omarchy 4 replaced Waybar with a Quickshell
    bar, so quickshell/ now ships a widget for it alongside the
    Waybar examples: the reading, trend and delta in your theme's state colour,
    the usual tooltip on hover, and a click that opens the TUI (right click for
    its settings screen). Its README also covers the no-plugin route, running
    sugarrush waybar through the bar's own command module.

Changed

  • The Quickshell bar widget prints the unit. The bar now reads
    10.5 mmol/L → -0.2 rather than 10.5 → -0.2: a number by itself names
    nothing, and the unit is the one word that says what was measured. Turn it
    off with showUnits on a crowded bar. The sugar cube that used to carry that
    job is now opt-in, behind showMascot.
  • --format waybar is now --format json. The same JSON is read by
    Waybar, by the Quickshell widget, and by anything else that takes a JSON
    line, so the format is named for its syntax rather than for one bar.
    waybar and bar are accepted spellings, and sugarrush waybar is
    unchanged — no config needs editing.
  • --format json reports the reading in parts. value, units,
    arrow and delta join the JSON, so a bar can compose its own line instead
    of parsing text apart. Waybar ignores them.
  • The Quickshell bar widget no longer pops up a tooltip. Hovering the
    reading used to show a second copy of it with a text sparkline; clicking
    opens a panel with the real chart, so the tooltip was answering a question
    that already had a better answer.
  • --format json also reports the state colour. The JSON now carries a
    color field holding the hex colour of the alert state, from your configured
    theme. Waybar ignores it and keeps styling the module from the CSS class;
    it is there for bars that style themselves from the payload instead of a
    stylesheet.

Fixed

  • --help fits a terminal again. The new command signatures outgrew the
    fixed column, so every row past it ran to 138 characters and the description
    column stopped existing. Long signatures now put their description on the
    next line; the widest row is 97 columns.
  • A lock left behind by a crash no longer disables treatment writes or the
    history cache permanently.
    Both used a lock file removed on clean exit, and
    a SIGKILL or a power cut leaves it behind — with no staleness rule, every
    later run waited out the timeout and failed, so one hard kill disabled the
    feature until someone found and deleted a file nothing had told them about. An
    abandoned lock is now reclaimed after 30 seconds, a live one is still
    respected, and the timeout message names the file and what to do about it.
  • A successful treatment write is no longer reported as a rejection. The
    client read the array Nightscout returns on success — the documents it just
    stored — as a list of refusals. So a treatment that Nightscout accepted was
    reported as rejected, and following the retry advice wrote it again: two
    identical carb or insulin records for one dose, both reported as failures.
    Only a non-empty array now counts as accepted; every other response shape is
    reported as unknown, which tells you to check Nightscout and retry with the
    same operation ID rather than a new one — the one retry that cannot duplicate.
  • Health and delivery joins survive person renames safely. Concurrent
    follower results and new delivery receipts now carry immutable site IDs;
    legacy name-only receipts remain readable without letting a reused display
    name inherit another person's current delivery status.

Added

  • Unattended treatment writes now need a grant in config.toml.
    treatment --non-interactive could write to someone's health record with no
    human in the loop, on a flag combination alone — available to anything that
    can compose a command line. It now also requires allow_unattended_writes = true, off by default and deliberately not editable in the settings screen, so
    the grant is a decision made once in a file you own. sugarrush about reports
    whether it is on, and now also reports whether each site has a write token at
    all — the presence, never the value.

  • Treatment submissions have a privacy-safe receipt view. treatments
    filters the bounded local audit by person and time, emits text/JSON/CSV, and
    exposes stable operation IDs for reconciliation without notes or credentials.

  • Managed watchers now point to usable diagnostics on every platform.
    macOS and Windows services write to a private user-data log, install/status
    print its path plus the strict health command, and uninstall says that logs
    remain; platform session and independent dead-man limits are documented.

  • Operational health is explicit instead of collapsing unlike guarantees.
    JSON now separates process, data, configured-channel, suppression, and known
    delivery status; --strict-delivery gives external monitors an opt-in
    degraded exit policy without claiming that an accepted alert was received.

  • Multi-person exports can no longer silently choose the first person. A
    follower must select --site NAME or explicitly request --all; filenames
    and output identify their subject and the matching cache/timezone are used.

  • Private cache storage is inspectable and selectively erasable. cache status reports each person's entry count, date span, and bytes without
    printing readings; confirmed clear commands target one person or everyone.

  • People now have immutable internal identities. Renaming a display label
    no longer moves alarm episodes, snoozes, cached readings, or treatment audit
    receipts between people; legacy configurations receive a deterministic ID
    and newly added sites receive a generated UUID.

  • Treatment writes are available behind an explicit security boundary. A
    separate per-site CarePortal token is masked in Settings and capability-
    checked before every confirmed treatment command; amounts, timestamps, and
    notes are validated and each accepted/rejected attempt is recorded in an
    owner-only audit without credentials or note text.

  • Offline history is available as an explicit privacy choice. An opt-in,
    owner-only per-site cache gives instant startup and outage context without
    ever presenting cached data as a live fetch; retention is bounded to 1–90
    days and disabling it deletes the local record.

  • Caregiver review now follows the person's context. Each site can set an
    IANA timezone used by AGP bucketing, pattern names, CSV offsets, and clinical
    summaries; alert history can be filtered with --site or emitted as
    structured JSON/CSV for private audit workflows.

  • The always-on watcher now has native service management on every shipped
    desktop platform.
    One command installs, starts, inspects, or removes a
    systemd user service on Linux, a launchd agent on macOS, or a Task Scheduler
    task on Windows; the old --install-unit spelling remains an alias.

  • Alarm delivery is now auditable and monitorable. Alert history records
    privacy-safe channel outcomes using careful accepted/rejected language, and
    sugarrush health --json exposes watcher liveness, per-site freshness,
    snoozes, alarm state, and the latest delivery attempt for external monitors.

  • Caregiver actions now target the right person. The follower list has a
    stable selected row that opens that person's dashboard with Enter and
    snoozes only that person with a; the CLI accepts --site NAME and requires
    explicit --all when several sit...

Read more

2026.8.1

Choose a tag to compare

@github-actions github-actions released this 08 Aug 16:36
v2026.8.1
83458b7

Release Notes

This release is about trusting what's on screen. The alarm path got a
correctness pass — the newest reading is now genuinely the newest, alerts no
longer re-fire every time a value hovers on a threshold, a flat glucose no
longer predicts a low, and a bad token says so and stops retrying instead of
looking like a network outage. Saving settings can no longer lose your
Nightscout token, the site URL and token are now editable in the app (masked,
and no longer echoed by the setup wizard), and an unencrypted http:// site is
called out rather than accepted silently. The stats panel turned clinical —
five-band time-in-range with time-below-range and CV variability, over a fixed
14-day window — and history is now fully navigable from the keyboard.

Added

  • Keyboard navigation for the overview stripH / L (or PgUp /
    PgDn) pan a whole window at a time and End jumps to the oldest edge of the
    overview, so moving through history no longer needs a mouse.
  • Clinical time-in-range. The stats panel now splits readings across the
    five consensus bands (very low / low / in range / high / very high) instead of
    three, calls out the time below range percentage — the number that changes
    treatment — and reports CV, the standard measure of glycaemic variability,
    highlighted when it exceeds the 36% consensus target.
  • Content-free notifications — a new Notification detail setting
    (notify_content) keeps desktop notifications free of your reading and alert
    state, for lock screens and shared displays. They still fire, and urgent ones
    are still critical.
  • Unsaved settings are visible. Settings apply live but only w writes them
    to config.toml; the settings header now says · unsaved changes (w to save)
    so quitting can't silently discard them.
  • Fix a bad site without leaving the app — the settings screen gains a
    Site section with the Nightscout URL and read-only token. Press Enter on
    a row to edit it; the app reconnects immediately, and w saves as usual. The
    token is masked while typing and never rendered back (the row reads
    set · ••••••).
  • Unencrypted sites are called out. A plain http:// site sends your token
    and readings in the clear, so the dashboard footer now says so and the setup
    wizard asks you to confirm before accepting one. Loopback addresses
    (localhost, 127.0.0.1) are exempt — they never leave the machine.
  • Push alerts are now a settings row (Alarm → Push alerts) — toggle the
    urgent-alert webhook on or off in the app without deleting the configured
    push_url. The row shows only the host, never the full topic/path, and the
    new push_enabled config key persists the choice.

Fixed

  • Esc no longer quits the app. From the dashboard it returns to the live
    edge (and closes the help overlay or a prompt, as before) — quitting is q,
    which is what every other screen already did.
  • The current-value pane keeps its range label when compact. On a short
    terminal the colour-independent label (LOW, in range) was pushed onto a
    line that got clipped, leaving colour as the only cue; it now sits on the
    headline next to the reading.
  • The overview strip says why it's empty — "loading overview…" before the
    first fetch, "no readings in this window" after — instead of drawing a bare
    box.
  • The audible alarm falls back to the terminal bell when no system audio
    player is available (headless boxes, minimal containers, a bare SSH login),
    instead of failing silently — silence is indistinguishable from "glucose is
    fine".
  • The setup wizard no longer echoes your token to the terminal — it's masked
    as you type, so it doesn't survive in the scrollback.
  • URLs are normalized instead of failing mysteriously. A bare
    mysite.example.com, a trailing slash, or a pasted
    …/api/v1/entries.json?count=10 now resolves to the right base URL, in the
    wizard, in the settings editor, and when loading an existing config.toml.
  • A partly-failed refresh now says so. When the readings arrive but a
    companion fetch doesn't, the affected panels (IOB/COB, treatment markers,
    forecast, sensor age, history, overview) were left showing old values with
    the connection still reading as healthy. The footer now names what's stale.
  • The connection recovers while you're browsing history. Backoff retries
    were skipped unless you were at the live edge, so an outage that started
    while you were panning stayed until you refreshed by hand. The backoff also
    now actually reaches its documented 60s ceiling (it stopped at 40s).
  • No more "heading low in ~0 min" from a stale forecast. Uploader forecasts
    are timestamped when the pump published them; an old one is entirely in the
    past, and its points were being reported as an imminent crossing. Past points
    are now skipped.
  • A delta too small to show no longer renders as -0.0 in the dashboard or
    the Waybar module — the sign follows the value as displayed, so a flat trend
    reads flat.
  • The predict-horizon setting is honest about its reach — above 30 minutes
    it notes that the local (AR2) forecast only projects that far, so a longer
    horizon needs uploader predictions from Loop or OpenAPS.
  • Saving settings can no longer lose your token. config.toml is now
    written to a temp file (created owner-only, flushed to disk) and renamed into
    place, instead of being truncated and rewritten — so a crash, a full disk, or
    a power cut mid-save leaves the old config intact rather than an empty file
    with the only copy of your Nightscout token gone.
  • The setup wizard no longer builds config.toml by string interpolation
    values are serialized by the TOML library, so a URL or token containing a
    quote or newline can't corrupt the file or inject extra settings into it. The
    file is also created with 0600 from the start, rather than being chmodded
    after the token was already written.
  • The audible alarm no longer leaks processes. Each alarm spawns a system
    audio player; those were never reaped, so a long overnight urgent state piled
    up hundreds of zombie processes. Finished players are now cleaned up on every
    play.
  • Alert thresholds can't cross any more — urgent-low ≤ low ≤ high ≤
    urgent-high is enforced while editing, so you can't silently disable a band
    by dragging one threshold past its neighbour.
  • The newest reading is now always the newest reading — entries are sorted
    by timestamp on arrival instead of trusting the order Nightscout (or a proxy
    or mirror in front of it) happened to return, so the current value, delta,
    staleness check, and forecast can't silently key off an older reading.
  • Alerts no longer flap on a threshold. A reading hovering on a boundary
    (69 → 71 → 69, well inside CGM noise) used to re-fire the notification, the
    audible alarm, and the push webhook every single time. Clearing an alert now
    requires moving 4 mg/dL past the threshold; raising one is unchanged, so a
    real low still alarms on the first reading that crosses.
  • A flat glucose no longer predicts a low. The predictive alert and its ETA
    now follow the centre of the forecast rather than the edge of the uncertainty
    cone, which widens with the horizon and so crossed a threshold even when
    glucose was perfectly steady.
  • A bad token or URL now says so and stops retrying instead of being
    retried forever as if it were a network outage. After three consecutive
    authentication (401/403) or not-found (404) responses, automatic fetching
    pauses with an explanatory message; press r, or switch/edit the site, to
    resume.
  • Stats are now clinical, not cosmetic — time-in-range, mean, and GMI are
    computed over a fixed window of the last N days (the AGP days setting,
    default 14 — the clinical standard) instead of whatever slice of the graph
    happened to be on screen, so panning or zooming no longer changes them. The
    stats panel title names the window (e.g. stats · 14d).

2026.7.3

Choose a tag to compare

@github-actions github-actions released this 18 Jul 02:18
v2026.7.3
20fa592

Release Notes

This release hardens the safety-critical alarm path and reworks the graphs. The
audible alarm can no longer stall silently — the Nightscout client now times
out, a total sensor dropout raises a Stale alarm, sensor-error codes no longer
fire a false urgent-low, and a wrong token says so instead of reading as
"offline". Visually, both the AGP and the short-term forecast now render as
filled percentile/uncertainty bands, chart shading lines up with the axes, the
colourblind palette renders on every terminal (including tmux/SSH), and there's
a ? keybinding overlay. It also adds a first-run units prompt and an in-app
"not a medical device" reminder.

Added

  • The AGP view now renders as a filled percentile fan (a shaded 5–95 and a
    brighter inter-quartile band) with a single bright median line, and its title
    shows the target range — much closer to a clinical AGP than the previous flat
    lines.
  • A keybinding help overlay — press ? for a full cheatsheet. The footer
    now falls back to a terse hint set on narrow terminals (it previously clipped
    silently, hiding settings/site/snooze) while always keeping ? help visible.
  • The dashboard footer now shows a snooze indicator with a countdown while
    the audible alarm is silenced, so it's clear the alarm is off and for how long.

Changed

  • The forecast cone on the timeline is now a filled low–high band (matching
    the AGP fan) with the centre line drawn on top, instead of two dim edge lines,
    and it emanates from the last reading (the AR2 fallback's initial jump no
    longer leaves the fan floating above the current dot).
  • In-app safety note — the "not a medical device" reminder now appears in
    the running app (a dim note in the header, and up front in the first-run
    wizard), not only in the README and about.
  • Alert banner now follows the theme/colourblind palette (it was hardcoded
    red/yellow), and the selected settings row is highlighted full-width.
  • Dashboard polish — the range bar now shows all four zones (urgent-low /
    low / in-range / high / urgent-high) and uses integer mg/dL labels; IOB and
    COB stand out from the dimmed device line; and the graph labels its carb and
    bolus markers with a small legend.

Fixed

  • Chart background tints now line up with the chart. The in-range band, the
    AGP fan, and the forecast fill are painted onto the terminal buffer, and the
    plot-rect geometry didn't match ratatui's — it was two rows too tall and used
    the wrong left gutter, so the shading spilled past the axes and sat offset from
    the lines/points it shades (the forecast fan looked detached from the current
    reading). The geometry now replicates ratatui's chart layout exactly.
  • Graph theming — the shaded in-range band is now derived from the in-range
    palette colour (it was hardcoded green, so it broke the colourblind preset),
    and the y-axis shows integer mg/dL values instead of spurious decimals.
  • Setup — the first-run wizard now asks for the display unit (mmol/L or
    mg/dL) instead of always defaulting to mmol/L, so mg/dL users aren't dropped
    into the wrong unit.
  • Accessibility — the colourblind-safe palette now uses named ANSI colours
    instead of truecolor hex, so it renders correctly on 16/256-colour terminals,
    tmux, and SSH sessions that lack truecolor (where it previously collapsed
    silently). The current reading is also exposed as plain text alongside the
    big-number glyphs, so screen readers, tmux copy, and braille displays can read
    it.
  • Clearer connection errors — a wrong or non-readable token now reports
    "authentication failed — check your read-only token (not API_SECRET)" instead
    of a generic "offline", both at runtime (in the header) and during first-run
    setup; unreachable hosts and HTTP errors are also distinguished.
  • Alarm responsiveness — a sensor gap now escalates to a Stale alarm within
    seconds (re-checked on the alarm tick) instead of waiting for the next full
    refresh, and a failed escalation push (dead push_url) is surfaced instead of
    swallowed silently.
  • Alarm reliability — the audible alarm could stop working silently in
    several cases, now fixed: the Nightscout client had no request timeout (a
    stalled connection froze input and the alarm), a total sensor dropout read as
    "in range" instead of a sensor gap, Nightscout sensor-error codes (0–12) were
    read as a real reading and could fire a false urgent-low, and predictive
    alerts evaluated the previous refresh's forecast. Failed data fetches no
    longer pile up doomed follow-up requests.

2026.7.2

Choose a tag to compare

@github-actions github-actions released this 17 Jul 15:42
v2026.7.2
a708e1b

Release Notes

This release is a dashboard glow-up. The graph now colour-codes readings by zone
with a shaded in-range band and dashed threshold rails, adds a zoned range bar
under the current value, and gains a switchable AGP (ambulatory glucose
profile) view alongside the 3h/24h timelines. The stats panel picks up a
time-in-range bar and a mean sparkline, and short-term forecasts now render as
an uncertainty cone — a high/low band — instead of a single line.

Added

  • Graph view tabs (Tab / Shift+Tab) — switch the graph pane between a
    3h or 24h timeline and an AGP (ambulatory glucose profile) that folds the
    last N days of readings onto a 24h clock as a percentile band (median +
    25/75 + 5/95). The number of days is configurable in settings (AGP days).
  • Dashboard graph glow-up — readings are colour-coded by zone
    (low/in-range/high) with dashed reference rails at the low/high thresholds,
    the in-range region is shaded as a band behind the trace, and a zoned range
    bar under the big current value shows where it sits between the thresholds.
  • Stats upgrade — time-in-range is drawn as a stacked zone bar, and the
    mean gets an inline sparkline of recent readings.

Changed

  • Forecast is now an uncertainty cone — predictions render as a widening
    high/low band (the plausible range) instead of a single line; the
    time-to-low/high ETA warns on the worst plausible path.

2026.7.1

Choose a tag to compare

@github-actions github-actions released this 17 Jul 11:55
v2026.7.1
205bdc3

Release Notes

First public release. A fast, keyboard-driven terminal UI for viewing
self-hosted Nightscout CGM data.

⚠️ Not a medical device. Don't use it for treatment decisions.

Try it instantly on synthetic data with sugarrush --demo (no config, no
network).

Added

  • Dashboard — big current value with trend arrow, delta, and a colour +
    text range label; stats panel with time-in-range, mean glucose + GMI,
    insulin-/carbs-on-board, and device status (battery, sensor age, last seen).
  • History & forecast — braille/dot graph you can pan (h/l), zoom
    (+/-, 1h–24h), and jump to a date (g); a 24h minimap you click or drag;
    a short-term forecast overlay (uploader predictions or a local AR2 fallback)
    with a "now" line, a time-to-low/high ETA, and predictive alerts; carb and
    bolus markers on the graph.
  • Alerts & safety — in-TUI banner plus cross-platform desktop notifications
    (Linux/macOS/Windows); an audible alarm for urgent lows/highs with snooze,
    per-level tones, quiet hours, and unacknowledged-alarm escalation (optional
    phone push); clear offline vs. sensor-gap states with backoff retry.
  • Configuration — an in-app settings screen (s) grouped into sections,
    editing units, refresh, thresholds, alarms, and theme live and saving back to
    config.toml; configurable colours with a colourblind-safe preset; multiple
    Nightscout sites (n to switch); a first-run setup wizard.
  • Elsewhere — a Waybar module (sugarrush waybar) with a sparkline tooltip
    and click-through; sugarrush --demo to try the app on synthetic data with
    no config or network.
  • Distribution — published to crates.io, the AUR (sugarrush-bin), and a
    Homebrew tap; prebuilt binaries + shell/PowerShell installers via cargo-dist.