Skip to content

Release/v1.3.0#179

Merged
uxjulia merged 112 commits into
mainfrom
release/v1.3.0
May 21, 2026
Merged

Release/v1.3.0#179
uxjulia merged 112 commits into
mainfrom
release/v1.3.0

Conversation

@uxjulia
Copy link
Copy Markdown
Owner

@uxjulia uxjulia commented May 21, 2026

Summary

Highlights:

  • Adds the Download Font Size Range setting so SD-card fonts can download a range of font sizes instead of installing one fixed size set from upstream Crosspoint repo.
  • Adds OPDS download cancellation, clearer retry/loading feedback, and safer low-memory OPDS handling.
  • Adds Recent Books long-press actions for delete, cache delete, completion, and remove-from-recents.
  • Adds the Minimal sleep screen, Quick Resume setting changes, and sleep/download reliability improvements.
  • Adds the 9pt Itty Bitty reader font size and the new teensy firmware variant.
  • Improves EPUB cache stability, low-memory layout behavior, cover thumbnail rendering, and SD-card font handling.
  • Fixes WiFi/manual connection flow, saved credential validation, XTC chapter selector crashes, KOReader Sync compatibility, and several reader/Home UI polish issues.

Closes #174, #170, #166, #154

Uri-Tauber and others added 30 commits May 15, 2026 15:38
…sspoint-reader#1812)

## Summary

