Commit 0de623e
Release v1.5.0
* feat(epub): native <ruby> support for Chinese, Japanese (crosspoint-reader#2665)
* fix: avoid Arduino HEX macro collision
* fix: free SD font caches before epub relayout
* chore: update freeink-sdk
* chore: Migrate Settings/State onto PersistableStore
Co-authored-by: Uri Tauber <uritaube@gmail.com>
* feat: unified Text Settings screen with live preview (crosspoint-reader#2605)
Co-authored-by: Uri Tauber <uritaube@gmail.com>
(cherry picked from commit 4e41bf6)
* fix: Move sunlight fading fix setting to different group (crosspoint-reader#2689)
Relocate STR_SUNLIGHT_FADING_FIX from the touch reader controls group to
the front button orientation group in the settings filter logic.
Sunlight fix was accidentally being hidden on non-touch where it should
have been hidden on touch instead. Closes crosspoint-reader#2030
* feat: cjk UI font fallback (crosspoint-reader#2521)
* Optimize font cache by persisting data across scopes
Keep loaded font data (intervals/glyphs/bitmaps/kern) across PrewarmScopes instead of clearing it. This allows idle prewarm of page N+1 to serve the actual page turn with zero SD reads when the mini cache already covers all requested codepoints. Add miniMetadataOnly flag to track bitmap availability and miniHysteresisPending to limit underuse hysteresis evaluation to once per rebuild. Remove freeStyleMiniKern call that was forcing reallocation every page.
* fix: Warp around in Percent Selection (crosspoint-reader#2677)
## Summary
Address request
crosspoint-reader#2659
---
### AI Usage
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? _**< NO >**_
* fix: avoid X3 Quick Resume flashes (crosspoint-reader#2698)
* feat(epub): native <ruby> support for Chinese, Japanese (crosspoint-reader#2665)
Co-authored-by: Julia Nguyen <julia@uxj.io>
* Add capacitive home key support to HalGPIO
Co-authored-by: Julia Nguyen <julia@uxj.io>
* Make frontlight panel a dismissible overlay
Co-authored-by: Julia Nguyen <julia@uxj.io>
* Reduce horizontal padding in settings tab bar
Tighten horizontal insets from 4 to 2 pixels to prevent wide labels like "Controls" from truncating to ellipsis at large UI scales. The four equal slots share the tab band, so reducing the pill width allows more room for label text while maintaining vertical padding for proper pill height.
* Add X4 Pro power button double-click frontlight toggle
Co-authored-by: Julia Nguyen <julia@uxj.io>
* Add long-press gesture support for touch interactions
Co-authored-by: Julia Nguyen <julia@uxj.io>
* test: add X4 Pro simulator environment
* fix(i18n): add missing strings in PT-PT translation (crosspoint-reader#2701)
* feat: simulate X4 Pro home key
* feat: move frontlight reader tabs to bottom
* fix: extend reader tabs to touch edge
* chore: small Italian translation fixes (crosspoint-reader#2703)
* feat: allow full-screen reader vertical swipes
* fix: add touch controls for nearby transfer offers
* feat: Add UC8279 panel controller detection for X3 devices (crosspoint-reader#2707)
(cherry picked from commit 1d98ce1)
* fix: ignore ambiguous EPUB guide text so books open at the right location (crosspoint-reader#2716)
* fix: Lower TLS minimum free memory threshold to 35KB for kosync (crosspoint-reader#2719)
* feat: point-size font selection (crosspoint-reader#2720)
* fix: return text settings focus to active tab
commit 447758c622131da551380606b6b6e17af1f782b0
Author: Julia Nguyen <julia@uxj.io>
Date: Sat Jul 25 18:51:36 2026 -0400
fix: stop text settings back from closing parent menu
commit 3fca47bca913b3465d53d2c0af5b7f67cf56847f
Author: Julia Nguyen <julia@uxj.io>
Date: Sat Jul 25 18:51:27 2026 -0400
fix: hide reader home icon on non-touch devices
* fix: preserve short button presses in low-power mode
* fix: preserve custom font ligatures (crosspoint-reader#2673)
* docs: update dictionary docs
* docs: Add StarDict sources list
* fix: show receiving screen before accepting nearby transfer
* chore: changelog cleanup
* fix: add on-screen buttons in nearby file transfer for touch devices
* fix: allow full-screen reader page swipes
* chore: changelog cleanup
* Revert "feat: unified Text Settings screen with live preview (crosspoint-reader#2605)". This feature doesn't map cleanly to Crossink's expanded text features as-is and needs more design thought before merge.
This reverts commit 48248f2.
* test: repair malformed section-break EPUB fixture (crosspoint-reader#2728)
* chore: Update czech.yaml (crosspoint-reader#2726)
* fix: translate BMP viewer error messages (crosspoint-reader#2730)
* fix: fixing german translation inconsistencies (crosspoint-reader#2702)
* feat: Add packages to nix dev shell required for clang-format-fix and… (crosspoint-reader#2695)
* fix: add touch controls for filename conflicts during nearby file transfer
* docs: add nearby file transfer docs
* fix: ignore ambiguous EPUB guide text so books open at the right location (crosspoint-reader#2716)
(cherry picked from commit dde7e03)
* fix: name dictionary lookup failures (low-memory vs decompress vs read) instead of 'Not found' (crosspoint-reader#2706)
* fix: bind settings labels to enum values (crosspoint-reader#2644)
* docs: explain EPUB indexing methods
* fix: map reading stats hints to assigned buttons (fixes issue 411)
* docs: document EPUB word spacing
* fix: TextSettingsActivity default to selected font (crosspoint-reader#2739)
* fix: align Lyra header battery indicator
* fix: allow switching dictionary after misses
* fix: convert icons to lucide
* feat: UI and touch enhancements
* chore: update freeink sdk to allow virtual list scrolling
* feat: add footnotes header and defer dictionary check until touch lookup gesture
* docs: Add instructions to fix a bricked Xteink (crosspoint-reader#2622) (crosspoint-reader#2682)
* fix: dictionary and UI updates for touch devices
* fix: treat <br> in CJK flowing text as a paragraph separator (crosspoint-reader#2710)
* perf: drop all-empty ruby vectors from TextBlock (crosspoint-reader#2772)
* chore: remove redundant wolfSSL TLS defines (crosspoint-reader#2727)
## Summary
* **What is the goal of this PR?**
* Remove the macro-redefinition warning storm from the normal ESP32-C3
build
without changing enabled TLS features.
* **What changes are included?**
* Stop repeating four TLS feature macros already enabled by
Arduino-wolfSSL's `user_settings.h` when `WOLFSSL_TLS13` is set.
* Document which configuration layer owns those features.
## Scope Check
- [x] I have read SCOPE.md and ROADMAP.md.
- [x] This PR is **not** a new built-in theme.
- [x] This PR is **not** a new external network connector.
- [x] This PR is **not** an interactive app, writing tool, browser,
media, or
PDF feature.
- [x] No issue or pending PR removes these redundant definitions.
- [x] This PR does not touch `freeink-sdk/`, `lib/hal/`, bootloader,
OTA, or
recovery code.
## Additional Context
`HAVE_TLS_EXTENSIONS`, `HAVE_SUPPORTED_CURVES`, `HAVE_HKDF`, and
`WC_RSA_PSS` remain enabled by the installed Arduino-wolfSSL
configuration.
This removes duplicate command-line definitions; it does not disable
those
features.
Validation:
- Full ESP32-C3 `default` rebuild passed.
- Reported size: 52,028 bytes RAM and 5,505,149 bytes flash.
- The wolfSSL macro-redefinition warnings are gone.
- The only remaining warning in that build was an unrelated deprecated
`NetworkClient::flush()` call inside the vendored WebSockets library.
- `git diff --check`.
Memory/flash impact: no intentional change. The effective preprocessor
feature
set is unchanged.
---
### AI Usage
Did you use AI tools to help write this code? **YES**
AI tools were used to trace the duplicate definitions to the library
configuration and compare the full build output before and after
cleanup.
## Emulator disclosure
The ESP32-C3 firmware was compiled locally and the warning output was
checked on Intel macOS. Runtime smoke testing used the desktop emulator;
this PR was not flashed to a physical X3 or X4.
* chore: update freeink sdk
* fix: Gyro not powering down on x3 and newer x4 battery latch issues (crosspoint-reader#2774)
Removes X3ProbeResult struct and associated I2C device detection
functions (probeBQ27220Signature, probeDS3231Signature,
probeQMI8658Signature) along with helper function readI2CReg8 in favor
of an SDK driven device detect API
* fix: connect strikethrough line across words
* perf: skip ruby scratch allocations on ruby-less lines (crosspoint-reader#2735)
* fix: derive file-transfer WebSocket port from HTTP (crosspoint-reader#2729)
## Summary
* **What is the goal of this PR?**
* Preserve the firmware's adjacent HTTP/WebSocket port contract when the
web
UI is served from a mapped host port in the desktop simulator.
* **What changes are included?**
* Use the current page's HTTP port, defaulting to 80 on-device.
* Connect WebSocket uploads to the next port instead of always using
host
port 81.
## Scope Check
- [x] I have read SCOPE.md and ROADMAP.md.
- [x] This PR is **not** a new built-in theme.
- [x] This PR is **not** a new external network connector.
- [x] This PR is **not** an interactive app, writing tool, browser,
media, or
PDF feature.
- [x] The current file-transfer page does not handle simulator port
mapping and
no pending PR fixes it.
- [x] This PR does not touch `freeink-sdk/`, `lib/hal/`, bootloader,
OTA, or
recovery code.
## Additional Context
On hardware the page is served from port 80 and WebSocket remains port
81, so
device behavior is unchanged. In the simulator, a page served from 8080
now
uses 8081; a configured 18080 listener uses 18081.
Validation:
- Built the real CrossPoint file-transfer server in the simulator.
- Loaded the page through `http://127.0.0.1:18080/`.
- Verified a WebSocket upgrade on port 18081 returns HTTP 101.
- Exercised WebSocket upload progress and the HTTP fallback path.
- `git diff --check`.
Memory impact: no firmware heap allocation is added. The change is
JavaScript
inside the existing compressed web asset.
---
### AI Usage
Did you use AI tools to help write this code? **YES**
AI tools were used to reproduce the browser/simulator port mismatch and
verify
the HTTP and WebSocket listeners together.
## Emulator disclosure
The mapped-port HTTP/WebSocket behavior was reproduced and validated
with the desktop emulator on Intel macOS. The on-device port-80/81
behavior was established from the unchanged firmware contract; no
physical device was used for runtime validation.
* build: simulate web server
* fix: Lower TLS minimum free memory threshold to 35KB for kosync (crosspoint-reader#2719)
(cherry picked from commit 1cf265a)
* fix: preserve custom font ligatures (crosspoint-reader#2673)
(cherry picked from commit 9ec7767)
* docs: Add StarDict sources list
(cherry picked from commit 9cff12b)
* test: repair malformed section-break EPUB fixture (crosspoint-reader#2728)
(cherry picked from commit b25e57d)
* feat: Add packages to nix dev shell required for clang-format-fix and… (crosspoint-reader#2695)
(cherry picked from commit ef3d980)
* fix: name dictionary lookup failures (low-memory vs decompress vs read) instead of 'Not found' (crosspoint-reader#2706)
(cherry picked from commit 087c3da)
* fix: preserve paragraph spacing after EPUB br tags
Co-Authored-By: Julia Nguyen <julia@uxj.io>
* perf: drop all-empty ruby vectors from TextBlock (crosspoint-reader#2772)
(cherry picked from commit 52ff942)
* chore: remove redundant wolfSSL TLS defines (crosspoint-reader#2727)
## Summary
* **What is the goal of this PR?**
* Remove the macro-redefinition warning storm from the normal ESP32-C3
build
without changing enabled TLS features.
* **What changes are included?**
* Stop repeating four TLS feature macros already enabled by
Arduino-wolfSSL's `user_settings.h` when `WOLFSSL_TLS13` is set.
* Document which configuration layer owns those features.
## Scope Check
- [x] I have read SCOPE.md and ROADMAP.md.
- [x] This PR is **not** a new built-in theme.
- [x] This PR is **not** a new external network connector.
- [x] This PR is **not** an interactive app, writing tool, browser,
media, or
PDF feature.
- [x] No issue or pending PR removes these redundant definitions.
- [x] This PR does not touch `freeink-sdk/`, `lib/hal/`, bootloader,
OTA, or
recovery code.
## Additional Context
`HAVE_TLS_EXTENSIONS`, `HAVE_SUPPORTED_CURVES`, `HAVE_HKDF`, and
`WC_RSA_PSS` remain enabled by the installed Arduino-wolfSSL
configuration.
This removes duplicate command-line definitions; it does not disable
those
features.
Validation:
- Full ESP32-C3 `default` rebuild passed.
- Reported size: 52,028 bytes RAM and 5,505,149 bytes flash.
- The wolfSSL macro-redefinition warnings are gone.
- The only remaining warning in that build was an unrelated deprecated
`NetworkClient::flush()` call inside the vendored WebSockets library.
- `git diff --check`.
Memory/flash impact: no intentional change. The effective preprocessor
feature
set is unchanged.
---
### AI Usage
Did you use AI tools to help write this code? **YES**
AI tools were used to trace the duplicate definitions to the library
configuration and compare the full build output before and after
cleanup.
## Emulator disclosure
The ESP32-C3 firmware was compiled locally and the warning output was
checked on Intel macOS. Runtime smoke testing used the desktop emulator;
this PR was not flashed to a physical X3 or X4.
(cherry picked from commit 5965dc6)
* fix: Gyro not powering down on x3 and newer x4 battery latch issues (crosspoint-reader#2774)
Removes X3ProbeResult struct and associated I2C device detection
functions (probeBQ27220Signature, probeDS3231Signature,
probeQMI8658Signature) along with helper function readI2CReg8 in favor
of an SDK driven device detect API
(cherry picked from commit 5713432)
* fix: restore spaces between CJK words (crosspoint-reader#2768)
* fix: clean image page after sync return (crosspoint-reader#2747)
* feat: Access text settings from epub reader (crosspoint-reader#2788)
* docs: replace contributing guides with development docs
* fix: Restrict CrossPoint position extension to official server (crosspoint-reader#2790)
* fix: updates to UI/UX of dictionary, clippings, and bookmarks
* fix: derive file-transfer WebSocket port from HTTP (crosspoint-reader#2729)
## Summary
* **What is the goal of this PR?**
* Preserve the firmware's adjacent HTTP/WebSocket port contract when the
web
UI is served from a mapped host port in the desktop simulator.
* **What changes are included?**
* Use the current page's HTTP port, defaulting to 80 on-device.
* Connect WebSocket uploads to the next port instead of always using
host
port 81.
## Scope Check
- [x] I have read SCOPE.md and ROADMAP.md.
- [x] This PR is **not** a new built-in theme.
- [x] This PR is **not** a new external network connector.
- [x] This PR is **not** an interactive app, writing tool, browser,
media, or
PDF feature.
- [x] The current file-transfer page does not handle simulator port
mapping and
no pending PR fixes it.
- [x] This PR does not touch `freeink-sdk/`, `lib/hal/`, bootloader,
OTA, or
recovery code.
## Additional Context
On hardware the page is served from port 80 and WebSocket remains port
81, so
device behavior is unchanged. In the simulator, a page served from 8080
now
uses 8081; a configured 18080 listener uses 18081.
Validation:
- Built the real CrossPoint file-transfer server in the simulator.
- Loaded the page through `http://127.0.0.1:18080/`.
- Verified a WebSocket upgrade on port 18081 returns HTTP 101.
- Exercised WebSocket upload progress and the HTTP fallback path.
- `git diff --check`.
Memory impact: no firmware heap allocation is added. The change is
JavaScript
inside the existing compressed web asset.
---
### AI Usage
Did you use AI tools to help write this code? **YES**
AI tools were used to reproduce the browser/simulator port mismatch and
verify
the HTTP and WebSocket listeners together.
## Emulator disclosure
The mapped-port HTTP/WebSocket behavior was reproduced and validated
with the desktop emulator on Intel macOS. The on-device port-80/81
behavior was established from the unchanged firmware contract; no
physical device was used for runtime validation.
* fix: restore spaces between CJK words (crosspoint-reader#2768)
(cherry picked from commit 9163149)
* fix: clean image page after sync return (crosspoint-reader#2747)
(cherry picked from commit dadc8ec)
* fix: Restrict CrossPoint position extension to official server (crosspoint-reader#2790)
(cherry picked from commit 2ceeecc)
* fix: keep reader settings clear of landscape button hints
* fix: order languages by native name instead of language code (crosspoint-reader#2803)
* fix: improve File Transfer menu
* docs: update device guidance
* fix: prevent CSS rule OOM reboot (issue 423)
* fix: add epub section splitting toggle
* fix: Save text settings immediately on each change (crosspoint-reader#2806)
* fix: Properly power down SD power rails on x3 (crosspoint-reader#2808)
Fixes a regression in the sticky device support that lumped GPIO13 into
a device check that never powered down the SD rails on this device.
* fix: orient dictionary navigation buttons (crosspoint-reader#2749)
* chore: update freeink sdk
* make OptionPopup orientation-aware
* fix: avoid duplicate OTA update actions (crosspoint-reader#2807)
* fix: port touch UI compatibility updates
* fix: Replace vector with deque for text token storage (crosspoint-reader#2814)
* fix: dictionary lookup OOM on .dict.dz definitions (crosspoint-reader#2791)
* perf: open dictionary index files once per lookup (crosspoint-reader#2733)
* perf: check dictionary sidecar freshness once per open
needsIndex() opens .idx and .qidx and re-reads the sidecar header on every
call, and DictionaryWordSelectActivity called it once per tapped word rather
than once per dictionary open. A lookup therefore cost 4 SD opens and 2
std::string path temporaries, not the 2 and 0 the previous change set out to
achieve.
Ask needsIndex() once, inside the same guarded block that opens the
dictionary, and feed the build result back so a successful build stops
re-triggering while a failed one still retries on the next word.
Reimplement needsIndex() on openSession() so the "is the sidecar usable?"
rule lives in one place rather than two that have to be kept in step. This
is behaviour-preserving for everything buildIndex() can produce: it always
writes at least one sample (entry 0) and removes the file on failure, so
sampleCount == 0 means absent, stale or corrupt, all of which rebuild. The
one divergence is an improvement -- a corrupt sidecar with a valid magic
previously reported fresh and then full-scanned every lookup forever, and
now rebuilds once.
Also make the open()-time length bound a compile-time constant instead of
two runtime strlen() calls, and correct the buildPath() comment, which
claimed a lookup allocates nothing at all -- cleanWord(), stemVariants() and
the matched headword all still do.
* fix: show more of truncated file names
* fix: refresh dashboard progress after reading
* fix: various UI fixes
Squashed commit of the following:
commit 50e5029228cbd4ff1a337c369f432a3996fc8979
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 08:46:39 2026 -0400
fix: restore auto turn after reader restart
commit ef1d90e001b055a8afde952d3e2e2cf4db954af9
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 08:44:31 2026 -0400
fix: add touch back button to file transfer
commit 68f2adaae8a0fc1a0a023b9e8b19a4bbc2754704
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 08:41:12 2026 -0400
fix: correct landscape dictionary button hints
* fix: refresh UI scale fonts immediately
* fix: order languages by native name instead of language code (crosspoint-reader#2803)
(cherry picked from commit 3eeb6ac)
* make OptionPopup orientation-aware
(cherry picked from commit b215ed8)
* fix: avoid duplicate OTA update actions (crosspoint-reader#2807)
(cherry picked from commit 74065f1)
* fix: Replace vector with deque for text token storage (crosspoint-reader#2814)
(cherry picked from commit d0b70b3)
* chore: update freeink sdk
* fix: restore option popup navigation build
* perf: prewarm next-page SD font glyphs
Adapted from crosspoint-reader commit 4d19d38.
Co-authored-by: Justin Mitchell <justin@jmitch.com>
* perf: reuse dictionary files across lookup probes
Adapted from crosspoint-reader commits bf253b1 and 5933da8.
Co-authored-by: William Floyd <william.floyd@modopayments.com>
Co-authored-by: Uri Tauber <uritaube@gmail.com>
* perf: batch web file list responses
Adapted from crosspoint-reader commit 302c077.
Co-authored-by: Justin Mitchell <justin@jmitch.com>
* perf: share one static bidi scratch buffer to save ~1.5 KB RAM (crosspoint-reader#2554)
* chore: update freeink sdk
* fix: apply book style setting before EPUB load
* fix: preserve clipping highlights across font changes (issue 426)
* chore: prepare v1.5.0 release
* fix: fall back to plain text for malformed dictionary HTML
* fix: keep clipping markers visible in dark mode (issue 431)
* fix: avoid file list callback allocation (issue 432)
* fix: restore dictionary left and right button hints
* fix: improvements to epup opening pipeline
Squashed commit of the following:
commit 0a4cfbabdee5bc8caf4d1b9f43350fe2f36b12a0
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:31:44 2026 -0400
docs: document EPUB loading hardening
commit a0f7b1084aac240234b1156ba58592e4d7066485
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:18:05 2026 -0400
fix: make sleep EPUB allocation fallible
commit 726d84cfc6d26a4e887f19eae7876a1d87b35369
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:16:25 2026 -0400
fix: report EPUB open failures
commit 00d7bc248718e0c5870c9e4522692b9106cbabee
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:11:21 2026 -0400
perf: defer optional EPUB location metadata
commit 05bca368ce716655478d0b8d9e161e234c0a4694
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:09:09 2026 -0400
fix: make EPUB location allocation fallible
commit 422612ae49592ac89db80d59d0e553fabf41f1a5
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:06:58 2026 -0400
fix: align sleep EPUB load memory timing
commit 7aefaaf75c05b7d3949276558066289c38bb7201
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:06:50 2026 -0400
refactor: snapshot EPUB settings before load
commit 398c98d11cae492a182d8bfbc32e7f6b9e43a2c2
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:05:13 2026 -0400
fix: retry sleep page partial EPUB builds
commit fc59765b079887229411dc1b85cb9057277bfdd6
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:03:46 2026 -0400
refactor: centralize EPUB section fallbacks
commit e9bb58cdbe236c2b2c50b0b1d0c16a761b6c0c6e
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:02:08 2026 -0400
fix: classify EPUB setup allocation failures
commit 805767f9277b90d5037649242f15eb6f06f9c0a2
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:01:28 2026 -0400
perf: inspect EPUB CSS cache without hydration
commit afcaf1faec4ec7288dd9155c538777669b8c587b
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 13:58:07 2026 -0400
fix: skip unused EPUB stylesheet discovery
* fix: match SD card font generation to built-in fonts and add dictionary font generation script
* fix: match SD card font generation to built-in fonts and add dictionary font generation script
* fix: preserve dictionary screenshot context (issue 437)
* fix: guarantee screenshot confirmation border (issue 437)
* build: update version labels
* fix: avoid crashing during a clock sync (issue 436)
* fix: make EPUB sync positions content-based (crosspoint-reader#2805)
* fix: CJK dictionary selection and lookups not working correcctly
* build: honor local PlatformIO version override
* Make bookmarks survive re-pagination
Ties bookmarks to the actual text on the page rather than to a page number. Page numbers shift whenever the book gets re-laid-out — changing font size, margins, line spacing, or rotating the screen — which could previously land you on the wrong spot.
This is a followup of crosspoint-reader#2805, making bookmarks use the same mechanism. Several minor improvments ride along.
* fix: hide unsupported web settings
* fix: open reading stats date editor
* perf: various performance improvements, a few borrowed from Sichroteph/YACP
Squashed commit of the following:
commit 2d4ec2c6826b61395eb16ebafa15585e59bc5d6c
Author: Julia Nguyen <julia@uxj.io>
Date: Sat Aug 1 22:28:06 2026 -0400
fix: avoid duplicate uncached EPUB image display
commit 946ccf003d90c71c308c26adb912ce79049e3193
Author: Julia Nguyen <julia@uxj.io>
Date: Sat Aug 1 13:55:40 2026 -0400
fix: persist progress after EPUB relayout
Track the pagination value alongside the debounced EPUB position and force one save after a live relayout has rendered. This keeps ordinary page turns batched while ensuring font and layout changes cannot leave stale pagination on disk.
commit f0271820e7a2fc3a11b349c186065678f61649bd
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:34:12 2026 -0400
perf: avoid repeated next-chapter probes
Adapt the one-page/direct-jump trigger and successful-prefetch marker from Sichroteph/YACP commit 3f3c5fc42e794c021edb9832856ef98c2d2065b9 under the MIT license. Preserve CrossInk full-section-only behavior, fallible Section allocation, heap gates, render-mode fallbacks, and SdFat file-lifetime rules.
Co-authored-by: Totofaki <Christophe.Jeannette@gmail.com>
commit 828dfb1ba0c737d204ea88761f945daafa4a8f87
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:32:26 2026 -0400
perf: reuse EPUB grayscale strip buffer
Adapt the reusable grayscale-strip lifecycle from Sichroteph/YACP commit 3f3c5fc42e794c021edb9832856ef98c2d2065b9 under the MIT license. The port keeps CrossInk async plane rendering and releases the 8 KB fallback before section builds, prefetch, and teardown.
Co-authored-by: Totofaki <Christophe.Jeannette@gmail.com>
commit a5fa25e6c1aedfabbbabc309d2d6847b643ea9a2
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:25:30 2026 -0400
perf: debounce reader progress writes
Adapt the allocation-free save policy and reader integrations from Sichroteph/YACP commit 3f3c5fc42e794c021edb9832856ef98c2d2065b9 under the MIT license. CrossInk-specific handling keeps explicit saves immediate, preserves EPUB estimated page counts, and flushes pending progress before reader teardown.
Co-authored-by: Totofaki <Christophe.Jeannette@gmail.com>
commit 6be71d0c3703ce0e5e207ec756373e42ec1f6f17
Author: Julia Nguyen <julia@uxj.io>
Date: Fri Jul 31 14:17:40 2026 -0400
perf: defer SD font discovery
Adapt the lazy-discovery concept from Sichroteph/YACP commit 3f3c5fc42e794c021edb9832856ef98c2d2065b9 while preserving CrossInk saved-font loading and CJK UI fallbacks.
Co-authored-by: Totofaki <Christophe.Jeannette@gmail.com>
* fix: prevent dictionary suggestion lookup freezes
* fix: landscape button labels in dictionary
* fix: clear reader menu headings from landscape hints
* fix: avoid web task watchdog timeout (issue 432)
* fix: prevent bionic letter overlap (issue 442)
* fix: load EPUB locations before reader handoff
x-locations.json loading was being deferred, which could block user input. It has been moved back to the epub load lifecycle, before entering the reader.
* fix: make EPUB sync positions content-based
ported from crosspoint PR crosspoint-reader#2805
Co-authored-by: Thiago Kenji Okada <thiagokokada@gmail.com>
* fix: avoid duplicate EPUB image display
* fix: limit EPUB image clean refresh to sync return
* docs: update docs for touch devices
* fix: restore book cover placeholder icon
* fix: preserve X3 power-button wake (issue 445)
* fix: allow clipping selection past arbitrary chapter-end limit (issue 449)
* fix: localize Russian dashboard stats (issue 450)
* fix: stream table rendering to reduce maxAlloc required
* fix: preserve button clicks after clearing recent book cache
button clicks after clearing a book cache from recent books would get swallowed, making the first click get ignored.
* fix: stabilize EPUB indexing and prioritize reader input
* Add NVS-backed wake verification before SD mount
Verify power button wake reason early in boot, before mounting SD card. Mirror the 'short press = sleep' setting to NVS so wake verification can run without waiting for SD-based settings. This reduces boot time for accidental wakes and ensures consistent hold-duration requirements regardless of SD mount delays.
* chore: update freeink sdk
includes draft changes for new x3 display drivers and possible fix for sleep screen ghosting
* feat: custom dictionary font and size along with dictionary performance optimizations
* refactor: remove stale web watchdog resets
* fix: improve dark clipping highlight contrast (issue 431)
* fix: avoid XTCH settings memory errors (issue 457)
* chore: update freeink sdk
* fix: restore precise cached EPUB sync positions
* docs: add dictionary folder structure example
* fix: keep saved clipping text legible in dark mode
* chore: use GitHub Actions token for releases
* fix: hide dictionary font options without dictionaries and update dictionary docs
* feat: add global dictionary font setting
* ci: update github token
* fix: clear inactive dictionary button hints
* fix: avod manage fonts screen from crashing
* fix: honor side-button layout in dictionary suggestions
* fix: load Wi-Fi credentials on first access (issue 421)
* perf: avoid copying reader settings at construction
* fix: cache EPUB books without covers (issue 465)
* fix: distinguish missing EPUB covers (issue 465)
* fix: preserve EPUB page on reopen (issue 466)
* fix: improve custom dictionary font persistence
* fix: reflow dictionary font after switching dictionaries
* fix: improve x4 screen refreshes after using wifi (issue 470 and 462)
* fix: preserve wake button release before sleep (issue 453)
* fix: consume wake power release (issue 453)
* fix: bold book titles in recent books list and bookmarks/clippings
* fix: cleanly redraw home after a silent restart after wifi usage
* fix: align Lyra settings tab underline
* chore: update freeink sdk
* fix: guard dictionary lookup against low heap
* fix: retain dictionary lookup cache path
* chore: update bug report template
* fix: dictionary font falling back to reader font
* fix: speed up random sleep image selection (issue 473)
* fix: lend framebuffer during next chapter indexing (issue 475)
* fix: allow cancellation of silent full section pre-indexing
* fix: render EPUB overlay images above text
* fix: chained dictionary lookups showing missing glyph diamond
* fix: silent restart into Manage Fonts with a fresh heap
* fix: unify theme battery icons (fixes #471)
* chore: update freeink sdk
* Add USB host detection and battery poll on charge
Implement SOF-based USB host detection for ESP32-S3 boards without VBUS pin (X4 Pro) by monitoring USB-Serial-JTAG frame counter. Add periodic battery percentage polling every 60 seconds when USB is connected to trigger display updates as battery charges.
(cherry picked from commit 3c4377e)
* fix: size translated-label buffers for UTF-8
Adapted for CrossInk from upstream commit cc96e3c (crosspoint-reader#2850).
* fix: recognize watchdog-triggered resets as panics
Adapted for CrossInk from upstream commit 53232ee (crosspoint-reader#2830).
* fix(epub): prevent ruby overflow in justified CJK text
Adapted for CrossInk from upstream commit 046827f (crosspoint-reader#2781), preserving the arena-backed layout path and sparse ruby cache format.
* fix: make Wi-Fi credential storage thread-safe
Adapted for CrossInk from upstream commit c507e54 (crosspoint-reader#2834). CrossInk already validates obfuscated payloads, so this retains that format while adding synchronized snapshots, thread-safe key initialization, and bounded decoding.
* fix: reject firmware for a different chip family
Adapted for CrossInk from upstream commit e00f595 (crosspoint-reader#2880). The OTA path buffers the complete chip-ID header before its first flash write.
* fix: serialize KOReader network time sync (issue 480)
* fix: load end-of-book suggestions before moving
* chore: update freeink sdk
* fix: wrap long UI error messages
* fix: resolve dictionary word selection cppcheck warnings
* fix: use selected image for sleep cover
* fix: release reader font cache before overlay PNG
* chore: clang-format
* fix: switch book menu tabs on held navigation (issue 483)
* chore: remove Sticky side button diagnostics
* fix: include silent restart helper in reader options
* fix: build v1.5 default and sticky releases
* chore: prepare for release
* ci: update build scripts
* docs: update docs for release
* docs: add link to inky
---------
Co-authored-by: Phạm Bình An <111893501+brianhuster@users.noreply.github.com>
Co-authored-by: Uri Tauber <uritaube@gmail.com>
Co-authored-by: Paul Delestrac <40175004+PaulDelestrac@users.noreply.github.com>
Co-authored-by: Justin Mitchell <justin@jmitch.com>
Co-authored-by: Tsz Ho Sze <szetszho@users.noreply.github.com>
Co-authored-by: Totofaki <Christophe.Jeannette@gmail.com>
Co-authored-by: CookieCaptainD <65847023+CookieCaptainD@users.noreply.github.com>
Co-authored-by: Matteo Scopel <matteo@scopel.email>
Co-authored-by: Thiago Kenji Okada <thiagokokada@gmail.com>
Co-authored-by: Leopoldo Pla Sempere <leopoldo.pla@treelogic.com>
Co-authored-by: Ing. Jan Kaláb <jan+github@kalabovi.org>
Co-authored-by: Bastian <391732+dasrecht@users.noreply.github.com>
Co-authored-by: Emily Marriott <emilylynmarriott@proton.me>
Co-authored-by: William Floyd <william.floyd@modopayments.com>
Co-authored-by: Paul Portocarrero <46283992+paulporto@users.noreply.github.com>
Co-authored-by: Eduard <ed.fruty@gmail.com>
Co-authored-by: Bob Vincent <pillarsdotnet@gmail.com>
Co-authored-by: winst0niuss <chumachenko.vadym@gmail.com>
Co-authored-by: Jesse Vincent <jesse@fsck.com>1 parent 54ba245 commit 0de623e
505 files changed
Lines changed: 75931 additions & 19472 deletions
File tree
- .claude
- .github
- ISSUE_TEMPLATE
- workflows
- bin
- docs
- contributing
- development
- include
- lib
- AppVersion
- DictHtmlRenderer
- EpdFont
- builtinFonts
- source
- NotoSansArabic
- scripts
- Epub
- Epub
- blocks
- converters
- css
- parsers
- FileIndex
- GfxRenderer
- HalClockSim
- include
- src
- I18n/translations
- InflateReader
- JpegToBmpConverter
- KOReaderSync
- Logging
- MemoryBudget
- Memory
- MiniBidi
- OpdsParser
- PngToBmpConverter
- Serialization
- Txt
- Utf8
- Xtc
- Xtc
- ZipFile
- hal
- miniz
- src
- third_party
- nix
- scripts
- site
- public
- scripts
- src
- layouts
- lib
- pages
- styles
- src
- activities
- boot_sleep
- browser
- home
- network
- reader
- settings
- util
- clippings
- components
- icons
- themes
- dashboard
- lyra
- minimal
- roundedraff
- network
- simulator
- util
- test
- clip_word_store
- combining_marks
- dict_layout
- minibidi_arabic
- stubs
- preview_block_locator
- reader_progress_save_debouncer
- stubs
- release_json_parser
- text_pool
- utf8_compose
- web/pages
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
5 | 9 | | |
6 | 10 | | |
7 | | - | |
| 11 | + | |
8 | 12 | | |
9 | | - | |
| 13 | + | |
10 | 14 | | |
11 | 15 | | |
12 | 16 | | |
| |||
23 | 27 | | |
24 | 28 | | |
25 | 29 | | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
26 | 43 | | |
27 | 44 | | |
28 | 45 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| 17 | + | |
17 | 18 | | |
18 | 19 | | |
19 | | - | |
| 20 | + | |
20 | 21 | | |
21 | 22 | | |
22 | 23 | | |
| |||
35 | 36 | | |
36 | 37 | | |
37 | 38 | | |
| 39 | + | |
38 | 40 | | |
39 | 41 | | |
40 | 42 | | |
| |||
48 | 50 | | |
49 | 51 | | |
50 | 52 | | |
| 53 | + | |
51 | 54 | | |
52 | 55 | | |
53 | 56 | | |
| |||
61 | 64 | | |
62 | 65 | | |
63 | 66 | | |
64 | | - | |
| 67 | + | |
65 | 68 | | |
66 | 69 | | |
67 | 70 | | |
| |||
85 | 88 | | |
86 | 89 | | |
87 | 90 | | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
88 | 104 | | |
89 | 105 | | |
90 | 106 | | |
| |||
This file was deleted.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
68 | | - | |
69 | | - | |
70 | | - | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
71 | 73 | | |
72 | 74 | | |
73 | 75 | | |
74 | 76 | | |
75 | 77 | | |
76 | | - | |
77 | | - | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
78 | 99 | | |
79 | | - | |
| 100 | + | |
80 | 101 | | |
81 | 102 | | |
82 | | - | |
| 103 | + | |
83 | 104 | | |
84 | 105 | | |
85 | 106 | | |
86 | 107 | | |
87 | 108 | | |
88 | | - | |
89 | | - | |
| 109 | + | |
| 110 | + | |
90 | 111 | | |
91 | 112 | | |
92 | 113 | | |
| 114 | + | |
93 | 115 | | |
94 | 116 | | |
95 | | - | |
| 117 | + | |
96 | 118 | | |
97 | | - | |
| 119 | + | |
98 | 120 | | |
99 | 121 | | |
100 | 122 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
| |||
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
31 | | - | |
| 32 | + | |
32 | 33 | | |
33 | | - | |
34 | | - | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
35 | 43 | | |
36 | 44 | | |
37 | 45 | | |
38 | | - | |
| 46 | + | |
39 | 47 | | |
40 | 48 | | |
41 | 49 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
60 | | - | |
| 60 | + | |
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
64 | | - | |
65 | | - | |
| 64 | + | |
| 65 | + | |
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
72 | | - | |
73 | | - | |
| 72 | + | |
| 73 | + | |
74 | 74 | | |
75 | 75 | | |
76 | 76 | | |
| |||
113 | 113 | | |
114 | 114 | | |
115 | 115 | | |
116 | | - | |
117 | | - | |
| 116 | + | |
| 117 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
80 | | - | |
| 80 | + | |
81 | 81 | | |
82 | 82 | | |
83 | | - | |
84 | | - | |
85 | | - | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
86 | 86 | | |
87 | 87 | | |
88 | 88 | | |
89 | 89 | | |
90 | 90 | | |
91 | | - | |
| 91 | + | |
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
| |||
102 | 102 | | |
103 | 103 | | |
104 | 104 | | |
105 | | - | |
106 | | - | |
| 105 | + | |
| 106 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
19 | 25 | | |
20 | 26 | | |
21 | 27 | | |
| |||
35 | 41 | | |
36 | 42 | | |
37 | 43 | | |
38 | | - | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
| 6 | + | |
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
| 11 | + | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
24 | 23 | | |
25 | 24 | | |
26 | 25 | | |
| |||
37 | 36 | | |
38 | 37 | | |
39 | 38 | | |
40 | | - | |
41 | | - | |
42 | | - | |
43 | | - | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
| |||
55 | 55 | | |
56 | 56 | | |
57 | 57 | | |
| 58 | + | |
58 | 59 | | |
59 | 60 | | |
60 | 61 | | |
| |||
106 | 107 | | |
107 | 108 | | |
108 | 109 | | |
109 | | - | |
| 110 | + | |
110 | 111 | | |
111 | 112 | | |
112 | | - | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
113 | 116 | | |
114 | 117 | | |
115 | | - | |
| 118 | + | |
116 | 119 | | |
117 | 120 | | |
118 | 121 | | |
| |||
131 | 134 | | |
132 | 135 | | |
133 | 136 | | |
134 | | - | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
135 | 141 | | |
136 | 142 | | |
137 | 143 | | |
| |||
150 | 156 | | |
151 | 157 | | |
152 | 158 | | |
| 159 | + | |
153 | 160 | | |
154 | 161 | | |
155 | 162 | | |
| |||
0 commit comments