InkDeck is a custom E-Ink application OS for two ESP32-S3 readers: the 7.5-inch Book32 and the 3.97-inch Seeed Studio Sticky. It includes an EPUB reader, a Todo app, a Klipper printer monitor, and a local web interface for books, settings, and OTA updates.
| Target | MCU / flash | Display | Input | Ebook storage |
|---|---|---|---|---|
| Book32 | XIAO ESP32-S3, 16 MB | 7.5 inch, 800 x 480 | One button | 10 MB internal LittleFS |
| Seeed Studio Sticky | ESP32-S3, 32 MB | 3.97 inch, 800 x 480 | GT911 touch + three buttons + buzzer | MicroSD, with 23 MB internal fallback |
Original Book32:
- Click: move to the next item or page.
- Long press: select, open, or go back depending on the app.
Seeed Studio Sticky:
- Tap a main-menu icon to open it and tap a library book to start reading.
- Tap the invisible left or right third of a reading page to turn backward or forward.
- Up/down buttons move backward/forward; the power/OK button selects.
| E-Ink Pin | Function | XIAO ESP32-S3 Pin |
|---|---|---|
| VCC | 3.3V | 3V3 |
| GND | Ground | GND |
| DIN | MOSI | GPIO 9 |
| CLK | SCK | GPIO 7 |
| CS | Chip select | GPIO 44 |
| DC | Data/command | GPIO 10 |
| RST | Reset | GPIO 38 |
| BUSY | Busy | GPIO 4 |
Button:
- Signal: GPIO 5
- Other side: GND
Battery sense:
- Voltage ADC: GPIO 1
- Measurement switch: GPIO 6, active high
The Sticky is a complete device and does not need external display wiring. Its board profile uses E-Ink SPI on GPIO 13/14/15/16/17/18 (enable GPIO 47), GT911 touch on GPIO 3/2/21/41 (enable GPIO 42), MicroSD CS on GPIO 8, and its PWM buzzer on GPIO 48. InkDeck uses the buzzer only for main-menu touchscreen taps; the eReader remains silent.
The Sticky build uses DIO flash with octal PSRAM. Do not change its flash mode to QIO: production Sticky hardware can watchdog-reset in the ESP32-S3 ROM before the second-stage bootloader finishes loading. Serial diagnostics use the device's CH343 UART bridge at 115200 baud.
The quickest installation method is the InkDeck Browser Installer. It works in desktop Chrome or Edge with a data-capable USB cable and does not require PlatformIO or a local development environment.
- Updating InkDeck flashes the firmware and web interface while preserving Wi-Fi settings, ebooks, and reading progress.
- Set up new hardware installs the bootloader, hardware-specific partition table, firmware, and web interface.
Choose either the Book32 or Seeed Studio Sticky hardware card before connecting USB.
The installer does not write to the dedicated ebook partition. If ESP Web Tools offers an Erase device option, leave it unchecked on a device that contains ebooks.
The easiest path is Visual Studio Code plus the PlatformIO extension.
- Install Visual Studio Code.
- Install the PlatformIO IDE extension.
- Install Git if it is not already installed.
- Clone this repo:
git clone https://github.com/rolohaun/Book32.git
cd Book32You can also use PlatformIO from the command line:
python -m pip install platformioChoose the matching environment:
# Original 7.5-inch Book32
python -m platformio run -e seeed_xiao_esp32s3 --target upload
# Seeed Studio Sticky
python -m platformio run -e seeed_reterminal_sticky --target uploadThen flash the matching web interface filesystem:
python -m platformio run -e seeed_xiao_esp32s3 --target uploadfs
# or
python -m platformio run -e seeed_reterminal_sticky --target uploadfsThe ebook storage partition is separate. These commands update firmware and the web UI, but they do not erase uploaded ebooks.
On a brand-new board, the firmware creates the internal ebook filesystem on
first boot. Sticky mounts a MicroSD card at /ebooks when present and otherwise
uses its internal fallback partition.
To watch boot logs:
python -m platformio device monitorIf upload fails because the board is not in bootloader mode, hold BOOT, tap RESET, then run the upload command again.
Seeed Studio Sticky:
- Power on the Sticky and tap the Wi-Fi icon.
- Tap a network, enter its password on the touch keyboard, and tap Connect.
- The credentials are saved and the assigned IP address appears on the main menu.
Original Book32:
- Power on Book32 and connect to the
InkDeck-Setupaccess point if WiFi is not configured. - Open
192.168.4.1if the setup portal does not open automatically. - Choose your WiFi network and enter the password.
- After connection, InkDeck shows its IP address on the main menu.
Open http://<INKDECK_IP>/ in a browser to manage books and settings after either
device joins the network.
InkDeck uses the public GitHub release feed:
https://github.com/rolohaun/Book32/releases/latest
No GitHub personal access token is required. Releases should include:
firmware.binlittlefs.binbook32-sticky-firmware.binbook32-sticky-littlefs.bin
The device downloads those public release assets directly when you run an update from the web interface or the device menu.
Build both firmware targets:
python -m platformio run -e seeed_xiao_esp32s3
python -m platformio run -e seeed_reterminal_stickyBuild the web UI filesystem image:
python -m platformio run --target buildfsFlash firmware:
python -m platformio run --target uploadFlash web UI:
python -m platformio run --target uploadfsOpen serial monitor:
python -m platformio device monitor- Polished boot screen with E-Ink progress feedback
- EPUB reader with streamed chapter parsing, Unicode-stable progress, and boot resume
- PSRAM-backed JPEG/PNG illustrations with high-quality monochrome dithering
- EPUB cover thumbnails decoded on demand without writing extracted cover files
- Bounded 16 KB page index for fast backward navigation without unbounded cache growth
- Reader-only idle CPU scaling for improved battery life
- Library menu optimized for E-Ink
- Local web interface for uploading and deleting books
- Todo app
- Klipper printer monitor
- Battery indicator and charging status
- Public GitHub OTA firmware and web UI updates
The EPUB image pipeline is inspired by the MIT-licensed CrossPoint Reader. It scales images before applying Atkinson-style 1-bit dithering, preserving useful detail on the E-Ink panel while keeping temporary working data in PSRAM.
InkDeck uses a hardware-specific custom partition table. Ebook storage is mounted
separately from firmware and the web UI, so normal firmware and uploadfs
updates do not overwrite it. Sticky uses partitions_32MB_sticky.csv; its SD
card and internal fallback share the same /ebooks path.
Fresh hardware setup uses three pieces:
python -m platformio run --target uploadflashes the bootloader, firmware, and the custom partition table.python -m platformio run --target uploadfsflashes the 1 MB LittleFS web UI partition namedspiffs.- The
ebookspartition (10 MB original, 23 MB Sticky fallback) is not flashed by PlatformIO. InkDeck formats it automatically the first time it sees that partition is blank.