CrossPoint 1.4 is mostly about things users don't see: tighter memory management, better stability under load, and a faster, more reliable SD layer. It also ships several long-requested features: EPUB bookmarks, RTL language support, Quick Resume, and a clock on the X3.
152 changes from 50 contributors, 32 of whom are new to the project.
EPUB Reading
- Bookmarks now work in EPUBs. Access it from the reader menu with
Toggle Bookmark. You can also set it as a Long-press action fromSettings > Controls > Long-press Menu. - Page turn speed and image quality improved on the X3 in AA mode
- Large images load faster and no longer freeze the reader
- Images no longer ghost onto the next page in AA mode
- SD font indexing and page turn speed improved
- Fixed missing images and broken footnote links
- Sub-chapter TOC navigation now lands at the correct anchor instead of jumping to page 0
- Cover images in OPF manifests are validated before use
- OPDS downloads prefer EPUB over KEPUB
- KOSync no longer glitches when syncing from the first page of a new chapter
- Added superscript, subscript, and horizontal rule (
<hr>) support
RTL Language Support
Right-to-left text is now supported in both the EPUB and TXT readers. Hebrew UI localization added.
Memory & Stability
- WiFi/LWIP teardown runs via a silent reboot that clears ~50KB of heap fragmentation. It routes you back where you were and looks like a screen refresh.
- Home screen cover cache reduced from ~52KB to ~16KB
- OTA install heap floor stays ~19KB during firmware downloads (was ~7.7KB)
- Tiled grayscale rendering drops peak allocation from ~114KB to ~82–90KB
- Fixed OOM crashes on books with thousands of ZIP entries
- CSS
resolveStylepath now does zero heap allocations — ~12,000 fewer per page render - Underline calculations skipped during font cache scans, cutting hundreds of SD reads on pages with heavy underline use
Fonts
Domitian and Libre Baskerville added to SD fonts. OpenDyslexic moved off flash, freeing ~30% of the flash space. The font picker now have a live preview pane that renders a sample in the currently highlighted font.
New Features
X3 Clock — Built-in clock with automatic time sync.
Themed Reader Menus — Reader menus follow the active theme.
Custom Sleep Timer — Free-entry field from 1 to 30 minutes (or never), replacing fixed presets.
Recent Books — Long-press to remove individual books. Option to auto-remove once a book is finished.
Quick Resume — Sleep setting that displays your last screen or page instead of a sleep image or cover.
What's changed
Features
- #1072 Themed reader menus — @CaptainFrito
- #1337 EPUB bookmarks — @vedi0boy
- #1590 Polish hyphenation support — @IjonFryderyk
- #1612 X3 clock display with DS3231 RTC and NTP sync — @juicecultus
- #1637 Swedish hyphenation — @steka
- #1658 Power button short press for quick access to footnotes — @santinilor
- #1700 RTL support in epub and txt readers — @Uri-Tauber
- #1808 Long-press Confirm launches KOReader sync from EPUB — @darkbublu
- #2016 Add the Domitian font family — @matteoscopel
- #2023 Make page turn naturally follow orientation — @jacksongoode
- #2032 Port crossink "read book move" feature to crosspoint — @mcrosson
- #2043 Add setting that allows removing books from recent list when read — @mcrosson
- #2045 Allow removing book from recent list — @mcrosson
- #2064 Seamless sleep/wake screens for displaying book pages during deep sleep — @Eloren1
- #2088 Add the Libre Baskerville font family — @matteoscopel
- #2089 Modify "Page as Sleep Screen" to "Quick Resume" options — @uxjulia
- #2105 Allow disabling side buttons in reader — @Joseph-DiGiovanni
- #2106 Tiled grayscale rendering to drop the storeBwBuffer peak — @jeremydk
- #2117 Port hr tag rendering from crossink — @uxjulia
- #2131
<sup>and<sub>support — @Uri-Tauber - #2139 Add image auto-cropping in web epub optimizer — @leecming82
- #2148 Implement CSS enumeration through OPF directory when missing from manifest — @latonis
- #2194 Add Spacing Modifier Letters range to font presets — @itsthisjustin
- #2206 Add custom sleep timer picker — @WuTofu
- #2214 Smooth progressive JPEG cover upscales in BMP conversion — @lpla
- #2280 Add Vietnamese glyph coverage to the built-in UI font — @jetaudio
- #2288 Support for Korean line breaks and glyph spacing — @itsthisjustin
- #2290 Add drag-and-drop to upload modal — @krunkosaurus
- #2349 Add live font preview pane to font selection screen — @PaulDelestrac
- #2393 Render grayscale epub images without text AA — @uxjulia
- #2394 Footnote returns to original position on deep sleep to avoid losing reading position — @ZephByte
Fixes
- #1480 Prefer epub format over derived formats when downloading from OPDS server — @jpirnay
- #1629 Return to the last selected menu location — @Uri-Tauber
- #1812 Update README.md to reflect the current state of crosspoint — @Uri-Tauber
- #1890 Use power button held time for shutdown logic — @marcinoktawian
- #1892 Clear cache when deleting folders in FileBrowserActivity — @WuTofu
- #1908 Silent-reboot on wifi activity exit to clear heap fragmentation — @jeremydk
- #1925 Jump page on hold in font family and language selection — @zgredex
- #1929 Handle fallbacks for advance table and prewarm — @leecming82
- #1943 Prevent card overflow on screens — @Kirillka8996
- #1947 Harden EPUB optimiser UI gating, size reporting, and picker teardown — @zgredex
- #1951 KOSync authentication with Calibre-Web-Automated — @drbourbon
- #1958 Characters from unsupported characterset are overlapping — @Uri-Tauber
- #1959 Prune books missing from SD card in recent books list — @mcrosson
- #1965 Several QoL updates for SD font's UI — @WuTofu
- #1973 Prepare SD card font caches from txt reader — @znelson
- #1977 Take orientation into account for border generation in ScreenshotUtil — @Disasm
- #1981 Navigate to TOC anchor when selecting sub-chapters — @Disasm
- #1985 Update URL-encoded image during EPUB optimization — @SimoneFelici
- #1990 Add documentation for USB-locked Xteink devices — @itsthisjustin
- #1991 Update documentation with new features and links — @itsthisjustin
- #2022 Bump open-x4-sdk to clear grayscale state after AA cleanup — @itsthisjustin
- #2033 Wire through silent restart clear resume state with SDK — @jeremydk
- #2034 USB serial logs now flow on cold+warm boot without jiggle — @jeremydk
- #2036 Silent-restart on exit from KOReader auth and OTA update — @jeremydk
- #2040 Close leaked resource handles — @sabraman
- #2058 Guard DC writes in JPEGDEC MCU_SKIP path — @jeremydk
- #2060 Stabilize deep sleep wake on USB power — @jeremydk
- #2062 Validate OPF cover items as images — @lpla
- #2063 Refresh Catalan, add Valencian locale, and complete Spanish clock strings — @lpla
- #2073 Even more deep-sleep fix (0 → 1) — @jeremydk
- #2074 Keep wifi OTA off the heap floor — @jeremydk
- #2092 Sleep from a WiFi activity instead of silent-rebooting — @jeremydk
- #2100 Improve edge case font/glyph handling — @itsthisjustin
- #2101 Preserve quick resume timeout preference — @uxjulia
- #2135 Serialize SdFat FsFile close through HalStorage mutex — @jeremydk
- #2137 SLEEP_TIMEOUT enum mismatch — @Uri-Tauber
- #2138 Fill the gap under the screen for the progress bar — @Eloren1
- #2161 BOOK_CACHE_VERSION jump — @Uri-Tauber
- #2188 Bookmark percentage always 0% and page number starts at 0 — @vedi0boy
- #2195 Section numbering in USER_GUIDE.md — @mateuscomh
- #2205 Redesign X3's UTC offset picker so it is easier to use — @uxjulia
- #2213 Avoid zip-wide CSS scan for large EPUBs — @uxjulia
- #2226 Fix ghosting on pages following images in grayscale — @itsthisjustin
- #2230 Replace full-image cache buffer with streaming band buffer to reduce memory usage — @itsthisjustin
- #2237 Skip underline calculations during font cache scan pass — @Uri-Tauber
- #2243 Long-press back should move to the start of chapter — @Uri-Tauber
- #2244 Fix section numbering and table of contents in USER_GUIDE.md — @mateuscomh
- #2245 KOReader sync drift when syncing at chapter start — @uxjulia
- #2249 Decode percent-encoded internal asset paths so assets render correctly — @uxjulia
- #2250 Apply progress bar offset from top instead of bottom edge — @Eloren1
- #2253 Crash on invalid font filename — @Uri-Tauber
- #2255 Scale SUP/SUB underline to match 50%-scaled glyphs — @SurprisedDuck
- #2271 Decode footnote href path before spine lookup — @uxjulia
- #2277 NFC-normalize EPUB text so NFD diacritics render correctly — @jetaudio
- #2298 Don't justify-stretch a leading no-break space — @SurprisedDuck
- #2303 Skip
<span>anchors — @Uri-Tauber - #2305 Prevent progress.bin corruption from interrupted writes — @peuic
- #2308 Resolve element XPath progress against visible body text — @uxjulia
- #2320 Restore first-line paragraph indentation — @Uri-Tauber
- #2323 Compile error: duplicate _order values found — @Uri-Tauber
- #2324 Hanging indent causes overlapping words — @znelson
- #2341 Swap reader menu navigation direction in CCW/inverted — @TheCyberRonin
- #2352 Add missing HTML 4.01 named entities — @rafaelmsse
- #2357 Enable Shift key for URL keyboard input — @nnnkit
- #2368 Submodule pointer — @Uri-Tauber
- #2371 Use STR_SELECT instead of STR_OPEN in bookmark button hint — @nnnkit
- #2372 Several bookmarks UX improvements — @Uri-Tauber
- #2373 Correct behaviour for prev/next side buttons — @Uri-Tauber
- #2379 Automatically connect to wifi for clock sync — @uxjulia
- #2382 Flush displaced anchor before overwrite — @kygia
Internal
- #1832 Add utils for non-throwing memory allocation and scoped cleanup — @znelson
- #1868 Consolidate theme rendering into ThemeMetrics — @Uri-Tauber
- #1875 Unify book cache clearing for epub, txt, and xtc files — @WuTofu
- #1940 Update delete endpoint reference — @sabraman
- #1948 Add 3-minute sleep option — @WuTofu
- #1961 Eliminate relative path includes — @znelson
- #1962 Remove SdCardFontGlobals.h — @znelson
- #1975 Remove unused icon header files — @znelson
- #2035 Shrink HomeActivity cover cache from 48KB framebuffer to 16KB region — @jeremydk
- #2055 Bump open-x4-sdk submodule for faster page turns on X3 — @itsthisjustin
- #2071 Remove FUNDING.yml — @daveallie
- #2072 Add funding badge for contributors in README — @itsthisjustin
- #2075 Move HttpDownloader onto esp_http_client — @jeremydk
- #2076 Route OTA version check through HttpDownloader — @jeremydk
- #2093 Right-size memory — @orbisai0security
- #2110 Update presets on sd-card-fonts — @borisfaure
- #2134 Update USER_GUIDE.md for v1.1.0–v1.3.0 features — @jhuebel
- #2140 Minor cleanup flagged by newer gcc — @znelson
- #2141 Drop FsFile alias, use HalFile in downstream code — @znelson
- #2142 Cache PlatformIO packages between runs — @znelson
- #2144 Migrate unit tests to gtest, integrate with CI — @znelson
- #2154 Pin PNGdec lib_dep to 1.1.6 — @znelson
- #2169 Sync book.bin/section.bin version refs to source — @angad-kandhari
- #2212 Add Claude Code contributor skills for firmware code quality — @jeremydk
- #2223 Remove unused sleep timer interval strings — @wlhlm
- #2231 Move OpenDyslexic from flash to SD — @Uri-Tauber
- #2262 Dedupe wifi scan in-place without std::map — @znelson
- #2263 Minimize string allocations in CSS parsing — @znelson
- #2268 Add t5s3 fork — @Uri-Tauber
- #2325 Drop redundant self-class prefix on applyDirectionToEntry — @znelson
- #2331 Use Noto Sans as punctuation fallback when generating downloadable SD fonts — @uxjulia
Languages
- #1970 Update Italian translation — @alan0ford
- #2011 Update Spanish — @mvidelatraduc
- #2017 Update Russian translation — @muhas
- #2068 Hebrew localization — @Uri-Tauber
- #2090 Update Swedish translations and remove unused strings — @steka
- #2094 Normalize Wi-Fi spelling across remaining locales — @lpla
- #2095 Fix the Italian translation — @matteoscopel
- #2173 Russian translate for new string — @muhas
- #2187 Update font size translation in French YAML — @Djef0o
- #2197 Swedish translation for strings added by #1337 and #2105 — @steka
- #2203 Complete Spanish, Catalan, and Valencian strings — @lpla
- #2207 Update the Italian translation — @matteoscopel
- #2217 Russian translate for new strings — @muhas
- #2218 New Italian fixes — @matteoscopel
- #2224 Update German translation — @wlhlm
- #2233 Refresh cache formats and web server workflows — @lpla
- #2251 Slovak translation — @neresus
- #2252 Small Italian fixes — @matteoscopel
- #2269 German translation for STR_INVERTED — @Uri-Tauber
- #2279 Add Vietnamese translation — @jetaudio
- #2309 Russian new string — @muhas
- #2315 German translation for STR_INVERTED — @Uri-Tauber
- #2342 Localize home empty-state strings — @krunkosaurus
- #2354 Ukrainian translation — @KymAndriy
- #2374 Russian new string — @muhas
- #2376 Update the Italian translation — @matteoscopel
- #2384 Update Spanish, Catalan, and Valencian translations — @lpla
New Contributors
- @IjonFryderyk made their first contribution in #1590
- @alan0ford made their first contribution in #1970
- @marcinoktawian made their first contribution in #1890
- @Kirillka8996 made their first contribution in #1943
- @SimoneFelici made their first contribution in #1985
- @matteoscopel made their first contribution in #2016
- @muhas made their first contribution in #2017
- @jacksongoode made their first contribution in #2023
- @Disasm made their first contribution in #1977
- @lpla made their first contribution in #2094
- @orbisai0security made their first contribution in #2093
- @jhuebel made their first contribution in #2134
- @Joseph-DiGiovanni made their first contribution in #2105
- @latonis made their first contribution in #2148
- @vedi0boy made their first contribution in #1337
- @Djef0o made their first contribution in #2187
- @angad-kandhari made their first contribution in #2169
- @mateuscomh made their first contribution in #2195
- @wlhlm made their first contribution in #2223
- @SurprisedDuck made their first contribution in #2255
- @santinilor made their first contribution in #1658
- @neresus made their first contribution in #2251
- @jetaudio made their first contribution in #2279
- @krunkosaurus made their first contribution in #2342
- @TheCyberRonin made their first contribution in #2341
- @rafaelmsse made their first contribution in #2352
- @nnnkit made their first contribution in #2357
- @darkbublu made their first contribution in #1808
- @peuic made their first contribution in #2305
- @PaulDelestrac made their first contribution in #2349
- @kygia made their first contribution in #2382
- @ZephByte made their first contribution in #2394
Full Changelog: release/1.3.0...release/1.4.0