Skip to content

Releases: giovi321/smalltv-mod

v2.13.1: the Clawdmeter dot lights only when it should

Choose a tag to compare

@giovi321 giovi321 released this 08 Sep 23:10

v2.13.1: the Clawdmeter dot lights only when it should

A one-line fix on the Clawdmeter screen's status dot, which turns out to have been wrong in both directions.

The status dot

drawUsage() decided whether to show the small accent dot with a 7-character prefix compare against "allowed". Two things fall out of that.

The daemon changed vocabulary. clawdmeter-daemon v1.1.0 reads Claude's usage endpoint instead of POSTing an inference request for its rate-limit headers, so st now carries the session limit severity (normal / warning / rejected) rather than the old header status (allowed / allowed_warning / rejected). Nothing cleared the dot for normal, so a perfectly healthy session showed the warning dot permanently.

And the prefix compare was too short all along. "allowed_warning" matches "allowed" across its first seven characters, so the warning state never raised the dot either.

Both calm values now clear the dot, compared exactly:

st 2.13.0 2.13.1
allowed off off
allowed_warning off on
rejected on on
normal on off
warning on on

Both vocabularies are accepted, so the screen behaves with old and new daemons alike.

Upgrading

Nothing to reconfigure. Self-update offers this build on every board, and each variant stays on its own image. Firmware for every board is attached below, built from this tag.

If you also run the PC-side daemon, update it to v1.1.0: from that release polling no longer spends an inference request against the quota it reports.

v2.13.0

Choose a tag to compare

@github-actions github-actions released this 31 Aug 10:34

v2.13.0 — two sensors on one screen

A new Home Assistant blueprint, dual_sensor.yaml, puts two readings side by side on one 240×240 panel instead of making the carousel rotate between them. The outdoor temperature next to a bedroom's, the two halves of a heating loop, a battery and its charge rate.

There is no firmware change in this release. The binaries attached below differ from v2.12.2 only in the version string they report. Devices will offer the update because the release tag is newer, but flashing it changes nothing on the panel. Everything new here is a blueprint, two examples, and documentation, all of which work on v2.12.2 firmware as it stands.

What it draws

The panel splits into two columns centred on x 60 and x 180, with a vertical divider between them. Each column gets an optional icon, a label, the value in large type, and the unit on its own row:

+--------------+--------------+
|        Temperatures         |
|--------------+--------------|
|     (sun)    |    (home)    |
|   Outside    |   Bedroom 2  |
|              |              |
|     12.4     |     21.7     |
|      °C      |      °C      |
+--------------+--------------+

One retained MQTT message per screen, on one carousel slot, same contract as the screen board blueprint. Nothing about existing automations changes.

The problem it solves

A column is half the panel less a 4 px margin on each side: 112 px. Text in the built-in 6×8 font is length × 6 × scale pixels wide, so a column holds 4 characters at scale 4, 6 at scale 3, and 18 at scale 1. That is a tight budget, and a sensor does not know about it. Three mechanisms keep a reading in it.

Text sizes are chosen at render time. Labels and values each take a minimum and a maximum; the blueprint uses the largest size in that range that fits 112 px, and cuts the string at the smallest size if even that is too wide. A sensor that suddenly reports -1234.567 cannot run off the panel or break the JSON.

A decimal cap, one place by default. A sensor reporting 21.718751234567 is 15 characters, and 15 characters only fit at scale 1 — unreadable across a room, for precision the panel cannot use. The cap fixes that, and it caps rather than formats, so nothing ever gets longer than the sensor reported:

Sensor reports Decimals Drawn as Text scale
21.718751234567 off 21.718751234567 1
21.718751234567 1 21.7 4
21.718751234567 0 22 4
1234 1 1234 4
21.0 1 21 4
cloudy 1 cloudy 3

Trailing zeros are dropped, integers stay integers, non-numeric states pass through untouched, and the cap runs after the value template, so a template computing a difference needs no round() of its own. Only the drawn text is rounded; the sensor's state and history keep full precision.