As noted in
[crosspoint-reader#1680](crosspoint-reader#1680 (comment)),
the README hasn't been updated in a while and has fallen behind the
actual firmware. This PR brings it up to date.

Beyond the feature list, I added a section acknowledging community forks
worth knowing about. I also took some deliberate editorial choices
around how CrossPoint is framed — I think it has the potential to be
more than just "an alternative Xteink firmware", and the wording
reflects that.

A note on process: I wrote the bulk of the text myself, but used AI
tools to scan the codebase and catch features I might have missed, and
to clean up my English (I'm fluent but not a native speaker). If any
line reads as unnatural or AI-sounding, please flag it — I'd rather fix
it than leave it.

---

One thing outside the scope of this PR: I think the cover photo could
use a refresh, ideally replaced with a small gallery showing different
CrossPoint screens. If you have a professional camera and an Xteink
device and want to help with that, let me know.

---------

Co-authored-by: Zach Nelson <zach@zdnelson.com>
## Summary

This release adds SD card fonts — the most-requested feature since
launch — brings the X3 to first-class status, redesigns the on-screen
keyboard, overhauls OPDS, and ships SD-card firmware updates. 144
changes from 53 contributors, 32 of whom are new to the project.

**🔠 SD Card Fonts**
Custom fonts are here. A complete font subsystem lets you install and
use fonts beyond the three built-in families. A new `.cpfont` binary
format packs multiple styles (regular, bold, italic, bold-italic) into a
single file per size, with on-demand glyph loading from the SD card. A
two-pass prewarm renderer bulk-reads glyphs per page, achieving
near-flash performance for Latin text and viable CJK rendering. Fonts
can be downloaded over WiFi directly from the device, uploaded via the
web interface, or copied manually to the SD card. The build pipeline
ships a 17-family font library (serif, sans, mono, accessibility) with
CI distribution via a dedicated crosspoint-fonts repository. As a bonus,
CJK characters no longer get spurious hyphens at line breaks, and an
advance-table cache eliminates 30+ second stalls during CJK section
indexing.

**📱 X3 Comes of Age**
The X3 graduates from initial bring-up to a proper target. Grayscale
antialiasing is sharper, EPUB images render correctly, OTA updates work,
and sleep screen dimensions are dialed in. The headline addition:
gyroscope-based tilt page turning via the QMI8658 IMU — tilt the device
to turn pages hands-free. SD-card firmware update support and X3
bootloader compatibility mean users can update without a USB connection.

**⌨️ Redesigned On-Screen Keyboard**
The keyboard has been completely redesigned with improved layout, better
key feedback, and a fix for the space key barely moving the cursor. Text
entry across WiFi setup, OPDS search, and KOSync login is noticeably
smoother.

**👁️ Focus Reading**
A new reading mode bolds the initial characters of each word (similar to
Bionic Reading) to create artificial fixation points, helping improve
reading speed and focus. The bolding ratio is 45%, with a minimum of 1
character and a maximum of 9, applied dynamically during indexing.

**📚 OPDS Overhaul**
OPDS gains in-catalog search with next/prev page navigation, support for
multiple servers, correct handling of relative paths and query
parameters (fixing CopyParty compatibility), and KOReader-compatible
download filenames.

**🔤 Text Rendering Refinements**
Combining marks (diacritics) now use font metrics for positioning
instead of heuristics, proportional numeral spacing is supported, and
differential rounding eliminates uneven inter-glyph gaps. Hyphenation
now recognizes ISO 639-2 language codes, nested block-level CSS styles
are tracked correctly, and horizontal CSS insets are capped at 2em to
prevent runaway margins. Bookerly has been replaced with Noto Serif for
licensing reasons.

**🎨 New Theme: RoundedRaff**
A new rounded theme joins the theme picker, with fixes for sleep cover
crop grid artifacts.

**🔋 Battery & Power**
Battery percentage smoothing on the X4 eliminates jittery readings. A
short press on the power button can be set to trigger a manual screen
refresh — handy for clearing ghosting.

**📶 WiFi & Networking**
WiFi connections now self-heal from transient drops without manual
intervention, and a dBm signal strength indicator appears during web
server sessions. WiFi networks can be edited directly from the web UI.

**🔄 KOSync**
Reading position sync is significantly more accurate. The old
character-offset approach frequently landed on the wrong paragraph after
syncing between devices — the new xpath-based mapping syncs at the
paragraph level, matching KOReader's own behavior. A separate fix
switches the HTTP layer to `esp_http_client`, and the reader now
releases ~65KB of EPUB heap before the TLS handshake — together these
eliminate the out-of-memory crashes that plagued KOSync on large books.

**🛡️ Stability**
Two memory leaks patched, a wild pointer crash in JPEGDEC MCU_SKIP
handling fixed, boot loops with large XTC files eliminated, legacy XTC
headers supported, the OTA updater now streams GitHub release JSON
instead of buffering it in RAM, and a JPEG downscaler y-axis scale
factor bug is corrected.

**🌐 Languages**
Slovenian is new. Russian, Ukrainian, Swedish, Italian, and Spanish
translations received significant updates.

---

Also in this release: **SD-card firmware updates without USB**, **file
extensions in the file browser**, **full path bar navigation**,
**end-of-book navigation improvements**, **XTC status bar**, **smarter
"Cover + Custom" sleep screens**, **set sleep cover from the BMP
viewer**, **orientation-aware popups**, **page turn buttons that follow
orientation**, **long-press delete for directories**, **context-aware
screenshot filenames with book title**, **crash reason displayed on
boot**, **empty line rendering in the TXT reader**, **wallpaper recency
buffer to prevent clustering**, **font family deletion from the
device**, **next/prev labels in the BMP viewer**, **non-breaking space
justification fix**, **README guidance for USB-locked third-party Xteink
units**, and a long tail of web UI polish, i18n memory optimizations,
and code quality improvements.

## What's Changed

### Features

* feat: add SD card font support with on-device download and web
management by @adriancaruana, @znelson, @itsthisjustin, @jpirnay, and
@mcrosson
* feat: Initial support for the x3 by @itsthisjustin in
crosspoint-reader#875
* feat: X3 grayscale antialiasing improvements by @juicecultus in
crosspoint-reader#1607
* feat: X3 gyroscope-based tilt page turning via QMI8658 IMU by
@juicecultus in
crosspoint-reader#1636
* feat(update): SD-card firmware update + X3 bootloader compatibility by
@eunchurn in
crosspoint-reader#1786
* feat: self-heal from transient WiFi loss, add dBm indicator during
WebServerActivity by @jeremydk in
crosspoint-reader#1780
* feat: edit wifi networks in webui by @osteotek in
crosspoint-reader#1743
* feat: add OPDS search support & next/prev page navigation by @rxmmah
in crosspoint-reader#1462
* feat: Support for multiple OPDS servers by @osteotek in
crosspoint-reader#1209
* feat: Adjust Navigation at End of Book by @nscheung in
crosspoint-reader#1425
* feat: Display file extensions in File Browser by @CaptainFrito in
crosspoint-reader#1019
* feat: show full path bar in file browser by @zgredex in
crosspoint-reader#1411
* feat: enable manual screen refresh on power button short press by
@bdeshi in
crosspoint-reader#1626
* feat: Rework "Cover + Custom" sleep screens to show covers only when
currently reading by @iandchasse in
crosspoint-reader#1256
* feat: Set sleep cover from BMP viewer by @el in
crosspoint-reader#1104
* feat: show crash reason on boot by @ngxson in
crosspoint-reader#1453
* feat: Support for proportional numeral spacing by @znelson in
crosspoint-reader#1414
* feat: add orientation-aware popups for reader activities by @mrtnvgr
in crosspoint-reader#1428
* feat: smooth battery percentage for x4 by @jonvex in
crosspoint-reader#1635
* feat: context-aware screenshot filenames with book title by
@jonstieglitz in
crosspoint-reader#1589
* feat(theme): add roundedraff theme and fix sleep cover crop grid
artifacts by @bunsoootchi in
crosspoint-reader#918
* feat: Page turn button orientation change by @mchuck in
crosspoint-reader#1069
* feat: Status bar for XTC files by @leecming82 in
crosspoint-reader#1849
* feat: enhance long press action to delete both files and directories
by @WuTofu in
crosspoint-reader#1803
* feat: Added Slovenian translation by @thehijacker in
crosspoint-reader#1551
* feat: focus reading by @vjapolitzer in
crosspoint-reader#1670
* feat: add next / prev labels to bmp viewer by @Telemaniaka in
crosspoint-reader#1852
* feat: add font family deletion functionality by @WuTofu in
crosspoint-reader#1919
* feat: separate into "Download All" and "Update All" in font manager by
@WuTofu in
crosspoint-reader#1955
* feat: verify CRC32 checksum for font files by @WuTofu in
crosspoint-reader#1904
* feat: increase default weight of Bitter font for improved rendering by
@uxjulia in
crosspoint-reader#1922
* feat: allow unnamed intervals by @steka in
crosspoint-reader#1903

### Fixes

* fix: epub images not rendering correctly on x3 by @itsthisjustin in
crosspoint-reader#1572
* fix: OTA update on x3 and progress bar on x4 and x3 by @itsthisjustin
in crosspoint-reader#1805
* fix: boot looping when opening large XTC files by @itsthisjustin in
crosspoint-reader#1648
* fix: Wild pointer crash in JPEGDEC MCU_SKIP handling by @itsthisjustin
in crosspoint-reader#1627
* fix: two small memory leaks by @Uri-Tauber in
crosspoint-reader#1628
* fix: use esp_http_client for KOSync to prevent TLS OOM on ESP32-C3 by
@trilwu in
crosspoint-reader#1381
* fix: Read GH release JSON as stream in OTA updater by @znelson in
crosspoint-reader#1810
* fix: support legacy XTC file headers where pageTableOffset=48 by
@uxjulia in
crosspoint-reader#1816
* fix: Use font metrics for combining mark positioning by @znelson in
crosspoint-reader#1310
* fix: Use differential rounding for consistent inter-glyph spacing by
@znelson in
crosspoint-reader#1413
* fix: Support hyphenation for EPUBs using ISO 639-2 language codes by
@znelson in
crosspoint-reader#1461
* fix: Track block style stack for nested styles by @daveallie in
crosspoint-reader#1582
* fix: cap per-side horizontal CSS inset at 2em by @rhoopr in
crosspoint-reader#1694
* fix: increase loadable epub size by @CSCMe in
crosspoint-reader#1638
* fix: Switch to xpath map for paragraph level syncing in KOSync by
@itsthisjustin in
crosspoint-reader#1686
* fix: free Epub RAM and simplify KOSync navigation via ActivityManager
by @wylanswets in
crosspoint-reader#1860
* fix: improve KOSync bidirectional position matching accuracy by
@wylanswets in
crosspoint-reader#1897
* fix: Fix failing very first wifi connection attempt by @jpirnay in
crosspoint-reader#1521
* fix: avoid skipping chapter after screenshot by @Mraulio in
crosspoint-reader#1625
* fix: back navigation from BMPViewer by @Telemaniaka in
crosspoint-reader#1597
* fix: Fix ghosting on exit of BMPViewer by @jpirnay in
crosspoint-reader#1432
* fix: make footnotes consider orientation for gutters by @Telemaniaka
in crosspoint-reader#1665
* fix: footnote link text by @steka in
crosspoint-reader#1666
* fix: Erroneous navigation with long filenames in footnote links by
@CSCMe in
crosspoint-reader#1723
* fix: prevent wallpaper clustering with 16-entry recency buffer by
@zgredex in
crosspoint-reader#1606
* fix: webserver /delete API backward compatibility by @DianaNites in
crosspoint-reader#1475
* fix: relative opds paths and query param with copyparty by @philips in
crosspoint-reader#1535
* fix: use same file name as KOReader for OPDS downloads by @spfenwick
in crosspoint-reader#1286
* fix: pressing space barely moves input cursor (crosspoint-reader#1729) by @pablohc in
crosspoint-reader#1733
* fix: keyboard feedback crosspoint-reader#1644 by @pablohc in
crosspoint-reader#1697
* fix: pluralize folder/file counts correctly in file list summary by
@fain182 in
crosspoint-reader#1701
* fix: rendering bug of scrollbar in RoundedRaff theme by @Uri-Tauber in
crosspoint-reader#1814
* fix: two roundedraff bugs by @Uri-Tauber in
crosspoint-reader#1851
* fix: overlap in download font list layout by @pablohc in
crosspoint-reader#1900
* fix: remove duplicate 'Download Fonts' menu entry and improve
navigation by @zgredex in
crosspoint-reader#1893
* fix: Add common ligatures to SD font conversion ranges by @znelson
* fix: capture instantiateVariableFont return value by @jpirnay in
crosspoint-reader#1911
* fix: Roundraff theme home menu offset with no recent books by @znelson
in crosspoint-reader#1845
* fix: Missing navigation button labels in Roundedraff theme by
@Uri-Tauber in
crosspoint-reader#1905
* fix: gracefully resolve fonts missing variants by @Uri-Tauber in
crosspoint-reader#1921
* fix: distribute justifyExtra to non-breaking space tokens by
@prawnwhoyawns in
crosspoint-reader#1783
* fix: remove percent rendering from activities by @mcrosson in
crosspoint-reader#1901
* fix: Restore performance in fontconvert_sdcard.py by @znelson in
crosspoint-reader#1924
* fix: Prepare SD card font caches from txt reader by @znelson in
crosspoint-reader#1973
* fix: make script help paths lightweight by @sabraman in
crosspoint-reader#1937
* fix: Replaced Bookerly with Noto Serif for licensing reasons by
@znelson in
crosspoint-reader#1736
* fix: incorrect y-axis scale factor in jpeg nearest-neighbor downscaler
by @WuTofu in
crosspoint-reader#1807
* fix: display empty lines in txt reader by @Uri-Tauber in
crosspoint-reader#1841
* fix: short-press power action triggered after screenshot combo release
by @pablohc in
crosspoint-reader#1853
* fix: correct Russian auto-turn translations by @a-ignatev in
crosspoint-reader#1566
* fix: Update Ukrainian translations for footnotes (issue 1409) by
@mirus-ua in
crosspoint-reader#1585
* fix: missing swedish translations by @steka in
crosspoint-reader#1667
* fix: Add swedish keyboard translations by @steka in
crosspoint-reader#1726
* fix: swedish translations by @steka in
crosspoint-reader#1762
* fix: swedish translation by @steka in
crosspoint-reader#1829
* fix: swedish translation by @steka in
crosspoint-reader#1888
* fix: Polish translation by @th0m4sek in
crosspoint-reader#1909
* fix: Ukrainian-translation by @KymAndriy in
crosspoint-reader#1946
* fix: Ukrainian translation by @KymAndriy in
crosspoint-reader#1939
* fix: python requirements files by @steka in
crosspoint-reader#1768
* fix: missing requirement by @steka in
crosspoint-reader#1896
* fix: Use LOG_ macros in loc functions by @znelson in
crosspoint-reader#1794

### Internal

* refactor: redesign on-screen keyboard by @pablohc in
crosspoint-reader#1644
* refactor: replace picojpeg with JPEGDEC for cover art conversion by
@jpirnay in
crosspoint-reader#1517
* refactor: Refactor drawArc / fillArc for faster execution by @jpirnay
in crosspoint-reader#1540
* perf: replace i18n pointer tables with offset tables, strip unused
strings by @jpirnay in
crosspoint-reader#1408
* refactor: Store only unique localization strings in offset buffers by
@znelson in
crosspoint-reader#1802
* refactor: Move language setting into JSON settings by @znelson in
crosspoint-reader#1796
* refactor: Use C++20 'requires' in ActivityResult constructor by
@znelson in
crosspoint-reader#1420
* refactor: Use default member initializers for JpegContext and
PngContext by @znelson in
crosspoint-reader#1435
* refactor: logPrintf and predefined log level strings by @CSCMe in
crosspoint-reader#1546
* refactor: RAII scoped open/close for ZipFile by @znelson in
crosspoint-reader#1433
* refactor: Deduplicated BMP header writing in Xtc by @znelson in
crosspoint-reader#1439
* refactor: Added shared XML parser teardown helper by @znelson in
crosspoint-reader#1438
* refactor: Removed redundant FsFile close() calls by @znelson in
crosspoint-reader#1434
* refactor: Deduplicate battery drawing code and fix Lyra charging
indicator by @znelson in
crosspoint-reader#1437
* refactor: Deduplicate Roundraff battery drawing by @znelson in
crosspoint-reader#1847
* refactor: Simplify sort in GfxRenderer::fillPolygon by @znelson in
crosspoint-reader#1817
* refactor: Avoid vector for page turn rates list by @znelson in
crosspoint-reader#1818
* refactor: Use std::size instead of sizeof/sizeof by @znelson in
crosspoint-reader#1819
* refactor: Use fixed-size integers for BookMetadataCache data by
@znelson in
crosspoint-reader#1844
* refactor: Simplify isReaderActivity bookkeeping by @znelson in
crosspoint-reader#1838
* refactor: Simplify XtcReaderActivity with detectPageTurn by @znelson
in crosspoint-reader#1837
* refactor: change ukrainian translation to adaptation and add missing
lines by @KymAndriy in
crosspoint-reader#1828
* chore: drop JPEGDEC patch in favour of upstream fix by @martinbrook in
crosspoint-reader#1465
* chore: clang-format.fix.ps1 script: Add .venv to list of path
exclusions by @jpirnay in
crosspoint-reader#1515
* chore: Updating sleep screen dimensions for X3 by @jensechu in
crosspoint-reader#1688
* chore: Clarify X3 RTC in SCOPE.md by @znelson in
crosspoint-reader#1687
* chore: Improved Italian translations by @znelson in
crosspoint-reader#1685
* chore: change ukrainian translation to adaptation by @KymAndriy in
crosspoint-reader#1684
* chore: Update spanish.yaml by @mvidelatraduc in
crosspoint-reader#1717
* chore: One Italian translation tweak by @znelson in
crosspoint-reader#1718
* chore: git pre-commit hook for format fix by @osteotek in
crosspoint-reader#1730
* chore: Update SDK to fork in CrossPoint org by @znelson in
crosspoint-reader#1836
* chore: Added RAM to firmware_size_history.py script by @znelson in
crosspoint-reader#1830
* chore: Updated docs to reflect DESTRUCTOR_CLOSES_FILE=1 by @znelson in
crosspoint-reader#1878
* feat: cap compressed group size at 64 KB by @jpirnay in
crosspoint-reader#1913
* fix: build-script bug fixes for fontconvert{,_sdcard}.py by @jpirnay
in crosspoint-reader#1910
* feat: include short SHA in CROSSPOINT_VERSION by @osteotek in
crosspoint-reader#1728
* feat: show long branch names by @steka in
crosspoint-reader#1727
* feat: enable pio build cache by @Uri-Tauber in
crosspoint-reader#1769
* style: put page name first in browser titles by @fain182 in
crosspoint-reader#1703
* style: unify page headers across web UI by @fain182 in
crosspoint-reader#1702
* style: move file type badges into Type column by @fain182 in
crosspoint-reader#1793
* style: align action buttons vertically with page title by @fain182 in
crosspoint-reader#1795
* docs: Update README with firmware flashing instructions by @ryneches
in crosspoint-reader#1654
* docs: fix typos by @kianmeng in
crosspoint-reader#1705
* docs: update README.md to reflect the current state of crosspoint by
@Uri-Tauber in
crosspoint-reader#1812
* docs: Add documentation for USB-locked Xteink devices by
@itsthisjustin in
crosspoint-reader#1990
* docs: expand first use of OPDS acronym and provide a wikipedia link by
@sizezero in
crosspoint-reader#1824
* docs: fix KOReader sync guide link by @sabraman in
crosspoint-reader#1930
* docs: fix hyphenation updater script name by @sabraman in
crosspoint-reader#1931
* fix: sd font download urls in docs by @mcrosson in
crosspoint-reader#1945
* fix: sd font folder paths in documentation by @mcrosson in
crosspoint-reader#1944
* chore: Add verbose mode to build-sd-fonts.py by @znelson in
crosspoint-reader#1923

## New Contributors
* @a-ignatev made their first contribution in
crosspoint-reader#1566
* @CSCMe made their first contribution in
crosspoint-reader#1546
* @thehijacker made their first contribution in
crosspoint-reader#1551
* @Telemaniaka made their first contribution in
crosspoint-reader#1597
* @Mraulio made their first contribution in
crosspoint-reader#1625
* @rxmmah made their first contribution in
crosspoint-reader#1462
* @bdeshi made their first contribution in
crosspoint-reader#1626
* @DianaNites made their first contribution in
crosspoint-reader#1475
* @ryneches made their first contribution in
crosspoint-reader#1654
* @zgredex made their first contribution in
crosspoint-reader#1411
* @jonvex made their first contribution in
crosspoint-reader#1635
* @KymAndriy made their first contribution in
crosspoint-reader#1684
* @jensechu made their first contribution in
crosspoint-reader#1688
* @kianmeng made their first contribution in
crosspoint-reader#1705
* @philips made their first contribution in
crosspoint-reader#1535
* @fain182 made their first contribution in
crosspoint-reader#1701
* @mvidelatraduc made their first contribution in
crosspoint-reader#1717
* @bunsoootchi made their first contribution in
crosspoint-reader#918
* @rhoopr made their first contribution in
crosspoint-reader#1694
* @spfenwick made their first contribution in
crosspoint-reader#1286
* @trilwu made their first contribution in
crosspoint-reader#1381
* @jonstieglitz made their first contribution in
crosspoint-reader#1589
* @uxjulia made their first contribution in
crosspoint-reader#1816
* @mchuck made their first contribution in
crosspoint-reader#1069
* @sizezero made their first contribution in
crosspoint-reader#1824
* @leecming82 made their first contribution in
crosspoint-reader#1849
* @jeremydk made their first contribution in
crosspoint-reader#1780
* @WuTofu made their first contribution in
crosspoint-reader#1803
* @wylanswets made their first contribution in
crosspoint-reader#1860
* @sabraman made their first contribution in
crosspoint-reader#1930
* @prawnwhoyawns made their first contribution in
crosspoint-reader#1783
* @mcrosson made their first contribution as co-author on SD card font
support

**Full Changelog**:
crosspoint-reader/crosspoint-reader@1.2.0...release/1.3.0

---------

Co-authored-by: Justin Mitchell <justin@jmitch.com>
Co-authored-by: Chun Ming Lee <95391408+leecming82@users.noreply.github.com>
Co-authored-by: Uri Tauber <uritaube@gmail.com>
…rosspoint-reader#1908)

WiFi/LWIP/netif teardown scatters long-lived allocations across the
heap, leaving ~50KB of contiguous space unrecoverable without a reboot.

Reboot the SoC on exit from any wifi-using activity to guarantee a clean
heap. An RTC_NOINIT flag survives the reboot and tells setup() to skip
the boot splash and route the user back where they came from:
  - File transfer / Calibre / OPDS / Font download -> home
  - KOReader sync -> currently-open EPUB

Activities check WiFi.getMode() before rebooting, so backing out of the
network mode menu without joining doesn't trigger a cycle. KOSync also
esp_wifi_stop()s after the sync result so the radio is off while the
user reads it; full teardown happens at the reboot.


## Additional Context

The silent reboot skips the booting splash screen - it visibly looks
like a screen refresh. This does cause a disconnection/reconnection blip
for developers actively pulling logs over serial, but `pio device
monitor` and the like successfully reconnect and feed in the early boot
serial.
as an example: 
```
[256676] [DBG] [ACT] Exiting activity: KOReaderSync
[256706] [DBG] [MAIN] Silent restart (target=reader)

ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0xc (RTC_SW_CPU_RST),boot:0xf (SPI_FAST_FLASH_BOOT)
Saved PC:0x403872bc
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd72a0,len:0x990
load:0x403cbf10,len:0xac8
load:0x403ce710,len:0x4d28
entry 0x403cbf10
[22] [INF] [MAIN] Hardware detect: X4
[29] [SD] SD card detected
[43] [DBG] [CPS] Settings loaded from file
[58] [DBG] [KRS] Loaded KOReader credentials for user: jeremydk
[69] [DBG] [OPS] Loaded 1 OPDS servers from file
[69] [DBG] [UI] Using Lyra theme
[70] [DBG] [MAIN] Starting CrossPoint version 1.2.0-dev-detached-bde75787

...

[203] [DBG] [ACT] Entering activity: Reader
[211] [DBG] [EBP] Loading ePub: /Halting State - Charles Stross.epub
[221] [DBG] [BMC] Loaded cache data: 51 spine, 41 TOC entries
[246] [DBG] [CSS] Loaded 41 rules from cache
[247] [DBG] [EBP] Loaded ePub: /Halting State - Charles Stross.epub
```
---
### 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? _PARTIALLY_
## Summary
* **What is the goal of this PR?** Update the Italian translation.
* **What changes are included?** Took the latest `english.yaml` as
reference and updated `italian.yaml` accordingly, translating new
strings and revising existing ones where needed. Specific changes can be
inspected from the diff.

## Additional Context
* Nothing special to flag — happy to adjust any wording the reviewer
disagrees with.

---
### 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? _**PARTIALLY**_ — Claude
provided a first-pass draft; I revised and rewrote a substantial portion
by hand.
## Summary

* **What is the goal of this PR?**  
Improve the UI based on feedback from someone on discord

> Downloading ALL fonts feature.
> 1.1 Disable sleep when downloading, in my case went directly to sleep
just right after downloading.
> 1.2 It would be great to have and overall progress indicator as we
only have the indication of each font family
> 1.3 Any cancel or pause function might come in handy in case battery
is running out and then resume or retry with pending fonts

* **What changes are included?**  
- Now the UI can show overall progress across every file being
downloaded in the batch, not just progress inside the current family.
- Extended `HttpDownloader::downloadToFile()` to accept a cancel flag
and abort the download.
- Rendered a cancel button in the font download UI while a download is
in progress.
- `preventAutoSleep()` in `FontDownloadActivity.h` now returns true for
`state_ == COMPLETE` and `state_ == ERROR` in addition to
`LOADING_MANIFEST` and `DOWNLOADING`

## Additional Context

Not very satisfied with how `HttpDownloader.cpp` is right now, might try
to refactor it after v1.3.0

---

### 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? _**PARTIALLY**_
## Summary

* Add swedish hyphenation using scripts/update_hypenation.sh
* Add hyphenation test data using the Swedish translation of Andy Weir's
Project Hail Mary

---

### 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**_
…#1890)

## Summary

* **What is the goal of this PR?**
Fix incorrect power button long-press detection during shutdown/wake
verification by introducing dedicated power button timing logic.
* **What changes are included?**
* Added getPowerButtonHeldTime() to HalGPIO as a wrapper over input
manager logic
* Replaced generic getHeldTime() usage with power-button-specific timing
in verifyPowerButtonWakeup()
* Ensures shutdown/wake decision is based only on actual power button
hold duration, not any-button timing
  * Minor header update for new API exposure in HalGPIO.h
## Additional Context

This fixes a bug where holding another button while briefly pressing the
power button could incorrectly trigger shutdown behavior due to shared
timing state (getHeldTime()).

The change isolates power button timing to prevent cross-button
interference and makes shutdown logic reliable during multi-button
interactions.

No behavioral changes are expected outside of power-button handling
logic.

**Dependencies**
- SDK PR: crosspoint-reader/community-sdk#3

This PR requires the `community-sdk` submodule to be updated after the
SDK change is merged.

- Fixes: crosspoint-reader#1881

---

### AI Usage
Did you use AI tools to help write this code? _**PARTIALLY**_
## Summary

prevent card overflow

## Additional Context

<img width="1920" height="1080" alt="bug"
src="https://github.com/user-attachments/assets/df84e233-908e-4ce1-8289-d0e9b579bc13"
/>
<img width="1920" height="1080" alt="Bug"
src="https://github.com/user-attachments/assets/cfd20f51-6421-4271-9a62-9c1987cc0dd0"
/>
<img width="1920" height="1080" alt="fix"
src="https://github.com/user-attachments/assets/4fbe83fe-5376-4393-bd45-a825f24e19e3"
/>
<img width="1920" height="1080" alt="fix2"
src="https://github.com/user-attachments/assets/4397848e-d8fa-4c51-ab4d-c32b2fcf33d1"
/>


---

### AI Usage

Did you use AI tools to help write this code? _**NO**_
…ader#1985)

## Summary

* **What is the goal of this PR?**  
Fix EPUB optimization when XHTML image references are URL-encoded.

* **What changes are included?**  
The optimizer already converts image files to `.jpg`, but XHTML files
could still reference the original URL-encoded image path, for example:

```html
<img src="images/wensday%201%20full%202.png">
````

The optimized EPUB then contained the converted file:

```text
images/wensday 1 full 2.jpg
```

but the XHTML still pointed to the old `.png`, so CrossPoint failed to
extract/render the image.

The issue was that the previous replacement logic matched only the plain
filename form, such as:

```text
wensday 1 full 2.png
```

but not the URL-encoded form:

```text
wensday%201%20full%202.png
```

This PR updates XHTML image `src` attributes through the existing
DOMParser pass by decoding and resolving the image path before matching
it against renamed images.

After this fix, the optimized EPUB correctly rewrites the XHTML image
reference to the generated `.jpg`, and the image renders correctly.

---

### 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? _**PARTIALLY**_

---

Please let me know if you have questions,
Thank you!
…spoint-reader#2022)

Pulls in community-sdk PR #9, which clears inGrayscaleMode inside
cleanupGrayscaleBuffers() after the restored BW frame is written back
into RED RAM. Without this, the next BW page turn would still see the
flag set and trigger a redundant grayscaleRevert() refresh, producing
visible ghosting on the X4 with text anti-aliasing enabled.

Regression introduced by SDK commit 0a8ada2 (factory LUT grayscale
support), which removed a redundant inGrayscaleMode guard in
grayscaleRevert() and so caused the cleanup to actually run for the
first time.

Bypassing rules to avoid this going stale and all nightly builds being broken for x4 users
Co-authored-by: muhas <mail@muhas.name>
uxjulia and others added 22 commits May 20, 2026 18:50
…ns (crosspoint-reader#2089)

## Summary

**What is the goal of this PR?**

Adds a clearer Quick Resume sleep-screen flow. The previous “Page as
Sleep Screen” behavior is now exposed as a dedicated `Sleep Screen >
Quick Resume `option, with the timeout-only behavior controlled by a
renamed `Quick Resume on Timeout `setting.

**What changes are included?**

- Adds `Quick Resume` as a new `Sleep Screen` option.
- Renames the old `Page as Sleep Screen` setting to `Quick Resume on
Timeout`.
- Changes that setting’s choices from `Never / After Timeout / Always`
to `OFF / ON`.
- Makes `Quick Resume on Timeout = ON` equivalent to the old `After
Timeout` behavior.
- Makes `Sleep Screen > Quick Resume` equivalent to the old `Always`
behavior.
- Automatically forces `Quick Resume on Timeout` to `ON` when `Sleep
Screen` is set to `Quick Resume`.
- Renames internal setting references from `seamlessSleepScreen` to
`quickResumeSleepScreen`.
- Updates translations for the renamed setting label.

**Additional Context**

- This is mostly a settings/labeling restructure around existing
behavior, not a new rendering path.
- The runtime quick-resume behavior still uses the existing saved
framebuffer / last-screen sleep flow.
- Review focus areas:
  - Sleep entry behavior from manual sleep vs timeout sleep.
- The automatic dependency where selecting `Sleep Screen > Quick Resume`
sets `Quick Resume on Timeout` to `ON`.

---

### 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? _**< YES >**_

---
**New `Quick Resume` option for `Sleep Screen` will automatically set
`Quick Resume on Timeout` to `ON`**:
<img width="480" height="800" alt="quick resume"
src="https://github.com/user-attachments/assets/94c553fd-a122-47a8-add9-f29694f55566"
/>

**Example where a different sleep screen setting like `Cover` can be
used in combination with the `Quick Resume on Timeout` setting**:
<img width="480" height="800" alt="cover + quick resume"
src="https://github.com/user-attachments/assets/dd18ce18-230b-4b78-808b-ac85f5e7d5d8"
/>
…nt-reader#2092)

Unify the two splash-skip signals (RTC silent-reboot flag, SD
seamless-sleep flag) into one BootResume enum driving a single switch.
Storage unchanged; behavior-preserving apart from the fix.

Holding power to sleep from a WiFi activity (Font Download, OPDS, web
server, Calibre, KOReader sync) rebooted to home instead of sleeping.
goToSleep() runs the outgoing activity's onExit(), and those activities
call silentRestart() to clear heap fragmentation, so the heap-defrag
reboot fired before deep sleep could start.

enterDeepSleep() now latches deepSleepInProgress before goToSleep();
silentRestart()/silentRestartToReader() no-op while it's set. Deep sleep
is a full chip reset on wake, so it already clears the fragmentation the
reboot existed for.



Did you use AI tools to help write this code? partial
…sspoint-reader#1875)

fix(settings): mirror quick resume timeout behavior on web settings

fix(settings): compare quick resume sleep screen by enum
* fix: show loading state before opds retry
* feat: add more debugging wifi connection diagnostics
* fix: make opds download cancellation more responsive
* docs: update changelog
@uxjulia uxjulia merged commit 06b3e50 into main May 21, 2026
3 checks passed
@uxjulia uxjulia deleted the release/v1.3.0 branch May 21, 2026 23:30
imshentastic referenced this pull request in imshentastic/CrumBLE May 23, 2026
Release v1.30 Highlights:

- Adds the Download Font Size Range setting so SD-card fonts can download a range of font sizes instead of installing one fixed size set from upstream Crosspoint repo.
- Swaps font repo from Crosspoint to Crossink's
- Adds OPDS download cancellation, clearer retry/loading feedback, and safer low-memory OPDS handling.
- Adds Recent Books long-press actions for delete, cache delete, completion, and remove-from-recents.
- Adds the Minimal sleep screen, Quick Resume setting changes, and sleep/download reliability improvements.
- Adds the 9pt Itty Bitty reader font size and the new teensy firmware variant.
- Improves EPUB cache stability, low-memory layout behavior, cover thumbnail rendering, and SD-card font handling.
- Fixes WiFi/manual connection flow, saved credential validation, XTC chapter selector crashes, KOReader Sync compatibility, and several reader/Home UI polish issues.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet