XTEINK X4
The XTEINK X4 4.26" e-ink reader running FrameOS as a thin client - the backend renders, the ESP32-C3 draws.
Official XTEINK store
Official store page for this device.
Manufacturer docs & datasheets
- Vendor
- XTEINK
- Model
- X4
- Technology
- E-ink
- Colors
- 4-level grayscale
- Resolution
- 800×480 px
- Size
- 4.26″ diagonal
- Interface
- ESP32-C3 board
- Platforms
- ESP32-C3
- Status
- 🟡 Should work
- Buttons
- 1 (usable in scenes)
- FrameOS driver
waveshare.EPD_4in26
Part of the FrameOS device database. Spotted an error, or tested this panel? Edit this page on GitHub - it's a markdown file.
The XTEINK X4 is a small 4.26" four-grayscale e-ink reader on an ESP32-C3 with 16 MB of flash. Reflashed with FrameOS it becomes a pocket-sized frame - and 800×480 on a 4.26" panel is a lot of pixels per inch, so small text stays legible.
The C3 has no PSRAM, so FrameOS runs this board as a thin client: your backend renders the scene and the device streams the packed panel bytes. The backend has to be reachable when the frame renders.
The X4's card slot shares its SPI bus with the e-paper controller, so SD-card assets are turned off on this board.
The C3's ~380 KB of internal RAM is tight: the firmware reserves the 96 KB panel buffer
at boot, before WiFi fragments the heap, and GET /status reports the free heap and largest
block if you want to keep an eye on it. The backend dithers the four-grey bitmap, so gradients
and photos come out smooth rather than banded.
The X4 provisions from the 4 MB no-OTA generic image, so firmware updates go over USB; a 16 MB C3 release asset that would enable OTA is on the list.
Setup
- In the FrameOS backend, create a frame with Flash embedded device.
- Choose ESP32-C3, select the XTEINK X4 preset, and enter your WiFi details.
- Build the firmware and flash it over USB from the browser.
- Install scenes as usual.
Battery
The X4's cell is read through a 2:1 divider on GPIO 0; the preset carries the wiring (from the TRMNL firmware's board table, not yet verified on this reader), so its charge shows in the backend's metrics.
Status
🟡 Boots and renders on real hardware, but not yet widely reported. Tell us on GitHub or Discord if you try it.