A tag whose type code is not in the profile table has no dimensions, so
after the unknown-profile guard its Set Text / Set Image / WiFi Plugins
actions are hidden. This adds a "Set Custom Size" action for those tags:
enter width, height and colour, and the graphics actions become usable.
The IR framing is identical to a table profile; only the screen geometry
differs, so no protocol is guessed. Custom size is applied only when the
barcode's type is not in the table, so a real profile is never overridden.
- New scene (VariableItemList): Width and Height in 8 px steps from 8 to
800, Colour mono/red/yellow, and Save.
- tagtinker_target_refresh_profile() synthesizes a "Custom" profile from
the stored size for unknown-type targets, so Show Tag Info, Set Text
and Set Image all see real dimensions.
- targets.txt gains three optional fields (barcode|name|cw|ch|ccolor);
older two-field lines still load, with no custom size.
- "Set Custom Size" appears in Target Actions only for unknown-type
targets (tagtinker_type_is_known()).
Builds clean on release SDK 1.4.3 (API 87.1) and dev SDK; no new
clang-format drift.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Worker (cloud-plugins/):
- New plugin 'GitHub Profile': avatar dithered upper-left, display
name + @handle (with accent star) + word-wrapped bio in the right
column, followers/repos line, and a 53x7 contribution heatmap
with an accent palette (red dots for everyday activity, black for
the rare hottest days). Tuned for 208x112 ESLs and adapts to
296x128 with a bigger avatar and roomier heatmap.
- Identicon plugin gains DiceBear style selector (pixel-art /
bottts / lorelei / adventurer / micah / fun-emoji / shapes) on
top of the original symmetric grid 'local' mode. Both are
rendered through the new shared image_util pipeline.
- Crypto plugin redesigned: editorial layout with corner brackets,
bold price headline, white-knockout delta badge with a real
triangle glyph, currency symbol prefix using the canvas font's
new euro / pound / yen glyphs, and a stippled accent fill under
the sparkline.
Canvas:
- setPixel is now last-write-wins across planes, so drawing black
on top of an accent-filled area produces a clean black pixel
instead of the muddy plane-conflict the e-paper driver was
showing previously. Every pixel is therefore exactly one of
white / black / accent which is what plugin authors intuit.
- New whitePixel + drawTextWhite primitives for knockout text
(e.g. white labels punched through a coloured badge).
- FONT_EXTRA shipped with the canvas for currency / arrow / shape
/ star / bracket glyphs. Plugins can now write '\u20AC1234' and
have the euro symbol Just Work.
Image pipeline (new image_util.ts):
- One fetchImageGray() that sniffs PNG vs JPEG, decodes via
upng-js / jpeg-js, composites alpha over white, and returns a
tightly-packed grayscale buffer.
- One blitGrayDither() that nearest-neighbour scales the gray
buffer to a destination rect and serpentine Floyd-Steinberg
dithers it on the way in. Used by identicon and github.
FAP:
- WiFi BMP writer is now plane-aware: writes the same biPlanes=1,
biBitCount=2, 3-entry palette layout the rest of the IR TX
pipeline already understood for web-image-prep BMPs. Tri-colour
tags now actually receive accent ink from cloud-rendered plugins.
- WiFi run scene un-forces accent: plugins are invoked with the
tag's actual accent capability and the BMP is opened with the
matching plane count.
- Run scene now calls bmp_abort on exit so an aborted transfer
doesn't leak the ~10 KB pixel buffer.
- Plugin manifest cache capped at TT_WIFI_MAX_FAP_PLUGINS=8 (down
from 16) and the UART RX stream buffer shrunk to 8 KB. Together
these cut WiFi-flow heap pressure by ~23 KB and fix the OOM
crashes that occasionally happened when opening WiFi Plugins.
- Broadcast scene auto-transmit fix: enter_callback now filters
by the >> Transmit << row index, and the cursor defaults to
row 0 instead of Transmit. Previously a stale OK key-release
from the prior submenu would land on the Transmit row and
blast the radio without any user action.
- Flipper FAP: WiFi Setup, Plugins picker, plugin-run scene wired into
Targeted Payloads -> <tag> -> WiFi Plugins
- Framed UART link to the dev board with bulk-read RX path and 16 KB
stream buffer to keep up with full plugin bursts
- ESP firmware: 900 KB UART<->HTTPS bridge, USB-Serial-JTAG console,
cert-bundle TLS, 16 KB worker stack to host mbedTLS handshake
- Cloudflare Worker: Crypto, Weather, Identicon plugins out of the
box; new plugins are a single TypeScript file, no Flipper reflash
- Shared protocol header + 1bpp BMP writer that matches web-image-prep
palette/stride conventions
- Add web-image-prep/: self-contained HTML5 image preparer with
perceptual Oklab 3-colour quantisation, Floyd-Steinberg/Atkinson/
Bayer dither, all supported tag profiles, BMPs that match the FAP
reader exactly. Auto-deployed to GitHub Pages.
- Add 'Set Image' under Targeted Payloads. Lists every BMP in
apps_data/tagtinker/dropped/, scrolls long names, marks foreign-
resolution files with a '~' prefix.
- Stream-time nearest-neighbour rescaling so any BMP can target any
tag at any page; image options screen is now Page-only.
- Remove Phone Sync menu and the Android companion app: replaced by
the browser preparer + drop folder.
- Static, IR-friendly transmit screen ('Tinkering Tag', point hint,
3-dot loader, 'Flipped ;)').
Add "+ Scan NFC" option in the Targeted Payloads menu.
Scans Mifare Ultralight NDEF tags, decodes the encoded
ESL ID, and auto-creates the target — no manual barcode
entry needed. Cyan LED blinks during scan. Loops until
a tag is found or the user presses Back.
New files:
- nfc/tagtinker_nfc.c/.h — NDEF URI decoder module
- scenes/tagtinker_scene_nfc_scan.c — NFC scan scene
Version bumped to 2.1, NFC credit added to About screen.