Governed community feed
Shows approved featured, upcoming, and Community content from GFAVIP. Cards include a section, type, title, summary, and timing label.
GFAVIP Community Display
The current ESP32 pilot turns approved GFAVIP announcements, featured content, and upcoming items into a touch-friendly desk display. It pairs as its own restricted device, manages Wi-Fi locally, validates HTTPS, and keeps useful content visible when the network disappears.
GFAVIP content today. CasaNode signals next.
ESP32-2432S028 · 2.8-inch resistive touch
Available today
This is running firmware, not a concept mockup. The behaviors below were built and exercised on physical devices. Anything planned for Raspberry Pi is marked separately.
Shows approved featured, upcoming, and Community content from GFAVIP. Cards include a section, type, title, summary, and timing label.
Previous and Next move through as many as 12 cards. Details opens a bounded, scrollable description with explicit Close and X controls.
Refreshes every 60 seconds, retries failures every 15 seconds, reconnects Wi-Fi, and keeps the last validated feed available offline.
A local, temporary setup network lets an operator scan or enter a 2.4 GHz network. New credentials are tested before the known-good profile is replaced.
Current live path
Administrators publish content for the display surface. The service applies audience and publication rules before the device receives anything. The display cannot see an administrator session, member token, Wallet credential, payment credential, or private key.
Connection and identity
Settings starts a temporary WPA2 network named GFAVIP-Setup-XXXX. A random one-time code appears only on the TFT. The phone opens http://192.168.4.1 to scan, select, or manually enter a 2.4 GHz SSID.
The candidate network runs from RAM first. Only a successful connection replaces the previous profile with one checksummed NVS record. Failure, Cancel, or the ten-minute timeout preserves the known-good network.
The device requests a short-lived code. A GFAVIP administrator approves it in Display Fleet, and the device redeems the claim for its own individually revocable gfd_ bearer credential.
Requests use the ISRG Root X1 trust anchor with certificate and hostname verification enabled. There is no insecure TLS fallback.
Software and architecture
The build targets a generic ESP32 board and pins all important toolchain and library versions for reproducibility.
Arduino CLI 1.5.1 with Espressif Arduino-ESP32 3.3.0. The pilot is not an ESP-IDF or PlatformIO project, although it uses selected ESP-IDF Wi-Fi functions through Arduino.
community_feed.inoRendering, touch input, feed parsing, HTTPS polling, cache states, diagnostics, Wi-Fi recovery, and the temporary setup portal.
display_pairing.inoCreates and polls the one-time claim, validates the returned restricted credential, and stores it without logging it.
Separate serial, TFT, touch, calibration, and HTTPS probes keep risky assumptions out of the production sketch.
The partition table has two application slots, but signed download, authenticated OTA, rollback policy, and remote firmware management are not implemented.
Each 1,310,720-byte application slot leaves about 121 KB—or 9.2%—of conservative firmware headroom.
Current network contract
/api/display/pairings Creates a short-lived display pairing request and one-time claim.
/api/display/pairings/status Polls the claim until an administrator pairs the device or the claim expires.
/api/display/feed Returns the governed, audience-filtered display feed for the paired device.
/api/display/check-in Reports minimized operational metadata after a successful refresh.
Base URL: https://webchat.gfavip.com. Feed responses are capped at 32 KB, parsed into at most 12 bounded cards, and cached only after successful validation.
Hardware reference
These values describe the yellow dual-USB ESP32-2432S028 units used in the pilot. Production batches must be verified rather than assumed identical.
The microSD slot, speaker path, and LDR are inventoried but not accepted as working product features.
Known limits
Hotel captive portals, enterprise authentication, unsupported channels, and some setup-AP clients remain problematic. Manual SSID entry cannot solve an incompatible radio or authentication mode.
A physical attacker could extract NVS on this development board. The display token is deliberately restricted and revocable, but a production revision needs secure provisioning and flash encryption.
The accepted affine calibration works on the tested unit. A manufacturing batch needs controlled sampling or per-device calibration.
Deliberate factory reset, complete revocation/replacement, ten-minute setup timeout, and all publish/update/expiry transitions still need full physical acceptance.
The current binary consumes about 90.8% of an application slot. New device-side features must stay small and be remeasured for both flash and runtime heap.
Attendee distribution needs a controlled BOM, enclosure and strain relief, certified power guidance, thermal/ESD tests, signed updates, support, and decommissioning.
Proposed integration · not implemented
The ESP32 and Pi can communicate over the same local 2.4 GHz network, but they do not talk to each other today. The cleanest first slice is a read-only status path—not a general remote shell and not a second large application on the ESP32.
CasaNode exposes a versioned, bounded JSON document on the LAN. The ESP32 polls it every 10–30 seconds, renders a compact node card, and falls back to the normal GFAVIP feed if the Pi is absent.
/api/casanode/display/v1/statusA future approved server integration can convert Pi status into governed display content. The ESP32 keeps using /api/display/feed, while GFAVIP remains the remote authority and audit surface.
Suggested phase-one schema
Start with status only: identity label, health state, one headline, one detail line, and an update time. Add metrics only after measuring memory and screen value.
{
"schema": "casanode.display.v1",
"node": "home-node",
"state": "healthy",
"headline": "CasaNode is online",
"detail": "Backups complete · 3 services active",
"updatedAt": "2026-07-31T09:30:00Z"
} The touchscreen could eventually trigger explicit actions such as “run backup” or “restart one service,” but only through allowlisted action IDs, confirmation UI, replay protection, timeouts, and a dedicated local credential. Arbitrary commands, SSH keys, and Pi administrator tokens should never live on the display.
Evidence and handoff
Landscape color, touch calibration, buttons, and scrolling details were confirmed on physical hardware.
Saved Wi-Fi, trusted time, certificate and hostname validation, and an HTTPS 200 response were confirmed.
Two devices received separate restricted credentials and rendered governed public content.
Ten consecutive power cycles passed; an eight-hour run reached refresh R514 with zero recorded failures.
Suitable for a supervised pilot—not yet a finished gift or unattended consumer appliance.
Signed OTA, destructive reset, flash encryption, production calibration, and complete revocation testing remain open.
Source of truth
The implementation lives inside the private GFAVIP Chat repository. Authorized collaborators should start with the README, then use the hardware, build, security/recovery, and acceptance documents for measured detail.
firmware/gfavip-esp32-tft-pilot/ ├── README.md ├── HARDWARE.md ├── BUILD.md ├── SECURITY-RECOVERY.md ├── ACCEPTANCE.md ├── community_feed/community_feed.ino ├── display_pairing/display_pairing.ino └── host_tests/ Design principle
The ESP32 should remain a bounded screen and touch surface. CasaNode should own local services, richer state, policy, and execution. GFAVIP should continue to own remote identity, governance, and fleet visibility.