ESP32-S3 supported target
The Waveshare ESP32-S3-Touch-LCD-4.3 is PocketPi's second supported physical target. It runs the same resident Pi Agent, ordinary App packages, AppSupervisor, Actions and View source as the ESP32-P4 reference target through a shared ESP-IDF host layer.
Exact board composition
| Area | Current PocketPi target |
|---|---|
| Board | Waveshare ESP32-S3-Touch-LCD-4.3 |
| Module | ESP32-S3-WROOM-1-N16R8 |
| Processor | dual-core Xtensa LX7 up to 240 MHz, 512 KB SRAM and 384 KB ROM |
| Memory configuration | 16 MB DIO Flash, 8 MB octal PSRAM at 80 MHz |
| Display | 4.3-inch 800×480 IPS RGB panel, RGB565, two PSRAM framebuffers |
| Touch | GT911 capacitive 5-point touch over I2C |
| Wireless | integrated 2.4 GHz 802.11 b/g/n Wi-Fi and BLE 5 |
Board-level parameters are also documented in the official Waveshare ESP32-S3-Touch-LCD-4.3 guide. PocketPi-specific flash mode, PSRAM speed, framebuffer and viewport values come from the checked-in S3 firmware host.
One physical panel, one rotated logical viewport
The RGB panel scans out at 800×480. PocketPi rotates rendered regions into that framebuffer and maps touch through the inverse transform, then reports Viewport(480, 800) to AppSupervisor. Every View therefore sees one consistent logical coordinate system.
View.viewport
// {
// width: 480,
// height: 800,
// orientation: "portrait",
// scale: 0.625,
// layoutWidth: 768,
// layoutHeight: 1280
// }The shared View SDK scales numeric geometry once, preserves fixed physical font slots and enforces at least 40×40 physical pixels for Pressable hit targets. Apps may branch onorientation and reduce repeated content when scale is below one; they do not receive a board name and must not contain S3-only layout code.
Install host tools and find the serial port
Install Rust with rustup, the ESP Rust toolchain andespflash. The repository invokes the S3 firmware through its declared esp toolchain. The current Python UART helpers use POSIX serial APIs; macOS is the documented host path.
espflash list-ports
export DEVICE_PORT=/dev/cu.usbmodem...
espflash board-info --port "$DEVICE_PORT"Build the release firmware
cargo xtask build esp32-s3This builds the S3 release firmware with the committed generated Pi Agent and View SDK assets. Regenerate those assets separately only when changing their sources.
Flash without erasing persistent state
espflash flash --baud 921600 --port "$DEVICE_PORT" \
--partition-table firmware/esp32-s3/partitions.csv \
firmware/esp32-s3/target/xtensa-esp32s3-espidf/release/pocket-pi-s3Keep the explicit partition table. A normal flash preserves Wi-Fi/model NVS and the LittleFS workspace. Do not erase the board unless the validation plan explicitly requires destructive reprovisioning.
Provision and install
python3 tools/uart-provision.py "$DEVICE_PORT" \
--provider deepseek --provision-wifi
cargo xtask package app exa path/to/exa-credentials.json
python3 tools/uart-install.py "$DEVICE_PORT" \
target/pocketapps/exa.pocketappProvisioning, HTTP/UART ingress, product review and activation use the same contracts as P4. The board-specific host owns integrated Wi-Fi, RGB scanout, rotation and GT911 touch only.
Recorded physical evidence
The 2026-08-24 repository record covers boot, 480×800 logical scanout, GT911 touch, integrated Wi-Fi, workspace Tool Calls, ordinary App installation and an Exa request on the physical S3. Long-running latency, display stability and memory-pressure acceptance remain separate work and are not implied by one successful interaction.
A simulator run or successful S3 release build is below physical-board acceptance. Record boot, scanout, touch, network, Tool and App results separately.
Shared port contract and S3 details: docs/esp32-p4-port.md ↗.