Skip to content

Release/v1.5.0 - #463

Merged
uxjulia merged 1168 commits into
mainfrom
release/v1.5.0
Aug 8, 2026
Merged

Release/v1.5.0#463
uxjulia merged 1168 commits into
mainfrom
release/v1.5.0

Conversation

@uxjulia

@uxjulia uxjulia commented Aug 4, 2026

Copy link
Copy Markdown
Owner

New

  • Full touch support for Seeed Studio Sticky
  • Dictionary lookup has been added, including suggestions and lookup history. "Look Up Word" can also be assigned as a short or long-press action. Dictionary lookup works with any compatible StarDict dictionary.
    • To get you started with some dictionaries, I've included 4 monolingual English dictionaries already optimized that you can download here: Inky.
    • If your dictionary includes IPA transcriptions, you can also download Crossink fonts that include the IPA glyphs under Dictionary Fonts from the above link.
    • You can set a custom dictionary font/size globally or per book when you have at least one dictionary added. Get to it from Settings > Reader > Font Options or from inside a book with Book Options > Font Options
  • This release re-introduces upstream Crosspoint's incremental indexing, however this time you can choose between Incremental or Full Sectionindexing globally or per book. Incremental indexing prepares a few pages ahead while Full Section indexing (the old default behavior and will remain the default) prepares the entire section/chapter from the beginning.
    • There are pros and cons to each method. Learn more: https://www.crossink.dev/epub-indexing.html.
    • Incremental indexing is still considered experimental. Use Full Section indexing if you generally don't have issues with EPUBs rendering.
  • Nearby File Transfer can send EPUB, TXT, XTC, XTCH, PNG, and BMP files directly between two CrossInk devices without a Wi-Fi network. Long-press from the File Browser or Recent Books to see the new option for Send to Nearby Device. On the receiving device, navigate to File Transfer >
  • Word Spacing setting has been added to Settings > Reader > Font Options > Word Spacing. This allows you to set the spacing between words up to 5 levels.
  • RTC-enabled devices can choose the date format shown in the settings menu and numeric separator in Settings > System > Device.
  • The web EPUB optimizer now splits oversized chapters into more device-friendly sections before sending them to the device. This is on by default. Note: Split sections may cause unexpected paragraph breaks where the optimizer has split the section. This is normal. Split sections will also show a "~" when estimating the chapter pages.
  • Small-caps rendering using a modified capitalized version of the font. This eliminates the need for the font to include small-caps.
  • EPUB rendering will now more aggressively try a silent restart. If that doesn't help then it will try falling back to a lighter rendering mode. Silent restarts allow the reader to reclaim fragmented memory to be able to properly render the book, but you may also sometimes see the screen start to slowly gray, before recovering to its normal state. If a silent restart happens during reading, you'll typically see "Loading", followed by "Indexing". This is all normal and a tradeoff that prevents the device from crashing or showing the "Chapter takes too much memory" error.

Changed

  • The setting for Download Font Size Range now displays the font point-size ranges: 8–12pt, 10–16pt, 14–20pt, and 8–20pt, replacing the old build names it corresponded to.
  • The Download All option has been removed to avoid excessive screen ghosting after very long Wi-Fi usage (downloading all fonts takes a very long time and is not recommended); fonts can still be downloaded individually or updated together.
  • File Transfer, KOReader Sync, OTA updates, and OPDS browsing now start with more memory available for network operations by doing a silent restart and loading only the necessary data before starting the activity.
  • The web file manager can delete non-empty folders and, when hidden files are shown, remove hidden or system-managed SD card items after confirmation.
  • Underlines and strikethroughs now display connected instead of just word by word.
  • Max number of clippings has increased from 64 to 256. The limit exists to bound RAM usage.
  • The full screen refresh during wake and sleep which caused visible flashing has been removed.

Fixed

brianhuster and others added 30 commits July 24, 2026 23:31
Co-authored-by: Uri Tauber <uritaube@gmail.com>
…er#2605)

