Skip to content

Releases: AxelHamburch/ZapBox

ZapBox - v955197 - LNURL-Auth Identity 🔐

24 Jun 16:53

Choose a tag to compare

🎯 Release v955197 / v955197h / v955197t — LNURL-Auth Identity Login

✨ Features

  • LNURL-Auth identity login (LNURL-04): the ZapBox can now display a login QR that authenticates users via their Lightning wallet — no payment required
  • Dual-page mode (Touch 3.5): swappable tabs between Identity login and classic Payment QR on the same screen
  • IDENTITY TRIGGER start screen with "touch to start" hint; QR appears on touch
  • Teach mode: 6-tap gesture on the screen opens a 6-digit PIN pad to protect the identity trigger
  • Dedicated CANCEL button on teach screen; configurable QR label via web installer
  • Red "IDENTITY LOGIN DISABLED" hint when server returns 403

🖥️ Touch 3.5" Version (v955197t)

  • Numeric Product Selection panel for multi-channel mode
  • Live block height on the product selection screen
  • Per-channel servo parameters for multi-channel mode (configurable in web installer)
  • Higher-quality Bitcoin logo in BTC ticker; 6-row landscape layout
  • Reject WebSocket payments addressed to the wrong PIN
  • Sleep wake sources corrected (touch cannot wake device; LED button added)
  • Corner button tap targets fixed for the physical-button edge strip
  • Portrait/landscape layout fix for error box and ACTION TIME

📦 Standard (v955197) + 💡 Headless (v955197h)

  • Installer config-mode fix: config-mode detection lost to mixed CDC chunks — fixed for T-Display-S3 and headless
  • Config wipe on interrupted write prevented
  • I/O-Expander shown in Print Config (T-Display-S3 installer)

🛠️ Technical Details

  • Updated to Bitcoin block height 955197
  • Merged branch feature/lnurlauth

ZapBox - v953430t — Numeric Product Selection

13 Jun 11:05

Choose a tag to compare

Bitcoin-Lightning-controlled switching unit for the JC3248W535C Touch 3.5"
(ESP32-S3, 480×320 QSPI touch display).

⭐ Highlight: Numerical Product Selection

The Touch 3.5" becomes a true vending interface: the customer taps a product
number on the on-screen keypad, and the matching channel's QR code (and amount) is
shown for payment. One device, many products — each mapped to its own channel, no
separate QR codes to pre-print or scan blindly. Works alongside the multi-channel
setup below.

✨ More features

  • Multi-channel mode — up to 6 independent channels. CH01–CH06 (GPIO 5, 6, 7,
    14, 15, 16) are each freely configurable in the web installer as:
    relay · servo 180° · servo 360° · ambient-light (synced with display) ·
    sensor (stop / blockage-monitor / level) · off. Each channel has its own amount
    via the LNbits extension.
  • Per-channel servo parameters (new). Channels set to Servo 180°/360° can now be
    individually parametrised — 180°: start angle, end angle, sweep duration; 360°:
    speed and spin duration. Driven in both single-channel and "One for All" mode.
  • One for All activation. A single payment on CH01 triggers all relay/servo
    channels simultaneously (one QR code).
  • Mini-PoS mode. Enter a fiat/sat amount on the device → generates an invoice →
    pay by QR code or NFC. Handles long BOLT11 invoices with route hints.
  • NFC payments. PN532 Bolt Card / NTAG21x reader, plus NT3H2111 (NFC Tag 2) for
    smartphone-tap LNURLp.
  • Product-selection screen. Live block height (mempool.space) shown at the bottom
    edge, BTC-ticker screensaver, portrait & landscape orientations, themeable colors.

🐛 Fixes

  • Config-mode boot loop on a freshly reset device. A floating GPIO 14 (flex channel
    CH04, no physical button on this board) was misread as a phantom "HELP" button press
    that immediately exited config mode and rebooted in a loop.
  • Installer: config no longer wiped on an interrupted write.
  • Numeric select: WebSocket payments for the wrong pin are now rejected.
  • BTC ticker: connect timeouts and removal of the retry/redraw storm while a fetch
    hangs; bounded SSL handshake.
  • PIN pad: clearer error/timeout messages, fixed button layout, no stray product
    timeout while the pad is active.

ZapBox - v953139t - Mini-PoS Mode for Touch 3.5"

11 Jun 19:17

Choose a tag to compare

The ZapBox Touch 3.5" becomes a small point-of-sale terminal: enter an amount on the touch display, the ZapBox fetches a Lightning invoice from your LNbits server and shows it as a QR code — payable by QR scan, mobile phone NFC tap or Bolt Card.

Requires zapbox_extension v2.3.0+ on the LNbits server.

✨ Features

🧾 Mini-PoS Mode (new ZapBox Mode in the Web Installer)

  • Amount entry screen with touch numpad, decimal point support (configurable: 2 decimal places or whole numbers) and currency display (ISO code or Sat for satoshi)
  • INVOICE button: requests a BOLT11 invoice from the LNbits server via the zapbox_extension (authenticated with the wallet Invoice/read key)
  • Invoice QR screen: label lines 1+2 from the LNbits pin-5 switch entry, line 3 shows the amount (e.g. 23.50 EUR); small CANCEL button bottom-right — only this button aborts
  • Three ways to pay: scan the QR code, tap a phone on the NFC Tag 2 (NT3H2111 carries the invoice), or tap a Bolt Card on the PN532 reader (pays the pending invoice, PIN protection supported)
  • Settlement push over the existing WebSocket: CH01 (GPIO 5) switches with the duration configured for pin 5 in LNbits (fallback 3000 ms), display shows PAID for 3 seconds, then returns to the empty entry screen
  • LAST PAY button: recalls the amount of the last settled payment — shown orange/locked for 5 seconds, then editable and re-usable
  • Invoice timeout: unpaid invoices expire after 3 minutes (INVOICE_TIMEOUT build flag) and the device returns to the entry screen
  • Bolt Card taps are ignored while no invoice is pending

📈 BTC Ticker as Screensaver (Mini-PoS)

  • With BTC-Ticker Mode: ON - always, the ticker acts as a screensaver: one touch opens the amount entry screen, after 30 s of inactivity (PRODUCT_TIMEOUT) the device returns to the ticker

🏷️ Idle NFC Tag

  • While no invoice is pending, the NFC Tag 2 carries https://zapbox.space — a curious phone tap on the idle device opens the project website

⚙️ Activation Options for Mini-PoS

  • The Activation Options (One for All) dropdown is now also available in Mini-PoS mode: a paid invoice additionally triggers the channels CH02–CH06 configured as relay/servo

🔐 PIN Pad Improvements (BoltCard pinLimit)

  • Backspace and clear keys swapped — arrow key now on the right, clear key relabeled from X to C
  • Clean two-line timeout message, attempt counter suppressed on timeout
  • Product timeout no longer fires while the PIN pad is active
  • Submitted flag reset on error-clear, tightened PIN submit timeout
  • Error messages are no longer cut off after 3 lines: the red error box now uses its full height (up to 6 lines landscape, 4 lines portrait — temporarily covering the CANCEL button, which reappears when the error auto-dismisses); overlong messages end with ...

🛠️ Technical Details

  • QR encoder chooses the QR version by content length and charset (the QRCode library performs no bounds checking — long BOLT11 invoices previously caused stack corruption and watchdog resets); BOLT11 is rendered uppercase so QR version 11 holds up to 468 chars (alphanumeric mode)
  • NDEF long-record support for payloads >255 B; NT3H write limit raised to 600 chars; lightning buffer enlarged to 640 B (invoices with route hints exceed 400 chars)
  • loopTask stack raised to 16 KB
  • BTC ticker timeout superscripted
  • BTC ticker hardened against hanging mempool fetches: connect timeouts, SSL handshake bounded to 10 s, no more retry/redraw storm while a fetch hangs, initial data drawn as soon as the first fetch completes
  • Updated to Bitcoin block height 953139

