Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
c81b58d
feat: add word and character spacing controls (#3528)
serialx Sep 21, 2026
10d0aa1
feat: refresh library (#3608)
Uri-Tauber Sep 21, 2026
12cc816
Remove RenderLock from EpubReaderActivity destructor
itsthisjustin Sep 22, 2026
6f94d1a
fix: unblock X4 Pro frontlight double-click when short power press = …
naydichev Sep 22, 2026
362c881
feat: Adds Cover Grid UI Theme for PSRAM capable devices (#3657)
itsthisjustin Sep 22, 2026
581f59f
Change book card selection indicator to CoverFrame
itsthisjustin Sep 22, 2026
b6cbb5e
feat: Add CrossInk style swipe and tap controls (#3586)
itsthisjustin Sep 22, 2026
04ca1d5
perf: reduce per-pixel overhead in font rendering (#3633)
serialx Sep 22, 2026
004c489
feat: Convert slider dialogs to popups over current page (#3669)
itsthisjustin Sep 22, 2026
6f7b3e4
fix(settings): fix list scrolling (#3668)
brianhuster Sep 22, 2026
d8da03e
fix: Split navigation modes for cover grid & add selected states (#3670)
itsthisjustin Sep 22, 2026
038d615
fix: stop duplicating identical interval tables across font styles (#…
eszter007 Sep 22, 2026
0914aa1
fix: wrap OTA completion power-on hint (#3632)
lpla Sep 23, 2026
aaf6837
feat: Add TrueType fonts on PSRAM boards (#3646)
itsthisjustin Sep 23, 2026
3f70f5d
fix: Sticky env missing ram stats (#3683)
Uri-Tauber Sep 23, 2026
fca8f55
fix: Reader list not scrollable with touch (#3693)
itsthisjustin Sep 23, 2026
0f01106
feat: add Portuguese hyphenation support (#3643)
type0labs-dev Sep 23, 2026
fc4feed
chore: address Python Sonar warnings (#2515)
lpla Sep 24, 2026
b88b653
feat: better footnotes navigation (#3682)
Uri-Tauber Sep 24, 2026
637ad4a
fix: Switch tap zones for RTL books (#3709)
Uri-Tauber Sep 24, 2026
794ac97
fix: justify Korean text by word spaces only (#3700)
serialx Sep 25, 2026
720b995
feat: add back buttons to the header and unify all theme headers (#3689)
itsthisjustin Sep 25, 2026
f7eedba
fix: Remove loading icon display during startup (#3671)
itsthisjustin Sep 25, 2026
8bae59d
Preserve display inversion for Quick Resume sleep
itsthisjustin Sep 25, 2026
5bfaf7b
Use FAST refresh for moon icon in night mode
itsthisjustin Sep 25, 2026
1d61100
fix: release SD-font caches on reader exit (#3699)
serialx Sep 25, 2026
10cb2c3
perf: avoid main-loop contention during EPUB rendering (#3652)
serialx Sep 26, 2026
022dfed
fix: Toolbar menu in landscape mode + TTF font sizes (#3748)
Uri-Tauber Sep 26, 2026
a70ade7
fix: don't reopen unreadable EPUB on wake (#3724)
SurayaAtouraya Sep 26, 2026
4a6283d
fix: Remove article stripping logic (#3749)
Uri-Tauber Sep 26, 2026
6410894
chore: Update translations (#3396)
Uri-Tauber Sep 27, 2026
6743b68
fix: don't cut screenshot folder names mid-letter (#3750)
SurayaAtouraya Sep 27, 2026
ef08c3a
fix: speed up long status titles (#3573)
Uri-Tauber Sep 27, 2026
93e98bb
fix: pin pioarduino in release.yml too
Uri-Tauber Sep 27, 2026
b145c14
fix: update keyboard layout and look (#3755)
uxjulia Sep 28, 2026
2813205
test: include <cstdint> in library builder storage stub (#3765)
suhsoohong Sep 28, 2026
1f08ce9
feat: navigate lists on button press (#3754)
Uri-Tauber Sep 28, 2026
e6af0c9
fix: Footnote selection with power button (#3766)
Uri-Tauber Sep 28, 2026
b418195
fix: preserve reader status bar settings when upgrading
uxjulia Sep 28, 2026
cab9c37
fix: keep Library in portrait orientation
uxjulia Sep 28, 2026
a7853fb
feat: allow toggling reading stats on/off
uxjulia Sep 28, 2026
0dc13d7
test: include integer types in library builder stub
suhsoohong Sep 28, 2026
799187d
fix: pin the nested PlatformIO core in release builds
Uri-Tauber Sep 28, 2026
7d447c6
fix: avoid white flash when adding the sleep moon
itsthisjustin Sep 28, 2026
891a06f
fix: skip the loading icon refresh on wake
itsthisjustin Sep 28, 2026
7cdaef4
fix: keep screenshot folder names on complete characters
SurayaAtouraya Sep 28, 2026
e10fb1f
perf: shorten long status titles with fewer measurements
Uri-Tauber Sep 28, 2026
74399e9
fix: wrap long update completion instructions
lpla Sep 28, 2026
2ecd13e
fix: restore periodic memory logs on Sticky
Uri-Tauber Sep 28, 2026
821eedc
fix: follow reading direction for RTL EPUB touch turns
Uri-Tauber Sep 28, 2026
bc1ef41
fix: free rebuildable font caches after reading
serialx Sep 28, 2026
6cb7e75
fix: keep Korean word spacing natural when justified
serialx Sep 28, 2026
169c1e2
feat: select footnotes on the reading page
Uri-Tauber Sep 28, 2026
7a0fc6f
feat: add Cover Grid Home on PSRAM devices
itsthisjustin Sep 28, 2026
19205ea
chore: sync upstream Crosspoint
uxjulia Sep 28, 2026
0112136
feat: allow independent customization of each side button
uxjulia Sep 28, 2026
c364f54
fix: restore reader preview height
uxjulia Sep 28, 2026
7c235dd
feat: add the old cover grid view into library for recently opened books
uxjulia Sep 28, 2026
cd35e8c
docs: explain reading stats controls
uxjulia Sep 28, 2026
78924ff
feat: allow more granular sleep/wake settings. Long-press always wake…
uxjulia Sep 28, 2026
965b4bd
fix: apply global font setting changes to open books on exit of setti…
uxjulia Sep 28, 2026
d4af286
Merge uxjulia/crossink development 965b4bd into development
claude Sep 29, 2026
b923769
fix: build and test fixes after upstream 965b4bd merge
claude Sep 29, 2026
9b0c70d
refactor: clear cppcheck knownCondition findings in upstream XTC stat…
claude Sep 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 9 additions & 15 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,12 @@ jobs:
token: ${{ secrets.RELEASE_PAT }}
fetch-depth: 0

- name: Verify release tag is on default branch
- name: Verify release tag is on main
if: github.event_name == 'push'
env:
DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
run: |
git fetch origin "$DEFAULT_BRANCH:refs/remotes/origin/$DEFAULT_BRANCH"
git fetch origin main:refs/remotes/origin/main
TAG_COMMIT="$(git rev-list -n 1 "$GITHUB_REF_NAME")"
git merge-base --is-ancestor "$TAG_COMMIT" "origin/$DEFAULT_BRANCH"
git merge-base --is-ancestor "$TAG_COMMIT" origin/main

- name: Resolve release version
id: version
Expand Down Expand Up @@ -85,18 +83,14 @@ jobs:
run: uv pip install --system -U https://github.com/pioarduino/platformio-core/archive/refs/tags/v6.1.19.zip

- name: Pin pioarduino core inside the platform penv
env:
PIO_ENV: ${{ matrix.environment }}
run: |
set -euo pipefail
# Envs with custom_sdkconfig (default, the light-sleep profiles) run a
# nested `pio run` from ~/.platformio/penv, which the platform creates
# with an open-ended "pioarduino>=6.1.19". That now resolves to 6.2.0,
# which needs SCons 4.11 while the platform installs SCons 4.8.1; the
# two reinstall over each other mid-build and the link fails with
# "No module named 'SCons.Tool.FortranCommon'". Pin the penv core to
# the outer core's version. The platform leaves a satisfying version
# alone. See crosspoint-reader/crosspoint-reader#3594 and
# pioarduino/platform-espressif32#529.
pio pkg install -e ${{ matrix.environment }}
# custom_sdkconfig runs a nested `pio run` from ~/.platformio/penv.
# Keep that core on the same version as the outer core.
# See https://github.com/pioarduino/platform-espressif32/issues/529
pio pkg install -e "$PIO_ENV"
uv pip install --python ~/.platformio/penv/bin/python "pioarduino==6.1.19"
~/.platformio/penv/bin/pio --version

Expand Down
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
### Added

- The web status API (`/api/status`) reports a `temperatures` block: the chip temperature on ESP32-S3 devices, the battery fuel gauge's temperature on boards that have one (such as the X3), and on the X4 Pro the e-ink panel controller's own sensor, sampled after a screen refresh at most once a minute. Sensors a board lacks are left out.
- Turn reading stats tracking on or off for the whole device or individual EPUB and XTC books, while keeping saved history and Time Left estimates.
- Assign separate short-press and long-press actions to the Left/Up and Right/Down side buttons; existing side-button layouts migrate to matching individual actions.
- Assign Library to power, long-press, button-chord, Home-button, or Quick Actions shortcuts to open the book list directly.
- Customize the top and bottom reader status bars separately, including item positions and progress bars, in EPUB, TXT, and XTC books. Each bar can be previewed where it appears while reading.
- View a selected book's reading stats from its Library or File Browser action menu.
Expand All @@ -21,10 +23,12 @@
- The Settings > System footer shows the firmware's branch (the batch number, such as `b11`, for combined test builds) and commit, with `*` when built from uncommitted changes, under the version. The System list stops above the footer instead of running under it. The web status API reports the full branch, build number (the commit count unless the build sets `CROSSINK_BUILD_NUMBER`; left out for shallow checkouts) and UTC build time.
- In-reader menu for X3/X4/X4 Classic have been updated to a modified version of the in-reader menu for touch devices
- Chapter pages and book progress information is displayed in the frontlight drawer when in the reader for X4 Pro
- Add a Cover Grid Home theme on devices with PSRAM, showing the current book and six library covers.

### Changed

- USB Drive mounts faster: the next part of the SD card is read in the background while the current data is sent over USB, cutting about 5 seconds from mounting a FAT32 card on the X4 Pro.
- Set Power short-press and long-press to Sleep, Wake, or Sleep/Wake separately; holding Power can always wake the device. Chord shortcuts and the home button can also now sleep the device.
- Brightness and warmth gestures now respond while you drag, with longer swipes making larger adjustments.
- Edge-slide and two-finger brightness and warmth gestures now adjust in 1% steps instead of 5% and are half as sensitive: a full-length slide changes the level by about 50%.
- Reversing a brightness or warmth drag partway now moves the level past where it started instead of stopping there.
Expand All @@ -46,6 +50,8 @@
- SD-card fonts share identical character lookup tables across styles, reducing memory use and repeated card reads.
- EPUB reader menus now share five tabs across devices. Button devices gain live font and margin previews, Reading Stats, and in-book transfer options.
- The on-screen keyboard now uses wider outlined keys with clearer spacing on touch and button devices.
- Long status titles shorten faster when they do not fit the screen.
- Leaving an EPUB or TXT reader releases rebuildable font buffers for other screens.

### Fixed

Expand Down Expand Up @@ -100,6 +106,16 @@
- A button press made while the end-of-book "Continue with" menu is still appearing is no longer lost: it moves the selection, opens the book, or goes back once the menu is ready.
- The image viewer redraws the image after you close the pull-down top panel, the image action menu, or a prompt, instead of leaving the panel or menu on screen.
- 8-bit and other paletted BMPs saved with a newer (V4/V5) header, as GIMP and ImageMagick write them, now show their real gray levels. White backgrounds no longer turn into dither dots and black no longer shows as dark gray, in the image viewer and on sleep and boot screens.
- Release builds use the pinned PlatformIO core during nested ESP-IDF configuration.
- Adding the sleep moon to the last screen no longer flashes white in night mode.
- Waking the reader skips the intermediate loading icon refresh.
- Screenshot folder names keep complete non-English characters when shortened.
- Longer power-on instructions wrap on the finished update screen.
- Sticky now records periodic heap and PSRAM statistics over its ROM logging path.
- RTL EPUBs use reading-order swipe and tap directions.
- Korean text keeps natural syllable spacing when justified and wraps by word.
- Footnote choices can be selected directly on the reading page, with a list fallback for links without a visible target.
- Changing global font or page layout settings from the pull-down panel on touch devices now updates the open book when it inherits those settings.

## [v1.6.0] - 2026-09-21

Expand Down
1 change: 1 addition & 0 deletions docs/data-cache.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ The main data directory is `.crosspoint` on the SD card. It stores render caches
│ ├── progress.bin.bak # Reading position slot B; the newer valid slot wins
│ ├── stats.bin # Legacy per-book reading stats
│ ├── stats_v5.bin # Version 5 per-book reading stats
│ ├── reading_stats_off # Present when stats tracking is disabled for this book
│ ├── reader_settings.bin # Per-book reader settings, render mode, and auto-page-turn interval
│ ├── cover.bmp # Book cover image, once generated
│ ├── cover_absolute.bmp # Four-tone image-mode cover (generated separately)
Expand Down
16 changes: 11 additions & 5 deletions docs/file-formats.md
Original file line number Diff line number Diff line change
Expand Up @@ -482,12 +482,18 @@ Binary layout:

## `section.bin`

### Version 79

Version 79 keeps the version 78 serialized layout. Korean words now wrap at
spaces by default; with hyphenation enabled, they can also split at a legal
CJK boundary at a line end without a visible hyphen. Justification stretches
word spaces only. Full caches (byte `79`) and suspended partial caches
(`0xF4`) both rebuild because earlier page positions are no longer valid.

### Version 78

Version 78 keeps the serialized layout unchanged. It was bumped because inline
CSS padding now affects dialogue and other styled text positions. Complete files
use byte `78`; suspended partials use the previously unused sentinel `0xF2`, so
version 77 partials (`0xF3`) rebuild instead of resuming under the new layout.
Version 78 changed layout for inline CSS padding. Full and suspended partial
section caches rebuild together.

### Version 77

Expand Down Expand Up @@ -612,7 +618,7 @@ import std.mem;
import std.string;
import std.core;

#define EXPECTED_VERSION 77
#define EXPECTED_VERSION 79
#define MAX_STRING_LENGTH 65535
#define FOOTNOTE_NUMBER_LEN 32
#define FOOTNOTE_HREF_LEN 96
Expand Down
10 changes: 9 additions & 1 deletion docs/reader-features.md
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,15 @@ clipping and its highlight, not an entry already exported to

## Reading Stats

CrossInk tracks per-book reading stats automatically and aggregates them into global stats.
CrossInk tracks per-book reading stats automatically and aggregates them into global stats for EPUB and XTC files.

### Turn tracking on or off

The device-wide switch is in **Settings > System > Reading Stats > Track Reading Stats**. When it is off, CrossInk stops recording new per-book and all-time stats. It does not delete saved stats or saved Time Left pace estimates. Turning tracking back on makes the saved history available again and resumes recording for books whose own tracking is enabled. Reading time and pages from the period when tracking was off are not added later.

While device-wide tracking is off, recorded-stat actions and displays are hidden from the menus and home themes that normally show them. The Dashboard can still show a saved Time Left estimate when one is available. The **Reading Stats** and **Minimal Stats** sleep screens fall back to the regular Minimal sleep screen when tracking is off device-wide or for the recent book. The tracking switch remains available in Settings so it can be turned back on.

You can also pause stats for one EPUB or XTC book while device-wide tracking is on. For an EPUB, use **Track Reading Stats** in the Reader Menu's **Settings** tab; for an XTC book, use **Track Reading Stats** in its Reader Menu. You can also use the book's Library/File Browser action menu when available. This preserves the book's saved stats and stops adding stats for that book, including its contribution to all-time totals. While paused, that book's **Reading Stats** view and book-specific theme display are hidden; its saved Time Left estimate may still appear in the Dashboard. Re-enable tracking to show the saved book history and resume recording.

Tracked stats include:

Expand Down
Loading
Loading