Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
401 commits
Select commit Hold shift + click to select a range
42352de
fix: correct Vietnamese i18n string offsets
uxjulia May 29, 2026
1d92cc0
fix: add missing settings menu translations
uxjulia May 29, 2026
16f0ba9
fix: inaccurate KOReader sync when syncing at chapter start
uxjulia May 29, 2026
f2d37f4
chore: merge upstream Crossspoint
uxjulia May 29, 2026
6177141
fix: automatically attempt to sync clock
uxjulia May 30, 2026
e7079d4
fix: stop counting backward page turns in reading stats
uxjulia May 30, 2026
99b7155
fix: only count page turns after 2 seconds
uxjulia May 30, 2026
2aa11dd
feat: display date for x3
uxjulia May 30, 2026
5b79ba2
fix: recover bookmarks from legacy epub hash filenames
uxjulia May 31, 2026
c2d47b2
chore: bump version
uxjulia May 31, 2026
3d3e0b1
chore: merge upstream crosspoint
uxjulia May 31, 2026
9deedec
fix: add more explicit KOReader sync error messaging
uxjulia Jun 1, 2026
d3b8b35
fix: improve book time-left estimates after quick navigations
uxjulia Jun 2, 2026
9d975be
fix: remove 'Go to Home' from in-reader menu
uxjulia Jun 2, 2026
2b66d28
fix: make clock and battery top padding consistent
uxjulia Jun 2, 2026
5512f8e
chore: merge upstream crosspoint
uxjulia Jun 3, 2026
43c53fe
fix: remove duplicate nearby stats sync label
uxjulia Jun 3, 2026
c164e26
fix: lyra and lyra extended home menu icon alignment
uxjulia Jun 3, 2026
d6e0aba
feat: allow selecting a custom sleep folder (#227)
uxjulia Jun 4, 2026
a7875f7
chore: merge upstream crosspoint master into development
uxjulia Jun 4, 2026
907b2f0
feat: reapply tiled grayscale row-band rendering on X3
uxjulia Jun 4, 2026
7757685
feat: skip loading popup for cached EPUB opens
uxjulia Jun 4, 2026
5176789
feat: add more reading stats for X3 and add minimal stats sleep screen
uxjulia Jun 4, 2026
6ba769b
feat: add more x3 reading stats
uxjulia Jun 5, 2026
2875242
fix: correct minimal stats streak wording
uxjulia Jun 5, 2026
9228aa3
feat: add global stats backup
uxjulia Jun 5, 2026
237efe8
fix: add explicit error when syncing with older version of crossink
uxjulia Jun 5, 2026
715c52f
feat: update web interface and improve development workflow
uxjulia Jun 5, 2026
a65388f
feat: add dark reader mode
uxjulia Jun 5, 2026
b74e164
chore: merge upstream crosspoint
uxjulia Jun 5, 2026
793f183
docs: minor formatting update to readme
uxjulia Jun 5, 2026
c2cd7eb
fix: localize minimal stats streak label
uxjulia Jun 5, 2026
a1496de
fix: reposition stats and swap 'new reader' icon
uxjulia Jun 5, 2026
1e98f98
fix: alignment and spacing fixes
uxjulia Jun 5, 2026
a988130
fix: adjust reading stats padding again
uxjulia Jun 5, 2026
bd39d6a
feat: improve rendering of controls menu
uxjulia Jun 5, 2026
53ec663
feat: improve rendering of display menu
uxjulia Jun 5, 2026
7937e18
feat: improve rendering of reader menu
uxjulia Jun 5, 2026
59b9a17
fix: reduce emoji coverage to more popular ones to reduce firmware size
uxjulia Jun 5, 2026
ec845e2
feat: add hebrew support to UI fonts
uxjulia Jun 5, 2026
eb45aba
fix: invert tilt-page-turn confirmation pop up in dark mode
uxjulia Jun 5, 2026
bd92e2d
feat: show a menu for toggable settings
uxjulia Jun 5, 2026
5b89768
feat: remove lesser used emojis
uxjulia Jun 5, 2026
b893267
fix: gate minimal stats to x3 devices only
uxjulia Jun 5, 2026
2b916a1
fix: align book time-left with displayed progress
uxjulia Jun 5, 2026
e15b969
feat: show reader font sizes as point sizes
uxjulia Jun 5, 2026
1ea390c
fix: tighten reading pace sample cutoff
uxjulia Jun 5, 2026
8b34c3d
fix: filter out reading pace samples greater than twice the average
uxjulia Jun 6, 2026
816d834
fix: german translation for STR_INVERTED (#2269)
Uri-Tauber Jun 5, 2026
8c4efcd
fix(epub): decode percent-encoded internal asset paths so assets rend…
uxjulia Jun 5, 2026
0e54239
fix(epub): decode footnote href path before spine lookup (#2271)
uxjulia Jun 5, 2026
012224f
chore: merge upstream Crossspoint
uxjulia Jun 6, 2026
537cbd9
docs: changelog cleanups
uxjulia Jun 6, 2026
058f7da
fix: clarify global reading stats backup label
uxjulia Jun 6, 2026
9a0ac66
feat: add dark mode shortcut actions
uxjulia Jun 6, 2026
0b1665a
fix: prefer pace for epub book time-left
uxjulia Jun 6, 2026
d2ecb4c
docs: readme cleanup
uxjulia Jun 6, 2026
2d117df
fix: free font catalog before SD font downloads; fixes #236
uxjulia Jun 7, 2026
03e58f2
fix: honor inverted side-button navigation in reader menus; fixes #235
uxjulia Jun 7, 2026
cfdd3df
feat: improve calculations for reading time left
uxjulia Jun 7, 2026
2f6fe0a
feat: reorganize reading stats backup settings
uxjulia Jun 7, 2026
066ed89
feat: add new menu and settings for reading stats including idle time…
uxjulia Jun 7, 2026
f5f3302
fix: add missing translations for minimal stats sleep screen reader t…
uxjulia Jun 7, 2026
c28d2eb
feat: add reading stats settings
uxjulia Jun 7, 2026
1c9197e
chore: merge upstream crosspoint
uxjulia Jun 7, 2026
0bbae1d
fix: release SD fonts before wifi activities and release wifi memory …
uxjulia Jun 7, 2026
bed4850
fix: clean up preserved cache return condition
uxjulia Jun 7, 2026
f9e2c45
feat: use pt sizes instead of names
uxjulia Jun 7, 2026
cc138b0
fix: invert quick resume markers in dark mode
uxjulia Jun 7, 2026
cecbed9
fix: sync quick resume timeout from sleep screen picker
uxjulia Jun 8, 2026
0becb77
fix: replace crosspoint versions with crossink's
uxjulia Jun 8, 2026
addb0e8
fix: update German translations
uxjulia Jun 8, 2026
e95f03a
fix: translate minimal home button labels
uxjulia Jun 8, 2026
5d43f33
fix: use versioned s3 font downloads
uxjulia Jun 8, 2026
78da3d3
fix: preserve heading alignment after inline images
uxjulia Jun 9, 2026
a4d99ce
fix: update spanish translations
uxjulia Jun 9, 2026
07ce046
fix: update translations for nearby stats sync
uxjulia Jun 9, 2026
1c4af42
chore: merge upstream crosspoint
uxjulia Jun 10, 2026
efbadff
docs: update agents.md
uxjulia Jun 10, 2026
3af5487
chore: merge upstream crosspoint
uxjulia Jun 10, 2026
18934ff
fix: add missing translations for 'quick return from footnotes'
uxjulia Jun 10, 2026
5db17b4
fix: show quick return from footnotes setting in web controls
uxjulia Jun 10, 2026
48084b3
docs: update readme
uxjulia Jun 10, 2026
bf362c9
Merge branch 'main' into development
uxjulia Jun 10, 2026
786556b
fix: invert clock settings
uxjulia Jun 10, 2026
d5f93fb
fix: stop book settings back button from skipping submenus
uxjulia Jun 10, 2026
39f4a1c
feat: long-press menu from home screen to swap between most recently …
uxjulia Jun 11, 2026
1cebed7
fix: preview png files from file browser #251
uxjulia Jun 11, 2026
777424c
fix: generate sleep covers on demand #252
uxjulia Jun 11, 2026
50af557
feat: add custom device name; feat: hide OS metadata in file browser
uxjulia Jun 11, 2026
896503f
feat: add additional shortcut options #222
uxjulia Jun 11, 2026
632a60c
fix: close hal files under storage lock
uxjulia Jun 12, 2026
19bad66
fix: refresh carousel cache for dynamic home icons
uxjulia Jun 12, 2026
cd7e2ac
fix: png page overlays causing long re-indexing #255
uxjulia Jun 12, 2026
604e2d9
feat: add noto sans regular
uxjulia Jun 12, 2026
d2e2065
chore: merge upstream crosspoint
uxjulia Jun 12, 2026
6811d86
fix: preserve reading stats when clearing cache #253
uxjulia Jun 12, 2026
020a7ff
fix: clean up KOReader sync failure return #257
uxjulia Jun 12, 2026
5427e91
fix: update font download sources
uxjulia Jun 12, 2026
40fbcb9
chore: bump version
uxjulia Jun 12, 2026
3d27954
feat: lower long-press threshold to 200ms
uxjulia Jun 12, 2026
ffdd281
fix: guard file browser loads under low memory
uxjulia Jun 12, 2026
f35f7b7
docs: update docs to reference optimizations
uxjulia Jun 12, 2026
2a12082
fix: move boot order back
uxjulia Jun 13, 2026
afedb9d
fix: use current screen for page overlay sleep background #260
uxjulia Jun 13, 2026
a3c080c
fix: add confirmation screen before clearing bookmark list
uxjulia Jun 13, 2026
838ab5e
docs: update controls documentation
uxjulia Jun 13, 2026
fe6065d
fix: resolve downloadable sd font sources
uxjulia Jun 13, 2026
1f94bf5
fix: prevent grayscale pass for page overlay images
uxjulia Jun 13, 2026
85b97f9
fix: namespace CrossInk settings file
uxjulia Jun 13, 2026
1e80145
chore: sync upstream Crossspoint
uxjulia Jun 13, 2026
36d73e9
fix(koreader): resolve element XPath progress against visible body te…
uxjulia Jun 13, 2026
e0441c6
feat: add setting to hide file extension #248
uxjulia Jun 13, 2026
1460426
feat: add file browser display row setting
uxjulia Jun 13, 2026
921bf3f
fix: date overlapping the clock in roundedraff
uxjulia Jun 13, 2026
5b8624a
fix: show remove read books setting in files cache
uxjulia Jun 13, 2026
9c36a70
Update release catalog for v1.3.2
uxjulia Jun 10, 2026
db9272b
fix: migrate epub state when moving finished books
uxjulia Jun 13, 2026
bf58ede
Merge branch 'main' into development
uxjulia Jun 13, 2026
0c15dca
ci: sign release catalog commits
uxjulia Jun 13, 2026
f8e1824
fix: lower roundedraff's battery icon #263
uxjulia Jun 13, 2026
798db91
fix: consume release after reader long-press shortcuts #265
uxjulia Jun 14, 2026
dd03e94
fix: redraw carousel header after restoring cached frames
uxjulia Jun 14, 2026
4699ea7
fix: redraw lyra carousel battery bar after restoring cached frames
uxjulia Jun 14, 2026
d44fe4a
fix: suppress back release from reader settings screens
uxjulia Jun 14, 2026
90cad03
feat: index large file browser folders on SD
uxjulia Jun 14, 2026
55a5691
fix(i18n): localize home empty-state strings (#2342)
krunkosaurus Jun 14, 2026
bdcc6e5
fix: avoid oversized web multi-delete requests (fixes #269)
uxjulia Jun 14, 2026
552da01
fix: improve handling of invisible codepoints
uxjulia Jun 14, 2026
d13252a
feat: add first pass for clipping support
uxjulia Jun 14, 2026
e39d6c4
fix: anchor clipping highlights to text after relayout
uxjulia Jun 14, 2026
6d77347
fix: clean clipping preview text
uxjulia Jun 14, 2026
7910ea3
ci: update release workflow for catalog publishing
uxjulia Jun 15, 2026
02bab00
fix: swap reader menu navigation direction in CCW/inverted (#2321) (#…
TheCyberRonin Jun 15, 2026
16eb66d
fix: add missing HTML 4.01 named entities (#2352)
rafaelmsse Jun 15, 2026
90039d7
fix(koreader): resolve element XPath progress against visible body te…
uxjulia Jun 16, 2026
2266060
fix: Ukrainian translation (#2354)
KymAndriy Jun 16, 2026
7cd16d3
fix: lower memory guard to what jpeg decoder actually needs
uxjulia Jun 16, 2026
f8515e4
fix: preserve EPUB position across font-size reindex
uxjulia Jun 16, 2026
1d702bd
fix: add epub compatibility mode that falls back to upstream's parsin…
uxjulia Jun 16, 2026
d950a1a
fix: font resizing causing large jumps
uxjulia Jun 16, 2026
c0bebf4
fix: index large folders on sd card
uxjulia Jun 16, 2026
660b28c
Add grayscale preconditioning for e-ink displays
itsthisjustin Jun 14, 2026
a2eefce
Add displayGrayscaleBase method for differential refresh
itsthisjustin Jun 14, 2026
ee9daed
update sdk
uxjulia Jun 14, 2026
b4d0ee1
feat: add clipping/highlighting support
uxjulia Jun 16, 2026
0275473
fix: regenerate fonts to handle strange codepoints
uxjulia Jun 16, 2026
96e3c70
fix: avoid overlapping Calibre transfer status
uxjulia Jun 16, 2026
4cdb5ab
fix: improve rendering of invisible codepoints
uxjulia Jun 16, 2026
43044ca
feat: save EPUB reader settings per book
uxjulia Jun 16, 2026
8cb19cc
fix: prewarm SD fonts for clipping selection
uxjulia Jun 16, 2026
60cc4da
feat: new in-reader menu
uxjulia Jun 16, 2026
365b6c3
fix: improve reader menu tab focus state
uxjulia Jun 17, 2026
055209c
fix: exit reader menu from focused tab row
uxjulia Jun 17, 2026
8005b74
fix: align clipping highlights with SD font advances
uxjulia Jun 17, 2026
ac17aa7
fix: clipping with sd card fonts rendering missing
uxjulia Jun 17, 2026
f66220a
fix: enable Shift key for URL keyboard input (#2178) (#2357)
nnnkit Jun 17, 2026
54d5a78
feat: add drag-and-drop to upload modal (#2290)
krunkosaurus Jun 17, 2026
d4069ae
feat: long-press Confirm launches KOReader sync from EPUB (#1808)
darkbublu Jun 17, 2026
22f3575
feat: Support for Korean line breaks and glyph spacing (#2288)
itsthisjustin Jun 17, 2026
f58ae93
fix: stacked calibre transfer progress bars
uxjulia Jun 17, 2026
522cc2b
fix: protect incompatible reading stats files
uxjulia Jun 17, 2026
0f20dbf
chore: update docs for clippings/highlights
uxjulia Jun 17, 2026
15c0063
fix(i18n): localize home empty-state strings (#2342)
krunkosaurus Jun 14, 2026
b2e55ce
fix: add missing HTML 4.01 named entities (#2352)
rafaelmsse Jun 15, 2026
14d6437
fix: enable Shift key for URL keyboard input (#2178) (#2357)
nnnkit Jun 17, 2026
375a7ea
feat: add drag-and-drop to upload modal (#2290)
krunkosaurus Jun 17, 2026
5be93a7
feat: Support for Korean line breaks and glyph spacing (#2288)
itsthisjustin Jun 17, 2026
cb8448a
fix: persist reader time-left estimates for home stats
uxjulia Jun 16, 2026
d63ec6e
fix: prepare SD font metrics for clipping selection
uxjulia Jun 17, 2026
9b82996
fix: add stats.bin migration flow
uxjulia Jun 17, 2026
f19f763
fix: clippings not highlighting correctly with SD card fonts
uxjulia Jun 17, 2026
c4e8d19
fix: remove unlabeled clipping page number
uxjulia Jun 17, 2026
cfe3b60
fix: keep txt reader open at file boundary
uxjulia Jun 17, 2026
4f0ebb3
feat: apply inverted filter to generated sleep screens
uxjulia Jun 17, 2026
eeeba56
fix: move roundedraff clock down on home screen
uxjulia Jun 17, 2026
b9cf3fe
chore: sync upstream Crossspoint
uxjulia Jun 17, 2026
125fa18
fix: cppchecks
uxjulia Jun 17, 2026
3e68387
fix: export clippings with selected page number
uxjulia Jun 17, 2026
a58c0cc
v1.3.4 (#284)
uxjulia Jun 17, 2026
be5f7ee
fix: guide dots not showing up when bionic reading was on
uxjulia Jun 18, 2026
1566f13
Merge branch 'release/v1.3.4' into development
uxjulia Jun 18, 2026
cc21307
feat: add new EPUB rendering mode and fallback method
uxjulia Jun 18, 2026
9ac0a58
fix: start clock UTC offset picker on the sign field
uxjulia Jun 18, 2026
70ccd5a
fix: back button when viewing clippings goes back to menu as expected
uxjulia Jun 18, 2026
d233847
fix: render clipping highlights across pages when layout changes
uxjulia Jun 18, 2026
def6789
ci: remove no_emoji builds
uxjulia Jun 18, 2026
1ec8b83
fix: add Portuguese hyphenation support
uxjulia Jun 18, 2026
aa534a5
feat: preserve epub publisher spacing
uxjulia Jun 19, 2026
2750d31
fix: preserve css during epub fallback layout
uxjulia Jun 19, 2026
d396013
feat: serve OTA firmware from stable S3 manifest
uxjulia Jun 19, 2026
73765f2
fix: stream OTA updates and verify sha-256 hash
uxjulia Jun 19, 2026
787fcde
feat: improve css rendering
uxjulia Jun 19, 2026
741bec9
fix: route no_emoji OTA updates to tiny
uxjulia Jun 19, 2026
f6c23c4
fix: reduce epub conversion heap pressure
uxjulia Jun 19, 2026
0224437
fix: revert rendering publisher's line-height settings
uxjulia Jun 19, 2026
0095570
fix: smooth progressive JPEG cover BMP upscales
gershalfred Jun 20, 2026
fc82da2
fix: refine progressive cover smoothing gate
uxjulia Jun 20, 2026
4574280
chore: update version
uxjulia Jun 20, 2026
95ab003
feat: add CrossInk EPUB location metadata
uxjulia Jun 14, 2026
c2f6592
wire in crossink-locations.json
uxjulia Jun 15, 2026
99652ef
feat: add stable epub reference pages
uxjulia Jun 20, 2026
df6bd2a
feat: stream epub opf
uxjulia Jun 20, 2026
766c25c
chore(release): prepare v1.3.4
uxjulia Jun 20, 2026
7c4473c
fix: update tilt page turn labels
uxjulia Jun 20, 2026
e5de8ed
fix: remove no_emoji references
uxjulia Jun 20, 2026
7114ac7
feat: add create clipping reader shortcuts
uxjulia Jun 21, 2026
706d629
fix: set sd file timestamps from x3 rtc
uxjulia Jun 21, 2026
a9a21b3
fix(epub): NFC-normalize EPUB text so NFD diacritics render correctly…
jetaudio Jun 18, 2026
cd4b00e
feat: add live font preview pane to font selection screen (#2349)
PaulDelestrac Jun 18, 2026
4a99b35
feat: add Spacing Modifier Letters range to font presets (#2194)
itsthisjustin Jun 21, 2026
229c82f
fix: don't justify-stretch a leading no-break space (#2185) (#2298)
SurprisedDuck Jun 21, 2026
e11a74c
Merge branch 'fix/x3-sd-timestamps' into development
uxjulia Jun 21, 2026
9846fb3
fix: update generated location filename
uxjulia Jun 21, 2026
1398240
Merge branch 'feat/crossink-locations' into development
uxjulia Jun 21, 2026
f713fcc
Merge branch 'release/v1.3.4' into development
uxjulia Jun 21, 2026
fb5160e
fix: epub crashes while indexing with bionic reading on
uxjulia Jun 21, 2026
a66598d
fix: use epub render fallbacks for silent indexing and avoid null fin…
uxjulia Jun 21, 2026
2b0a05f
fix: constrain EPUB clipping highlights
uxjulia Jun 21, 2026
0adaa0b
fix: handle sync long-press select release
uxjulia Jun 21, 2026
b1abee2
fix: add guidance for bionic/guide dots during memory pressure
uxjulia Jun 21, 2026
d7aee12
Merge branch 'release/v1.3.4' into development
uxjulia Jun 21, 2026
ac3f772
fix: preserve authored hyphens in clipping text
uxjulia Jun 22, 2026
fa7b8b6
fix: align reader menu icons with orientation
uxjulia Jun 22, 2026
87a7ae6
fix: reduce epub layout buffering for reading aids
uxjulia Jun 23, 2026
73dda8f
fix: new reader menu icons not rendering correctly in landscape
uxjulia Jun 23, 2026
228b24a
Merge branch 'release/v1.3.4' into development
uxjulia Jun 23, 2026
d9b5e76
fix: avoid home cover refresh oom crash
uxjulia Jun 23, 2026
f041039
update sdk
uxjulia Jun 23, 2026
61477a2
Merge branch 'fix/issue-303-home-book-crash' into release/v1.3.4
uxjulia Jun 23, 2026
d76b9c8
fix: preserve clipping highlights after relayout
uxjulia Jun 23, 2026
efb6fa4
fix: in-reader menu icons
uxjulia Jun 23, 2026
2e8f059
fix: keep clipping highlights complete after font relayout
uxjulia Jun 23, 2026
11edec5
fix: reduce epub reading aid layout tokens
uxjulia Jun 23, 2026
0b4c0e3
Merge branch 'feat/improve-bionic-and-guide-dots' into release/v1.3.4
uxjulia Jun 24, 2026
3bc3b9a
feat: add chained slab arena allocator
uxjulia Jun 24, 2026
5d9ab26
perf: wire parse arena into EPUB chapter style stacks
uxjulia Jun 24, 2026
7915a2b
fix: use arena inline style stack for table labels
uxjulia Jun 24, 2026
52e317c
fix: use arena scratch buffers for epub layout
uxjulia Jun 24, 2026
d8fb0bc
Merge branch 'release/v1.3.4' into development
uxjulia Jun 24, 2026
7b0f6a7
chore: update changelog
uxjulia Jun 24, 2026
89cb23d
Merge branch 'development' into feat/epub-arena-stacks
uxjulia Jun 24, 2026
9abab93
fix: add epub safe mode fallback
uxjulia Jun 24, 2026
5d1fbb0
Merge branch 'feat/safe-mode' into feat/epub-arena-stacks
uxjulia Jun 24, 2026
b4252c4
fix: bound epub footnote preview indexing
uxjulia Jun 24, 2026
60f63cb
fix(epub): flush displaced anchor before overwrite (#2336) (#2382)
kygia Jun 21, 2026
e78aced
feat: footnote returns to original position on deep sleep to avoid lo…
ZephByte Jun 22, 2026
783be1a
chore(release): prepare v1.3.4
uxjulia Jun 24, 2026
6c105cf
fix: report EPUB clipping save failures
uxjulia Jun 24, 2026
71096d7
fix: allow long EPUB section LUT growth and preserve section LUT low-…
uxjulia Jun 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
38 changes: 0 additions & 38 deletions .agents/skills/custom-fonts/SKILL.md

This file was deleted.

1 change: 0 additions & 1 deletion .github/skills/crosspoint-reader.md

This file was deleted.

27 changes: 23 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ jobs:
steps:
- uses: actions/checkout@v6
with:
token: ${{ secrets.RELEASE_PAT }}
submodules: recursive
fetch-depth: 0

Expand Down Expand Up @@ -61,7 +62,12 @@ jobs:
- name: Build CrossInk
env:
CROSSPOINT_RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
run: pio run -e teensy -e tiny -e xlarge -e no_emoji
run: pio run -e teensy -e tiny -e xlarge

- name: Create legacy no_emoji OTA alias
run: |
cp ".pio/build/tiny/firmware-tiny-v${{ env.RELEASE_VERSION }}.bin" \
".pio/build/tiny/firmware-no_emoji-v${{ env.RELEASE_VERSION }}.bin"

- name: Generate release catalog
run: |
Expand All @@ -71,15 +77,28 @@ jobs:
--firmware ".pio/build/teensy/firmware-teensy-v${{ env.RELEASE_VERSION }}.bin" \
--firmware ".pio/build/tiny/firmware-tiny-v${{ env.RELEASE_VERSION }}.bin" \
--firmware ".pio/build/xlarge/firmware-xlarge-v${{ env.RELEASE_VERSION }}.bin" \
--firmware ".pio/build/no_emoji/firmware-no_emoji-v${{ env.RELEASE_VERSION }}.bin" \
--output ".pio/build/catalog"

- name: Publish catalog to GitHub Pages source
env:
DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
CROSSINK_SIGNING_SSH_KEY: ${{ secrets.CROSSINK_SIGNING_SSH_KEY }}
run: |
if [ -z "$CROSSINK_SIGNING_SSH_KEY" ]; then
echo "::error::CROSSINK_SIGNING_SSH_KEY is not set"
exit 1
fi

install -m 700 -d ~/.ssh
printf '%s\n' "$CROSSINK_SIGNING_SSH_KEY" > ~/.ssh/crossink_actions_signing
chmod 600 ~/.ssh/crossink_actions_signing
ssh-keygen -y -f ~/.ssh/crossink_actions_signing > ~/.ssh/crossink_actions_signing.pub

git config user.name "uxjulia"
git config user.email "[email protected]"
git config gpg.format ssh
git config user.signingkey "$HOME/.ssh/crossink_actions_signing.pub"

git fetch origin "$DEFAULT_BRANCH"
git worktree add ../crossink-pages "origin/$DEFAULT_BRANCH"
cp ".pio/build/catalog" "../crossink-pages/docs/catalog"
Expand All @@ -89,7 +108,7 @@ jobs:
exit 0
fi
git add docs/catalog
git commit -m "Update release catalog for v${RELEASE_VERSION}"
git commit -S -m "Update release manifests for v${RELEASE_VERSION}"
git push origin "HEAD:$DEFAULT_BRANCH"

- name: Create GitHub Release
Expand All @@ -102,5 +121,5 @@ jobs:
files: |
.pio/build/teensy/firmware-teensy-v${{ env.RELEASE_VERSION }}.bin
.pio/build/tiny/firmware-tiny-v${{ env.RELEASE_VERSION }}.bin
.pio/build/tiny/firmware-no_emoji-v${{ env.RELEASE_VERSION }}.bin
.pio/build/xlarge/firmware-xlarge-v${{ env.RELEASE_VERSION }}.bin
.pio/build/no_emoji/firmware-no_emoji-v${{ env.RELEASE_VERSION }}.bin
1 change: 0 additions & 1 deletion .github/workflows/release_candidate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,3 @@ jobs:
.pio/build/teensy/firmware-teensy-${{ env.RC_BRANCH_SAFE }}-${{ env.RC_HASH_SHORT }}-RC.bin
.pio/build/tiny/firmware-tiny-${{ env.RC_BRANCH_SAFE }}-${{ env.RC_HASH_SHORT }}-RC.bin
.pio/build/xlarge/firmware-xlarge-${{ env.RC_BRANCH_SAFE }}-${{ env.RC_HASH_SHORT }}-RC.bin
.pio/build/no_emoji/firmware-no_emoji-${{ env.RC_BRANCH_SAFE }}-${{ env.RC_HASH_SHORT }}-RC.bin
36 changes: 36 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,40 @@
# Changelog
## [v1.3.4] - 2026-06-24

### Added
- File Browser now indexes large SD-card folders so directories with many books can be browsed without loading every filename into memory at once.
- EPUB text clipping with saved highlights, clipping lists, and Kindle-style `/My Clippings.txt` export.
- `Create Clipping` is now available as a reader shortcut for short/long Power, long-press Menu, and long-press Back actions.
- Per-book EPUB options for font, layout, styling, reading aids, and render modes, including `CrossInk Default`, `Balanced`, and `Light` modes for difficult books.
- Arena allocator (`lib/Memory/Arena.h`) for burst-then-discard allocation patterns - reduces heap fragmentation during EPUB parsing and page layout over long reading sessions.
- Optimized EPUBs now store location metadata at `META-INF/x-locations.json`.
- X3 SD-card writes now use the RTC for file timestamps when the clock is available.

### Changed
- The EPUB reader menu now splits the growing menu into 3 screens, labels per-book settings as `Book Options`, and avoids showing duplicate `Orientation` controls.
- The `Inverted` sleep cover filter now flips Minimal and Reading Stats sleep screens to black text on a white background.

### Fixed
- Calibre Wireless transfer status no longer stacks the last received-file message on top of the upload percentage.
- X3 Tilt Direction now labels left/right choices as `Left-Right` and `Right-Left`, with existing left/right preferences migrated to keep the same physical tilt behavior.
- EPUB layout now honors publisher page-break CSS, avoids stretching justified spaces before closing punctuation, and keeps large CSS rule sets in a smaller disk-backed lookup cache.
- EPUB first-open conversion now uses more compact OPF manifest lookups and streams cover-wrapper parsing to avoid large temporary heap buffers on books with huge manifests.
- EPUB chapters that run out of memory now retry with `Balanced`, `Light`, and final `Safe Mode` rendering before showing an error, apply the same fallbacks during next-chapter pre-indexing, and let book action menus reset a book's reader settings if Safe Mode still cannot open it.
- EPUB reader font-size changes now restore the current chapter position by content instead of jumping far backward after re-indexing.
- Reading Stats now use the reader's last live book time-left estimate instead of showing a separate fallback estimate.
- Per-book reading stats now migrate compatible legacy `stats.bin` files into the `stats_v5.bin` flow instead of resetting when only the old filename exists.
- Lyra Carousel Home menu rendering now avoids extra label allocations that could crash builds under low memory.
- Lyra Carousel Home cover refresh no longer risks a reboot when memory is tight after returning to or selecting a recent book.
- EPUB image-heavy chapters no longer risk a reboot while saving their reading cache under low memory.
- TXT readers now stay open when pressing a page-turn button at the end of the file.
- Long-press reader shortcuts that open another screen no longer close or confirm it again when releasing the shortcut button.
- RoundedRaff's header battery icon and percentage now sit lower to avoid clipping at the top edge.
- Lyra Carousel now keeps the Home header current when rendering the menu or restoring cached carousel frames, preventing stale battery and clock values while navigating between books.
- Web file manager multi-delete now handles larger selections without failing after a small batch.
- Portuguese EPUBs now use Portuguese hyphenation rules instead of leaving long words unhyphenated when Hyphenation is enabled.
- Progressive JPEG EPUB covers now render more smoothly in generated cover and thumbnail BMP assets.
- EPUB section layout now flushes long text runs earlier when Bionic Reading or Guide Dots are enabled, reducing low-memory failures on difficult books.
- Footnotes in EPUBs with very large shared notes sections no longer cause long stalls when opened.

## [v1.3.3] - 2026-06-13

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ The UI now uses [Inter](https://fonts.google.com/specimen/Inter) as the display

### Font Sizes

There are 4 available build variants to choose from due to build size constraints: `teensy`, `tiny`, `xlarge`, and `no_emoji`.
There are 3 available build variants to choose from due to build size constraints: `teensy`, `tiny`, and `xlarge`.

See [Font Build Variants](./docs/font-build-variants.md) for the full point-size and emoji-support matrix.

Expand Down
2 changes: 2 additions & 0 deletions USER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,8 @@ On the **Xteink X3**, the gyroscope can be used to turn pages by tilting the dev

When reading an EPUB that contains footnotes, you can navigate to the footnote text by selecting the footnote reference in the book. From the footnote, you can return to your original reading position.

If the device goes to sleep or you close the book while viewing a footnote, the book reopens to your original reading position, not the footnote.

### System Navigation

* **Return to Home:** Press the **Back** button to close the book and return to the **[Home](#31-home-screen)** screen.
Expand Down
134 changes: 67 additions & 67 deletions docs/catalog
Original file line number Diff line number Diff line change
@@ -1,69 +1,69 @@
{
"schema_version": 1,
"releases": [
{
"id": "stable-1.3.3-teensy",
"channel": "stable",
"name": "1.3.3",
"version": "1.3.3",
"variant": "teensy",
"released_at": "2026-06-13T20:06:21Z",
"notes": "CrossInk 1.3.3 stable firmware",
"firmware_url": "https://github.com/uxjulia/CrossInk/releases/latest/download/firmware-teensy-v1.3.3.bin",
"firmware_sha256": "4dbff2a0361d77d820860f7d937e22ef0b3ba14840b17f82a95395c28b63389d",
"size": 5752432,
"supported_devices": [
"x4",
"x3"
"schema_version": 1,
"releases": [
{
"id": "stable-1.3.3-teensy",
"channel": "stable",
"name": "1.3.3",
"version": "1.3.3",
"variant": "teensy",
"released_at": "2026-06-13T20:06:21Z",
"notes": "CrossInk 1.3.3 stable firmware",
"firmware_url": "https://github.com/uxjulia/CrossInk/releases/latest/download/firmware-teensy-v1.3.3.bin",
"firmware_sha256": "4dbff2a0361d77d820860f7d937e22ef0b3ba14840b17f82a95395c28b63389d",
"size": 5752432,
"supported_devices": [
"x4",
"x3"
]
},
{
"id": "stable-1.3.3-tiny",
"channel": "stable",
"name": "1.3.3",
"version": "1.3.3",
"variant": "tiny",
"released_at": "2026-06-13T20:06:21Z",
"notes": "CrossInk 1.3.3 stable firmware",
"firmware_url": "https://github.com/uxjulia/CrossInk/releases/latest/download/firmware-tiny-v1.3.3.bin",
"firmware_sha256": "ccaed6bdd7cd0282f1a5c3aaf47c5a4d1344777cc7604c854687cfcf38cc1164",
"size": 6186384,
"supported_devices": [
"x4",
"x3"
]
},
{
"id": "stable-1.3.3-xlarge",
"channel": "stable",
"name": "1.3.3",
"version": "1.3.3",
"variant": "xlarge",
"released_at": "2026-06-13T20:06:21Z",
"notes": "CrossInk 1.3.3 stable firmware",
"firmware_url": "https://github.com/uxjulia/CrossInk/releases/latest/download/firmware-xlarge-v1.3.3.bin",
"firmware_sha256": "6d2b4dcc5d5b5adfdbc8dc450ff5676c3976705737e6400597d9d5dd21bf2528",
"size": 6050896,
"supported_devices": [
"x4",
"x3"
]
},
{
"id": "stable-1.3.3-no_emoji",
"channel": "stable",
"name": "1.3.3",
"version": "1.3.3",
"variant": "no_emoji",
"released_at": "2026-06-13T20:06:21Z",
"notes": "CrossInk 1.3.3 stable firmware",
"firmware_url": "https://github.com/uxjulia/CrossInk/releases/latest/download/firmware-no_emoji-v1.3.3.bin",
"firmware_sha256": "083b49bd99b744edeb42677dd01e34f7e059753e834de9860aa332af43098521",
"size": 6509856,
"supported_devices": [
"x4",
"x3"
]
}
]
},
{
"id": "stable-1.3.3-tiny",
"channel": "stable",
"name": "1.3.3",
"version": "1.3.3",
"variant": "tiny",
"released_at": "2026-06-13T20:06:21Z",
"notes": "CrossInk 1.3.3 stable firmware",
"firmware_url": "https://github.com/uxjulia/CrossInk/releases/latest/download/firmware-tiny-v1.3.3.bin",
"firmware_sha256": "ccaed6bdd7cd0282f1a5c3aaf47c5a4d1344777cc7604c854687cfcf38cc1164",
"size": 6186384,
"supported_devices": [
"x4",
"x3"
]
},
{
"id": "stable-1.3.3-xlarge",
"channel": "stable",
"name": "1.3.3",
"version": "1.3.3",
"variant": "xlarge",
"released_at": "2026-06-13T20:06:21Z",
"notes": "CrossInk 1.3.3 stable firmware",
"firmware_url": "https://github.com/uxjulia/CrossInk/releases/latest/download/firmware-xlarge-v1.3.3.bin",
"firmware_sha256": "6d2b4dcc5d5b5adfdbc8dc450ff5676c3976705737e6400597d9d5dd21bf2528",
"size": 6050896,
"supported_devices": [
"x4",
"x3"
]
},
{
"id": "stable-1.3.3-no_emoji",
"channel": "stable",
"name": "1.3.3",
"version": "1.3.3",
"variant": "no_emoji",
"released_at": "2026-06-13T20:06:21Z",
"notes": "CrossInk 1.3.3 stable firmware",
"firmware_url": "https://github.com/uxjulia/CrossInk/releases/latest/download/firmware-no_emoji-v1.3.3.bin",
"firmware_sha256": "083b49bd99b744edeb42677dd01e34f7e059753e834de9860aa332af43098521",
"size": 6509856,
"supported_devices": [
"x4",
"x3"
]
}
]
}
}
2 changes: 1 addition & 1 deletion docs/contributing/development-workflow.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ pio run -e default
CI enforces formatting, static analysis, and the primary firmware build.
Use clang-format 21+ locally to match CI.
If `clang-format` is missing or too old locally, see [Getting Started](./getting-started.md).
Run plain `pio run` before larger PRs to build the release variants (`teensy`, `tiny`, `xlarge`, and `no_emoji`).
Run plain `pio run` before larger PRs to build the release variants (`teensy`, `tiny`, and `xlarge`).

## 4) Open the PR

Expand Down
2 changes: 1 addition & 1 deletion docs/contributing/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ pio run -e simulator
pio run -e default
```

`pio run` without an environment builds the release variants listed in `platformio.ini`: `teensy`, `tiny`, `xlarge`, and `no_emoji`.
`pio run` without an environment builds the release variants listed in `platformio.ini`: `teensy`, `tiny`, and `xlarge`.

## Flash

Expand Down
2 changes: 1 addition & 1 deletion docs/contributing/testing-debugging.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ pio run -e simulator
pio run -e default
```

`pio run` without `-e` builds the release matrix from `platformio.ini` (`teensy`, `tiny`, `xlarge`, and `no_emoji`). Use it before opening broad firmware PRs, but prefer explicit environments while iterating.
`pio run` without `-e` builds the release matrix from `platformio.ini` (`teensy`, `tiny`, and `xlarge`). Use it before opening broad firmware PRs, but prefer explicit environments while iterating.

## Flash and monitor

Expand Down
17 changes: 15 additions & 2 deletions docs/data-cache.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,14 @@ The main data directory is `.crosspoint` on the SD card. It stores render caches
├── opds.json # Saved OPDS servers
├── koreader.json # KOReader sync credentials
├── bookmarks/ # Bookmark files, one per book
├── clippings/ # EPUB clipping/highlight files, one per book
├── home_carousel_cache.bin # Lyra Carousel home-screen snapshot cache
├── sleep_frame.bin # Temporary sleep overlay framebuffer, when used
├── epub_12471232/ # Each EPUB is cached to epub_<hash>
│ ├── progress.bin # Reading position (chapter, page, etc.)
│ ├── stats.bin # Per-book reading stats
│ ├── reader_settings.bin # Per-book reader settings
│ ├── stats.bin # Legacy per-book reading stats
│ ├── stats_v5.bin # Version 5 per-book reading stats
│ ├── reader_settings.bin # Per-book reader settings, render mode, and auto-page-turn interval
│ ├── cover.bmp # Book cover image, once generated
│ ├── thumb_*.bmp # Home/recent-books thumbnail images
│ ├── book.bin # Book metadata, spine, table of contents, etc.
Expand All @@ -57,6 +59,17 @@ To clear EPUB/XTC render caches from the device UI without deleting settings or

Cache folders are path-based. Moving a book file can create a new cache directory, so the moved copy may start with fresh reading progress unless the firmware migrates the cache for that move. CrossInk migrates cache and bookmark data for the built-in move-to-Read flow and related file-browser move actions.

EPUB reader font, page layout, styling, and reading-aid settings normally come from the global Reader settings. If those settings are changed from inside an EPUB, CrossInk stores a per-book override in that book's `reader_settings.bin`; books without that override continue to follow the global defaults. EPUB render mode is also stored per book so a problematic title can be switched to Balanced or Light rendering from the File Browser or Recent Books long-press menus before opening it.

EPUB clippings and highlights live outside the EPUB render-cache folder in
`/.crosspoint/clippings/`. Each book gets a binary clipping file named from the
book type and the CRC32 of the book path. The same clipping record powers the
in-reader highlight, the clipping list, and jump-back behavior. CrossInk also
appends a Kindle-style text export to `/My Clippings.txt` on the SD-card root;
that export is human-readable and append-only, so deleting a clipping in the UI
removes the in-app saved clipping but does not rewrite old text already exported
to `/My Clippings.txt`.

Cache data is cleared by supported CrossInk delete/move flows. If you remove or rename books outside CrossInk by editing the SD card directly, old cache folders may remain until you clear reading cache.

All-time reading stats can also be backed up outside `.crosspoint` in:
Expand Down
Loading
Loading