Release/v1.3.0#179
Merged
Merged
Conversation
…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!
…uares in Lyra Carousel theme
…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
…down (crosspoint-reader#1947) Co-authored-by: Justin Mitchell <justin@jmitch.com>
Co-authored-by: muhas <mail@muhas.name>
…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
This was
linked to
issues
May 21, 2026
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Highlights:
Download Font Size Rangesetting so SD-card fonts can download a range of font sizes instead of installing one fixed size set from upstream Crosspoint repo.teensyfirmware variant.Closes #174, #170, #166, #154