Every element is optional. Each column lists which of its icon, label, value, and unit to draw; the title and divider go away by clearing their own inputs. This is also the payload lever: a screen with a title and two icons comes to 715 bytes, past the ESP8266's ~700 B limit, while bare numbers with no captions come to 230.

Element Bytes freed (both columns)
Title ~70, plus its length
Divider ~60
Icon ~130
Label ~130
Unit ~135
Value ~135

Nothing reflows when an element goes away — the rest stay on the rows the Layout section gives them. The documentation lists starting y values for each trimmed layout.

Templates

Label, value, icon, and foreground colour each take a Jinja template that wins over the static input when it renders non-empty. So a column can combine sensors, switch its icon between window-open and window-closed, turn red past a threshold, or show a difference with no entity of its own. Every y position and text size is an input too, defaulting to the layout above.

Installing it

Import from the UI: Settings → Automations & scenes → Blueprints → Import blueprint, then paste

https://github.com/giovi321/smalltv-mod/blob/main/blueprints/automation/smalltv/dual_sensor.yaml

Needs Home Assistant 2024.6.0 or newer. The blueprint has no firmware requirement beyond MQTT screens, which means the standard ESP8266 image or any ESP32 image; the lean ESP8266 image compiles screens out.

Also in this release

For a single reading in the full panel width, the screen board blueprint is still the right tool, and for three or four readings it is better to publish one screen each and let the carousel do the work: four 60 px columns leave 52 px of usable width, which is 8 characters at scale 1.

Firmware images for every board are attached below, built by CI from this tag.

v2.12.2: the usage screen stops flashing

Choose a tag to compare

@github-actions github-actions released this 31 Aug 09:12

v2.12.2: the usage screen stops flashing

A maintenance release built from two community pull requests. The visible change is on the Clawdmeter screen, which no longer blinks black every time the daemon pushes.

The Clawdmeter screen flashed on every push

drawUsage() cleared the whole panel with fillScreen() on every update. The daemon re-POSTs to /api/usage on a fixed interval whether or not anything changed, and the reset countdown ticks once a minute, so in practice the 240x240 panel went black and repainted on nearly every refresh. On a device sitting on a desk that reads as a constant blink.

The full clear now happens only when the layout actually changes: the first paint, coming back from the idle mascot animation, a flip between valid and invalid data, or a wake from another mode. A routine update repaints the two meter cards and the status dot in place and leaves the rest of the screen alone. That is the same diffed approach the idle mascot animation already used, now applied to the stats screen.

Thanks to @andrewhannaford, who found this, wrote the fix, and verified it over the air on a physical SmallTV in #8.

Building on Windows

The same pull request added extra_script.py, a workaround for PlatformIO on Windows. SCons sends build-tool command lines through cmd.exe, which can mis-tokenize the long quoted lines this project generates and fail a .cpp compile with "no such file or directory". The script re-tokenizes the line and starts the process directly.

It is wired into the ESP8266 envs and gated on os.name == "nt", so Linux and macOS builds are unchanged. Documented in Building from source.

Compiler warnings

Two snprintf destination buffers were sized exactly to their expected output, which clang flags as a possible truncation. Both are now large enough to silence it: the timestamp buffer in Clock.cpp and the flight-level label in RadarMode.cpp. Neither changes what the device draws or reports.

Thanks to @therealbstern in #9.

Upgrading

Nothing to reconfigure. Self-update offers this build on every board, and each variant stays on its own image. Firmware for every board is attached below, built by CI from this tag.

v2.12.1 — radar: the real fix for the empty scope, plus diagnostics that name the fault

Choose a tag to compare

@github-actions github-actions released this 27 Aug 16:57

v2.12.1 — radar: the real fix for the empty scope, plus diagnostics that name the fault

