Skip to the content
PCBKitNew board
2 layers25 × 67 mmInkDeck, the printed circuit board in 3D

A pocket e-paper e-reader with physical page-turn buttons, weeks of battery life, and books loaded over Wi-Fi.

Size
25 × 67 mm
Copper layers
2
Thickness
1.6 mm
Parts
17
Nets
11
Pads
50
Tracks, vias
0, 0
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
13 Oct 2026
Updated
31 Oct 2026

Overview

InkDeck is an open-source printed circuit board by Yourm5m5, from the Yourm5m5/InkDeck repository on GitHub. It is a 2-layer board of 25 × 67 mm with 17 parts on 11 nets.

It is built around the AO3400. Its parts include 4 switches, 3 resistors, 3 connectors, 1 diode and 1 transistor. It belongs with the lEDs and displays boards of this library.

Main components

1

README

README.md

InkDeck

A pocket e-paper e-reader with physical page-turn buttons, weeks of battery life, and books loaded over Wi-Fi.

What is InkDeck?

InkDeck is a DIY e-reader about the size of a paperback (153 × 72 × 23.5 mm). It has a 4.7" e-paper screen that looks like printed paper, so it's easy on the eyes and readable in sunlight, and it keeps the page on screen even with the power off.

It's built around a LilyGo T5 4.7" E-Paper S3 board (ESP32-S3 + 960 × 540 e-paper + microSD slot), plus a custom grip PCB I designed in KiCad. The grip board sits beside the screen under your right thumb and has:

  • 3 buttons: PREV, NEXT and MENU
  • A coin vibration motor for a little buzz on each page turn
  • A slide power switch between the battery and the LilyGo

It reads EPUB and .txt books from the microSD card, and you can add books from your phone over Wi-Fi without taking the card out. Everything fits in a 3D-printed case I modelled in Fusion 360.


Why I built it

I like reading on e-paper, but most e-readers only work properly with one company's book store, and the cheaper ones only have a touchscreen. I wanted real buttons I can press with one thumb while holding it in one hand, like turning a page.

Building it myself means it reads my own DRM-free books (Project Gutenberg, Standard Ebooks) with no account or store. I can also change anything I want, from how long the buttons are held to how the pages look.

It was also a good way to learn about low-power design, which a phone or laptop never makes you think about:

  • picking pins that can wake the chip from deep sleep
  • dealing with strapping pins
  • making e-paper and a battery work together

Features

  • 4.7" 960 × 540 e-paper with 16 grey levels: easy to read, and the page stays on screen with zero power
  • Reads EPUB (converted once, then opens instantly) and .txt books
  • Physical buttons: tap for the next or previous page, hold to jump a chapter
  • Haptic feedback: a different buzz for page turns, chapter jumps, errors and sleep
  • Deep sleep after 10 minutes, then MENU wakes it on the same page
  • Wi-Fi upload: the reader makes its own hotspot, so a phone can add or delete books
  • Remembers your page in every book
  • Battery % in the footer, and it shows "please charge" and sleeps when nearly flat
  • One-handed grip with the buttons under your thumb

How it works

mermaid
flowchart LR
    subgraph Grip["Grip PCB"]
        BTN["PREV / NEXT / MENU buttons"]
        MOT["Vibration motor via AO3400"]
        SW["Power switch"]
    end
    subgraph LilyGo["LilyGo T5 4.7-inch S3"]
        ESP["ESP32-S3 firmware"]
        EPD["E-paper 960 x 540"]
        SD["microSD card"]
        ADC["Battery ADC IO14"]
    end
    BAT["LiPo battery"]
    PHONE["Phone or laptop"]

    BTN -->|GPIO 10 39 48| ESP
    ESP -->|GPIO 45| MOT
    BAT --> SW --> LilyGo
    BAT -.-> ADC --> ESP
    SD <-->|SPI| ESP
    ESP -->|parallel bus| EPD
    PHONE <-->|Wi-Fi hotspot| ESP

The e-paper, SD card and touch use almost every GPIO on the LilyGo. Only 4 are free, so the grip PCB uses exactly 4 signals through a 6-pin JST-SH cable:

J3 pinSignalLilyGoWhy this pin
1+3.3V3V3
2GNDGND
3BTN_MENUIO10The only free RTC pin, so MENU can wake the chip from deep sleep
4BTN_PREVIO39Internal pull-up
5MOTORIO45Strapping pin, so the PCB has a 10k pull-down to keep it LOW at boot
6BTN_NEXTIO48Internal pull-up

Controls

ButtonWhile readingIn the library
NEXT / PREVNext / previous pageMove down / up
Hold NEXT / PREV (0.7 s)Next / previous chapterMove 5 rows
MENUOpen the libraryOpen the book / vibration on or off
Hold MENU 1 sWi-Fi upload modeWi-Fi upload mode
Hold MENU 3 sSleepSleep
MENU while asleepWake up on the same page

While MENU is held, the motor buzzes at 1 s and again at 3 s, so you can feel which action you'll get before letting go.


Firmware

Written in PlatformIO (Arduino framework) with LilyGo's e-paper library. The full explanation with diagrams and code snippets is in firmware/FIRMWARE.md.

FileWhat it does
config.hEvery pin and setting in one place
buttons.hDebounced buttons: tap, hold and long press
haptic.hVibration patterns
epub.cppTurns an EPUB into plain text
main.cppScreens, page layout, Wi-Fi upload, sleep and the main loop

EPUB reader: an EPUB is a ZIP file full of web pages. The first time a book is opened, the firmware:

  1. reads the ZIP's file list
  2. finds content.opf (title + chapter order)
  3. unzips each chapter with the decoder built into the ESP32-S3's ROM
  4. removes the HTML tags and saves plain text to the SD card

After that the book opens instantly. Every chapter starts on a new page.

Pages: a greedy word-wrap fills each line with words until the next one doesn't fit. Where every page starts is saved on the SD card, so the footer can show Ch 3/27 57 / 312 70% and going back a page is instant.

Deep sleep: the e-paper keeps the page visible with no power, so the reader looks the same asleep. MENU wakes it:

cpp
while (digitalRead(PIN_BTN_MENU) == LOW) delay(10);   // never sleep while MENU is held
esp_sleep_enable_ext0_wakeup(GPIO_NUM_10, 0);         // MENU wakes it up
esp_deep_sleep_start();

Haptics:

BuzzMeaning
1 shortPage turn
2 shortChapter jump
3 quickCan't go further
1 longGoing to sleep

Testing: the parts haven't arrived yet, so the EPUB converter and a simulation of the whole firmware (fake buttons, screen and SD card) are tested on a computer, in firmware/pc_tests.


Custom PCB

Designed in KiCad: a 25 × 67 mm two-layer grip board that sits beside the LilyGo inside the case. Power is on the front layer, button signals on the back, with ground fill on both sides. It passes DRC with 0 errors, 0 unconnected.

  • Power: battery in → slide switch → battery out to the LilyGo's battery socket
  • Buttons: 3 × 6 mm tact switches. MENU has a 10k pull-up so it still works in deep sleep
  • Motor driver: AO3400 MOSFET with a 1N4148 flyback diode and a 10k gate pull-down
  • Connector: 6-pin JST-SH (J3) to the LilyGo GPIOs
Schematic PCB

Enclosure

Modelled in Fusion 360 with user parameters, so it can be updated once the real parts are measured. It's 3 printed parts:

  1. Front shell: screen window, 3 button holes lined up with the grip PCB, standoffs for the PCB, and cut-outs for the power switch, USB-C and microSD
  2. Back cover: holds the battery behind the screen and the motor behind the grip, with a raised ridge so it's comfy to hold
  3. Button caps (×3): plungers that reach the tact switches, with a flange so they can't fall out

The grip is on the right so your thumb reaches the buttons, and USB-C is on the left so the cable doesn't get in the way.

Exploded view

Shows how the screen, grip PCB, battery, motor, printed parts and screws fit together. The parts list, step-by-step assembly and wiring are in CAD/ASSEMBLY.md.

Renders

Enclosure Enclosure Enclosure Enclosure

The screen window, USB-C, microSD and battery sizes are placeholders and will be checked against the real parts before the final print.


Bill of materials

All parts are from AliExpress except the custom PCB, which comes from JLCPCB. Prices are approximate AUD and change with sales, exchange rates and shipping. Many small parts only come in packs, so you'll have spares. Where a listing has several options (value, size, pin count, pack size), pick the one in the Part column.

Electronics

#PartQtyApprox. AUDLink
1LilyGo T5 4.7" E-Paper S3 V2.3 (ESP32-S3, N16R8)1$65.00AliExpress
23.7 V LiPo battery, ~2000 mAh, ~60 × 50 × 6 mm (605060), JST-PH 2.01$12.00AliExpress search (pick 605060 with a PH 2.0 plug)
310 mm coin vibration motor, 3 V (pack of 10)1 pack$5.00AliExpress
46 × 6 mm tact switches (pack of 100)1 pack$3.00AliExpress
5SS12D00 mini slide switch (pack of 20)1 pack$3.00AliExpress
6AO3400 N-channel MOSFET, SOT-23 (pack of 50)1 pack$3.00AliExpress
71N4148 diode (pack of 100)1 pack$2.00AliExpress
810k resistors, 0805 (pack of 100)1 pack$2.00AliExpress
9JST-SH 1.0 mm 6-pin connectors + pre-crimped cable1 set$5.00AliExpress
10JST-PH 2.0 mm 2-pin connectors + pre-crimped cable1 set$4.00AliExpress
11microSD card, 8–32 GB1$8.00AliExpress
12Custom grip PCB, 5 pcs + shipping (JLCPCB)1 order$18.00JLCPCB (upload the Gerbers in PCB/)
Electronics subtotal$130.00

Enclosure

#PartQtyApprox. AUDLink
13PLA or PETG filament (~80 g of a 1 kg roll)1$3.00AliExpress
14M2 brass heat-set inserts (need 8, pack of 50)1 pack$6.00AliExpress
15M2 screw assortment (4× M2×5, 4× M2×8)1 kit$6.00AliExpress
16Thin double-sided foam tape (holds the battery)1 roll$3.00AliExpress
Enclosure subtotal$18.00

Total

AUD
Electronics$130.00
Enclosure$18.00
Estimated total≈ $148.00

Charging is through the LilyGo's own USB-C port, so any phone charger and USB-C cable works.

AliExpress listings change often. If a link stops working, search AliExpress for the exact part name in the table (e.g. "LilyGo T5 4.7 S3", "AO3400").

Repository layout

text
InkDeck/
├── README.md
├── JOURNAL.md               ← build log, day by day
├── PCB/                     ← KiCad project + Gerbers (grip PCB)
├── CAD/
│   ├── ASSEMBLY.md          ← parts list, assembly steps, wiring
│   ├── step/  stl/          ← printable parts + assemblies
│   └── images/              ← exploded view, renders, drawing
└── firmware/
    ├── platformio.ini
    ├── FIRMWARE.md          ← how everything in the code works
    ├── src/                 ← the firmware
    └── pc_tests/            ← EPUB + firmware tests that run on a computer


Acknowledgements

Parts

17
QtyValueFootprintReferences
210KResistor_SMD:R_0805_2012MetricR1, R3
1100Resistor_SMD:R_0805_2012MetricR2
11N4148Diode_SMD:D_SOD-123D1
1AO3400Package_TO_SOT_SMD:SOT-23Q1
1BAT INConnector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalJ1
1BAT OUTConnector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalJ2
1LilyGoConnector_JST:JST_SH_SM06B-SRSS-TB_1x06-1MP_P1.00mm_HorizontalJ3
1MENUButton_Switch_THT:SW_PUSH_6mmSW5
1NEXTButton_Switch_THT:SW_PUSH_6mmSW4
1PREVButton_Switch_THT:SW_PUSH_6mmSW3
1SW_SPDTButton_Switch_SMD:SW_SPDT_PCM12SW1
1Vibration motorConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalM1

The 13 most common of 17 parts.

Questions

How big is the InkDeck PCB?

It measures 25 × 67 mm and has 2 copper layers, 1.6 mm thick.

What parts does the InkDeck use?

17 parts, built around the AO3400. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the InkDeck KiCad files?

From the Yourm5m5/InkDeck repository on GitHub, at the commit this page was made from: the board is PCB/_restore_backup_2026-10-16T16-21-23-037/Inkdeck.kicad_pcb and its schematic PCB/Inkdeck.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the InkDeck design in my own project?

Its repository states no licence, so its author keeps all rights: ask Yourm5m5 before reusing the design.

Similar boards

  • 2 layers55 × 80 mmBoard esp32 v2, the printed circuit board in 3D

    Board esp32 v2

    sudomesh/disaster-radio

    A (paused) work-in-progress long-range, low-bandwidth wireless disaster recovery mesh network powered by the sun.

    101 parts1.1k
  • 2 layers59.2 × 52.9 mmMagic epaper, the printed circuit board in 3D

    Magic epaper

    fossasia/magic-epaper-hardware

    Magic ePaper Hardware

    57 parts1kApache-2.0
  • 2 layers155.5 × 130 mmEinkpicframe, the printed circuit board in 3D

    Einkpicframe

    Spritetm/picframe_colepd

    A WiFi picture frame allowing for remote photo uploads, using an ESP32-C3 and a 5.6" color E-ink display

    60 parts97
  • 2 layers100 × 93 mmSpeeduino base, the printed circuit board in 3D

    Speeduino base

    Tjeerdie/SPECTRE

    Speeduino compatible engine control unit (ECU) based around black STM32F407VET6 board.

    213 parts59GPL-3.0
  • 2 layers128 × 77 mmScale, the printed circuit board in 3D

    Scale

    Jana-Marie/lab-balance

    https://twitter.com/_Jana_Marie/status/1270040286710968321

    59 parts34
  • 2 layers36 × 100 mmEleph, the printed circuit board in 3D

    Eleph

    FeruzTopalov/eleph

    GPS-based local relative navigation system for group of up to 6 members

    56 parts24GPL-3.0
  • 2 layers55.5 × 33 mmCode, the printed circuit board in 3D

    Code

    evyd13/wasdat

    Controller for WASD V2/CODE

    29 parts16CC-BY-SA-4.0
  • 2 layers50 × 100 mmSpoke, the printed circuit board in 3D

    Spoke

    FeruzTopalov/spoke

    Standalone LoRa-based real-time off-grid relative GPS navigation for group of up to 5 people. Improved version of LRNS Eleph

    143 parts16GPL-3.0