Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
79b4d63
fix: settings persist on font clear, reserve() before push_back, mino…
sypianski Jul 3, 2026
685d4e8
feat: Lazy incremental EPUB section indexing (#2452)
itsthisjustin Jul 4, 2026
3e1dd31
feat(reader): End of Book next-book suggestions (#2499) (#2532)
tomlarse Jul 4, 2026
ca1b833
fix: follow spec for zxing qr code generation (#2540)
latonis Jul 5, 2026
44ff313
fix: render <br> between paragraphs as a visible section break (#2548)
Uri-Tauber Jul 6, 2026
f2b00f6
chore: Replace product link with affiliate tracking link (#2401)
Uri-Tauber Jul 6, 2026
6f5c5a0
fix: Flatten TextBlock word storage into single allocation (#2547)
itsthisjustin Jul 6, 2026
3c5c5e8
feat: preview image files inline in web file browser (#2429)
fain182 Jul 6, 2026
5776911
fix: FontDecompressor OOM aborts on the render path (-fno-exceptions …
k5njm Jul 7, 2026
c2c1bad
chore: Refactor stores to use PersistableStore CRTP template (#2464)
Uri-Tauber Jul 8, 2026
7ec07b4
fix: show "Failed to index" when failing to parse epub (#2556)
Uri-Tauber Jul 8, 2026
a430613
chore: update the Italian translation (#2559)
matteoscopel Jul 8, 2026
4fb843e
perf: skip redundant progress writes when position is unchanged (#2436)
hooligan333 Jul 10, 2026
4b34a57
chore: update Spanish, Catalan, and Valencian translations (#2566)
lpla Jul 10, 2026
0dc92c1
fix: update czech.yaml (#2574)
Pitel Jul 11, 2026
1f5669a
fix: Swedish translation (#2577)
steka Jul 11, 2026
3e62711
fix: oom exceptions for OPDS, KOSync, and OTA via wolfssl (#2475)
itsthisjustin Jul 11, 2026
287457f
fix: handle low-bit-depth, upscaled, and SVG EPUB images (#2503)
lpla Jul 12, 2026
6add0b9
feat: Add Finnish hyphenation (#2084)
timo-mart Jul 12, 2026
e142e88
perf: drop per-image delay(50) on chapter build, retry getDimensions …
hooligan333 Jul 12, 2026
e0253a8
perf: reserve CSS rule map before loading from cache (#2435)
hooligan333 Jul 12, 2026
5202bbf
feat: auto-connect saved Wi-Fi networks (#2189)
axhoff Jul 12, 2026
bb06219
docs: add script to generate EPUB from USER_GUIDE.md (#2152)
jhuebel Jul 12, 2026
5fbc657
perf: always binary-search idref lookups in content.opf (#2433)
hooligan333 Jul 12, 2026
b596f21
perf: stream NCX/NAV TOC into parser, drop temp-file round-trip (#2440)
hooligan333 Jul 12, 2026
d8139e9
perf: release CSS rule map after warm open (#2439)
hooligan333 Jul 12, 2026
859f6cb
chore: update Spanish, Catalan, and Valencian Wi-Fi strings (#2578)
lpla Jul 12, 2026
444d87d
fix: Add framebuffer release/realloc and improved lazy indexing (#2563)
itsthisjustin Jul 12, 2026
39ea4b0
feat: render placeholders while waiting for images to render (#1003)
Tritlo Jul 12, 2026
3a97f3e
feat: Send optional document metadata with KOSync progress uploads (#…
nperez0111 Jul 13, 2026
73ab9ab
feat: implement captive portal redirects for auto-loading the managem…
latonis Jul 13, 2026
bfa1d70
feat: Hidden wifi ssid support (#2360)
HgGamer Jul 13, 2026
552b268
fix: keep list item bullet inline with nested paragraph text (#2589)
jan-xyz Jul 13, 2026
932a472
feat: Arabic/Farsi/Urdu bidi reordering and contextual shaping — PR 1…
YouHusam Jul 13, 2026
fae3423
feat: add portuguese-PT.yaml (#2597)
Uri-Tauber Jul 13, 2026
2a19eb9
feat: Arabic/Farsi/Urdu glyphs in built-in UI fonts - PR 2/3 (#2596)
YouHusam Jul 13, 2026
c5787d1
fix: Use HALF_REFRESH for sleep and boot instead of FULL (#2588)
itsthisjustin Jul 13, 2026
8c5cd67
feat: complete Turkish translation (390/390) (#2592)
metoli86 Jul 14, 2026
94ae750
feat(i18n): add Norwegian Bokmål translation (#2113)
tomlarse Jul 14, 2026
e84840b
fix(css-parser): don't save unusable rules to RAM (#2604)
brianhuster Jul 14, 2026
a0ec581
feat: Arabic translation YAML - PR 3/3 (#2599)
YouHusam Jul 14, 2026
f180069
fix: ignore open-x4-sdk and fs_ (#2609)
Uri-Tauber Jul 14, 2026
3dac444
fix: remove duplicate sleep logic (#2492)
Uri-Tauber Jul 15, 2026
b9867b0
feat(i18n): add Bosnian translation (#2616)
arunoruto Jul 15, 2026
95d8cb7
feat: configurable OPDS download folder and filename format (#2571)
oscarnogueira Jul 15, 2026
f3cad2f
fix(kosync): reload Epub before reading upload metadata (#2608)
W-Floyd Jul 15, 2026
35a45f9
feat: add options to remember web upload settings & rename ebooks to …
victor141516 Jul 15, 2026
a4ac3b2
feat: add smart KOReader progress sync (#2192)
axhoff Jul 15, 2026
63093e6
feat: Back on home menu opens the most recent book (#2619)
rxmmah Jul 15, 2026
a2db43d
feat: enable CORS headers in the HTTP API (#2594)
metoli86 Jul 15, 2026
fdffc2e
fix: reduce CSS parse-time OOM risk in chapter layout (#2606)
brianhuster Jul 16, 2026
9737cb3
fix: correct the settings enums for "blank" and "cover + custom" slee…
uxjulia Jul 17, 2026
b1d0375
feat: Add kosync user registration and switch to crosspoint-sync serv…
itsthisjustin Jul 18, 2026
9fe4dc5
feat: Add option to switch behavior for "back to browser / home" in R…
tsymalla Jul 19, 2026
5ba1d57
fix: EndOfBookOptions fails to compile
Uri-Tauber Jul 19, 2026
b1d1d75
feat: Slim dictionary (#2583)
Uri-Tauber Jul 19, 2026
556b8ae
fix: swedish translation (#2649)
steka Jul 19, 2026
64364be
feat: add Nix development shell (#2645)
thiagokokada Jul 19, 2026
3dfbc03
fix(i18n): add missing strings in PT-PT translation (#2632)
CookieCaptainD Jul 20, 2026
3319aa1
fix(epub): preserve word continuation when splitting CJK text on MAX_…
brianhuster Jul 20, 2026
e03aa16
fix: select strongest AP for matching WiFi SSID (#2655)
lpla Jul 20, 2026
c9188a7
chore: Clarify project scope and development priorities (#2149)
itsthisjustin Jul 20, 2026
f42fab1
feat: Add touch coordinate mapping and RTOS task yielding (#2481)
itsthisjustin Jul 20, 2026
cb9b971
Refactor SCOPE.md for improved formatting
itsthisjustin Jul 21, 2026
973a902
fix: duplicate User-Agent header on wolfSSL requests breaks strict se…
dylanbyars Jul 21, 2026
f1206f4
chore: update Vietnamese translations (#2667)
brianhuster Jul 21, 2026
63eda54
chore: Migrate Settings/State onto PersistableStore; (#2647)
Uri-Tauber Jul 21, 2026
aacdd7e
add Bahasa Indonesia Translation (#2666)
chalei Jul 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
blank_issues_enabled: false
contact_links:
- name: Scope or Roadmap Question (start here if unsure)
url: https://github.com/crosspoint-reader/crosspoint-reader/discussions
about: |
Not sure if your idea fits CrossPoint's scope? Start a Discussion before filing an issue.
See SCOPE.md and ROADMAP.md for what is in, out, and currently paused.
- name: Read the Scope document
url: https://github.com/crosspoint-reader/crosspoint-reader/blob/master/SCOPE.md
about: The authoritative list of what CrossPoint will and will not accept.
- name: Read the Roadmap
url: https://github.com/crosspoint-reader/crosspoint-reader/blob/master/ROADMAP.md
about: Current phase, what is being closed out, and what comes next.
80 changes: 80 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: Feature Request
description: Propose a new feature, enhancement, or change to CrossPoint
title: "Short, descriptive title of the request"
labels: ["enhancement", "needs-scope-review"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to propose a change to CrossPoint!

**Before you continue, please read [SCOPE.md](../blob/master/SCOPE.md) and [ROADMAP.md](../blob/master/ROADMAP.md).**

CrossPoint is intentionally narrow. Most rejected proposals are rejected for scope reasons that are already
documented. The checklist below exists to save both of us time.

If you are not sure whether your idea fits, open a [Discussion](../../discussions) first instead of filing
this issue.

- type: checkboxes
id: scope-check
attributes:
label: Scope Self-Check (required)
description: Please confirm each of the following. If any are unchecked, your issue will likely be closed.
options:
- label: I have read SCOPE.md and ROADMAP.md.
required: true
- label: This is **not** a new theme or theming change (themes are temporarily closed pending the move to SD-loaded themes).
required: true
- label: This is **not** a new external network connector (sync engine, cloud storage, remote file access, OPDS extensions beyond what exists, or any new "talk to a server" feature).
required: true
- label: This is **not** an interactive app (game, calculator, notepad), writing/authoring tool, RSS/news/browser feature, media playback feature, or PDF rendering.
required: true
- label: The stock firmware does **not** already handle this well.
required: true
- label: No other popular CrossPoint fork already handles this well (or, if one does, I explain below why CrossPoint still needs it).
required: true

- type: textarea
id: problem
attributes:
label: Problem this solves
description: What user-facing problem or reading-experience gap does this address? Be concrete.
placeholder: e.g., "When reading in landscape, paragraph breaks are inconsistent because..."
validations:
required: true

- type: textarea
id: stock-gap
attributes:
label: Why the stock firmware (and other forks) do not already solve this
description: Explain which existing solutions you checked and why they fall short. This is the core scope filter.
validations:
required: true

- type: textarea
id: proposal
attributes:
label: Proposed change
description: A short description of what you would build or change. Focus on user impact; implementation details can come later.
validations:
required: true

- type: textarea
id: tradeoffs
attributes:
label: Memory / flash / complexity cost
description: |
CrossPoint runs on 380KB of RAM. Roughly how much DRAM, flash, or code complexity does this add?
"Don't know" is a valid answer, but please attempt an estimate.
placeholder: e.g., "Adds ~2KB flash for the new font tables, no DRAM impact at runtime."
validations:
required: false

- type: textarea
id: additional-context
attributes:
label: Additional context
description: Anything else relevant (links, screenshots, related discussions).
validations:
required: false
22 changes: 20 additions & 2 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,34 @@
* **What is the goal of this PR?** (e.g., Implements the new feature for file uploading.)
* **What changes are included?**

## Scope Check

CrossPoint is intentionally narrow. See [SCOPE.md](../blob/master/SCOPE.md) and [ROADMAP.md](../blob/master/ROADMAP.md).
Please confirm:

- [ ] I have read SCOPE.md and ROADMAP.md.
- [ ] This PR is **not** a new built-in theme (themes are temporarily closed pending the move to SD-loaded themes).
- [ ] This PR is **not** a new external network connector (sync engine, cloud storage, remote file access, etc.).
- [ ] This PR is **not** an interactive app, writing tool, RSS/news/browser, media playback, or PDF feature.
- [ ] The stock firmware does not already handle this well, **and** no other popular CrossPoint fork already does
(or, if one does, I explain why CrossPoint still needs it below).
- [ ] If this PR touches `freeink-sdk/`, `lib/hal/`, the bootloader, OTA, or recovery code, I have coordinated with
the relevant maintainer.

**If this PR was opened against the previous (broader) scope and was already in flight under Phase 0, link the
relevant Discussion or issue so reviewers can see the history.**

## Additional Context

* Add any other information that might be helpful for the reviewer (e.g., performance implications, potential risks,
* Add any other information that might be helpful for the reviewer (e.g., performance implications, potential risks,
specific areas to focus on).
* Memory / flash impact, if known.

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it
While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**< YES | PARTIALLY | NO >**_
6 changes: 5 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,13 @@ jobs:
restore-keys: pio-${{ runner.os }}-

- name: Build CrossPoint
# Both envs in ONE pio invocation: a second `pio run` can wipe the whole
# .pio/build tree (project-checksum mismatch after the S3 toolchain
# installs into the restored cache), deleting the default firmware.bin
# before the artifact upload.
run: |
set -euo pipefail
pio run | tee pio.log
pio run -e default -e sticky | tee pio.log

- name: Extract firmware stats

Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
.idea
.DS_Store
.vscode
open-x4-sdk
fs_
lib/EpdFont/fontsrc
lib/I18n/I18nKeys.h
lib/I18n/I18nStrings.h
Expand Down
25 changes: 22 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ CrossPoint is open-source e-reader firmware - community-built, fully hackable, f

![CrossPoint Reader running on Xteink device](./docs/images/cover.jpg)

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

## What can CrossPoint do?

- **Reader engine**: EPUB 2/3 rendering with embedded-style option, image handling, hyphenation, kerning, chapter navigation, footnotes, bookmarks, go-to-percent, auto page turn, orientation control, focus reading, KOReader progress sync and more.
- **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.

- **Various formats**: native handling for `.epub`, `.xtc/.xtch`, `.txt`, and `.bmp`.

Expand Down Expand Up @@ -40,8 +42,6 @@ CrossPoint is open-source e-reader firmware - community-built, fully hackable, f

### Coming soon:

- Dictionary lookup — inline word lookup without leaving the reader.

- More themes.

- Much more! stay tuned.
Expand Down Expand Up @@ -136,6 +136,7 @@ Conversion runs the firmware repo's `lib/EpdFont/scripts/fontconvert_sdcard.py`
- [Web server endpoints](./docs/webserver-endpoints.md)
- [Project scope](./SCOPE.md)
- [Contributing docs](./docs/contributing/README.md)
- [Touch and UI development](./docs/contributing/touch-and-ui.md) - FreeInkUI components for new screens, the touch bridge for existing ones, and build envs for the non-Xteink touch devices

---

Expand All @@ -158,6 +159,24 @@ cd crosspoint-reader
git submodule update --init --recursive
```

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

### Build / flash / monitor

```bash
Expand Down
88 changes: 88 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# CrossPoint Reader Roadmap

This roadmap describes how CrossPoint is moving through the tighter scope defined in [SCOPE.md](SCOPE.md). It is
intentionally phased: Phase 0 closed out the commitments already in flight before locking down to the stricter
"fill gaps the stock firmware leaves" delineator.

Phases are sequential. We do not start the next phase until the prior one is wrapped or explicitly carried over.

---

## Phase 0 - Close Out Legacy Scope Items — **COMPLETE**

**Goal:** Land the work that was already in motion under the prior, broader scope so contributors are not left
hanging, and so we enter the stricter phases with a clean slate.

**Landed in Phase 0:**

* **RTL support PRs.** The in-flight right-to-left work was reviewed, iterated, and merged.
* **Dictionary PR.** The offline dictionary lookup work was reviewed and merged.
* **Bookmarks** feature. First-class navigation markers in EPUBs.
* ~~**Transparent sleep screens.**~~ Shelved; not picked back up under the stricter phases.

Phase 0 is closed. The tighter scope in [SCOPE.md](SCOPE.md) is now fully enforced. "But it was on the old roadmap"
is not a valid argument for accepting a PR.

---

## Phase 1 - Consolidation, Footprint, and Multi-Device Support — **IN PROGRESS**

**Goal:** Reduce memory and flash usage, clean up the codebase, and land the SDK / HAL generalization work so
CrossPoint runs cleanly on ESP32-based e-reader hardware beyond Xteink (X3 / X4), including ESP32-S3 class devices.

**Focus areas:**

* DRAM and heap fragmentation reduction across the reader core.
* Flash footprint reduction (dead code, redundant strings, oversized tables).
* Refactors that tighten the HAL / SDK boundary.
* Pluggable per-device SDK layers (display, input, storage, battery) and per-device build configuration without
forking the reader core.
* Documentation for adding a new ESP32 e-reader target.
* E-ink driver refinement (ghosting, partial update behavior).

**Closed during this phase:** new themes built into firmware, new external network connectors (sync engines, cloud
storage, remote file access).

---

## Phase 2 - Languages, Fonts, and Themes

**Goal:** With the codebase smaller and portable, make reading great in every language: multi-language support,
better font support with custom fonts, UI translations, and themes loaded from the SD card instead of consuming
flash.

**Focus areas:**

* Multi-language reading support (underserved languages, complex script support where realistic on ESP32 hardware).
* Better font support and custom fonts.
* UI languages and localization.
* Moving themes off-firmware to SD-loaded assets (see SCOPE.md Section 6).
* **Moving hyphenation files off-firmware.** Hyphenation rules vary per language and the files are large (German
alone is ~200KB). Today these eat flash budget that should be available for the reader core. The plan is to build
a downloader analogous to the existing font downloader and store the dictionaries on SD / SPIFFS, loading on
demand. This unlocks better hyphenation for long-word languages (German, Finnish, Norwegian, etc.) without paying
the flash cost up front.

This phase depends on Phase 1 cleanup landing first; otherwise we generalize a moving target.

---

## Out of Roadmap

The following are explicitly *not* on the roadmap. They may live in other CrossPoint forks; they will not be picked
up here:

* Interactive apps (games, calculators, notepads).
* Writing / authoring tools.
* Active connectivity features (RSS, news, browsers).
* PDF rendering as a first-class format.

See [SCOPE.md](SCOPE.md) for the full rationale.

---

## How This Roadmap Changes

* Phase boundaries are decided by maintainers, not by individual PRs.
* If a phase needs to be extended or an item carried over, that is documented here with a short note.
* Proposals for new phases or reordering should go through a Discussion first.
Loading
Loading