This release closes the "radar shows nothing, no error anywhere" reports for good, with the bug found and verified on two ESP8266 devices over the air.

The bug

A device whose radar source is set to adsb.fi has shown a permanently empty scope since that feed moved behind Cloudflare in August 2026 — on any network, at any range, with any amount of traffic overhead. The failure was invisible: the device got HTTP 200 and even parsed the response "successfully."

The mechanism: Cloudflare answers HTTP/1.1 requests with chunked transfer-encoding, and the radar's parser reads the raw TLS stream. The chunk-size framing reaches the JSON parser, which reads the leading hex length as a bare number, reports a valid document, and finds no aircraft array in it. Zero aircraft, no error, every poll.

v2.12.1 requests HTTP/1.0, which forbids chunking, so adsb.fi parses correctly again. adsb.lol was never affected (it sends plain responses) and remains the recommended source on the ESP8266.

If you are on older firmware and cannot update right now: switch the radar source to adsb.lol in the Radar tab. That alone fixes it.

Diagnostics: the scope can now explain itself

The Status tab has a new Radar line, and /api/status a radar object, reporting what the last poll actually did:

  • ok with the aircraft count, and how many the feed carried before your altitude filter
  • skipped, low heap — the TLS handshake would not fit in memory
  • connect failed, http error (with the code), parse failed
  • no aircraft in feed — the fetch worked and the sky is genuinely empty
  • all filtered out — traffic was there, your minimum-altitude setting dropped it

plus the negotiated TLS buffer size and the age of the last attempt and last success. Free heap in the Status tab now also shows the largest contiguous block, which is the number that actually decides whether a TLS handshake can start.

Two smaller fixes in the same code

  • The memory guard measured the wrong thing. It compared total free heap against 18,000 when the handshake needs one contiguous 16,000-byte block (the same floor the cash.ch ticker has always used). The old test blocked healthy devices and passed fragmented ones. On the standard ESP8266 image the radar was effectively always blocked; the lean image is the practical answer there — see Which release file to download.
  • TLS session resumption for the direct feeds, as the cash.ch fetch has long done. After the first handshake, polls resume the session instead of repeating the full key exchange — the slow part and the allocation peak on this chip.

Upgrading

Self-update offers this build on every board; each variant stays on its own image. ESP8266 users with an empty scope: update, then check the new Radar line — if it says ok, you are done; if it names another stage, that is the actual fault, stated plainly.

Firmware images for every board are attached below, built by CI from this tag.

v2.12.0 — a lean ESP8266 image for devices short on heap

Choose a tag to compare

@github-actions github-actions released this 27 Aug 15:01

v2.12.0 — a lean ESP8266 image for devices short on heap

The original SmallTV (ESP8266) now has a second firmware image, smalltv-mod-firmware-lean.bin, with Home Assistant screens and the Claude usage meter compiled out. It gives the heap 8,732 more bytes, which is what a device needs when the radar scope or a cash.ch ticker goes blank with no error on screen.

Nothing changes for anyone whose device already works, and nothing at all changes on the ESP32 boards.

The problem it solves

The ESP8266 shares one 80 KB DRAM arena between static allocations and the heap. Two fetch paths check for free memory before opening an HTTPS connection and skip the attempt when there is not enough, rather than crash:

  • the plane radar needs 18,000 bytes of free heap
  • a cash.ch quote needs a 16,000-byte contiguous block

Below those lines the screen goes quiet with nothing to explain it. Changing the data source does not help, because the device never gets as far as sending a request. A busy LAN or a weak signal is enough to push a working device under: broadcast traffic gets buffered, and a poor link means retransmission queues that come out of the same memory. The same firmware on the same hardware can work on one network and not another.

Read heap and maxblk in the Status tab to see where a device sits.

What the lean image gives back

Build Static RAM Heap gained
smalltv-mod-firmware.bin 55,536 B baseline
smalltv-mod-firmware-lean.bin 46,804 B 8,732 B

Home Assistant is 7,668 bytes of that, and two objects are nearly all of it: g_screens, the four-screen store, at 5,792 bytes, and g_ic, the icon cache, at 1,704 bytes. The 768-byte PubSubClient receive buffer also stops being allocated at runtime. The usage meter accounts for the other 1,080 bytes.

Which file to download

Nine files now come with a release. The names follow one pattern:

smalltv-mod-<image>[-<target>][.factory].bin

No target suffix means the original ESP8266. -lean, -c2, -esp32, and -esp32-pro name the others. A .factory file is the merged bootloader, partition table, and app, written at offset 0x0 over a cable; without it the file is an app image sized for an OTA slot.

File Board Use it for
smalltv-mod-firmware.bin SmallTV, SmallTV-ultra (ESP8266) The normal install and every later update
smalltv-mod-firmware-lean.bin Same ESP8266 boards The same device when it needs more heap
smalltv-mod-loader.bin SmallTV-ultra (ESP8266) One-time first install when the stock updater rejects the full image
smalltv-mod-firmware-c2.bin SmallTV (ESP32-C2) Updates
smalltv-mod-firmware-c2.factory.bin SmallTV (ESP32-C2) First install over USB-C
smalltv-mod-firmware-esp32.bin NM-TV-154 (ESP32) Updates
smalltv-mod-firmware-esp32.factory.bin NM-TV-154 (ESP32) First install over USB
smalltv-mod-firmware-esp32-pro.bin SmallTV Pro (ESP32, 8 MB) First install over the stock web UI, and every later update
smalltv-mod-firmware-esp32-pro.factory.bin SmallTV Pro (ESP32, 8 MB) Direct install or recovery over the UART header

Switching between the two ESP8266 images

Upload the other file in the System tab. Settings carry over: both images read the same config.json from the same LittleFS partition, and neither touches the layout.

The System tab now shows which variant is running next to the version, for example smalltv-mod 2.12.0 (esp8266-lean), and /api/status reports it as variant. Self-update follows that variant, so a lean device fetches the lean image and keeps its feature set instead of quietly regaining what you removed.

The one thing that does not survive the switch to lean: screens already pushed over MQTT are dropped and their topics are no longer subscribed. Retained messages on your broker are untouched, so going back to the standard image brings the screens back.

Also in this release

Documentation for all of the above:

Firmware images for every board are attached below, built by CI from this tag.

v2.11.0 — radar: pick your ADS-B feed, adsb.lol by default on the ESP8266

Choose a tag to compare

@github-actions github-actions released this 27 Aug 13:23

v2.11.0 — radar: pick your ADS-B feed, adsb.lol by default on the ESP8266

Radar went blank on the original GeekMagic SmallTV (ESP8266) in late August 2026. Nothing changed on the device: adsb.fi moved its open-data API behind Cloudflare, and Cloudflare's TLS is incompatible with what an ESP8266 can hold in RAM.

What broke

The ESP8266 has no room for a full-size TLS receive buffer, so the firmware probes the server's Maximum Fragment Length (MFLN) support and, when the server agrees, runs BearSSL with a 512-byte buffer. Cloudflare does not implement MFLN, so the probe fails and the buffer falls back to 4 KB. Cloudflare then ramps its record size up on large responses, and a 50 nm radar query is around 50 KB of JSON — the connection breaks part-way through the read, the parse fails, and the scope stays empty.

Verified against the live endpoint: opendata.adsb.fi returns no max_fragment_length extension in its ServerHello and reports Server: cloudflare. The API itself is fine — it answers HTTP 200 with normal data. No IP ban, nothing wrong with your device or your config.

The ESP32 boards (SmallTV knockoff / ESP32-C2, NM-TV-154, SmallTV Pro) use mbedTLS with dynamically sized buffers and were never affected.

What changed

The radar data source is now a three-way choice in Radar → Range & data:

  • adsb.lol (direct, no server) — new, and the default on the ESP8266. Same {"ac":[...]} shape and same fields as adsb.fi, no API key, ~1 req/s. It still negotiates MFLN, so the TLS handshake fits comfortably.
  • adsb.fi (direct, no server) — unchanged, and still the default on the ESP32 boards.
  • Custom webhook (LAN proxy) — unchanged.

Details:

  • The MFLN probe is now per-host and re-runs when you switch provider, instead of caching one answer for the life of the boot.
  • Configs saved by 2.10.x and earlier store the source as direct. Those predate the Cloudflare move, so they now resolve to the platform default (adsb.lol on the ESP8266, adsb.fi on the ESP32) rather than pinning adsb.fi. If you had picked adsb.fi deliberately, re-select it after updating and it will stick.
  • Webhook setups are untouched.

Also in this release

The Claude usage tab now says up front that the screen needs clawdmeter-daemon running on your PC, with a link to it. The requirement was previously buried in a hint paragraph below the inputs, where it read as optional detail rather than a prerequisite.

Upgrading

Self-update will offer this build. ESP8266 users whose radar is stuck on an empty scope should get planes back on the first refresh after the reboot, with no settings change needed.

If adsb.lol ever goes behind a CDN too, switch to adsb.fi or the webhook — the point of the selector is that neither feed is hardcoded any more.

Firmware images for every board are attached below, built by CI from this tag.

v2.10.1 — fix: brightness control from Home Assistant

Choose a tag to compare

@giovi321 giovi321 released this 21 Aug 20:01

v2.10.1 — fix: brightness control from Home Assistant

Patch release. One bug fix on top of v2.10.0:

  • Brightness commands from Home Assistant were ignored. The device never subscribed to smalltv/<hostname>/brightness/set, so moving the slider in HA published the command into the void and the retained state topic snapped the slider back. The topic is now subscribed at connect.

If you installed v2.10.0, update to this one — self-update will offer it, since v2.10.0 devices report a lower version.

Everything else is identical to v2.10.0: HA screens over MQTT (freeform draw protocol, icons, bitmaps with on-device upscale, UTF-8 text), the temp_compare and screen_board blueprints, brightness state sync + auto-discovery, screen TTL and the Clear screens button, the rotation 180° fix, and the flat 3D-printed case in case/. See the v2.10.0 notes for the full feature list and the docs for usage.

Firmware images for every board are attached below, built by CI from this tag.

Full Changelog: v2.10.0...v2.10.1

v2.10.0 — Home Assistant screens over MQTT

Choose a tag to compare

@giovi321 giovi321 released this 21 Aug 19:37

v2.10.0 — Home Assistant screens over MQTT

The headline feature: a new Home Assistant mode. Home Assistant pushes screens to the display as retained MQTT messages, in a freeform JSON draw protocol, and the device renders them — a red/green "open the window" indicator, sensor readouts, anything you can template. Multiple screens rotate in a carousel you can mix with the built-in modes.

What's new

  • HA screens mode: subscribe smalltv/<hostname>/screen/<slot>, one retained JSON document per screen. Draw primitives: fill, rect, rrect, circle, line, text, icon (20 built-in vector icons), and bitmap (1-bit hex, with on-device 1–4× upscale so payloads stay tiny). Text accepts UTF-8 (degree sign and Western-European accents render). Empty retained payload deletes a screen; screens persist across reboots; per-screen TTL expiry. Broker is configured in the new MQTT card of the web UI.
  • Brightness over MQTT: …/brightness/set (plain 0–100) with a retained state topic, synchronized both ways with the web UI slider. A retained MQTT-discovery config makes the Brightness entity appear in Home Assistant automatically.
  • Two Home Assistant blueprints, importable by URL straight from the repo: temp_compare (the indoor/outdoor window advice screen) and screen_board (up to four Lovelace-card-style screens per automation: per-screen templates for value/title/icon/colors/bitmaps, auto-fit text with min/max sizes and line wrapping, editable layout, MDI bitmap support via tools/mdi_to_hex.py). Screens expire on their own after you delete the automation (screen_ttl), and the web UI has a Clear screens button that also purges stale retained messages from the broker.
  • Docs: full MQTT contract, blueprint install/update guide, MDI bitmap tooling, and examples — see the Home Assistant screens page.
  • 3D-printed case: flat desk case + stand STL in case/, with a preview render.
  • Fix: display rotation 180°/270° now applies the correct panel row offset (content no longer pushed to the top of the screen).

Flash budget

To fit all this on the 4 MB ESP32 targets, the web UI is now served gzipped and Bluetooth is compiled out of the smalltv_esp32/smalltv_c2 images. Headroom after this release: ~83 KB (esp32), ~167 KB (c2), ~342 KB flash (ESP8266), ~630 KB (8 MB Pro). WITH_HA=0 and WITH_NOTIFY=0 build flags exist for slim custom builds.

Notes

  • MQTT is plain TCP (no TLS) — keep the broker on your LAN.
  • ESP8266 payload limit is ~700 B per screen; ESP32 builds take ~2 KB. A 48 px bitmap only fits ESP32-family payloads; prefer a 24 px source with on-device upscale.

Firmware images for every board are attached below, built by CI from this tag.

Superseded by v2.10.1: the assets below ignore brightness commands from Home Assistant (the command topic was never subscribed). Use v2.10.1 instead.

v2.9.2

Choose a tag to compare

@github-actions github-actions released this 15 Aug 20:17

Push a notification to the screen, put the settings page behind a password, and a round of documentation corrections.

Notifications

A new endpoint takes over the whole panel with an animation and a message, holds it for as long as you ask, then puts back whatever was showing.

curl -X POST http://smalltv.local/api/notify \
  -H 'Content-Type: application/json' \
  -d '{"state":"done","ttl":20,"label":"nightly-backup"}'

waiting waves over NEEDS YOU, done jumps over TASK DONE, and the optional label says which job it was, which is the useful half of the message once more than one thing is firing alerts. Nothing is persisted and nothing survives a reboot.

The overlay is not a mode: it cannot be selected in the Display tab and never joins the carousel. When it expires, the time it spent on screen is credited back to the rotation, so the carousel resumes on the same feature with the same remaining dwell and repaints from cache rather than re-fetching.

Contributed by @LynchzDEV in #5, verified on ESP8266 hardware. See Notifications for the full contract and the two cases where an alert is accepted but not drawn.

A password on the settings page

Off by default, so nothing changes unless you want it. Turn it on in the System tab and the settings page, the whole API, and the firmware upload all ask for credentials.

It uses HTTP digest rather than basic, so the password itself never crosses the network even though the page is plain HTTP. One endpoint stays open on purpose: the address the Clawdmeter daemon pushes to, which has no way to send credentials and can only change the numbers on the screen.

There is no password recovery. Forget it and the only way back in is to reinstall the firmware over a cable, so write it down before you save.

Fixes

  • The setup hotspot password was erased on every save. The field is never filled in from the device, so a blank one could not be told apart from clearing it, and every "Save settings" wrote the blank through. It now keeps the stored password, as the WiFi rows always have, and a "No password (open hotspot)" tick-box is the explicit way to clear it.
  • The radar Range dropdown rendered blank on any device that had never changed it, because the firmware default of 20 was not one of the options. A value the list does not carry is now added rather than dropped, which also covers imported configs.
  • The Display tab's Mode dropdown listed features under names the tabs no longer use. It now reads Ticker, Clawdmeter, Radar, Carousel.

Documentation

Every statement in the README and the docs was checked against the source. Nine were wrong rather than merely dated and have been corrected, including a radar page that named a dropdown entry that no longer exists and listed the range rings without the default, a Clawdmeter tab documented with one field when it has two, and a flashing guide still quoting an image size from July.

Boards

Board Image Of its slot
SmallTV (ESP8266) 717,888 B 69%
SmallTV (ESP32-C2) 1,495,440 B 95%
NM-TV-154 (ESP32) 1,527,536 B 97%
SmallTV Pro (8 MB) 1,599,600 B 72%

The 4 MB classic ESP32 is close to its ceiling at 97%. It fits and updates normally, but that board has little room left for anything new; the 8 MB Pro runs the same code with 628 KB to spare.

v2.9.0

Choose a tag to compare

@github-actions github-actions released this 15 Aug 19:15

A WireGuard client on the boards that have room for it, colour correction for the panel, per-symbol ticker retry, and a renamed pair of tabs.

WireGuard VPN

The device can now join your VPN itself, so you can reach the settings page from outside your network without forwarding its plain-HTTP port to the internet. Set it up in the WiFi tab: private key, peer public key, endpoint, tunnel address, allowed IPs.

Which boards get it comes down to how much of its update slot each image already uses:

Board WireGuard Image against its slot
SmallTV (ESP8266) and ultra no the chip has neither the flash nor the heap
SmallTV (ESP32-C2) yes 1,469,520 of 1,572,864 bytes
SmallTV Pro (8 MB) yes 1,573,904 of 2,228,224 bytes
NM-TV-154 (classic ESP32) no 1,501,344 of 1,572,864 bytes, and with the client it lands 1.6 KB short of overflowing

Three crash reboots in a row hold the tunnel down at the next boot, so a bad tunnel configuration cannot lock you out of your own settings page. A clean boot, a completed handshake, or re-saving the settings clears the hold. Full details in WireGuard VPN.

Panel colour correction

These devices do not all ship the same panel, so two units running this firmware side by side can render the same colour differently. The Display tab gains a Colour card: per-channel red, green, and blue gain, a colour-order switch for panels with red and blue swapped, and an invert toggle for panels that come up looking like a negative. Everything applies as soon as you save, so you can adjust with the device in front of you.

Swapping red and blue used to mean editing a board header and reflashing. It is now a setting.

Tickers retry on their own

Each ticker now keeps its own schedule. A symbol whose fetch fails comes back after 12 seconds, then 24, 48, 96, and settles at the refresh interval, retrying there for as long as it keeps failing. It is never given up on.

A failing ticker also no longer drags the healthy ones into its retries, which on the ESP8266 means fewer expensive TLS handshakes. The Ticker tab lists what the device currently holds for every symbol and, for the failing ones, how long until the next attempt.

Web UI

  • The Update tab is now System, and the Usage tab is now Clawdmeter.
  • The live ticker values moved off the Status page to a Live data card at the top of the Ticker tab, next to the settings that produce them.
  • The project logo now appears in the page header and as the browser tab icon.

Also in this release

  • Poll and rotation intervals are clamped at both ends. The web UI's own limits were advisory only, since the page posts JSON rather than submitting a form, and an out-of-range value could wrap the counter it was stored in.
  • Enabling a tunnel starts NTP whether or not night mode is on, because WireGuard rejects a handshake stamped with a wrong clock.

Boards

Five targets build from this tag, including the GeekMagic SmallTV Pro added by @sweetlilmre in #4. Each board takes its own image; see which one do I have if you are not sure.

Board Install
SmallTV (ESP8266) smalltv-mod-firmware.bin
SmallTV-ultra smalltv-mod-loader.bin first, then smalltv-mod-firmware.bin
SmallTV (ESP32-C2) smalltv-mod-firmware-c2.factory.bin over USB, then -c2.bin for updates
NM-TV-154 smalltv-mod-firmware-esp32.factory.bin over USB, then -esp32.bin for updates
SmallTV Pro smalltv-mod-firmware-esp32-pro.bin through the stock web UI

Every board updates itself from the System tab from here on.