Co-authored-by: Uri Tauber <uritaube@gmail.com>
(cherry picked from commit 4e41bf6)
…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
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.
## 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 >**_
Co-authored-by: Julia Nguyen <julia@uxj.io>
Co-authored-by: Julia Nguyen <julia@uxj.io>
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.
Co-authored-by: Julia Nguyen <julia@uxj.io>
Co-authored-by: Julia Nguyen <julia@uxj.io>
uxjulia and others added 26 commits August 6, 2026 19:38
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)
Adapted for CrossInk from upstream commit 046827f (crosspoint-reader#2781), preserving the arena-backed layout path and sparse ruby cache format.
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.
Adapted for CrossInk from upstream commit e00f595 (crosspoint-reader#2880). The OTA path buffers the complete chip-ID header before its first flash write.
@uxjulia
uxjulia marked this pull request as ready for review August 8, 2026 20:01
@uxjulia
uxjulia merged commit a00c8c8 into main Aug 8, 2026
6 checks passed
@uxjulia
uxjulia deleted the release/v1.5.0 branch August 8, 2026 20:19

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

setError("Could not read device id");

P2 Badge Translate nearby-sync failure messages

On hardware where reading the device ID or starting ESP-NOW fails, this literal is stored in errorMessage_ and rendered directly on the error screen; the same activity has several other literal setError(...) calls for storage, timeout, and queue failures. These messages therefore remain English regardless of the selected device language. Add translation keys and pass the corresponding tr(STR_*) values for every user-visible failure in this activity.

AGENTS.md reference: AGENTS.md:L51-L51

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +64 to +65
CROSSINK_RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
run: pio run -j1 -e default -e sticky

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Write the requested version into the active PlatformIO key

When workflow_dispatch supplies a version different from the checked-in value, the preceding sed still searches for the removed crossink_version key, so I verified that it leaves platformio.ini byte-for-byte unchanged. The newly added Sticky build then uses its hardcoded ${crossink.version}-sticky runtime version even though the artifact is named with ${RELEASE_VERSION}, causing OTA comparisons and diagnostics to report a different version from the released binary name. Update [crossink].version or make the Sticky environment consume the release variable before building. (sed --help confirms -i edits the input file in place; the exact substitution was tested against this file.)

AGENTS.md reference: AGENTS.md:L106-L106

Useful? React with 👍 / 👎.

Comment thread site/src/lib/docs.ts
Comment on lines +33 to +34
"dictionary-development",
"file-formats",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep linked reference pages reachable in the public build

These entries are removed from both navigation and static route generation, but public pages still link to them: docs/dictionary.md:185 targets dictionary-development.md, and docs/data-cache.md:81 targets file-formats.md. After the Pages workflow builds the Astro site, those links resolve to ungenerated HTML files and return 404; either retain routes for linked pages or rewrite the links to a reachable location.

Useful? React with 👍 / 👎.

Comment thread README.md
- `fs_/` - sample SD card contents (books, sleep images, themes) used by the simulator
- `nix/` - Nix/NixOS development shell definitions
- `managed_components/` - ESP-IDF managed component dependencies, fetched automatically during build
- [`SCOPE.md`](./SCOPE.md), [`GOVERNANCE.md`](./GOVERNANCE.md), [`CHANGELOG.md`](./CHANGELOG.md) - project scope, community principles, and release history

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Remove the link to the deleted governance file

This newly added repository-layout entry links to GOVERNANCE.md, while the same commit deletes that file and repo-wide search finds no replacement. Anyone following the README link therefore gets a 404; remove the entry or point it to the document that now contains the community guidance.

Useful? React with 👍 / 👎.

Comment thread web/pages/files.js
Comment on lines +2818 to +2820
for (const node of chunk) partContainer.appendChild(partDoc.importNode(node, true));
out[partPath] = safeSerialize(partDoc, content);
splitSections[path].push(partPath);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Rewrite anchors when splitting XHTML sections

When optimization splits a long chapter, IDs in later chunks move from chapter.xhtml to generated paths such as chapter__ci_section_002.xhtml, but this code only emits the chunks and updates the OPF spine; it never rewrites references based on where each ID moved. Consequently, TOC, subchapter, and footnote links such as chapter.xhtml#later-anchor still target the first part, where the anchor no longer exists. This affects any optimized EPUB with a post-split anchor, and section splitting is enabled by default in the conversion options.

Useful? React with 👍 / 👎.

Comment thread docs/simulator.md
Comment on lines +41 to +45
Use the X4 Pro environment to enable its touch, frontlight, and Home-key behavior:

```sh
pio run -e x4-pro-simulator -t run_simulator
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Restore the documented X4 Pro simulator environment

The documented command cannot run in this revision: I checked every tracked PlatformIO configuration and platformio.ini defines simulator, simulator-X3, and sticky-simulator, but no x4-pro-simulator environment. The environment existed earlier in the release history and was removed during release preparation while this documentation remained, so developers cannot exercise the newly documented Home-key and frontlight behavior; either restore the environment or remove/update the command and associated H-key claim.

Useful? React with 👍 / 👎.

Comment on lines +149 to +153
startActivityForResult(std::make_unique<DictionaryDefinitionActivity>(
renderer, mappedInput, controller.getFoundWord(), controller.getFoundLocation(),
true, cachePath, controller.getRecordHistory(), controller.getLookupWord(),
DictionaryLookupController::toHistStatus(controller.getFoundStatus()), nullptr,
nullptr, dictionaryFontFamilyName, dictionaryFontPointSize),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Make history-definition allocation fallible

On an ESP32-C3 with a fragmented or low internal heap, selecting a word from lookup history reaches this std::make_unique allocation for the relatively large DictionaryDefinitionActivity. Because firmware exceptions are disabled, the underlying bare new aborts on allocation failure instead of returning an error, rebooting the reader rather than using the existing memory-error flow. Allocate with makeUniqueNoThrow and handle nullptr, as the word-selection path already does for the same activity.

AGENTS.md reference: AGENTS.md:L55-L56

Useful? React with 👍 / 👎.

Comment on lines +294 to +297
// Add Access-Control-Allow-* headers to every response so web-based clients
// and PWAs on other origins can use the HTTP API. Preflight OPTIONS requests
// are answered in handleNotFound().
server->enableCORS(true);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Restrict cross-origin access to the unauthenticated API

While the device web server is active, this enables cross-origin reads for arbitrary websites even though the inspected route table has no authentication: /api/files and /download expose SD-card contents, and the same server registers settings, credential, upload, and deletion endpoints. A malicious page visited by a user who is connected to the reader AP or shares its LAN can therefore access the reader API from the browser rather than being stopped by the same-origin policy. Use an explicit trusted-origin/authentication scheme instead of globally enabling CORS.

Useful? React with 👍 / 👎.

Comment on lines +1312 to 1313
} else if (s.valuePtr) {
doc["value"] = static_cast<int>(enumDisplayIndexForRawValue(s, SETTINGS.*(s.valuePtr)));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Derive the SD-font selection from its own size list

When an SD font is selected, the response replaces the option labels with that family's available sizes but still computes value using the base built-in raw values [10, 12, 14, 16]. For a family exposing [8, 9, 10, 12], a saved 10-point size is consequently returned as index 0 and the web page displays 8 points as selected. Compute the display index against selectedSdFamily->availableSizes() so the settings portal reports the active size correctly.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment