diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5456e57..c5e55ff 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,7 +24,6 @@ Thanks for wanting to help out! Here's how to get involved. - Support for new ESL tag sizes and models - NFC tag support for additional ESL formats - UI/UX improvements -- Android companion app improvements ## Pull Request Guidelines diff --git a/README.md b/README.md index bdfdb77..fe8fe76 100644 --- a/README.md +++ b/README.md @@ -31,14 +31,14 @@ This tool is built for IoT security curiosity, learning about obscure protocols, ## Features -- **TagTinker Flipper App:** High-performance, zero-allocation RLE streaming IR engine. +- **TagTinker Flipper App:** High-performance 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](https://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 open `Targeted Payloads → → Set Image` and 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. +- **Drop-folder image flow:** Drop a prepared BMP into `apps_data/tagtinker/dropped/` on the Flipper SD card, then open `Targeted Payloads → → Set Image` and pick it. The Flipper rescales the 1-bit and two-plane BMPs that the image preparer exports, so one file can be sent to graphics tags of other sizes and to any page. Type 1626 (SmartTAG Color 2.6) targets only accept files up to 24 KB. +- **NFC Tag Scan:** Add a target by scanning the tag's NFC chip instead of typing its barcode. This works when the tag's NFC data carries an ID TagTinker can decode; otherwise use `+ Type Barcode`. +- **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. The dev board firmware talks to the worker named by `CONFIG_TT_CLOUD_URL`, so you can point it at your own deployment of `cloud-plugins/` instead. image -- Display text, custom images, and test-patterns. +- Display text and custom images. - Support for monochrome and accent-color (red/yellow) graphics tags. ## Getting Started @@ -52,7 +52,7 @@ This tool is built for IoT security curiosity, learning about obscure protocols, **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. +This app does. The IR protocol itself is simple enough to drive from other cheap microcontroller hardware, such as an ESP32 and an IR LED, but this repository only contains the Flipper implementation. 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?** diff --git a/cloud-plugins/wrangler.toml b/cloud-plugins/wrangler.toml index 2ca1a64..47d3a38 100644 --- a/cloud-plugins/wrangler.toml +++ b/cloud-plugins/wrangler.toml @@ -3,5 +3,7 @@ main = "src/index.ts" compatibility_date = "2024-09-23" # `npm run deploy` will publish to ..workers.dev. -# Once deployed, point the ESP firmware at the resulting URL via -# the FAP "WiFi Setup -> Server URL" field. +# The dev board firmware has no runtime URL setting. To use your own +# deployment, set CONFIG_TT_CLOUD_URL (idf.py menuconfig, under TagTinker, +# or in esp32-wifi-fw/sdkconfig.defaults), then rebuild and reflash the +# ESP32-S2. diff --git a/esp32-wifi-fw/main/Kconfig.projbuild b/esp32-wifi-fw/main/Kconfig.projbuild new file mode 100644 index 0000000..f803bee --- /dev/null +++ b/esp32-wifi-fw/main/Kconfig.projbuild @@ -0,0 +1,18 @@ +menu "TagTinker" + +config TT_CLOUD_URL + string "Cloud worker base URL" + default "https://tagtinker.jhackerr.workers.dev" + help + Base URL of the Cloudflare Worker that serves /plugins and /render + for the WiFi Plugins feature. + + Point this at your own deployment (see cloud-plugins/) if you would + rather not send plugin parameters to someone else's worker. Set it + with `idf.py menuconfig` under TagTinker, or put + CONFIG_TT_CLOUD_URL="https://your-worker.example.workers.dev" in + sdkconfig.defaults, then rebuild and reflash the board. + + No trailing slash. + +endmenu diff --git a/esp32-wifi-fw/main/cloud_client.h b/esp32-wifi-fw/main/cloud_client.h index 50693b5..973e0f4 100644 --- a/esp32-wifi-fw/main/cloud_client.h +++ b/esp32-wifi-fw/main/cloud_client.h @@ -2,8 +2,11 @@ * Cloud plugin client. * * Talks to the TagTinker Cloudflare Worker that hosts plugin manifests - * and renders. Default URL is hard-coded below; override at runtime by - * calling cloud_client_set_url() (the value is persisted in NVS). + * and renders. The base URL comes from CONFIG_TT_CLOUD_URL, which is set + * with `idf.py menuconfig` under TagTinker or in sdkconfig.defaults, unless + * NVS already holds one. cloud_client_set_url() can store a different URL + * at run time, but nothing calls it yet, so changing worker means + * rebuilding and reflashing. * * GET /plugins -> JSON manifest list * GET /render/?...-> binary framebuffer (see worker docs) @@ -19,8 +22,13 @@ #include #include #include +#include "sdkconfig.h" +#ifdef CONFIG_TT_CLOUD_URL +#define TT_CLOUD_DEFAULT_URL CONFIG_TT_CLOUD_URL +#else #define TT_CLOUD_DEFAULT_URL "https://tagtinker.jhackerr.workers.dev" +#endif /* Persisted base URL (no trailing slash). */ const char* cloud_client_url(void);