CrossPoint Reader firmware: flashing an ESP32 e-reader with esptool or the web installer
Open-source e-reader firmware
At a glance
- What is it?
- CrossPoint Reader is MIT-licensed firmware for ESP32-based e-ink devices, covering EPUB rendering, Calibre and OPDS workflows, and SD-card fonts. Here is how it installs, what the unlocker changes, and where the project stops being the right choice.
- Who is it for?
- Adopt CrossPoint Reader if you own one of the listed ESP32 e-ink devices and want an MIT-licensed firmware you can rebuild from source, with Calibre wireless transfer, OPDS browsing, and SD-card fonts. Do not adopt it as a generic e-reader OS: the README names only ESP32C3 and ESP32S3 targets, and a USB-locked Xteink unit needs the unlocker before anything flashes.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly C, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- crosspoint-reader/crosspoint-reader8,779 ★ · +775
| Repository | 2026-09-22 | 2026-11-14 |
|---|---|---|
| crosspoint-reader/crosspoint-reader | 8k | 8.8k |
775 Stars in the last 53 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
What CrossPoint Reader replaces, and for whom
Stock e-reader firmware decides which formats you can open, which fonts you can install, and whether your library can leave the vendor's cloud. CrossPoint Reader is an attempt to move those decisions onto the device owner. The README describes it as "open-source e-reader firmware - community-built, fully hackable, free forever", and the repository is MIT-licensed, so the constraint is hardware rather than licence.
The audience is narrow and specific. The README lists ESP32C3-based Xteink X4 and X3, plus ESP32S3-based Xteink X4Pro and X4Classic, Seeed reTerminal Sticky, M5PaperMono, Metalio E-Ink 4, EEGOREAD A4 and Boox Picco. If your device is not on that list, this firmware is not for you, and the Devices page is the place the project says to check for the full list. The second audience is developers: the tree contains platformio.ini, src/, lib/, test/, a freeink-sdk submodule, and a docs/ directory, so building new screens is an intended use, not an afterthought.
How the reader engine and the wireless stack fit together
Two halves matter. The reading half renders EPUB 2 and 3 with an embedded-style option, and the README also claims image handling, hyphenation, kerning, adaptive table layouts, native CJK ruby annotations, chapter navigation, footnotes, bookmarks, StarDict dictionary lookups, go-to-percent, auto page turn, orientation control, focus reading, and KOReader progress sync. Beyond EPUB, the firmware handles .xtc/.xtch, .txt, and .bmp natively. Custom fonts are loaded from the SD card rather than compiled in, which is why a font change does not require a reflash.
The workflow half is a set of network services on the device: a file transfer web UI, an EPUB Optimizer, a web settings UI and API, WebSocket fast uploads, a WebDAV handler, AP mode and STA mode with QR helpers, a Calibre wireless connect flow, and an OPDS browser with up to eight saved servers, search, pagination, and direct download. OTA update checks and installs pull from GitHub releases. The practical consequence is that the device is a small HTTP server as much as it is a reader.
Installing CrossPoint Reader with the web flasher or esptool
The recommended path is the web installer. Connect the device over USB-C, wake or unlock it, then go to the flash tools page, pick your device from the list (X3, X4, Xteink X4Pro, Seeed reTerminal Sticky, or M5PaperMono), and choose an official CrossPoint release. To install a specific build, download the firmware file for your device from the releases page and use the Custom .bin option instead. Nothing is compiled locally on this path.
The command line path needs esptool and a firmware file from the releases page:
pip install esptoolAfter connecting the device over USB-C, find the port. On Linux the README suggests running dmesg after connecting; on macOS it gives this command:
log stream --predicate 'subsystem == "com.apple.iokit"' --infoThen flash according to the chip. For an X3 or X4:
esptool.py --chip esp32c3 --port /dev/ttyACM0 --baud 921600 write_flash 0x10000 /path/to/firmware.binFor an Xteink X4Pro, Seeed reTerminal Sticky, or M5PaperMono:
esptool.py --chip esp32s3 --port /dev/ttyACM0 --baud 921600 write_flash 0x10000 /path/to/firmware.binNote the offset: 0x10000, not the usual 0x0. Reverting works the same way in reverse. The README says you can flash the latest official firmware from the same flash tools page to go back. For custom fonts, on devices with external RAM enabled in CrossPoint, you copy .ttf, .otf or .ttc files to the SD card, one file in /fonts/ or /.fonts/ or one family's files in a subfolder, and select them as reader fonts; docs/sd-card-fonts.md covers the folder layout.
The unlocker is the part that can end badly
Some Xteink units bought from third-party stores ship with USB flashing locked. The README is explicit that units bought directly from xteink.com are not locked and do not need the Xteink Unlocker, and it tells you to test the web flasher first: if the browser's serial device picker does not show the device, try another USB port or browser before assuming it is locked.
The warning attached to the unlocker is the strongest statement in the README. Only CrossPoint and CrossInk are officially supported in the unlock tool. Flashing anything else on a USB-locked device "may permanently brick the device" or leave it permanently stuck on that firmware with no recovery path, because once USB flashing is re-locked the only route back is OTA, and a firmware without OTA support leaves no way out. That is a genuine failure mode with no software fix, and it is the single reason to read the README end to end before touching a cheap imported unit.
What the documentation does not promise
The README lists more themes under "Coming soon", which means they are not in the shipped firmware; Bluetooth page turners and SD card plugins are now listed as features. Tilt page turn is scoped to X3 and Sticky, USB Drive mode to X4Pro, and touch reading to touch-enabled devices, so feature parity across the supported models does not exist. A buyer choosing between an X3 and an X4Pro is choosing between tilt paging and mass-storage access.
The repository also does not read as a single-vendor product. GOVERNANCE.md, SCOPE.md, ROADMAP.md, AGENTS.md, and CLAUDE.md sit at the top level next to a freeink-sdk submodule, and the README asks readers to consider an X3/X4 Developer Edition purchase because the project receives a share of each sale. That is disclosed funding, not hidden, but it does mean the hardware recommendation and the funding path point at the same store. Rollback, as the install section describes it, means reflashing the latest official firmware through the same flash tools page.
Calibre wireless versus OPDS versus WebDAV
CrossPoint offers three ways to move books, and they are not interchangeable. The Calibre wireless connect flow speaks Calibre's own protocol, so it fits people who already manage a library in Calibre and want the device to appear there. The OPDS browser is the opposite approach: the device pulls from a catalogue server, with up to eight saved servers, search, pagination, and direct download, which suits public or self-hosted catalogues rather than a local Calibre instance. WebDAV is the file-level option, useful when neither protocol matches your server.
Against KOReader, the difference is architectural rather than feature-level. KOReader is a reader application that runs on top of an existing system across many devices; CrossPoint is firmware for a fixed set of ESP32 boards, and it borrows one KOReader feature specifically, progress sync, rather than adopting its model. If you want one reader UI on a Kobo, a Kindle, and an Android tablet, CrossPoint is the wrong shape. If you want to replace the firmware on an Xteink or M5PaperMono and keep hacking on it in C, the repository layout is aimed at exactly that.
Maintenance, licence, and what an upgrade costs you
The last push to the develop branch was on 2026-11-02, and the most recent release listed is 2.0.0 from 2026-11-01, following 2.0.0rc on 2026-10-19 and 1.6.5 on 2026-09-27. Release candidates sit alongside stable tags, so anyone tracking releases needs to decide whether to run rc builds or wait for the numbered tag. The repository is not archived.
The licence is MIT, which permits commercial use and modification, and the project's own funding is separate from that: the README mentions a royalty.dev contributors link and a share of Developer Edition sales. MIT places no obligation on downstream redistributors to fund anything, so the funding and the licence are independent facts rather than a combined bargain.
Upgrade cost is low on paper. OTA checks and installs run from GitHub releases, and custom fonts live on the SD card with no reflash needed, so the two most common changes do not require a cable. The expensive part is the initial flash and the unlocker decision, which is a one-time risk. Build-from-source work is heavier: the tree carries platformio.ini, requirements.txt that pulls in lib/EpdFont/scripts/requirements.txt and scripts/requirements.txt, and a nix/ directory, so expect a real toolchain rather than a single pip install.
Editorial conclusion
Adopt CrossPoint Reader if you own one of the listed ESP32 e-ink devices and want an MIT-licensed firmware you can rebuild from source, with Calibre wireless transfer, OPDS browsing, and SD-card fonts. Do not adopt it as a generic e-reader OS: the README names only ESP32C3 and ESP32S3 targets, and a USB-locked Xteink unit needs the unlocker before anything flashes. Verify first that your exact model appears on the Devices page, that your unit is not USB-locked, and that the release you intend to flash matches your chip, because the command line example differs between esp32c3 and esp32s3.
Frequently asked questions
What is CrossPoint Reader?
It is open-source e-reader firmware distributed under the MIT licence, described in the README as community-built and fully hackable. It runs on ESP32C3-based Xteink X4 and X3 and on ESP32S3-based Xteink X4Pro and X4Classic, Seeed reTerminal Sticky, M5PaperMono, Metalio E-Ink 4, EEGOREAD A4 and Boox Picco.
How do I update my CrossPoint Reader?
The firmware checks for and installs OTA updates from GitHub releases. You can also reflash manually through the flash tools page or with esptool, and the README notes that flashing the latest official firmware the same way reverts to the stock build.
What files can CrossPoint Reader read?
The README lists native handling for .epub, .xtc/.xtch, .txt, and .bmp, with EPUB 2 and 3 rendering including hyphenation, kerning, footnotes, bookmarks, and StarDict dictionary lookups.
How do I install CrossPoint Reader on my device?
The recommended route is the web installer: connect over USB-C, open the flash tools page, select your device, and choose an official release. A command line route uses esptool with the chip matching your model, esp32c3 for X3 and X4 or esp32s3 for X4Pro, Sticky, and M5PaperMono.
What does CrossPoint Reader do?
It renders EPUB 2 and 3 with hyphenation, kerning, footnotes, bookmarks, and StarDict dictionary lookups, and it handles .xtc/.xtch, .txt, and .bmp natively. It also exposes network workflows including a file transfer web UI, WebDAV, an OPDS browser, and a Calibre wireless connect flow.
How do I use CrossPoint Reader?
After flashing, you load books onto the SD card or transfer them over Wi-Fi, then read with chapter navigation, bookmarks, and dictionary lookups. Custom .ttf, .otf or .ttc fonts go on the SD card under /fonts/ or /.fonts/ (or a family subfolder) and are selected as reader fonts on devices with external RAM enabled.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/crosspoint-reader-crosspoint-reader)Star history chart for your README
[](https://hysenlabs.com/projects/crosspoint-reader-crosspoint-reader)Was this useful?