📦 Compatibility

  • Touch 3.5" (JC3248W535C) only — Standard (T-Display-S3), Headless and C3 variants are unchanged in behavior; no new release needed for them
  • LNbits server needs zapbox_extension v2.3.0 for Mini-PoS (older firmware versions keep working with v2.3.0 — the extension is backwards compatible)

📜 Commits since v952864 (1295204)

  • 8407142 Merge branch 'feature/minipos': Mini-PoS mode for Touch 3.5
  • 8caf26a build(touch3.5): update v953139t firmware (PIN error display fixes)
  • a28179d fix(pinpad): show full payment error message on PIN screen
  • 35127b7 fix(btc-ticker): stop retry/redraw storm while a fetch hangs, bound SSL handshake to 10 s
  • f814591 fix(btc-ticker): connect timeouts for mempool fetches, fast retry while no data loaded
  • be2519f fix(btc-ticker): draw initial data as soon as the first fetch completes
  • c605756 Release v953139t: Mini-PoS mode for Touch 3.5 (amount entry, invoice QR/NFC payment)
  • 43abca5 feat(minipos): BTC ticker screensaver, idle NFC tag URL, Activation Options, README
  • 0d70558 fix(minipos): handle long BOLT11 invoices with route hints (QR + NFC tag)
  • 51d25a1 fix(minipos): choose QR version by content length - QRCode lib has no bounds check
  • 66d2791 fix(minipos): raise loopTask stack to 16 KB, hide multi-channel UI in Mini-PoS installer mode
  • d28f210 feat(minipos): add Mini-PoS mode for Touch 3.5 (amount entry -> invoice -> QR/NFC payment)
  • aa70eb8 fix(pinpad): reset submitted flag on error-clear, tighten PIN submit timeout
  • 73ffe15 timeout btc-ticker superscripted
  • 400033d fix(pinpad): show clean two-line timeout message, suppress attempt counter
  • 397a8ee fix(pinpad): change clear key label from X to C
  • fd4a73d fix(pinpad): prevent product timeout from firing while PIN pad is active
  • c68bdd3 fix(pinpad): swap backspace and clear buttons — arrow now on right

ZapBox - v952864 - Router Stability & All Orientations

08 Jun 15:56

Choose a tag to compare

✨ Features

  • Touch 3.5": All 4 display orientations — horizontal (h), horizontal inverted (hi), vertical (v), vertical inverted (vi), each with adapted screen layouts for BTC ticker, QR code, product selection and more
  • Touch 3.5": Portrait BTC ticker — redesigned in T-Display-S3 style with large logo header, 3 label/value pairs, elegantly vertically centered

🛠️ Bug Fixes

  • BTC price persisted on failed fetch — last known value is kept instead of showing "Error" when mempool.space is temporarily unreachable
  • Touch navigation fix (T35)pinPadState is now reset after payment so touch navigation works correctly on the next interaction
  • NFC LNURL prefetch — plain NTAG cards now pre-check the LNURL type to show a clear error instead of a cryptic "502"

🌐 Network & Router Stability

  • CoinGecko replaced by mempool.space — BTC price and block height both fetched from a single server (mempool.space/api/v1/prices). Supported currencies: USD, EUR, GBP, CAD, CHF, AUD, JPY
  • Startup simplified — single TCP probe to lnbitsServer:443 proves both internet access and server reachability; eliminates 6+ redundant HTTP connections at boot
  • 3-second gap before WebSocket — prevents router connection-tracking from dropping the first SSL handshake (saves ~26s on restrictive routers like Fritzbox 7510)
  • WebSocket ping skip — periodic internet checks are skipped when the WebSocket is actively pinged, preventing competing SSL connections
  • Server check retries — up to 3 attempts with 2s delay; single DNS failure no longer causes a full startup timeout
  • BTC price retry — if the first price fetch is dropped by the router, it retries automatically after the block height fetch warms up the connection (fixes "Loading…" staying on the BTC ticker)
  • Startup internet check deferred — first periodic check no longer fires immediately in the first loop iteration, avoiding collision with the initial BTC fetch

🔧 Technical Details

  • Version based on Bitcoin block height: 952864
  • v952864 — Standard (T-Display-S3)
  • v952864h — Headless (ESP32 Dev)
  • v952864t — Touch 3.5" (JC3248W535C)

ZapBox - v950715 - PIN Pad for BoltCard & NT3H Stability

23 May 21:14

Choose a tag to compare

🎯 Release v950715 / v950715h / v950715t — PIN Pad for BoltCard & NT3H Stability

✨ Features

  • PIN Pad screen for BoltCard pinLimit withdraw flow — handles pin_required and pin_error WebSocket events with device-side 210s timeout fallback
  • PIN pending screen after submit; action screen shift on PIN entry
  • Touch input fully wired into main loop for PIN pad session

🖥️ Touch 3.5" Version (v950715t)

  • Full PIN pad touch support for JC3248W535C
  • Multi-channel navigation fix (board-agnostic pin mapping)
  • Restored CH01–CH06 grid layout (3 rows × 2 columns)
  • Show/hide CH02–CH06 based on ZapBox Mode selection in installer
  • Improved display layout and UI (fonts, QR position, screen freeze fix)
  • Help screen disabled (touch-only device, no physical button)
  • NT3H2111: boot hang on missing NT3H fixed; NDEF write at startup corrected

📦 Standard Version (v950715) — T-Display-S3

  • Web installer overhaul: IO-Expander, GPIO channels, theme labels
  • GPIO reassignment and IOExpander sensor cleanup
  • Installer theme options and read-lockout for Restart button
  • invertQr flag in ThemeConfig; non-inverted themes support
  • Missing theme entries in Display.cpp added; installer labels corrected

💡 Headless Version (v950715h)

  • WiFi AUTH_FAIL: retry every 60s instead of hanging permanently
  • Boot hang on missing NT3H and WiFi auth failure prevented
  • NFC: NT3H2111 self-detection in PN532 filtered
  • NFC: NT3H phone read no longer blocked by PN532 RF during card removal wait
  • NFC: window opened for phone (UID=4) when device is not ready
  • WebSocket blocked forever after late WiFi recovery at boot — fixed

🛠️ Technical Details

  • Version: Bitcoin block height 950715
  • PlatformIO env renamed: jc3248w535cTouch3_5
  • Bug fix: showPinPadScreen / pinPadHitTest stubs added to headless build

📁 New Case Designs & E-Layouts

  • b950530-Compact — NFC Tag 2 (case drawing)
  • e950677-Compact — NFC Tag 2 (E-Layout)

⚡ Flash Firmware

Variant Board Installer
v950715 LILYGO T-Display-S3 https://installer.zapbox.space/
v950715h ESP32 Dev (Headless) https://installer.zapbox.space/headless/
v950715t JC3248W535C Touch 3.5" https://installer.zapbox.space/touch3.5/

ZapBox - v949844 - Bug Fixes

17 May 19:07

Choose a tag to compare

Bug Fixes

  • WebSocket reconnect after Internet recovery — After an Internet outage the device would stay stuck on the error screen and never reconnect the WebSocket without a manual restart. Root cause: the onErrorScreen flag was not cleared during recovery, causing the condition if (onErrorScreen && currentErrorType < 4) to permanently block the reconnect loop.

Changes

  • GPIO3 / GPIO34 permanently configured as FD (Field Detection) for NT3H2111 — GPIO3 (T-Display-S3, INPUT_PULLUP) and GPIO34 (Headless ESP32, INPUT) are now always active as the Field Detection input for the NT3H2111 NFC tag. The configurable option in the Web Installer has been removed. When a smartphone approaches the tag, the PN532 is paused for 8 seconds so the tag can be read without interference.

  • Removed showSpecialModeQRScreen() — The function was identical to showQRScreen() (same call, different fallback label only). All call sites have been replaced with showQRScreen() and the function removed from all files.

Web Installer

  • Removed GPIO3 function selection from the T-Display-S3 installer
  • Updated NFC section in T-Display-S3 and Headless installer: added PN532 IRQ pin (GPIO1 / GPIO4) and NT3H2111 FD pin (GPIO3 / GPIO34) with explanation

Electrical Layouts & Housing

  • E-Layout e949674 – Servo (assets/electric/E-Layout-ZapBox-Servo-e949674.svg/png)
    Electrical layout for the Servo variant with NFC Tag 2 module and minor redesign

  • Housing b949639 – Servo (assets/housing/b949639-Servo/)
    3MF print files for the Servo variant with NFC Tag 2 module:

    • Front (35°), Mount, ServoBox, ServoLid
    • NFC-Both, NTAG Spacer
    • Adapter (35°), Double Button, Label Short, Switch Cover
    • Full assembly (b9469634-Servo-all.3mf)

Firmware Downloads

Hardware Version
LilyGo T-Display-S3 v949844
ESP32 Dev (Headless) v949844h
ESP32-C3-21-1 v949844c
JC3248W535C (Touch 3.5") v949844t

ZapBox - v949509 - NFC Tag Bug 🐛🔫 Shooter

15 May 12:10

Choose a tag to compare

🎯 Release v949509 / v949509h / v949509t / v949509c - NFC Tag Bug 🐛🔫 Shooter

✨ Highlights

  • Fixes the NT3H2111 NFC address bug in a robust way.
  • Adds automatic recovery when the tag no longer responds on the default I2C address.
  • Cleanly separates test firmware from production builds to avoid setup/loop linker conflicts.

🛠️ Bug Fixes

  • Prevents accidental overwrite of the I2C address byte when writing block 0.
  • Adds automatic address recovery back to default address during init failures.
  • Build configuration fixed: nt3h_test is now compiled only in the dedicated test environment.
  • esp32dev build configuration restored to stable production settings.

📦 Firmware Variants

  • Standard (T-Display-S3): v949509
  • Headless (ESP32 Dev): v949509h
  • Touch 3.5 (JC3248W535C): v949509t
  • ESP32-C3-21-1: v949509c

🔧 Installer and Manifests

  • Standard installer updated to new version.
  • Headless installer updated to new version.
  • Touch 3.5 installer updated to new version.
  • C3 installer updated to new version.
  • New manifest files and binary packages created for all four variants.

✅ Build Status

  • lilygo-t-display-s3: SUCCESS
  • esp32dev: SUCCESS
  • jc3248w535c: SUCCESS
  • esp32-c3-21-1: SUCCESS

🧱 Technical Details

  • Version updated to Bitcoin block height 949509.
  • Release artifacts generated for all target platforms.
  • Includes merge from dev to main.

🔖 Relevant Commits

  • 6c553b9 Release v949509/v949509h/v949509t/v949509c: NFC Tag Bug 🐛🔫 Shooter
  • eeb84cb merge(dev): integrate nfc recovery fixes and build config updates
  • 7be3c23 fix(build): restore esp32dev environment and keep nt3h test isolated
  • 5307320 merge(nfc): NT3H2111 address recovery and isolated test environment
  • e84cfd4 fix(nfc): NT3H2111 address recovery and protective write guards
  • d4674fd feat(nfc): add NT3H2111 minimal I2C test with automatic address recovery

ZapBox - v949417 - Supreme 👑 ESP32-C3-21-1

14 May 20:49

Choose a tag to compare

👑 Supreme

Tag: v949417c
Target: ESP32-C3-WROOM-02 (esp32-c3-21-1)


✨ Features

  • Flex channel servo support (GPIO6 / GPIO7) — 180° und 360° Modi, parallel zum Relay-Trigger via FreeRTOS (nicht blockierend)
  • GPIO6 / GPIO7 sensor-stop — zieht ein Flex-Pin auf GND → Servo und Relay stoppen sofort
  • GPIO6 / GPIO7 sensor-monitor / sensor-level — überwacht Produktstau oder Füllstand (blockiert Payment bei Trigger)
  • GPIO6 / GPIO7 als zusätzliches Relay — Flex-Kanal schaltet parallel mit GPIO4 einen externen Relay
  • Web-Installer Flex-Konfiguration — neue UI-Sektion im C3-Installer für beide Flex-Kanäle:
    • Modus-Auswahl: Relay / Servo 180° / Servo 360° / Sensor-Stop / Monitor / Level
    • Servo-Parameter: Start-/Endwinkel, Dauer (180°); Geschwindigkeit, Dauer (360°)

🔧 Bug Fixes

  • Servo nie ausgelöstinitServos() wurde für C3 nicht aufgerufen wenn Multi-Channel-Modus off war
  • LEDC/GPIO-Matrix-KonfliktinitFlexPin() hat nach servo.attach() pinMode(OUTPUT) + digitalWrite(LOW) gerufen und damit den LEDC-PWM-Kanal vom GPIO getrennt

🔌 Flash

Web-Installer: https://axelhamburch.github.io/ZapBox/installer/c3/

📦 Assets

File Offset
bootloader.bin 0x0000
partitions.bin 0x8000
firmware.bin 0x10000

ZapBox - v949107t - ZapBox Touch 3.5

12 May 18:32

Choose a tag to compare

🖥️ Release v949107t — ZapBox Touch 3.5" (JC3248W535C)

First stable release for the JC3248W535C touch display board.

⚠️ This firmware is exclusively for the JC3248W535C (480×320 QSPI, ESP32-S3).
Flash via the Touch 3.5" Web Installer.


✨ Features

  • Full display support for JC3248W535C with AXS15231B touch controller (QSPI, 480×320, landscape)
  • Theme system: black-white, zapbox, orange, purple, blue, and more
  • QR code display for LNURL-pay and NFC Bolt Card payments
  • BTC ticker, configurable currency, screen orientation
  • Multi-channel relay/servo support
  • NFC Bolt Card reader (PN532, external I2C)
  • Screensaver: backlight off after configurable idle time, wake on touch

🛠️ Config Mode

  • Enter config mode by tapping the screen 5 times rapidly, then holding the 5th tap for ≥ 2 seconds
  • Prevents accidental config entry during normal operation

🐛 Bug Fixes

  • Screensaver no longer wakes immediately after activation
    (GPIO16 = PIN_NFC_IRQ is permanently LOW on this board — replaced with actual I2C touch polling + 1500 ms cooldown)
  • Config mode entry now reliable via edge-detection counter (no false triggers)
  • Config mode reboot fixed (uses I2C polling instead of broken digitalRead)
  • Web installer connect button fixed
  • Config array indices aligned with firmware positional parser

📦 Web Installer

  • Full configuration UI matching the T-Display-S3 installer
  • Themes, orientation, QR format, BTC ticker, screensaver, deep sleep, multi-channel, threshold payments, NFC
  • Default theme: Black & White

ZapBox - v948616 - NFC Tag 2 & IOExpander

09 May 14:04

Choose a tag to compare

🎯 Release v948616 & v948616h — NFC Tag 2 & IOExpander

✨ Features (Both Versions)

  • NFC Tag 2 / NT3H2111 — Passive NFC chip support: ESP32 writes LNURL via I²C, smartphones tap and pay autonomously without ESP32 involvement. Auto-detected at startup, no configuration needed
  • NT3H2111 FD pin — Optional Field Detection: GPIO 3 (T-Display-S3) or GPIO 34 (headless) can be configured as fd to log phone approach events
  • Both NFC modules (PN532 + NT3H2111) now run independently in parallel — no mode switching

🛠️ Bug Fixes

  • IOExpander channel config was broken in the web installer — a duplicate { brace in the config array (rebase artifact) silently broke all JavaScript, preventing the channel selection from opening when clicking "Yes"
  • Removed residual dead both/both-boltcard NFC mode code (~250 lines, never executed)

📚 Documentation

  • README updated: NT3H2111 section with wiring, flow diagram, wallet compatibility; I²C address table extended; Project Structure updated