Cheese BTC Widget

org.cheeserobot.btcwidget
by Marnix Schoorel marnix@noderunners.org

A tiny, no-nonsense Android home-screen widget that shows the latest Bitcoin price at a glance. No accounts, no ads, no tracking — just the number.

First release: May 5, 2026, 11 total releases.

Most recent release: Jun 12, 2026.

Repo

Appears in 1 app stack.

0 sats / 0 zaps received in the past year.

Sats Received

Underlying data available via MCP: app_zaps, app_releases.

Zap Count

Underlying data available via MCP: app_zaps, app_releases.

Releases

  • Jun 12, 2026 5.0
    ### Added - **Any of 126 fiat currencies.** The configure screen's quick-pick radios (US Dollars, Euros, Bitcoin, Sats per USD, Block height) are now joined by an "Other currency" option backed by a spinner of the full catalog. The list is discovered from the backend's `GET /api/currencies/` endpoint and cached locally, with a bundled offline fallback covering all 126 codes and display names so the picker populates instantly even on first launch with no network. - **Full history for every currency.** Non-USD/EUR fiats fetch the parameterised `GET /price/summary.json?currency={code}` — the same
    More…
    envelope, keyed generically (`price.price`, hist arrays of `{when_unix, price}`) — so every currency gets both the 24h sparkline background and the 7d change indicator, not just price. The server applies its FX rate across the BTC-USD history, so the chart and change % are available everywhere. ### Changed - New `CurrencyCatalog` (catalog parse + offline fallback + symbols + routing predicates) and `ExtendedFetcher` (per-currency `summary.json?currency=` fetch + compact per-window series cache). `refreshWidgets` now routes each widget to the BTC (no network), summary (USD/EUR/SATS/BLOCK), or extended (everything else) path. - The config screen uses a "Done" + "Cancel" pair: Done (and every other close path) auto-saves; Cancel discards. - App icons migrated from PNG to webp. ### Removed - The unused `Notifier` helper and the launcher mipmap icon assets (the widget has no launcher icon — the widget itself is the app). [5.0]: https://github.com/AbelLykens/org.cheeserobot.btcwidget/releases/tag/v5.0
  • May 13, 2026 4.0
    ### Added - **Custom price backend.** The configure screen now exposes a "Price backend" row under Advanced options. The default URL (`https://price.cheeserobot.org/price/summary.json`) is pre-filled so the field doubles as documentation; anyone running their own feed (e.g. a self-hosted [pricemon](https://github.com/AbelLykens/pricemon) instance) can paste their URL and the widget will switch to it on the next refresh. The pref is global — every placed widget shares the one upstream fetch — so changing it from any widget's settings screen affects all of them.
    More…
    - **Live validation.** When the field loses focus or the user taps the keyboard's Done action, the activity does a one-shot fetch + parse off the main thread and only saves the URL if the payload carries everything the widget actually reads: both fiat prices, a non-empty 24h history array, a non-empty 7d history array, and a latest-block snapshot. A partially-compatible feed gets refused with a short human-readable reason ("Missing or non-numeric price_usd", "hist_1d array missing or empty", etc.) and the previously-saved URL stays active so the widget never goes dark mid-edit. - **One-tap reset.** A "Reset to default URL" button clears any override and restores the bundled default in the field. Typing the default URL back in by hand or leaving the field blank both have the same effect.
  • May 12, 2026 3.2
    ### Changed - **Price feed moved to a dedicated subdomain.** The widget now fetches its consolidated payload from `https://price.cheeserobot.org/price/summary.json` instead of `https://cheeserobot.org/price/summary.json`. Same JSON shape, same one-round-trip refresh — only the host changed, so the upstream can serve the price feed from its own box without dragging the rest of the site along for the ride. [3.2]: https://github.com/AbelLykens/org.cheeserobot.btcwidget/releases/tag/v3.2
  • May 8, 2026 3.1
    ### Fixed - **Widget no longer greys itself out on wake-up.** When the device woke from doze and the radio hadn't fully reattached yet, a scheduled refresh would briefly see "no network", paint the widget in the OFFLINE state (grey icon, dimmed text, no live background), and bump an internal failure counter — two such ticks in a row was enough to keep the widget greyed out indefinitely. The scheduled 30-min refresh path now leaves the widget alone on transient failures: the launcher's last good frame stays on screen until we actually have new data. The "…" loading flash is also limited to
    More…
    user-initiated refreshes (taps and "save settings"), so a scheduled tick can no longer briefly clobber the visible price. ### Changed - **Stale styling is now time-based, not failure-based.** The widget switches to its greyed-out "stale" treatment once the cached price has aged past three hours — about six missed scheduled ticks — rather than after two consecutive fetch failures. Transient hiccups no longer change how the widget looks; only data that's actually getting old does. - **F-Droid availability.** Cheese BTC Widget is now also published on F-Droid: <https://f-droid.org/en/packages/org.cheeserobot.btcwidget>. No app behaviour changes, just an extra install channel. [3.1]: https://github.com/AbelLykens/org.cheeserobot.btcwidget/releases/tag/v3.1
  • May 7, 2026 3.0
    ### Added - **Block height widget mode.** New currency option in the configure screen: pick **Block height — latest block** to turn the widget into a live bitcoin block-height counter. The miner / pool name (e.g. "SpiderPool") sits in the top caption slot, the latest block number (e.g. `948,347`) is the main read, and the chart background paints a stylised diagonal line going up — block height only ever climbs, so the line is the joke. Powered by the new `latest_block` field in `summary.json`. The change-percentage indicator hides automatically for this mode.
    More…
    ### Changed - **Single endpoint, all data.** USD, EUR, SATS, the 24-hour and 7-day history series, and the latest block are now pulled from one consolidated `https://cheeserobot.org/price/summary.json` call instead of three different endpoints. Each widget refresh costs exactly one HTTP round-trip on the wire — the previous design fanned out to as many as three (price, hist-1d, hist-7d) per tick. The chart cache and the change-indicator's 24h/7d reference points fall straight out of the same payload, so no new caching machinery is needed. [3.0]: https://github.com/AbelLykens/org.cheeserobot.btcwidget/releases/tag/v3.0
  • May 7, 2026 2.8
    ### Added - **Sticky preview in the configure screen.** The logo and live preview now stay pinned to the top of the screen while the rest of the controls scroll underneath. Toggling any setting always updates the preview within view — no more scrolling back up to check what your change did. ### Removed - **"Choose your currency" / "Update your widget settings" header
    More…
    copy.** Both the title and the context-switching subtitle were decorative; the live preview right below them tells you what you're configuring. Removing them shrinks the sticky header so more controls fit on screen at once. The Bitcoin logo above the preview was also slimmed from 64dp to 40dp for the same reason. - **Flat green chart for BTC mode.** When the currency is Bitcoin (₿) — the "always 1 BTC" easter-egg — the chart background paints a single horizontal green line. There's no fetch, no historical, no period selector: the line is the joke. ### Changed - **"Price change" replaces "Price change indicator".** The settings category is renamed and now offers just two options — **24h** and **7d** — instead of the old Off / 24-hour / 7-day trio. The bottom red/green percentage line is therefore always shown when upstream data is available; users who previously had it disabled see the 24h reading from now on. Existing widgets with a stored `OFF` value migrate silently to `1D` on first read; their other settings are preserved. - **Chart background follows the chosen period.** The "Show chart background" toggle is no longer hard-wired to 7-day data. Picking **24h** in the new section paints the sparkline from the new `/price/price-hist-1d.json` endpoint (~25 hourly samples); picking **7d** keeps the existing 4-hourly 7-day series. Both endpoints are throttled to one fetch per hour each, independently, and only pulled when at least one placed widget actually needs them. - **Chart always ends at "now".** Whenever the sparkline is painted, the most recently fetched upstream USD/EUR price is appended as the rightmost data point. Up until now the line could end anywhere up to an hour in the past (the price-history cache lives at hourly resolution); the appended sample closes the gap so the chart's right edge matches the price text above it.
  • May 6, 2026 2.6
    ### Added - **New Bitcoin logo** baked from `btc.png`: density-correct PNGs for every launcher icon mipmap bucket (mdpi → xxxhdpi), and the same artwork inside the widget face, the launcher activity, and the widget configure screen. The adaptive launcher icon now sits on a white background with the orange ring inset 16dp into the safe zone so it stays whole on every launcher mask shape. - **Hide currency icon ($, €, sat).** New display toggle: when off it drops the "$" / "€" / "₿" prefix from the price for USD/EUR/BTC modes, and hides the sat-symbol icon for SATS mode. Independent of
    More…
    "Show Bitcoin logo"; for SATS the two toggles compose. - **"Moscow Time" easter egg.** Hidden bonus in the configure screen: pick **Sats per USD** as the currency *and* a thousands separator, and a "Display as Moscow Time" toggle appears under Number format. Flipping it on renders the four-digit sats-per-USD figure as a colon-split clock — e.g. 1234 sats becomes `12:34`. - **7-day chart in the configure-screen preview.** The sparkline now also paints behind the live preview, so toggling the chart option has visible feedback before you save. Uses real cached history when available; otherwise synthesises a plausible curve from the sample endpoints. ### Changed - **All display toggles read in the affirmative ("Show X").** The former "Hide Bitcoin logo" / "Hide \"1 BTC\" caption" CheckBoxes now read "Show Bitcoin logo" / "Show \"1 BTC\" caption" and are checked by default. **Show decimal places** moved out of Number format into the Display section so all visibility toggles live in one place. Underlying preference keys are unchanged — the activity inverts at load/save — so existing widgets keep their settings. ### Fixed - **Numeric and Moscow-Time renderings agree on the last digit.** The numeric formatter rounds (HALF_UP), but the Moscow-Time formatter used to truncate via `toLong()`, so a value like 1223.7 rendered as `1 224` numerically but `12:23` as Moscow Time. Both now round the same way and produce identical digits.
  • May 6, 2026 2.5
    v2.5 - Optional 7-day chart background. * New optional faint sparkline of the last 7 days behind the price text. Green when the 7-day move is up, red when down. * Driven by a new cheeserobot.org/price/price-hist-7d.json endpoint, fetched at most once per hour regardless of how often you tap. * Toggle under Advanced options. On by default.
  • May 6, 2026 2.4
    ### Added - **"Sats per USD" currency.** Pick it from the currency list to see how many satoshis one US dollar buys, with the Font Awesome sat symbol shown in the icon slot. The value is derived from the existing USD price feed (no extra network call), and the 24h/7d change indicator works in this mode too — note that "+x%" for sats means the dollar bought *more* sats than before, i.e. BTC dropped. [2.4]: https://github.com/AbelLykens/org.cheeserobot.btcwidget/releases/tag/v2.4
  • May 5, 2026 2.3
    A big release: the widget now shows a 24-hour or 7-day price-change indicator, refreshes every placed widget at once on a single shared network call, and the settings screen has been reorganised around a live preview. ### Added - **Price change indicator.** Optional red/green percentage line at the bottom of the widget showing 24-hour or 7-day change vs the current price. Off by default; pick "24h" or "7d" under Advanced options. Driven by the new `price_1d_ago_*` / `price_1w_ago_*` fields the
    More…
    upstream feed now exposes. - **Refresh-all on tap.** Tapping any widget now refreshes every placed widget on the device. The feed returns USD and EUR (and historicals) in one JSON, so a single HTTP call covers everyone — multi-widget setups stay in sync and don't make redundant requests. - **15-second rate limit** on user-triggered refreshes. A second tap inside the window repaints from cache instead of hitting the wire. System-scheduled updates (every 30 min) and the settings-save path bypass the limit. - **Live widget preview** at the top of the settings screen, sitting on a checkered grey background so opacity changes are visible without closing the screen. Updates in place on every input change. - **Two-tier settings.** The configure screen now shows just the currency picker by default. An "Advanced options" header expands to reveal tracked amount, formatting, opacity, display toggles, and the change indicator. Auto-expands on reconfigure when any advanced setting is non-default. - **Version footer** at the bottom of the settings screen. ### Changed - **Bitcoin logo now lines up with the price text vertically.** The widget layout was restructured so the icon and the price share a horizontal row, with the "1 BTC" caption as a sibling above. The icon's centre now aligns with the price number's centre rather than the centre of the icon-plus-caption stack. - **Robust JSON parsing.** Currency lookup tokenises keys and excludes any key containing "ago", so "price_1d_ago_usd" can never shadow today's "price_usd" regardless of key order. ### Fixed - **No more redundant fetches** when multiple widgets share a currency — previously each widget's refresh fired its own HTTP request.
  • May 5, 2026 2.1
    ### Changed - **Widget face restyled.** The icon-and-text group is now centered as a single block, so hiding the Bitcoin logo no longer shifts the remaining text off-center. Auto-sizing of the price has a real vertical bound now, so prices fill the widget vertically instead of rendering small. - Migrated the Gradle build from the standalone `org.jetbrains.kotlin.android` plugin to AGP 9's built-in Kotlin support, fixing a "kotlin extension already registered" collision with AGP 9.0.1 + Kotlin 2.2.10.