Skip to content

Releases: thaitop/tamaclaude

tamaclaude v1.2.3

Choose a tag to compare

@thaitop thaitop released this 10 Aug 04:35

The brightness you set is the brightness you get back. Unplug the board, quit the app, flash it again — it comes back where you left it.

What was wrong

The setting lived in RAM on both sides and nowhere else. The board reset the backlight to 100% on every boot, and the Mac app defaulted its slider to 100% on every launch. Nothing was ever written down, so a power cycle — or just quitting the menu bar app — threw the number away.

What changed

  • The board remembers on its own. The value goes into NVS and is loaded before the first frame is drawn, so a board that wakes up alone — no Mac in range, no Bluetooth, no Wi-Fi — lights up at the right brightness immediately, with no full-bright flash first. It writes only when the number actually changes, so a value re-sent on reconnect costs no flash wear.
  • The Mac remembers too, and re-sends on every new link. That is not a backup of the board’s copy; it answers the two states the board cannot answer for itself — a freshly flashed board whose NVS is gone, and the settings window needing a number to show when no board is connected.
  • The slider stops lying. Reopening Settings used to snap it back to 100% regardless of what the screen was doing.

Flashing

One file, bootloader and app together:

python3 -m pip install esptool
python3 -m esptool --chip esp32 --port "$PORT" \
    write_flash 0x0 ~/Downloads/tamaclaude-esp32-1.2.3.bin

Your saved Wi-Fi and LAN key survive an app-only flash but not a full erase; this image writes from 0x0 and leaves NVS alone.

The Mac app is still built from source — see the README.

tamaclaude v1.2.2

Choose a tag to compare

@thaitop thaitop released this 06 Aug 10:10

The weather page used to sit perfectly still while the mascot page's sky drifted behind it. Swipe between the two and the device read as frozen. It doesn't any more.

The weather sky

  • Clouds drift, stars twinkle, rain and snow fall — the same speeds and the same cadence the mascot page has always used, not a second set of numbers.
  • Lightning flashes. Two strikes and then a long dark, roughly every four seconds. Storm on this page had nothing else that could move: no stars, nothing falling, and every drifting cloud buried under a deck that reaches most of the way down the sky. A bolt that is lit all the time is a decal, not weather. The mascot page keeps its steady bolt, where a flash would only compete with the mascot for your eye.
  • The temperature stays readable when a cloud passes behind it. Clouds may only be brighter than the sky when the text on it is dark. At dawn and dusk white type over a pale cloud dropped to 2.8:1; the cloud now borrows the colour of the overcast above it and holds 4.5:1.

Measured on the board with rain forced: worst frame 106–109 ms against the mascot page's 93–136 ms, LVGL memory unchanged, no watchdog.

Flashing

One file, bootloader and app together:

python3 -m pip install esptool
python3 -m esptool --chip esp32 --port "$PORT" \
    write_flash 0x0 ~/Downloads/tamaclaude-esp32-1.2.2.bin

The Mac app is still built from source — see the README.

tamaclaude v1.2.1

Choose a tag to compare

@thaitop thaitop released this 06 Aug 09:06

A wrong Wi-Fi password used to be a dead end. Everything here is about getting out of it.

Wi-Fi

  • Rescan works while the board is retrying. The connect loop kept the radio through the whole handshake, so the button was dropped in silence and the list stayed empty — with no rows, no network could be selected and Connect stayed grey. The person at the keyboard now outranks the loop.
  • Saved networks always have a row, whether or not the last sweep saw them, so the one you need to fix is the one you can pick.
  • An empty password box on a saved network keeps the password the board already has instead of erasing it.
  • A password reaches flash only after it carries a connection. A typo leaves nothing behind, and it can no longer overwrite one that works.
  • "Wrong password" now means it. Switching between two networks fails mid-handshake as a matter of course; that is the radio, and the board keeps trying. Only credentials you typed that have never connected get blamed.

Flashing

One file, bootloader and app together:

python3 -m pip install esptool
python3 -m esptool --chip esp32 --port "$PORT" \
    write_flash 0x0 ~/Downloads/tamaclaude-esp32-1.2.1.bin

The Mac app is still built from source — see the README.

tamaclaude v1.2.0

Choose a tag to compare

@thaitop thaitop released this 05 Aug 19:13

Five pages on one screen, and a settings window that knows it.

The screen

  • Every page wears the same top bar — page name, quota, clock, and whether the snapshot came over Bluetooth or Wi-Fi. It never repeats what the page below already shows bigger.
  • A foot on every page, with pips that say which page you are on; the lit pip drains as the rotation clock runs down. The four data pages keep a mini mascot down there too.
  • The page holds after a swipe instead of being yanked away by the rotation, and the round can be switched off entirely.
  • Watchlist pages got a card for the first row: coin and ticker logos, a 24-hour shape on crypto, and today's high/low band on stocks.
  • The weather page is drawn under the sky of that hour, and the mascot's own sky now follows the weather too.

The Mac app

  • The settings window is a sidebar of four panes — Board, Screen, Wi-Fi, Claude — opening on the page list, in the order the board runs it, one switch per row.
  • Watchlists offer the symbols that already have artwork on the board instead of asking you to type one blind.

Flashing

One file, bootloader and app together:

python3 -m pip install esptool
python3 -m esptool --chip esp32 --port "$PORT" \
    write_flash 0x0 ~/Downloads/tamaclaude-esp32-1.2.0.bin

The Mac app is still built from source — see the README.

tamaclaude v1.0.4

Choose a tag to compare

@thaitop thaitop released this 02 Aug 16:35

Bluetooth drops — you walk past the board, the Mac half-sleeps — and until now that left
the screen holding a frame nobody was updating. The board can now join your own network
from the settings window, and when BLE has been quiet for ten seconds the Mac sends the
same snapshot over a sealed TCP connection instead. The board finds nothing on its own and
never talks to claude.ai; your session key stays on the Mac.

Setting it up is in the app: gear ▸ Settings… ▸ Wi-Fi, with the board in Bluetooth range.
The list comes from the board's own scan, so it holds what the board can actually reach —
2.4 GHz only. The snapshot on the wire is AES-256-GCM under a key the app generates and
pushes over the encrypted config characteristic, the same channel as your Wi-Fi password.

The settings window also finally says whether the claude.ai session key went in. The field
is masked and never filled back in, so pressing Save used to change nothing on screen.

Firmware for the ESP32-2432S028R ("Cheap Yellow Display").

tamaclaude-esp32-1.0.4.bin is a merged image — bootloader, partition table and app in
one file. Flashing it needs esptool and nothing else:

PORT=$(ls /dev/cu.usbserial-* | head -1)      # your board's serial port
python3 -m pip install esptool
python3 -m esptool --chip esp32 --port "$PORT" \
    write_flash 0x0 ~/Downloads/tamaclaude-esp32-1.0.4.bin

Built with ESP-IDF v5.5.5, target esp32, 4MB flash, DIO @ 40MHz.

sha256: 28043fc4bee389d64379a54862e2b2357e08ed4c8171037ae7f22640c3236951

The Mac side is still built from source — see the README.

tamaclaude v1.0.3

Choose a tag to compare

@thaitop thaitop released this 31 Jul 09:42

When the board loses the link to the Mac, the screen no longer keeps the last panels it was
given. Stale sessions and a frozen quota bar read as live data from across the desk, which is
worse than showing nothing — so the board now clears down to the clock and the date and waits.

The preview renderer also stopped calling the project by its old name; the screenshots in the
docs were re-rendered from it.

Firmware for the ESP32-2432S028R ("Cheap Yellow Display").

tamaclaude-esp32-1.0.3.bin is a merged image — bootloader, partition table and app in
one file. Flashing it needs esptool and nothing else:

