Preview build

Open-source firmware · Xteink X3 + X4

Technical books deserve better firmware.

Tables stay structured. Formulas stay legible. Books open before they finish decoding.

Target
ESP32-C3
Memory
256 KB heap
Panel
792 × 528
Engine
Async + cached
DEVICE PROFILEXTEINK_X3 / REV.01
Xteink X3 technical drawing Front elevation with screen, buttons, dimensions, and construction lines. 01 02 01 / E-INKACTIVE PANEL 02 / IMAGEFOUR TONES
FR-X3-792
Try before flashing

01 / TRY BEFORE FLASHING

Try the reader before you install it.

The emulator runs the same deterministic application state machine as the firmware, compiled to WebAssembly and running entirely in your browser. Browse a library of public-domain technical books, open one, and work the controls without touching your X3 or X4.

Your file stays in this browser tab. Nothing is uploaded.

ferrisreader.com / emulator / x3
Power (P) Previous page (Arrow Up) Next page (Arrow Down) Back (Backspace / Esc) OK / Confirm (Enter) Previous page (Arrow Left) Next page (Arrow Right)
Ferris Reader emulator showing an illustrated EPUB cover
ACTIVITY offREFRESH DEVICE xteink x3 · 528 × 792

02 / THE READING ENGINE

Built for the pages that break other firmware.

Ferris Reader treats technical material as first-class content—not an edge case.

03 / READER CAPABILITIES

Technical books are the baseline.

Concrete support for structure, code, tables, figures, navigation, large-book resume, and constrained-device reliability.

FORMATS / 01

EPUB, Markdown, and plain text

Reflowable EPUB 2 and EPUB 3 books share the reader with UTF-8 text and bounded Markdown rendering for headings, emphasis, lists, quotes, rules, and fenced or indented code.

  • EPUB 2 + EPUB 3
  • Markdown
  • Plain text
PACKAGE / 02

Package semantics, not filename guesses

Ferris follows the EPUB container, OPF manifest, and spine; validates present mimetype markers, omits non-linear reading-order items, and follows bounded fallbacks to readable documents or supported images.

STRUCTURE / 03

Semantic technical pages

Heading hierarchy, paragraphs and line breaks, horizontal rules, nested numbered and bulleted lists, indented nested blockquotes, and fresh-page chapter starts.

  • Reflowable layout
  • Structured cache
  • Stable positions
TABLES / 04

Tables built for narrow screens

Centered bordered grids with captions, bold headers, colspan, wrapped cells, multi-page rows, and a stacked fallback for wide tables. Nested tables keep their text.

CODE / 05

Code remains code

Preformatted blocks preserve indentation and line breaks, wrap safely, and use a built-in monospace face. Inline code stays distinct inside prose.

FIGURES / 06

Equations, figures, and inline images

Image-based equations and diagrams render in four tones from sequential or progressive JPEG, PNG including Adam7, first-frame GIF, and base64 data images, with bounded alt-text fallback.

TYPE / 07

Technical text and emphasis

UTF-8 text, Latin accents, General Punctuation, Greek, character entities, and true bold, italic, and bold-italic from semantic markup or CSS emphasis.

NAVIGATION / 08

Nested contents and exact targets

EPUB 3 navigation documents and EPUB 2 NCX with nested drill-down, breadcrumbs, page jumps, current-chapter feedback, and TOC entries that land on exact EPUB fragments.

POSITION / 09

Reading position survives reflow

Content-based positions remain meaningful when font size moves page boundaries. Per-book progress, page-history Back, whole-book page mapping, and exact page resume use the same model.

OPEN / 10

Resume-first loading

The saved section becomes readable first. Nearby pages and the remaining book decode afterward in bounded background slices; completed caches reopen immediately.

MEMORY / 11

Bounded on difficult books

ZIP, XHTML, CSS, tables, and images stream through fixed-size work. Long chapters, giant cells, large images, malformed content, and allocation failures take bounded or fallible paths.

ROBUSTNESS / 12

Tested from parser to glass

An ever-growing suite covers parsers, codecs, pagination, memory pressure, deterministic emulator flows, and rendered-pixel snapshots. X3 and X4 hardware checks, TTFR benchmarks, and profiling verify the same application core on actual devices.

  • Emulator tests
  • Snapshot testing
  • X3 + X4 hardware
  • TTFR benchmarks

04 / ASYNC DECODE PIPELINE

Start reading now.
The rest catches up.

Work is split into bounded slices. The foreground stays responsive while Ferris builds a reusable SD-card cache behind it.

ONE CORE / ASYNC PIPELINEReadable first. Then decoding keeps advancing behind the page.FOREGROUND ALWAYS GOES FIRST
01OPEN BURSTforeground priority
OPENRead package RESUMESection 21 text TTFRReadable page FOREGROUNDYou start reading
PAGE PRESENTED↓ BACKGROUND LOOP STARTS HERE ↓YIELDS ON INPUT
02 → ∞BACKGROUND LOOPkeeps advancing
05 194204 212IMAGES 223233243↑ INPUT / YIELD253263 END5
  1. 1 Saved section text → readable
  2. 2 Saved-page images
  3. 3 ~5 pages forward
  4. 4 ~2 pages back
  5. 5 Remaining book → SD cache

YOU KEEP READING WHILE THE LOOP ADVANCES. Input pauses the current slice, gets the foreground, then background decoding resumes where it stopped.

05 / PROJECT STATUS

What ships, and what’s next.

SHIPPED / 01

Xteink X3 + X4

Both Xteink X3 and X4 are fully supported. One firmware image detects the attached hardware at boot.

WIP / 02

Wi-Fi + Calibre

Wireless library syncing through a companion Calibre plugin is under development.

06 / WEB FLASHER

From browser to book
in one cable.

Connect an unlocked Xteink X3 or X4 over USB-C. The installer verifies compatibility before it writes anything.

Safety
first
USB-locked units are refused. On supported readers, the current firmware stays in its recovery slot until the new image passes an on-device checksum.
CrossPoint
compatible
Ferris Reader uses the same X3/X4 partition layout as CrossPoint, and this flasher leaves the SD card untouched. You can switch between firmwares without erasing books or either firmware’s saved progress.
FERRIS FLASH / RUST + WEB SERIALSECURE STATE: CHECKING
01Browser checkLoading the Rust installerWAIT
02Inspect X3 / X4USB-C data cable · unlocked readerWAITING
03Verify + installUnavailable until the read-only check passesLOCKED

Checking browser support. No device access is requested automatically.