# CrossPoint Reader firmware: flashing an ESP32 e-reader with esptool or the web installer

> 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.

**crosspoint-reader/crosspoint-reader** — Open-source e-reader firmware

- Repository: https://github.com/crosspoint-reader/crosspoint-reader
- Website: https://crosspointreader.com
- Stars: 8,134 · Forks: 1,923
- Language: C
- License: MIT
- Published: 2026-09-22 · Updated: 2026-09-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/crosspoint-reader-crosspoint-reader

## 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, Seeed reTerminal Sticky, and M5PaperMono. 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 contributing docs for touch and UI work, 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, and the two documented references for that surface are docs/webserver.md and docs/webserver-endpoints.md.

## 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:

```bash
pip install esptool
```

After connecting the device over USB-C, find the port. On Linux the README suggests running dmesg after connecting; on macOS it gives this command:

```bash
log stream --predicate 'subsystem == "com.apple.iokit"' --info
```

Then flash according to the chip. For an X3 or X4:

```bash
esptool.py --chip esp32c3 --port /dev/ttyACM0 --baud 921600 write_flash 0x10000 /path/to/firmware.bin
```

For an Xteink X4Pro, Seeed reTerminal Sticky, or M5PaperMono:

```bash
esptool.py --chip esp32s3 --port /dev/ttyACM0 --baud 921600 write_flash 0x10000 /path/to/firmware.bin
```

Note 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, the project runs a hosted builder at crosspointreader.com/fonts that uses lib/EpdFont/scripts/fontconvert_sdcard.py unmodified; you copy the resulting .cpfont files to /fonts/YourFont/ on the SD card, or /.fonts/YourFont/ to hide the folder, then select the family in the device font settings.

## 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 Bluetooth pageturner, more themes, and web plugins under "Coming soon", which means they are not in the shipped firmware. 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. Finally, the README does not document rollback beyond reflashing official firmware through the same flash tools page, and it does not describe what happens to your library data during an OTA. Verify those on your own device before relying on them.

## 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-09-21, and the most recent release listed is 1.6.5rc from 2026-09-14, following 1.6.0 on 2026-09-05. 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.

## 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.

## FAQ

### 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, Seeed reTerminal Sticky, and M5PaperMono.

### 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 fonts go on the SD card under /fonts/YourFont/ and are selected in the device font settings without a reflash.

## Sources

- [crosspoint-reader/crosspoint-reader on GitHub](https://github.com/crosspoint-reader/crosspoint-reader)
- [License: MIT](https://github.com/crosspoint-reader/crosspoint-reader/blob/develop/LICENSE)
- [Project website](https://crosspointreader.com)
- [README](https://github.com/crosspoint-reader/crosspoint-reader/blob/develop/README.md)
- [Releases](https://github.com/crosspoint-reader/crosspoint-reader/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/crosspoint-reader-crosspoint-reader