PORT=$(ls /dev/cu.usbserial-* | head -1)      # your board's serial port
python3 -m pip install esptool
python3 -m esptool --chip esp32 --port "$PORT" \
    write_flash 0x0 ~/Downloads/tamaclaude-esp32-1.0.3.bin

Built with ESP-IDF v5.5.5, target esp32, 4MB flash, DIO @ 40MHz.

sha256: 4dcb8528c2461328321bb7d6217a24f1779faf2b37a25329cd8fbd99b510fc4e

The Mac side is still built from source — see the README.

tamaclaude v1.0.2

Choose a tag to compare

@thaitop thaitop released this 31 Jul 09:17

The mascot now puts on glasses while it types, and waiting holds a clock instead of
standing empty-handed — the pose that asks for your answer is the one you see from across
the desk, so it needed a silhouette of its own. The globe was resized to match.

On the Mac side, taking over the statusline slot no longer costs you a statusline: if you
never had one, the app draws a full line itself — directory, branch, model, changed lines,
token count, and both quota bars with a pace mark and a reset countdown. The gear menu item
is now called Read quota from the statusline.

Firmware for the ESP32-2432S028R ("Cheap Yellow Display").

tamaclaude-esp32-1.0.2.bin is a merged image — bootloader, partition table and app in
one file. Flashing it needs esptool and nothing else:

PORT=$(ls /dev/cu.usbserial-* | head -1)      # your board's serial port
python3 -m pip install esptool
python3 -m esptool --chip esp32 --port "$PORT" \
    write_flash 0x0 ~/Downloads/tamaclaude-esp32-1.0.2.bin

Built with ESP-IDF v5.5.5, target esp32, 4MB flash, DIO @ 40MHz.

sha256: 67e646d64553f536d6c49f7b8e9162f9674a7d41427f42475b82cbd7feb82279

The Mac side is still built from source — see the README.

tamaclaude v1.0.1

Choose a tag to compare

@thaitop thaitop released this 30 Jul 16:35

The globe prop (searching) used to dissolve into the daytime sky — its ocean colour sat
within one step of the sky's. It now carries a 2 px steel rim, so the dark edge and the light
fill fail in opposite directions and one of them is always readable, at every hour of the day.

Firmware for the ESP32-2432S028R ("Cheap Yellow Display").

tamaclaude-esp32-1.0.1.bin is a merged image — bootloader, partition table and app in
one file. Flashing it needs esptool and nothing else:

PORT=$(ls /dev/cu.usbserial-* | head -1)      # your board's serial port
python3 -m pip install esptool
python3 -m esptool --chip esp32 --port "$PORT" \
    write_flash 0x0 ~/Downloads/tamaclaude-esp32-1.0.1.bin

Built with ESP-IDF v5.5.5, target esp32, 4MB flash, DIO @ 40MHz.

sha256: 62a307a285c873bf7f8174f04111d58e99274a473b7aea98c13d3b4874fe0a1a

The Mac side is still built from source — see the README.

tamaclaude v1.0.0

Choose a tag to compare

@thaitop thaitop released this 30 Jul 14:31

Firmware for the ESP32-2432S028R ("Cheap Yellow Display").

tamaclaude-esp32-1.0.0.bin is a merged image — bootloader, partition table and app in
one file. Flashing it needs esptool and nothing else:

PORT=$(ls /dev/cu.usbserial-* | head -1)      # your board's serial port
python3 -m pip install esptool
python3 -m esptool --chip esp32 --port "$PORT" \
    write_flash 0x0 ~/Downloads/tamaclaude-esp32-1.0.0.bin

Built with ESP-IDF v5.5.5, target esp32, 4MB flash, DIO @ 40MHz.

sha256: 660fda8b8639c9a52bad45ecf84eaafbf21b02199cfc6677837895a5e2bf1354

The Mac side is still built from source — see the README.