tx_bmp_open() accepted 24- and 32-bit BMPs of any width, then each source row was read into uint8_t row_buf[128] on the stack. A 24-bit BMP wider than 42 px, or a 1-bit BMP wider than 1024 px, overran it. The decoder also reads one bit per pixel, so 24/32-bit files were misread anyway. A host build of the previous code under AddressSanitizer reports a 132-byte write into the 128-byte buffer for a 24-bit, 43 px wide file. - Accept only 1bpp and the stacked-plane "2bpp" layout, reject zero or over-16-bit sizes, and reject rows wider than TX_BMP_ROW_BUF_SIZE. - Read header fields as uint32_t. Shifting into bit 31 of an int and negating INT32_MIN were undefined. - The result screen showed "Flipped ;)" and played the success sound even when the send failed or was cancelled. Show "Send failed" with the error sound, or "Stopped" with no sound when cancelled with Back. - Check for a stop request after the gap between frames of a sequence. tagtinker_ir_transmit() clears the stop flag on entry, so a Back pressed during the gap was lost and the next frame went out in full. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
TagTinker V2.1
Infrared ESL Research Toolkit for Flipper Zero
Protocol study • Signal analysis • Digital Art
→ Launch the TagTinker Image Prep web app ←
Overview
TagTinker is a Flipper Zero app for exploring infrared electronic shelf-label (ESL) protocols. It allows you to transmit custom images and text to supported graphics tags. A companion web image preparer runs entirely in the browser and lets you drop, dither and download Flipper-ready BMPs without any install.
As the Flipper Zero team notes:
"FYI: this is pure infrared signal, same that you use in TV remotes. The whole security was relying on obscurity of protocol."
This tool is built for IoT security curiosity, learning about obscure protocols, and displaying digital art on e-ink hardware.
Warning
Hardware Warning: Many infrared ESL tags store their firmware, address, and display data in volatile RAM to save cost and energy. If you remove the battery or let it fully discharge, the tag will lose all programming and become unresponsive ("dead"). It usually cannot be recovered without the original base station.
Features
-
TagTinker Flipper App: High-performance, zero-allocation RLE streaming IR engine.
-
TagTinker Image Prep (web): Single-file, dependency-free HTML page that lists every supported tag profile, runs a full image pipeline (tone, contrast, detail, sharpen, dither, photo-grade Oklab 3-colour quantisation) and exports a Flipper-ready BMP. Hosted at i12bp8.github.io/TagTinker (source:
web-image-prep/). -
Drop-folder image flow: Drop a prepared BMP into
apps_data/tagtinker/dropped/on the Flipper SD card, then openTargeted Payloads → <tag> → Set Imageand pick it. The Flipper rescales any BMP on the fly so a single file can target any tag and any page. -
NFC Tag Scan: Instantly identify ESL targets by scanning their NFC tag — no manual barcode entry needed.
-
WiFi Plugins (optional): Plug a Flipper WiFi Dev Board (ESP32-S2) into the GPIO header to unlock live, network-rendered tag designs — crypto price cards, weather tiles, identicons, and more — auto-discovered by the FAP. New plugins live entirely on the cloud worker; the Flipper firmware never has to be re-flashed to add one.

-
Display text, custom images, and test-patterns.
-
Support for monochrome and accent-color (red/yellow) graphics tags.
Getting Started
- Build the Flipper app from this repository and install it via
ufbt. The first launch createsapps_data/tagtinker/dropped/on your SD card. - Open i12bp8.github.io/TagTinker in any browser, pick your tag profile, drop an image, tweak, and download the BMP.
- Copy the BMP into
apps_data/tagtinker/dropped/on the SD card (overqFlipper, USB MTP, or whatever you use). - On the Flipper open
Targeted Payloads → <your tag> → Set Image, pick the BMP, choose a page, send.
FAQ
Does this require a Flipper Zero?
No, not at all! You can do this with less than $5 worth of microcontroller hardware (like an ESP32 and an IR LED). The Flipper Zero just happens to be my favorite security research tool, which is why I built the app for this platform.
Where is the .fap release?
The Flipper app is source-first. Build the .fap yourself from this repository with ufbt so it matches your firmware and local toolchain.
What if it crashes or behaves oddly?
If you are using a custom firmware branch, custom asset packs, or a heavily modified device setup, start by testing from a clean baseline firmware.
Credits & Background
This project is deeply indebted to the incredible public reverse-engineering work by furrtek. To understand the underlying protocol, signal structure, and history, please read his research:
- Furrtek’s ESL research: https://www.furrtek.org/?a=esl
- PrecIR reference implementation: https://github.com/furrtek/PrecIR
NFC tag decoding contributed by 7h30th3r0n3.
Disclaimer
Caution
STRICTLY PROHIBITED FOR ILLEGAL USE
TagTinker is an independent project intended strictly for educational research, security curiosity, and displaying digital art on hardware that you legally own.
Under no circumstances is this software allowed to be used for illegal activities. You are strictly prohibited from using TagTinker to alter retail displays, modify electronic shelf labels in stores, interfere with third-party infrastructure, or cause any form of vandalism or financial harm.
The creator of TagTinker assumes absolutely no liability for any misuse of this software. By using this software, you agree to take full responsibility for your actions and use it responsibly and legally.
License
Licensed under the GNU General Public License v3.0 (GPL-3.0). See the LICENSE file for details.