Releases: AxelHamburch/ZapBox
ZapBox - v955197 - LNURL-Auth Identity 🔐
🎯 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
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"
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
Satfor 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_TIMEOUTbuild 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
XtoC - 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
✨ 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) —
pinPadStateis 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:443proves 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
🎯 Release v950715 / v950715h / v950715t — PIN Pad for BoltCard & NT3H Stability
✨ Features
- PIN Pad screen for BoltCard
pinLimitwithdraw flow — handlespin_requiredandpin_errorWebSocket 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
invertQrflag 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:
jc3248w535c→Touch3_5 - Bug fix:
showPinPadScreen/pinPadHitTeststubs 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
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
onErrorScreenflag was not cleared during recovery, causing the conditionif (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 toshowQRScreen()(same call, different fallback label only). All call sites have been replaced withshowQRScreen()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
🎯 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
👑 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öst —
initServos()wurde für C3 nicht aufgerufen wenn Multi-Channel-Modusoffwar - LEDC/GPIO-Matrix-Konflikt —
initFlexPin()hat nachservo.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
🖥️ 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
🎯 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
fdto 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-boltcardNFC 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