2025-12-03 22:00:29 +11:00
# CrossPoint Reader
2026-05-19 22:42:45 -04:00
[](https://app.royalty.dev/crosspoint-reader/crosspoint-reader)
2026-05-15 23:38:22 +03:00
CrossPoint is open-source e-reader firmware - community-built, fully hackable, free forever. It's maintained by a growing community of developers and readers who believe your device should do what you want - not what a manufacturer decided for you.
2025-12-03 22:00:29 +11:00
2026-05-15 23:38:22 +03:00
**Now running on:** ESP32C3-based Xteink [X4 ](https://www.xteink.com/products/xteink-x4 ) and [X3 ](https://www.xteink.com/products/xteink-x3 ).
2025-12-03 22:00:29 +11:00
2026-05-15 23:38:22 +03:00

2025-12-03 22:00:29 +11:00
2026-07-06 23:13:27 +03:00
> If you're planning to buy an Xteink device, consider purchasing an **X3/X4 Developer Edition** through https://crosspointreader.com. CrossPoint receives a small share of each sale, helping fund development costs.
2026-05-15 23:38:22 +03:00
## What can CrossPoint do?
2025-12-03 22:00:29 +11:00
2026-07-19 17:57:16 +03:00
- **Reader engine**: EPUB 2/3 rendering with embedded-style option, image handling, hyphenation, kerning, chapter navigation, footnotes, bookmarks, dictionary lookups ([StarDict ](docs/dictionary.md )), go-to-percent, auto page turn, orientation control, focus reading, KOReader progress sync and more.
2025-12-03 22:00:29 +11:00
2026-05-15 23:38:22 +03:00
- **Various formats**: native handling for `.epub` , `.xtc/.xtch` , `.txt` , and `.bmp` .
2025-12-03 22:00:29 +11:00
2026-05-15 23:38:22 +03:00
- **Screenshots.**
2025-12-03 22:00:29 +11:00
2026-05-15 23:38:22 +03:00
- **Custom fonts**: install your favorite fonts on the SD card.
2025-12-03 22:00:29 +11:00
2026-05-15 23:38:22 +03:00
- **Tilt page turn (X3 only)**.
2025-12-20 01:44:39 +11:00
2026-05-15 23:38:22 +03:00
- **Library workflow**: folder browser, hidden-file toggle, long-press delete, recent books, SD-cache management.
2026-01-27 14:14:32 +03:00
2026-05-15 23:38:22 +03:00
- **Wireless workflows**:
- File transfer web UI
- EPUB Optimizer
- Web settings UI/API (edit many device settings from browser)
- WebSocket fast uploads
- WebDAV handler
2026-06-07 21:47:44 +02:00
- AP mode (hotspot) and STA mode (join existing Wi-Fi), both with QR helpers
2026-05-15 23:38:22 +03:00
- Calibre wireless connect flow
- OPDS browser with saved servers (up to 8), search, pagination, and direct download
- OTA update checks and installs from GitHub releases
2025-12-03 22:00:29 +11:00
2026-08-12 22:21:43 +02:00
- **Customization**: multiple themes (Classic, Lyra, Lyra Extended, RoundedRaff), sleep screen modes including transparent overlays, front/side button remapping, status bar controls, power-button behavior, refresh cadence, and more.
2026-05-15 23:38:22 +03:00
2026-05-31 16:57:51 +03:00
- **Localization**: 24 UI languages and counting. RTL support.
2026-05-15 23:38:22 +03:00
### Coming soon:
- More themes.
- Much more! stay tuned.
---
2026-02-05 22:38:42 +11:00
2026-05-15 11:44:47 -04:00
## USB-locked devices (Xteink Unlocker)
Some Xteink units purchased from third-party stores (e.g. AliExpress) ship with USB flashing locked from the factory.
If your device is locked, you will need to use the **Xteink Unlocker** tool available at
https://crosspointreader.com/#unlock -tool before you can flash CrossPoint.
**You do not need this tool if you bought your device directly from xteink.com.** Those units are not locked.
2026-05-15 23:38:22 +03:00
**Not sure if your device is locked?** Power it on, connect the USB-C cable, and try flashing via the web flasher first (see
[Install firmware ](#install-firmware ) below). If the browser's serial device picker does not show your device, try a different
2026-05-15 11:44:47 -04:00
USB port or browser before assuming the device is locked. Only reach for the unlocker if the device still doesn't appear.
> ### ⚠️ WARNING: READ THIS BEFORE USING THE UNLOCKER ⚠️
2026-05-15 23:38:22 +03:00
>
2026-05-15 11:44:47 -04:00
> **The only officially supported firmwares in the unlock tool are CrossPoint and CrossInk.**
2026-05-15 23:38:22 +03:00
>
2026-05-15 11:44:47 -04:00
> Flashing any other firmware on a USB-locked device may **permanently brick the device** or leave it **permanently
> stuck on that firmware with no recovery path**. Once USB flashing is re-locked, your only way back is via OTA, and if
> the firmware you flashed doesn't support OTA, **there is no way out**.
2026-05-15 23:38:22 +03:00
## Install firmware
2025-12-09 00:07:38 +11:00
2026-05-15 23:38:22 +03:00
### Web installer (recommended)
2025-12-09 00:07:38 +11:00
2026-05-15 23:38:22 +03:00
1. Connect your device to your computer via USB-C and wake/unlock the device
2. Go to https://crosspointreader.com/#flash -tools, select device (X3 or X4), and choose an official CrossPoint release.
2025-12-09 00:07:38 +11:00
2026-05-15 23:38:22 +03:00
### Web installer (specific version)
2025-12-09 00:07:38 +11:00
2026-05-15 23:38:22 +03:00
1. Connect your device to your computer via USB-C and wake/unlock the device
2. Download a `firmware.bin` from [Releases ](https://github.com/crosspoint-reader/crosspoint-reader/releases ), local build, or continuous integration artifact.
3. Go to https://crosspointreader.com/#flash -tools, select device (X3 or X4), click "Custom .bin" and upload a `firmware.bin` .
2025-12-09 00:07:38 +11:00
2026-05-15 23:38:22 +03:00
### Revert to Official Firmware
2025-12-09 00:07:38 +11:00
2026-05-15 23:38:22 +03:00
To revert to the official firmware, you can also flash the latest official firmware using https://crosspointreader.com/#flash -tools.
2025-12-09 00:07:38 +11:00
2026-05-15 23:38:22 +03:00
### Command line
1. Install [`esptool` ](https://github.com/espressif/esptool ):
2026-04-14 03:50:31 +09:00
```bash
pip install esptool
```
2026-05-15 23:38:22 +03:00
2. Download `firmware.bin` from the [releases page ](https://github.com/crosspoint-reader/crosspoint-reader/releases ).
3. Connect your device via USB-C.
4. Find the device port. On Linux, run `dmesg` after connecting. On macOS:
2026-04-14 03:50:31 +09:00
```bash
log stream --predicate 'subsystem == "com.apple.iokit"' --info
```
2026-05-15 23:38:22 +03:00
5. Flash:
2026-04-14 03:50:31 +09:00
```bash
esptool.py --chip esp32c3 --port /dev/ttyACM0 --baud 921600 write_flash 0x10000 /path/to/firmware.bin
```
2026-05-15 23:38:22 +03:00
Adjust `/dev/ttyACM0` to match your system.
2026-04-14 03:50:31 +09:00
2025-12-09 00:07:38 +11:00
### Manual
2026-05-15 23:38:22 +03:00
See [Development quick start ](#development-quick-start ) below.
2025-12-09 00:07:38 +11:00
2026-05-15 23:38:22 +03:00
---
2026-05-19 00:32:30 -04:00
## Custom SD-card fonts
Convert your own TTF/OTF files into `.cpfont` files that load from the SD card. No firmware reflash is needed.
1. Go to https://crosspointreader.com/fonts and open the "SD-card font builder" form.
2. Upload up to four styles (regular, bold, italic, bold-italic), set the family name, point sizes, and Unicode range.
3. Download the generated `.cpfont` files.
4. Copy them to your SD card under `/fonts/YourFont/` (or `/.fonts/YourFont/` to hide the folder).
5. Select the font on the device from the font settings.
Conversion runs the firmware repo's `lib/EpdFont/scripts/fontconvert_sdcard.py` script unmodified, so output matches a local host build.
---
2026-05-15 23:38:22 +03:00
## Documentation
- [User Guide ](./USER_GUIDE.md )
- [Web server usage ](./docs/webserver.md )
- [Web server endpoints ](./docs/webserver-endpoints.md )
- [Project scope ](./SCOPE.md )
- [Contributing docs ](./docs/contributing/README.md )
2026-08-12 13:40:09 -04:00
- [Touch and UI development ](./docs/contributing/touch-and-ui.md ) - how to build new screens on the FreeInkUI activity bases (UiListActivity and friends), plus build envs for the non-Xteink touch devices
2026-05-15 23:38:22 +03:00
---
## Development quick start
2025-12-03 22:00:29 +11:00
### Prerequisites
2026-05-15 23:38:22 +03:00
- [pioarduino ](https://github.com/pioarduino/pioarduino ) or VS Code + pioarduino plugin
- Python 3.8+
- `clang-format` 21
- USB-C cable supporting data transfer
2025-12-03 22:00:29 +11:00
2026-05-15 23:38:22 +03:00
### Setup
2025-12-06 04:53:58 +11:00
2026-05-15 23:38:22 +03:00
```bash
2026-02-05 22:38:42 +11:00
git clone --recursive https://github.com/crosspoint-reader/crosspoint-reader
2026-05-15 23:38:22 +03:00
cd crosspoint-reader
2025-12-06 04:53:58 +11:00
2026-05-15 23:38:22 +03:00
# if cloned without --recursive:
2025-12-06 04:53:58 +11:00
git submodule update --init --recursive
```
2026-07-19 22:57:37 +01:00
### Nix/NixOS
Nix/NixOS users can enter the development shell with either `nix develop` (flakes) or `nix-shell` :
```bash
nix develop -f nix
# or
nix-shell nix
```
To flash a connected ESP32-C3 device, enable PlatformIO's udev rules in your NixOS configuration:
```nix
services . udev . packages = with pkgs ; [ platformio-core . udev ];
```
After rebuilding the system configuration, reconnect the device or reload udev rules.
2026-05-15 23:38:22 +03:00
### Build / flash / monitor
2025-12-03 22:00:29 +11:00
2026-05-15 23:38:22 +03:00
```bash
2025-12-03 22:00:29 +11:00
pio run --target upload
```
2026-05-15 23:38:22 +03:00
### Contributor pre-PR checks
```bash
./bin/clang-format-fix
pio check -e default
pio run -e default
```
2026-02-01 13:53:20 +02:00
### Debugging
After flashing the new features, it’ s recommended to capture detailed logs from the serial port.
First, make sure all required Python packages are installed:
```python
2026-02-03 16:33:20 -05:00
python3 - m pip install pyserial colorama matplotlib
2026-02-01 13:53:20 +02:00
```
2026-05-15 23:38:22 +03:00
After that run the script:
2026-02-01 13:53:20 +02:00
```sh
2026-02-03 16:33:20 -05:00
# For Linux
# This was tested on Debian and should work on most Linux systems.
2026-02-01 13:53:20 +02:00
python3 scripts/debugging_monitor.py
2026-02-03 16:33:20 -05:00
# For macOS
python3 scripts/debugging_monitor.py /dev/cu.usbmodem2101
2026-02-01 13:53:20 +02:00
```
2026-05-15 23:38:22 +03:00
2026-02-03 16:33:20 -05:00
Minor adjustments may be required for Windows.
2025-12-03 22:00:29 +11:00
2026-05-15 23:38:22 +03:00
---
2025-12-03 22:00:29 +11:00
## Internals
2026-05-15 23:38:22 +03:00
CrossPoint Reader is pretty aggressive about caching data down to the SD card to minimise RAM usage. The ESP32-C3 only has ~380KB of usable RAM, so we have to be careful. A lot of the decisions made in the design of the firmware were based on this constraint.
2025-12-03 22:00:29 +11:00
2025-12-29 12:19:54 +10:00
### Data caching
2025-12-03 22:00:29 +11:00
2026-06-07 21:47:44 +02:00
The first time chapters of a book are loaded, they are cached to the SD card. Subsequent loads are served from the
2025-12-03 22:00:29 +11:00
cache. This cache directory exists at `.crosspoint` on the SD card. The structure is as follows:
2026-05-15 23:38:22 +03:00
```text
2025-12-03 22:00:29 +11:00
.crosspoint/
2026-05-15 23:38:22 +03:00
├── epub_<hash>/ # one directory per book, named by content hash
│ ├── progress.bin # reading position (chapter, page, etc.)
│ ├── cover.bmp # generated cover image
│ ├── book.bin # metadata: title, author, spine, TOC
2026-06-07 21:47:44 +02:00
│ ├── css_rules.cache # parsed CSS rule cache
│ ├── img_* # rendered image cache files
2026-05-15 23:38:22 +03:00
│ └── sections/ # per-chapter layout cache
│ ├── 0.bin
│ ├── 1.bin
2025-12-29 12:19:54 +10:00
│ └── ...
2026-06-07 21:47:44 +02:00
├── settings.json # device settings
├── state.json # resume/runtime state
└── recent.json # recent books list
2025-12-03 22:00:29 +11:00
```
2026-06-07 21:47:44 +02:00
Removing `/.crosspoint` clears all cached metadata and forces a full regeneration on next open. Book deletes, overwrites, and moves done through the firmware or web UI clear or re-key matching caches; manual SD-card edits may leave stale cache directories behind.
2025-12-29 12:19:54 +10:00
For more details on the internal file structures, see the [file formats document ](./docs/file-formats.md ).
2025-12-03 22:00:29 +11:00
2026-05-15 23:38:22 +03:00
---
2025-12-03 22:00:29 +11:00
## Contributing
2026-05-15 23:38:22 +03:00
Contributions are welcome. If you're new to the codebase, start with the [contributing docs ](./docs/contributing/README.md ). For things to work on, check the [ideas discussion board ](https://github.com/crosspoint-reader/crosspoint-reader/discussions/categories/ideas ) — leave a comment before starting so we don't duplicate effort.
2025-12-03 22:00:29 +11:00
2026-05-15 23:38:22 +03:00
Everyone here is a volunteer, so please be respectful and patient. For governance and community expectations, see [GOVERNANCE.md ](./GOVERNANCE.md ).
2025-12-03 22:00:29 +11:00
---
2026-05-15 23:38:22 +03:00
## Community forks
2025-12-06 13:32:09 +11:00
2026-05-15 23:38:22 +03:00
One of the best things about open source is that anyone can take the code in a different direction. If you need something outside CrossPoint's [scope ](./SCOPE.md ), check out the community forks:
- [CrossInk ](https://github.com/uxjulia/CrossInk ) — Typography and reading tracking: Bionic Reading (bolds word stems to create fixation points), guide dots between words, improved paragraph indents, and replaces the default fonts with ChareInk/Lexend/Bitter.
- [papyrix-reader ](https://github.com/bigbag/papyrix-reader ) — Adds FB2 and MD format support. Actively maintained with Arabic script support. Custom themes via SD card.
2026-07-01 14:22:27 -04:00
- ~~[crosspet ](https://github.com/trilwu/crosspet ) — A Vietnamese fork that adds a Tamagotchi-style virtual chicken that grows based on your reading milestones (pages read, streaks, care). Also: Flashcards, Weather, Pomodoro timer, and mini-games.~~ (Unmaintained)
2026-05-15 23:38:22 +03:00
- [crosspoint-reader-cjk ](https://github.com/aBER0724/crosspoint-reader-cjk ) — Purpose-built for Chinese, Japanese, and Korean reading.
- [inx ](https://github.com/obijuankenobiii/inx ) — Completely reimagines the user interface with tabbed navigation.
- ~~[PlusPoint ](https://github.com/ngxson/pluspoint-reader ) — custom JS apps support.~~ (Unmaintained)
- [crosspoint-reader-papers3 ](https://github.com/juicecultus/crosspoint-reader-papers3 ) — Crosspoint port for M5Stack Paper S3.
2026-06-05 18:50:22 +03:00
- [t5s3-reader ](https://github.com/ShallowGreen123/t5s3-reader ) — Crosspoint port for LilyGo T5 ePaper S3 / T5S3 4.7-inch e-paper device.
2026-05-15 23:38:22 +03:00
**Note:** Many of these features will make their way into CrossPoint over time. We maintain a slower pace to ensure rock-solid stability and squash bugs before they reach your device.
Want to build your own device? Be sure to check out the [de-link ](https://github.com/iandchasse/de-link ) project.
---
CrossPoint Reader is **not affiliated with Xteink or any device manufacturer** .
Huge shoutout to [diy-esp32-epub-reader ](https://github.com/atomic14/diy-esp32-epub-reader ), which inspired this project.