3dslibris changelog
v3.0.0 · Oct 27, 2026
3dslibris 3.0.0
It has been a while, but now you can search your books and zoom in on images!
This release also includes many fixes and improvements, including better support for CJK text, landscape orientation and handedness controls, and more.
New
- #163: find words and phrases with the 3DS keyboard, highlight matches and move between results. Available in EPUB, MOBI, TXT, Markdown, FB2, RTF and ODT through the BOOK menu.
- #28: zoom and pan illustrations in EPUB, MOBI and FB2. Hold Y to select an image, then press A to open it. Includes touch controls and returns to your reading position.
- #101: optional 800×240 top-screen mode for PDF, CBZ and XPS through
wide top screenin the BOOK menu. Available on Old/New 3DS (including XL) and New 2DS XL; the original 2DS stays at 400×240. - Optional
disable ebook imagessetting understyle customization(I also read YT comment hehe).
Fixes and improvements
- Faster library browsing and EPUB page turns, smoother PDF panning and quicker app shutdown.
- Open PDFs fitted to the whole page and improve PDF/CBZ image scaling.
- EPUB books show the first page before the page cache finishes saving.
- Fix overlapping full-page images and preserve authored image sizes across reading screens.
- Correct orientation and handedness controls, landscape buttons, loading screens and partial redraws (I didn't try these for a while and some things were broken).
- Show two lines for library titles and load folder covers only when visible and idle.
- Fix a CJK pagination stack overflow (#165), parsing errors, image-loading limits and invalid page-cache handling.
Updating
EPUB and MOBI page caches are rebuilt on first open after updating. Reading progress, bookmarks and preferences are kept. If you close the app while an EPUB cache is still being prepared, it may need rebuilding on the next open. Returning to the library finishes the pending save.
Search does not support PDF/CBZ/XPS, OCR or RTL text. See the search guide and image controls for details.
Downloads
3dslibris.ciaor3dslibris.3dsxfor normal use.3dslibris-sdmc.zip: runtime files for Homebrew Launcher installs; use with the.3dsxdownload.- Debug builds (
3dslibris-debug.cia/3dslibris-debug.3dsx) and3dslibris-source.tar.gzare also included.
Thanks to everyone reporting issues and supporting the project. Special thanks to @Rhlp-Engineering and @Leblatar for supporting this version! You can help with a ⭐ on GitHub or a coffee.
v2.9.1 · Oct 1, 2026
3dslibris 2.9.1
This update makes the menus easier to use without a touchscreen and fixes EPUB layout, navigation, and RTF text issues.
Improvements
- #156: navigate settings and the go-to-page dialog with the D-pad as well as the Circle Pad. The D-pad also changes pages in book information.
- Make the selected option easier to see in settings, font selection, the index, and bookmarks across the available color modes.
- Improved test quality and coverage.
Bug Fixes
- #139: keep text after a horizontal rule near the page edge instead of dropping the following heading.
- #142: place adjacent block divisions on separate lines.
- Keep distinct EPUB index entries when their anchors share a page, including after malformed XHTML.
- Read RTF control words starting with
uwithout mistaking them for Unicode characters. - Stop cancelled book openings before parsing starts, including TXT files.
❤️ Community Shoutouts
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.9.0 · Sep 28, 2026
3dslibris 2.9.0
I'm coming back from a long hiatus (holidays heheh) with a new release that fixes some long-standing issues and adds a few new features. I hope you enjoy it!
This version brings more reliable text pagination and alignment, finer publisher-margin controls, lower memory usage when reopening large MOBI books, natural CBZ page ordering, and corrected CIA banner audio.
Improvements
- Smoother library navigation: respond to input before idle cover and metadata work. It redraws only the parts of the library that changed.
- Faster settings changes: apply font and spacing adjustments immediately, then group repeated preference saves after a short pause or when settings are closed.
- Faster PDF drawing: reuse page display lists across previews and zoom changes, and precompute image scaling coordinates.
- In my New 3DS debug captures, the main drawing step at zoom 4 fell from about 163 to 120 ms (26% less time).
- Quicker CBZ page turns: keep the archive open and reuse decoded images across previews and zoom levels, skipping repeat reads and scaling when possible.
- For a 480×701 scale, measured time fell from 93 to 14 ms on New 3DS (84% less) and 288 to 51 ms in Azahar (82% less).
- Clearer CBZ text at low zoom: start with a higher-resolution image instead of requiring a zoom in and out to sharpen it, while retaining a lower-resolution fallback if decoding fails.
- Lower MOBI memory use: reopen page caches larger than 16 MiB incrementally instead of reading them all into memory at once.
- More control over EPUB layout: set publisher vertical spacing and side margins independently, globally or per book.
- Better debug measurements: record PDF/CBZ opening, decoding, drawing and presentation times, plus memory use and slow library jobs, to help locate remaining bottlenecks.
Bug Fixes
- Redraw PDF/CBZ viewports with smoothing when the Circle Pad or C-Stick stops, matching stylus release.
- Prepare fixed-layout workers synchronously before HOME/sleep, without blocking joins or freeing their resources inside the APT hook. Cleanup runs after resume. This addresses lifecycle hazards; the HOME Menu crash reported in #68 is still under investigation (I can't reproduce it with my New 3DS nor with my Old 3DS XL).
- Wait for PDF strip rendering to finish before releasing its pixels or display list when cancelling or changing pages.
- Preserve positive publisher vertical margins between blocks, including
1emgaps that were previously consumed by the paragraph line break. - #139: fixed text disappearing between pages when a long paragraph crossed reading screens with different heights. Pagination now uses each screen's limits and starts at the same text baseline as the renderer.
- #142: load embedded XHTML
<style>blocks as well as linked stylesheets, so their alignment and publisher margins reach the page layout. Older EPUB page caches are rebuilt automatically. - #142: fixed centered and right-aligned text reverting to left alignment after the first line. Alignment now applies to each line while preserving intentional blank lines, including across screens and pages.
- #151: corrected the CIA HOME Menu banner audio to stereo. Added checks for the channel count and duration required by the banner format (my fault not reading the docs heh).
- #152: fixed CBZ chapters and pages being sorted alphabetically instead of numerically, so
Chapter 5comes beforeChapter 10and2.pngcomes before10.png, including inside nested folders.
❤️ Community Shoutouts
Thanks to everyone who reported the issues!
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.8.1 · Jun 23, 2026
3dslibris 2.8.1
Better personalized covers, more accurate EPUB publisher styling, safer fixed-layout rendering, and reliable reading progress across library folders.
Improvements
- #144: improved personalized cover scaling and rendering quality so external cover images more closely match covers extracted from EPUB and CBZ files.
- Reduced internal coupling around input, menus, settings, fonts, and library jobs to make navigation and future maintenance safer.
Bug Fixes
- #145: fixed reading progress and bookmarks being lost after leaving a library subfolder and entering it again, including after restarting the app.
- #142: fixed EPUB publisher
text-indentrules being ignored while preserving explicit no-indent classes such as.left. - #142: fixed publisher block margins appearing too wide on the 3DS screen and vertical spacing below block or page-break images being discarded.
- #139: fixed pagination near the bottom safety area skipping text between pages.
- #139: fixed large font sizes placing the final visible line too close to the bottom clip area, which could make text appear missing between pages.
- #68: stopped repeated high-resolution MuPDF render attempts after an allocation failure, reducing the risk of black screens, instability, or crashes when returning to the HOME Menu under memory pressure.
❤️ Community Shoutouts
Thanks to everyone who tested personalized covers and subfolder progress, and to everyone who shared EPUB samples, screenshots, and HOME Menu crash logs!
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.8.0 · Jun 11, 2026
3dslibris 2.8.0
<img width="600" alt="imagen" src="https://github.com/user-attachments/assets/b20a5a5c-1a6f-4581-aae0-cdbb015a9111" />
True landscape reading, safer GIF decoding, reorganized reading controls, and fixed-layout viewport corrections.
New Features
- #92 Added true horizontal reading mode for reflowable books, PDF, and CBZ, with orientation-specific rendering across both screens.
- Split reading orientation (Horizontal/Vertical) from handedness (Left-handed/Right-handed), with both settings persisted independently.
Improvements
- Moved reading orientation and handedness to the second settings page in both global and per-book settings. PDF/CBZ reading direction is available there as a separate option.
- Updated reflowable pagination, text wrapping, inline images, progress information, rules, links, and touch zones to use the real geometry of each landscape screen.
- Updated PDF/CBZ decoding, preview caches, workers, and rendering to follow the active orientation dimensions.
Bug Fixes
- #142: fixed GIF pages and EPUB images freezing or crashing on 3DS by moving GIF decoder state off the thread stack and decoding the first frame safely.
❤️ Community Shoutouts
Thanks to everyone who tested the landscape builds, shared screenshots and logs, and reported the GIF crash on hardware!
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.7.6 · Jun 9, 2026
3dslibris 2.7.6
Small fixes and a new setting to reopen the last book on startup.
As I told a couple of patches ago, I'm planning to slow down the release cadence, so expect bugfixes or small features for a while :)
New Features
- #140: added a global reopen last book setting so startup can either open the last-read book automatically or stay in the library.
Bug Fixes
- #141: fixed EPUB
text-align: rightandtext-align: centerrendering when publisher CSS block margins also move the line start. - #142: enabled EPUB inline GIF decoding and fixed centered/right-aligned EPUB ornaments when publisher block margins shift the line start or the ornament is the only paragraph content.
❤️ Community Shoutouts
Thanks to everyone who keeps testing early builds and reporting bugs!
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.7.5 · Jun 2, 2026
3dslibris 2.7.5
Small fixes for EPUB image-heavy pages, bottom-of-screen spacing, and reader progress writes.
Bug Fixes
- #77: paragraphs no longer create blank space at the top of the right screen.
- #77: EPUB text now uses the real last visible line before moving to the next screen.
- #77: EPUB image-only paragraphs and decorative separators no longer add invisible extra spacing.
- #77: EPUB publisher margins between paragraphs are preserved when there is room.
- #128: block images are less likely to be pushed or treated like full-page images.
- Returning from reader/settings no longer writes duplicate progress or preference updates.
❤️ Community Shoutouts
Thanks to everyone who keeps testing early builds and reporting layout edge cases quickly, especially @EmbersFlying for detailed testing and feedback.
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.7.4 · May 29, 2026
3dslibris 2.7.4
Hotfix update focused on saving the book progress.
New Features
- #133: improved Book Information description rendering by sanitizing common inline HTML/CSS markup (for example
<br>,<p>,<li>,&,<) and adapting inline style parsing (includingfont-weight,font-style,text-decoration,white-space,text-transform) so tags no longer appear as raw code and long descriptions can be read across additional info pages.
Bug Fixes
- #130: fixed a cover-layout regression where page-like EPUB covers could be pre-advanced and pushed to the next reading page/screen instead of staying in the current opening spread.
- #134: fixed a reading-progress regression where the saved page could reopen at page 1 after restart or book switching by persisting before switch-close and preserving restored pending position until parse completes.
- Improved EPUB reopen stability for very large page-cache files (RAM crashes related)
❤️ Community Shoutouts
Thanks to everyone who keeps testing early builds and reporting UI details quickly.
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.7.3 · May 28, 2026
3dslibris 2.7.3
Quality-of-life update for in-reader visibility and settings flow.
New Features
- #131: added Time Remaining (ETA) in the reader HUD as an optional setting.
- #115: added Book Information in book settings with quick stats (title, author, format, current page, total pages, chapters, last read...).
- #94: added custom adjacent cover overrides. If present next to the book, 3dslibris now prioritizes
Book.jpgorBook.png(including.txt,.md,.rtf, and.odt).
Bug Fixes
- Keeping the Y:lnk hint visible to standardize the reader HUD.
- #77: improved CSS paragraph spacing consistency near page bottoms (percent-based margins like
1.5%no longer collapse as if they were1%, and CSS-driven breaks avoid compressed separation at screen edges). - #77: added block-level
padding-topsupport for%/px/emin inline styles, and upgradedpage-break-before: alwayshandling to a hard page break so entry separators start on a new logical page. - #128: fixed wide leading EPUB images that could be forced into an isolated full-width block on their own reading screen.
❤️ Community Shoutouts
Thanks to everyone who keeps testing early builds and reporting UI details quickly.
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.7.2 · May 27, 2026
3dslibris 2.7.2
Library sorting improvements. You can now sort your library by six different criteria.
Note: I've been working on this project a lot these past months, and I want to take it slow for a while. I'll still be fixing bugs and making small improvements in order to make the reader good and stable, but I won't be adding any new features for a while. Thanks for your understanding! 😄
New Features
- #93, #132: library sort now supports six modes: by title, by filename, by author, by file type, by date modified, and by recently opened. Cycle through them from the library settings button. The last-opened timestamp is saved per book so the recently opened order survives restarts.
Bug Fixes
- #130: EPUB cover images no longer appear smaller than full screen.
- #128: wide landscape block images no longer force an unnecessary pre-advance.
❤️ Community Shoutouts
3dslibris wouldn't be the same without your support! This version is dedicated to:
- Library sorting: Thanks to everyone who reported and tested #93 and #132.
- Image layout and EPUB rendering fixes: Thanks to everyone who reported and tested #128 and #130.
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.7.1 · May 26, 2026
3dslibris 2.7.1
Small fixes for the library and the index menu. Also, you can select reader settings globally or per book now.
Note: I've been working on this project a lot these past months, and I want to take it slow for a while. I'll still be fixing bugs and making small improvements in order to make the reader good and stable, but I won't be adding any new features for a while. Thanks for your understanding! 😄
Fixes
- #126: open the index on the page for the current chapter.
- #127:
STARTnow closes folders, likeB. - #127:
STARTnow also leaves settings opened from the library. - #106: publisher font sizes no longer change image width.
- #106: text following a large-text section no longer overflows to the right screen.
- #108: body font-size no longer makes the whole book too small.
- #108: EPUB style settings now control publisher indents, margins, and paragraph spacing.
- #108: EPUB style settings can now be changed per book.
- Line spacing can now be adjusted from reader settings, globally and per book.
- #77: indented block text no longer loses its indent at the top of a new page.
- #84: child zero margins no longer erase parent block spacing.
- #128: block images with custom width now keep block layout.
- #128: right-aligned block images now align right.
- #128: hidden elements no longer create blank space before images.
- CIA banner music is audible again.
- Fix crash when pressing HOME while a CBZ with ComicInfo.xml chapters was loaded.
❤️ Community Shoutouts
3dslibris wouldn't be the same without your support! This version is dedicated to:
- HOME crash investigation: Thanks to everyone who investigated and shared hardware details, crash dumps, and trace logs for #68. I fixed a CBZ crash on HOME in this release, let's see if it's enough.
- Font rendering and CSS fixes: Thanks to everyone who reported and tested #77, #84, #99, #106, #108, #126 and #128.
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.7.0 · May 23, 2026
3dslibris 2.7.0
Library folder navigation, continuous D-Pad page turning, unified publisher font scaling, much more reliable HOME button on Old 3DS / 2DS, and rendering fixes.
Notable changes
- Books can now be organized into one level of subfolders. The root library shows folders first, then root-level books. Opening a folder shows its contents, with
Bor the touch back button returning to the root. - Holding D-Pad Up/Down in reflowable books (EPUB, MOBI, FB2, TXT, RTF, ODT) now repeats page turns automatically after a short delay.
- The "Respect Publisher Font Sizes" toggle has been removed. Publisher CSS font sizes are now always honored, but scaled relative to the user's font-size preference.
- New improvements to prevent HOME crashes: several causes have been fixed at once and the app now frees up to ~20 MB before suspending. Check if you have installed a custom theme that is conflicting with the homebrew and it's crashing on "menu".
Stability
- SD-card writes inside the APT hook callback (running on the system thread) sometimes blocked the HOME menu from getting its acknowledgment in time.
- free up to ~20 MB of RAM before HOME takes over: PDF/CBZ bitmap caches, preloaded adjacent pages, MuPDF display lists, the inline image cache, and the FreeType glyph bitmap cache are now released the moment the app suspends
- PDF/CBZ workers shut down cleanly on suspend and re-init on resume
- book opening, first library scan, cover extraction, metadata indexing, TOC resolution, and page-cache writes now temporarily block HOME only while the unsafe critical section is running
- applet exit handling no longer changes reader mode directly inside the APT hook; the main loop observes the exit request and shuts down from the normal app thread
- CIA: drop SystemMode to 80 MB (safer on Old 3DS), enable ExeFS compression, bump
bannertoolto 1.2.2 (matches stable homebrew like [Anemone3DS](github.com/astronautlevel2/Anemone3DS), Checkpoint...)
Improvements
- #41: first-level folder navigation in the library: the root library shows folders first, then root-level books; opening a folder shows the books directly inside it;
Bor touch back returns to the root library; optional sibling folder covers supported viaFolderName.jpg - #24: continuous D-Pad page turning for reflowable books: holding D-Pad Up/Down repeats previous/next page turns reflowable layout; new general setting to disable Circle Pad page turns for users affected by analog drift
- #106: unify publisher font-size rendering: publisher CSS
font-sizeis always applied; absolutepxvalues scale relative to the publisher's declaredbody { font-size }baseline; reader's font-size preference acts as a global scale factor - #108: CSS
em/remlengths now resolve against the actual font size:text-indent,margin-left,margin-right, and related properties previously convertedemto pixels using a hardcoded 12px baseline - #102 add conservative Markdown reading for
.mdand.markdownfiles: headings, emphasis, lists, blockquotes, code spans, and link text are converted into the existing reflowable text renderer - battery percentage now uses the real
mcu::HWCreading, following the approach used by 3DSident; PTMU's coarse 0-5 level is only kept as a fallback - #83: fix center- and right-aligned paragraphs containing narrow inline elements
- #84: CSS
margin-topandmargin-bottomon block elements: section spacing in poetry-style EPUBs now respects the declared CSS margin size
Fixes
- #98: fix "Clear Cache" not triggering a book re-parse on the next open
- #96: fix CSS keyword font sizes in inline
style=attributes being silently ignored - #99: fix incomplete TOC index in very large anthology EPUBs (regression from v2.6.4)
- #100: fix link navigation performance on TOC pages with many inline links
- #112: fix filenames with decomposed/combining UTF-8 accents not matching their saved settings and metadata entries
- #116: fix CIA banner audio
- fix CSS
margin-top: 0/margin-bottom: 0(and negative values) on block elements incorrectly applying the default inter-paragraph spacing instead of suppressing it - #77: fix random blank space before the first heading on a page
- fix single-line paragraphs whose text is wrapped in an inline element (e.g.
<p class="centered"><span>…</span></p>) being bumped to the next screen by the paragraph-start orphan guard - fix overflow detection in page and screen advance firing one line too late
- fix MOBI pre-wrap pagination adding blank lines when text exactly reached the right edge
- fix a reflowed EPUB rendering case where a forced screen-break token on the already-active right screen was ignored
- tighten reflowed page drawing to the configured content bounds so glyph overhang no longer leaks into the right margin
Infrastructure
- split the 1,286-line
app.cppinto focused translation units (app_accessors.cpp,app_lifecycle.cpp,app_menu_frames.cpp,app_views.cpp);app.cppis now 446 lines and holds only initialization, screens/orientation, status, and gradient backgrounds - add
-fdata-sectionsand drop C++ unwind tables (exceptions are off) to let the linker garbage-collect more dead data (small but free .3dsx size reduction) - add boot/APT trace files (
sdmc:/3dslibris_boot_trace.txtandsdmc:/3dslibris_apt_trace.txt) to diagnose CIA launch and HOME suspend crashes on real hardware - add
debug-safe-cia, a diagnostic CIA build path with simplified title metadata and no custom banner/audio, for isolating HOME Menu metadata/cache issues - debug logs for failed PDF/TXT/RTF opens now include
errno/strerror(errno)when the filesystem layer exposes a useful error - #121: optimize PNG UI/readme assets to shave a little size from the repository and packaged resources
- #124: refine the PTMU fallback battery label so an empty/critical coarse level displays as ~1% instead of ~0%
- keep very noisy diagnostics behind explicit Makefile flags instead of enabling them in every debug build
- remove stale TODO comments whose underlying refactors have already landed
❤️ Community Shoutouts
3dslibris wouldn't be the same without your support! This version is dedicated to:
- Library organization and D-Pad repeat: Thanks to @svenotta and @EmbersFlying for the suggestions.
- HOME crash investigation: Thanks to everyone who investigated and shared hardware details, crash dumps, and trace logs for #68. Let's see if we can fix it for good in newest releases.
- Community PRs: Thanks to @adri22235 for #112, @AverageJohtonian for #116, and @Rhlp-Engineering for #121 and #124.
- Font rendering and CSS fixes: Thanks to everyone who reported and tested #77, #83, #84, #99, #100, #102, #106, #108, and the poetry stanza spacing fix.
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.6.4 · May 16, 2026
3dslibris 2.6.4
Important bug fixes and improvements for EPUB rendering, PDF/CBZ performance and zoom, in-book settings, and CIA size.
Notable changes
- You can now adjust font, size, spacing, orientation, and publisher font-size settings in-book. Press Start to return to the library, otherwise you return to the book with the new settings applied.
- The PDF/CBZ reader is now faster and supports up to 4.0× zoom on both Old 3DS and New 3DS.
See the full changelog below for details.
Improvements
- #91: in-book settings (Select) now shows font, size, spacing, orientation, and publisher font-size controls; exiting automatically reopens the book when any layout-affecting setting changed; footer adds "back" (return to book) and "library" buttons; Start key goes to library
- unify PDF and CBZ maximum zoom to index 6 (4.0×) on both Old 3DS and New 3DS
- reduce CIA binary size by ~32 MB by stripping MuPDF's embedded CJK fallback fonts; place a font (e.g. NotoSansCJK) in the font directory for CJK PDF rendering
- fix CIA gallery covers not loading by raising SystemMode to 96 MB and lowering the cover extraction memory threshold
- support user-supplied CJK fonts in the font directory for PDF glyph rendering
- render ruby annotations as
(text)at 75% size; bold column and row headers in table output
Fixes
- #98: fix "Clear Cache" button showing stale "cleared!" text when re-entering Settings after a cache clear
- #97: fix CSS keyword font sizes (
font-size: small,x-small,smaller, etc.) rendering at the wrong size when "Respect publisher font size" is off - #99: fix incomplete TOC index in large books
- #76: fix only the first linked CSS stylesheet being loaded; books with a non-CSS file (e.g.
.xpgt) before the.cssnow apply all CSS rules correctly - #78: (hopefully™️) fix HOME button crashes in debug builds caused by SD card I/O in the APT hook callback on the system thread
- #100: fix DPad controls in inline link focus mode: UP/DOWN now navigate across pages; LEFT/RIGHT corrected for portrait orientation
- #96: fix transparent PNG inline images (e.g. decorative banners/ornaments) rendering with a white background instead of compositing against the page
- #96: fix images inside EPUB table cells producing a stray
[image]text artifact or white squares at the top of pages; table-cell images are now silently suppressed - fix superscript (
<sup>) and subscript (<sub>) text rendering: replaced box-filter downscaling with native FreeType rendering at 70% pixel size for sharper glyphs - #83: fix
text-align: center(andright) paragraphs appearing left-aligned when the line text is wider than the screen; each word-wrapped visual line is now centered independently - fix centered text (
text-align: center/right) appearing right-shifted on the second screen - fix continuation wrap lines on the second screen starting with incorrect left margin after screen overflow
- fix list items containing an inner
<p>element rendering the list marker on a separate line instead of inline with the content - support CSS
text-indentproperty for first-line paragraph indentation (px, em, pt, in units) - #84: honor CSS
margin-topandmargin-bottomon block elements (div,aside,blockquote,figure,caption,dd); default spacing preserved when no CSS value is specified - fix CSS class
font-weight: boldandfont-style: italicbeing silently ignored; class-level bold/italic now applies to inline text - fix returning from in-book settings leaving the top screen blank (book text now redraws immediately on return)
Infrastructure
- extract ten handler modules from
book_xml_parser.cpp: heading, table capture, inline image, anchor, flow emission, screen advancement, element style, inline element, block element, and FB2 element handlers - extract CSS element handler dispatch into dedicated per-concern compilation units
- split five large source files into focused translation units:
mupdf_view.cpp,book_xml_css_style_utils.cpp,text_renderer.cpp,book_xml_parser.cpp(support helpers),path_utils.h - extract
cover_cache,GoToPageDialog, fixed-layout and reflowable input handlers, andepub_css_tokenizerinto dedicated modules - expand FB2 integration test coverage
- add page alignment utils test coverage (
MeasureFirstVisualLineWidth, centered/right-aligned overflow) - replace hardcoded screen dimensions and consolidate repeated screen-dimension constants into shared headers
❤️ Community Shoutouts
3dslibris wouldn't be the same without your support! This version is dedicated to:
- Issue reports and testing: Thanks to everyone who reported and followed up on #76, #78, #83, #84, #91, #96, #97, #98, #99, and #100.
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.6.3 · May 9, 2026
3dslibris 2.6.3
Improved PDF/CBZ speed and EPUB rendering fidelity: global CSS element rules now apply correctly, list marker suppression is more reliable, centered paragraphs behave more consistently, line wrapping is improved, inline figures/captions behave better across both reading screens, and random empty space from page-break and margin flush edge cases is fixed.
See the full changelog below for details.
Improvements
- #83: apply global CSS element rules (
p {},body {},li {},h1 {},blockquote {}, etc.) to block layout, margins, font-size, and text-align - #76: suppress list markers when
list-style-type: noneis declared on<ol>or<ul>via a bare element selector - make PDF and CBZ fixed-layout viewport panning smooth by blitting cached zoom/preview bitmaps while expensive render/decode work is deferred
- improve EPUB NCX/NAV/TOC handling and parser coverage
- improve EPUB line wrapping
- improve preformatted text wrapping so whitespace is preferred before splitting long tokens
- improve EPUB
<dd>indentation by using block margins instead of injecting literal leading spaces - improve inline image layout for
<figure>/div.figurecontent with captions - allow page-mode images and covers to fill the available page box when appropriate
- add a START-button quit shortcut from the library/browser for Homebrew Launcher users
- improve parser dispatch boundaries and integration coverage for real EPUB opens and metadata indexing
- reduce App singleton usage across library, UI, menu, and settings layers
Fixes
- #77: fix random empty space when rendering caused by pending block-spacing not flushing correctly at page boundaries
- #83: fix text-align not rendering when declared on a bare element selector (
p { text-align: center }) - #76: fix list markers not suppressing when the CSS rule targets the parent
<ol>/<ul>element rather than the<li>directly - fix page break edge cases in EPUB reflow
- fix EPUB screen transitions so parser state and rendered page buffers stay synchronized between left/right reading screens
- fix block-boundary edge cases where pretty-printed whitespace between XHTML block elements could consume pending breaks
- fix heading spacing when a heading follows existing content
- fix page-mode inline images on the second reading screen incorrectly advancing to a blank next screen
- fix large EPUB inline JPGs failing to draw on constrained 3DS memory by using bounded subsampled decode
- fix figure-with-caption images on the second reading screen being pushed too aggressively to the next spread
- fix bottom reading-screen margin handling by using the compact margin resolver consistently
- fix a MOBI page-cache compatibility regression by bumping the cache version after line-break behavior changed
- fix old-3DS gallery covers being skipped when the previous memory guard was too conservative for real hardware
- #68: mitigate Old 3DS
.3dsxHOME/APT crashes by handling pending suspend before more graphics/input work - fix flowed text emission so local left margins cannot move text left of the base reading margin
Infrastructure
- extract parser and renderer dispatch layers for EPUB, MOBI, FB2, TXT, RTF, ODT, PDF, CBZ
- move
Book::Indextobook_parser::Index - remove
Book::Open, move open/parse/index dispatch intobook_parser, and unify the fixed-layout book path - move public rendering and fixed-layout dispatch into
book_renderer - remove
Text::app - extract gradient drawing from
App - decouple
Text, touch utilities, browser views, library helpers, and menu layer fromApp - move the NDS/3DS hardware reference docs out of this repository into gba-ds-3ds-specs
- expand host integration, CSS, NCX/NAV, FB2 metadata, TXT/FB2/RTF, and page-cache test coverage
- #68: add targeted debug lifecycle logs for APT suspend/resume/exit and shutdown diagnostics
- keep host parser integration tests linked with the shared binary/ZIP helpers used by cache and EPUB image paths
Testing
- host test suite now covers 110 scripts
- add real EPUB integration coverage for
epub_parser::Open,epub_parser::Index,book_parser::Open -> EPUB, andbook_parser::Index -> EPUB - add regression coverage for preformatted wrapping, inline figure placement, bounded inline-image JPEG decode sizing, and old-3DS cover warmup thresholds
- add
coverage-hostreporting for host-testable code paths
❤️ Community Shoutouts
3dslibris wouldn't be the same without your support! This version is dedicated to:
- Issue reports and testing: Thanks to everyone who reported and followed up on #68, #76, #77 and #83.
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.6.2 · May 4, 2026
3dslibris 2.6.2
Improved EPUB rendering and performance, a new battery indicator in the reader HUD, an optional publisher font-size toggle, and a critical APT suspend thread-safety fix (hopefully) preventing HOME Menu crashes after reading.
See the full changelog below for details.
Improvements
- add battery level indicator in the reader HUD
- add publisher font-size toggle in settings
- #85: support basic
<hr/>styling for EPUB reflow - reduce heap allocations during pagination
- reuse BiDi analysis buffers across pagination
- avoid one full temporary buffer copy on EPUB first-time cover extraction
- start visible cover warmup sooner on New 3DS in conservative browser mode
- stop carrying full OPF baggage on metadata-only EPUB indexing
- avoid extra work on simple LTR text during EPUB text shaping
- reuse Latin-1 glyph advances during pagination for EPUB text measurement
- avoid the heavyweight Unicode decoder during layout for simple Latin UTF-8 text
- batch EPUB content text before shaping
- consolidate CSS class lookups into a single pass per element
- simplify button label draw code
- simplify
ContainsRTLin BiDi utils
Fixes
- #87: render large EPUB images by moving pixel budget guard from metadata probe to draw time
- #84: support CSS
margin-topandmargin-bottomin EPUB reflow - #68: defer APT suspend hook state mutations to main thread to fix cross-thread write hazards, crashes and freezes on HOME menu
- follow manifest document order for EPUB spine ordering when the NAV
toclink is absent - #82: accumulate nested list indentation correctly per depth level
- apply CSS
display:blockpromotion to block-level layout properties - restore EPUB open path after parser-reuse regression
- #83: ensure text-align from CSS class definitions applies to block elements properly
- #76: respect
list-style-type: noneon<ol>and<ul> - #35: keep adjacent length values on CSS
marginshorthand withautovalues - use the document base instead of the inherited context size for heading font-size restore
- #81: clamp tiny CSS font sizes to a readable range
- skip no-op inline font-size changes
- keep thumbnail fast-path under the RGB safety guard for large EPUB PNG/JPEG covers
Infrastructure
- silence noisy debug builds after the EPUB/cover profiling pass
- remove obsolete EPUB parser helpers left behind by CSS lookup consolidation
❤️ Community Shoutouts
3dslibris wouldn't be the same without your support! This version is dedicated to:
- Issue reports and testing: Thanks to everyone who reported and followed up on #35, #68, #76, #81, #82, #83, #84, #85 and #87.
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.6.1 · May 1, 2026
3dslibris 2.6.1
Accessibility, inline-link, CSS improvements, stability fixes, and CBZ chapter index support.
<table>
<tr>
<td width="50%"><img width="660" height="551" alt="Image1" src="https://github.com/user-attachments/assets/051a6fd1-b443-449e-8b30-61e9ad2f08cc" /></td>
<td width="50%"><img width="660" height="551" alt="Image2" src="https://github.com/user-attachments/assets/9f1b6e6b-9b4b-4f43-bcc8-99ad36d80d03" /></td>
</tr>
<tr>
<td width="50%"><img width="660" height="551" alt="Image4" src="https://github.com/user-attachments/assets/cad89fbb-b401-44e1-9116-07bd7d119338" /></td>
<td width="50%"><img width="660" height="551" alt="Imag3" src="https://github.com/user-attachments/assets/60eebdfc-bce6-41e4-8715-248ba566681d" /></td>
</tr>
</table>
New
- CBZ
ComicInfo.xmlchapter index:.cbzfiles that include aComicInfo.xmlfile (as embedded by tools such as ComicTagger) now expose a table of contents. Pages with aBookmarkattribute in the<Pages>section appear as named chapters in the index menu. Files withoutComicInfo.xmlor without bookmarks are unaffected. See #67.
Community
- GitHub Discussions is now open: questions, bug triage, ideas, and development discussion have a dedicated space at github.com/RigleGit/3dslibris/discussions. The bug triage category includes a structured form that collects version, console model, format, and reproduction steps to make debugging easier.
Fixes & Improvements
- Inline links are visible while reading: internal EPUB links are now rendered in blue at all times, using a dark blue on light themes and a light blue on dark themes. See #69.
- Link Mode can move across pages: while holding
Yto use Link Mode,D-Pad Rightnow moves to the next inline link andD-Pad Leftmoves to the previous inline link, continuing onto nearby pages when needed.D-Pad Up/Downstill keep the existing spatial navigation within the current page. See #69. - EPUB raster images no longer turn into
[illustration]after cache rebuilds. See #70. - EPUB centered block text is aligned correctly again:
text-alignon block containers such asbody,div,section, anddisplay:blockelements is now applied to the text inside them and inherited by child paragraphs/headings unless they override it. See #71. - EPUB ornament images now render at their intended size: inline images with an explicit
width="X%"attribute or a CSSwidth: X%style are now capped to that fraction of the text area rather than stretching to full width. Ornaments such as decorative separators, stars, and bars that are authored at a small percentage of the line width now appear at that size instead of occupying the entire screen. See #74. - CSS
page-break-before: alwaysis now respected: block elements withpage-break-before: always(or the CSS3 equivalentbreak-before: page) in their inlinestyle=attribute or stylesheet class now force content onto a new page, as intended by EPUB authors.page-break-after: alwaysis also supported. See #72. - CSS
page-break-inside: avoidis now respected: blocks marked withpage-break-inside: avoid(orbreak-inside: avoid) are kept together and will not be split across two pages. - More CSS properties are now applied from stylesheets: EPUB stylesheets can now control
text-decoration: none(suppress underline on an element),font-weight: normal/lighter/100–500(reset inherited bold),font-style: normal(reset inherited italic),font-sizewithptunits and absolute keywords (xx-smallthroughxx-large), andmargin-top/margin-bottomwithem,rem, andptunits. Both inlinestyle=attributes and class rules are recognised. - CSS horizontal margins are now applied:
margin-leftandmargin-righton EPUB block elements now affect both wrapping width and visible line starts, including stylesheet classes, percentages, shorthand margins, and negative values. - CSS
text-indentandtext-transformare now applied:text-indentcontrols the first-line paragraph indent; a CSS value overrides the default indent, and a negative or zero value suppresses it entirely.text-transform: uppercase,lowercase, andcapitalizetransform text casing at parse time, and transformed inline spans are measured before line wrapping so they no longer overflow or get clipped. See #73. - CSS
text-align: startandtext-align: endare now supported. - CSS
white-spacemodes are now respected:pre,pre-wrap,pre-line, andnowrapcontrol whitespace and line-break preservation in EPUB content, so code blocks and preformatted passages render as the author intended. On the 3DS screen,nowrapstill wraps when needed after collapsing spaces so long lines remain readable. - CSS
floatandclearare now applied to images:float: leftpins an image to the left margin andfloat: rightpins it to the right margin.clear: both,clear: left, andclear: rightforce a line break before the clearing element. Text wrapping around floated images is not yet supported; the image occupies its own band and following content begins below it. Parser and renderer now share the same floated-image layout override, so small floated ornaments no longer render inline after pagination treated them as block bands. - Nested EPUB lists are visually indented: second- and third-level ordered or unordered lists now shift their markers and wrapped lines inward, making nested bullets, alphabetic lists, and roman-numeral sublists distinguishable on screen.
- Inline
font-sizeand<small>/<big>tags are now rendered: any element with a CSSfont-size, via inlinestyle=or a stylesheet class, renders text at the specified size. The<small>tag applies thesmallerscale factor (~83% of the current size) and<big>applieslarger(~120%). All units are supported:px,em,rem,pt,%,smaller,larger, and the absolute keywordsxx-smallthroughxx-large. The size is restored correctly when the element closes, and page breaks mid-element are handled. See #75. - HOME Menu no longer crashes after returning to the library (I hope): pressing HOME or powering off after leaving a book no longer crashes the HOME Menu process. Three issues were fixed. See #68.
- Preferences were being written to the SD card inside an APT hook callback, blocking the HOME Menu's acknowledgment window;
- the PDF and CBZ background-render workers could free memory still in use by a render thread (use-after-free);
- and switching from a PDF/CBZ book to the library now cancels any in-progress background render before the browser starts new work.
❤️ Community Shoutouts
3dslibris wouldn't be the same without your support! This version is dedicated to:
- Bug triaging: Thanks to @EmbersFlying for testing and reporting multiple issues that were fixed (or at least tried) in this release.
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.6.0 · Apr 28, 2026
3dslibris 2.6.0
Navigation improvements and a fast metadata cache.
<table>
<tr>
<td width="33%"><img width="664" height="553" alt="imagen" src="https://github.com/user-attachments/assets/7255a111-9be2-4978-a116-48a2e0b2beef" /> </td>
<td width="33%"><img width="664" height="553" alt="imagen" src="https://github.com/user-attachments/assets/9c430418-e116-4dfd-94c8-3088cc2ed80c" /></td>
<td width="33%">
<img width="664" height="553" alt="imagen" src="https://github.com/user-attachments/assets/b8c4a8f5-ae48-4e6d-b7a5-b5f33f6b3c61" />
</td>
</tr>
</table>
New
- ZL/ZR page flip (New 3DS only): ZL advances to the next page (same as R), ZR goes back (same as L). Orientation-aware: the mapping flips automatically when the display is rotated. See #63.
- D-pad wraps to next/previous page at list boundaries: in list view, pressing Down on the last item jumps to the next page; pressing Up on the first item jumps to the previous page. In gallery view the same applies column-wise — pressing Right from the right column advances a page, Left from the left column goes back. See #64.
- Separated Circle Pad and D-pad controls: reader, browser, and paged menus now use explicit mappings instead of the mixed libctru directional aliases, so Circle Pad and physical D-pad can behave differently where needed. For example, the reader now uses the Circle Pad for smooth panning in fixed-layout formats, while the D-pad retains the original page-turning behaviour. It also supports the New 3DS stick. See #57.
- Inline internal link navigation: hold
Yon a page with inline links to enter link focus mode, move with the D-pad, and pressAto follow the selected link. See #27. - Alternative SD data path support: runtime data can now also be loaded from
sdmc:/config/3dslibrisin addition to the legacysdmc:/3ds/3dslibrislayout. See #6. - Visual feedback: added "saving cache..." status screens during the page cache write phase for EPUB and MOBI, paired with "loading..." and the progress indicator during the open phase.
- Reset to defaults: the
GENERALsettings screen now has a reset settings option (on page 2, navigate with L/R or the next footer button) that restores font size, paragraph spacing, orientation, color mode, clock format, and library view to their factory defaults. - Clear all caches: the
GENERALsettings screen now has a clear cache option (page 2) that deletes all epub, mobi, cover, and metadata disk caches so everything is rebuilt fresh on the next open.
Performance
- Metadata disk cache (~60–80× faster per book): title, author, and cover path are now written to a small binary cache file (
cache/meta/*.bmc) the first time a book is indexed. On subsequent launches the cache is read in ~1–2 ms per book instead of the previous 115–163 ms required to parse the source file. The cache key is derived from the file path, size, and mtime, so stale entries are ignored automatically when the source file changes. - Library opens fully populated (~300 ms for a 147-book library on warm cache): metadata for all books is now pre-loaded from the disk cache during the "Preparing library..." phase, before the browser opens. This also means the initial title sort uses real book titles instead of empty strings. On a cold cache, the failed lookups return in under 1 ms each and the behaviour is unchanged.
- Faster first EPUB opens: first-time EPUB pagination no longer writes the page cache during the spine parse, and common LTR text now uses a lighter shaping path while keeping the full BIDI/Arabic path for RTL content.
- MOBI page cache saves immediately at first open with visual feedback: MOBI page cache saving no longer blocks at 100% during parsing. The write happens right after parsing completes.
- Page cache saves are really faster for large books: the SD card write buffer for EPUB and MOBI page caches was increased from 32 KB to 256 KB, reducing the number of physical write operations per save. For a 9,919-page EPUB the cold-cache save time dropped from ~7 minutes to under 10 seconds (~45× faster).
- EPUB cache-hit opens are significantly faster: the read buffer for EPUB page cache loads was mismatched at 32 KB while writes used 256 KB, causing up to 8× more SD card round trips on every cache-hit open. Both paths now use the same 256 KB buffer.
- EPUB TOC resolution is faster on large books: the internal href and basename lookup tables used during TOC resolution now use hash maps instead of sorted trees, reducing per-entry lookup cost from O(log N) to O(1).
- Bookmark insert no longer sorts the full list: toggling a bookmark on a page now inserts at the correct sorted position directly (binary search + single insert) instead of appending then sorting the entire bookmark list.
- MOBI text cleanup uses less peak memory: the mojibake repair pass now moves the text into its safety backup rather than copying it, eliminating one full allocation of the text buffer (~2–3 MB for a large MOBI) at the peak of the cleanup phase.
Fixes
- Homebrew shutdown is now deterministic again:
.3dsxexits now finish app cleanup before terminating through the homebrew-safe path, avoiding the invalid APT shutdown sequence that could still trigger a crash or undefined exit behaviour after the fixes for HOME-time loading. See #58. - Async opening progress stays main-thread safe: the async open state is now installed before the worker is submitted, preventing worker-side progress callbacks from falling back to direct splash rendering.
- Reader images no longer slip under the bottom HUD: full-page covers and other large inline images now stop at the start of the status bar area, which also avoids some lower-edge content being clipped. See #59.
- Text alignment is now consistent across EPUB documents: fixed three independent bugs that caused unreliable text centering and right-alignment — alignment declared via a CSS class was silently ignored; the first line of a paragraph continuing onto a new page lost its alignment and reverted to left; and line-width calculations for center/right positioning were thrown off by inline style tokens (bold/italic toggles, headings,
<small>), causing text to appear at the wrong horizontal offset. See #66. - EPUB headings now honor CSS font sizes and wrap correctly:
h1-h6now respect heading-specificfont-sizestyling from inline CSS and stylesheet classes, including relative units, and large headings paginate without corrupting line breaks or leaking their size/bold styling into the following paragraph. The same EPUB CSS class map path now also appliesvertical-align: super/subrules declared in stylesheet classes, so superscript and subscript styling no longer depends on inline markup alone. See #46. - EPUB lists now respect CSS marker suppression on
<li>items: list bullets/ordinals are now correctly hidden whenlist-style-type: noneis declared through stylesheet classes on the list item itself, instead of only through inherited parent-list context. See #48.
Packaging
- SD data compatibility: installs that keep data under
sdmc:/config/3dslibrisare now supported alongside the existingsdmc:/3ds/3dslibrislayout. See #6.
❤️ Community Shoutouts
3dslibris wouldn't be the same without your support! This version is dedicated to:
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
- Enhancement Ideas: Thanks to @Kr0Key, @Narwher, @EmbersFlying and @The0zymandias for their suggestions and feedback that helped shape this release.
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.5.0 · Apr 24, 2026
3dslibris 2.5.0
Performance, stability, and new formatting support.
New
- Text alignment support:
text-align: centerandtext-align: rightare now honoured in EPUB reflow. Each paragraph emits an alignment token thatPage::Drawuses to compute per-line offset, so wrapped lines stay correctly aligned across the whole paragraph. See #47. - README revamped: the README has been reorganized to better highlight the features of the project.
Performance
- EPUB CSS scanning (~1 sec less loading time): only the
<head>section of each XHTML spine document is scanned for stylesheet links, reducing zip I/O on large books. - Reused zip handle (~20% less loading time): a single
unzFilehandle is recycled across all spine CSS scans instead of opening/closing per document. - Plain text pagination: eliminated per-line heap allocation; uses data/size pointer streaming.
- Text shaping pipeline: reuses static scratch buffers (
text_run,normalized,breaks) instead of re-allocating on every shaped run. - Release build overhead removed: guarded
osGetTimecalls and unnecessary allocations withDSLIBRIS_DEBUGonly. - Text renderer diagnostics budget raised: increased the debug blit page diagnostics budget from 12 to 48 entries, making short debug captures less likely to miss relevant draw calls.
- Faster first-time EPUB covers (x3 speed increase): large JPEG covers now try a MuPDF subsampled thumbnail decode before falling back to full-image
stb_imagedecoding, reducing old3DS work for oversized cover art. - Quieter blit diagnostics: debug logs now skip steady idle blit frames where no dirty region or framebuffer copy occurred.
- Safer PDF cover preparation: PDF cover warmup now runs with shared complexity guards on both old3DS and new3DS, skipping pathological pages earlier instead of risking OOM during first-time cover extraction.
Fixes
- Browser return and suspend handling stabilized: returning from the reader to the library now explicitly resumes browser jobs, handles applet suspend/resume through the app controllers, and avoids tearing down in-flight async opens during HOME suspension. See #62.
- Open cancel polling is worker-safe: cancellation polling no longer touches HID/APT state from worker threads; background open paths now use an atomic cancellation flag while the main thread remains responsible for system event polling.
- Gallery covers clipped correctly: cover thumbnails in gallery view are clipped to the rounded frame, preventing image pixels from bleeding outside the card border. See #59.
- PDF shouldn't crash on HOME button:
ParseMuPdfFileis now split into three independently cancellable steps (fz_open_document,fz_count_pages,fz_load_outline), each separated by an APT yield point viaopen_cancel_poll::Poll. Pressing HOME during PDF loading is now handled cleanly instead of causing a console restart. See #58. - Worker join timeouts bounded:
LightEvent_WaitinCancelMuPdfIncrementalRenderStatereplaced with a 100 ms polling loop;ShutdownMuPdfWorkerandShutdownCbzWorkernow use a 500 ms join timeout instead ofU64_MAX, preventing either path from blocking HOME acknowledgment indefinitely. See #58. - Bookmarks button icon updated: refreshed the bookmarks button artwork. See #60.
- Large EPUB page limit raised:
kMaxPagesInMemoryraised from 5 000 → 25 000 and cache guard to 50 000, fixing books that stopped loading halfway through. See #54 and #37. - HR overflow tracking: parser and renderer now agree on
pen.yafter<hr>rules, preventing<hr/> <p>Text</p>from overlapping text. See #37. - PagedListMenu overflow: pagination indices changed from
u8tou16so menus with more than 255 entries no longer wrap and corrupt the page list. - MOBI synchronous-only open: removed the deferred-finalize path that could leave the reader in an inconsistent state on large MOBI files.
- Startup font path cleanup: removed hardcoded RomFS font paths; all runtime asset discovery now goes through
paths::kRomfsFontDir. - Reflow open gate simplified: removed stale
ForceSynchronousBookOpenflag anddeferred_pumpedreferences;ShouldUseAsyncReflowOpenis now a single-parameter function. - Permanent cover failures stop retrying: browser warmup now stops requeueing covers after non-recoverable failures, avoiding repeated work on unsupported files.
- Gallery redraws after visible cover jobs: finishing a cover job for a visible gallery item now forces a browser redraw, preventing stale tiles after first-time cover extraction.
- Raw SVG gallery covers are skipped cleanly: EPUBs whose detected cover is a raw SVG now fall back to the no-cover placeholder instead of going through an unsupported decode path.
- No-cover gallery placeholder cleaned up: generated placeholders now keep the frame visible, use tighter centered metadata text, and inherit the active theme fill color. See #59.
Packaging
- SDMC zip trimmed:
3dslibris-sdmc.zipnow contains only SD card runtime files. The.3dsxbuilds remain separate release assets instead of being duplicated inside the zip.
❤️ Community Shoutouts
3dslibris wouldn't be the same without your support! This version is dedicated to:
- Text alignment: Thanks to @EmbersFlying for opening #47 and pushing for
text-align: centerandtext-align: rightsupport in EPUB reflow. - Large book reports: Thanks to @Davetheword and @EmbersFlying for reporting #54 and #37: those issues led to raising the page limit to 25.000 and fixing the
<hr>overflow overlap bug. - Bug triaging: Thanks to @runarcn, @EmbersFlying, @lunapanshiel and @TrevorArenival07 for testing and reporting multiple issues that were fixed (or at least tried) in this release.
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going and keep me caffeinated!
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip(runtime files only; pair it with the.3dsxasset for Homebrew Launcher installs)3dslibris-source.tar.gz
v2.4.2 · Apr 22, 2026
3dslibris 2.4.2
Stability and crash-fix release.
Fixes
- FontManager null dereference crash:
GetFace()usedstd::map::operator[], which silently inserted aNULLFT_Facefor missing style keys. Callers then dereferencedface->size, causing a data abort at offset0x58fromNULL.GetFace()now usesfind()and returnsNULLfor missing keys; all callers (GetHeight(),GetGlyphIndex(), bothGetFontName()overloads) guard againstNULLbefore dereferencing. - Division by zero in browser marquee: the background color averaging loop in
BrowserGridViewdivided byvis_w * shwithout checking for zero-dimension covers, leading to a divide-by-zero when a book had no valid thumbnail. Guarded withif (bg_pixels > 0). - Degenerate layout when font height is zero: if
GetHeight()returned0(for example, when no valid face was loaded), button and line heights collapsed to0and produced unreadable or non-interactive menus. Added aline_heightfloor of10pixels infont.cppandpaged_list_menu.cpp. - Out-of-bounds touch in empty list menus:
PagedListMenu::HandleTouchInput()accessedbuttons[0]without checking whether the vector was empty, causing an out-of-bounds read on menus with no entries. Added an earlyreturnwhenbuttons.empty(). - Infinite loop in text wrapping:
WrapTextToLines()could spin forever whenUtf8BytesForDisplayChars()returned0(for example, on a zero-width or unrecognised code point). Forced a minimum advance of1byte so the loop always makes progress.
❤️ Community Shoutouts
3dslibris wouldn't be the same without your support! This version is dedicated to:
- Reading Milestones: Huge thanks to @runarcn at runarcn.no for the lovely write-up! Knowing that the app helped you finish two books in two weeks is the best motivation.
- Issues & Feedback: Thanks to everyone opening issues and suggesting features. In v2.4.2, reports from @Davetheword and @runarcn in #55 made it possible to track down these problems. I also want to give a special thanks to @EmbersFlying and @lunapanshiel, who have helped a lot by reporting and investigating issues since the beginning.
- Fueling the Code: A special thank you to my Ko-fi supporters. Your donations help keep the project going — and keep me caffeinated.
Want to support the project? Consider leaving a ⭐ on GitHub or buying me a coffee!
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.4.1 · Apr 22, 2026
3dslibris 2.4.1
Crash-at-boot fix.
Fix
- Crash on launch (reported on #55 ):
FontMenuis constructed duringApp::App()before fonts are loaded (FontManageris still null). CallingGetHeight()andGetAdvance()through the null pointer cascaded into a heap Data Abort immediately at startup. Both methods now return safe defaults (PIXELSIZE/0) until the font manager is initialised.
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.4.0 · Apr 21, 2026
3dslibris 2.4.0
UI and navigation overhaul. This release delivers a six-color theme system, improved menus throughout, dark/light splash screen variants, gradient backgrounds in the reader, EPUB chapter detection fixes, and browser warmup re-enabled for faster cover loading.
UPDATE YOUR 3dslibris-sdmc.zip TO HAVE THE NEWEST SPLASHES.
<table>
<tr>
<td width="50%"><img width="640" height="531" alt="3dslibris_darksepia" src="https://github.com/user-attachments/assets/6de341bf-7811-4e70-be73-6e0aa4ca62ac" /></td>
<td width="50%"> <img width="640" height="531" alt="3dslibris_light" src="https://github.com/user-attachments/assets/9874a40f-47d7-4c07-9f35-a90dd63edc9c" /></td>
</tr>
</table>
Highlights
- Six-color theme system (from #53) : the app now supports six palette-based color themes (light, sepia, dark, and three more), each controlling text, background, UI chrome, and cover overlays consistently across all views.
- Dark/light splash screen variants (from #53): the startup splash now uses a dark or light version that matches the active color mode, replacing the single legacy
splash.jpgwith theme-aware3DSLibris_dark_small.jpg/3DSLibris_light_small.jpg. - Cycle themes with X in the browser: press
Xin the library view to cycle through color modes without opening the settings menu. - Gradient backgrounds in reader mode: the top and bottom strips of the reading view now use a smooth gradient instead of a flat color.
- Improved bookmark menu: entries now show a preview of the page text alongside the bookmark position, making it easier to identify saved positions at a glance.
- Improved chapter menu (partly mentioned on #52): chapter titles wrap to up to three lines so long titles are no longer truncated.
- Dynamic row heights in PagedListMenu: the shared paged-list component now sizes rows dynamically per page so entries always fit the available screen space.
- Long font filenames wrap in FontMenu: font file paths too long for a single line now wrap cleanly instead of being clipped.
- Browser warmup re-enabled: cover extraction now runs incrementally on idle frames (3 ms budget), so covers populate without stalling the UI. Extraction is deferred to idle time and never runs during menu transitions.
Fixes and behavior changes
TryLoadCoverCacheno longer runs synchronous cover extraction when browser warmup is active — extraction is now deferred to idleProcessJobscalls. This prevents the freeze-on-toggle regression seen with warmup enabled.Button::SetLabel3/GetX/GetYadded to support three-line button labels in menus.PagedListMenurow height is now computed per-page rather than fixed, accommodating variable-length entries.- EPUB NAV spine ordering fixed: chapter detection now correctly follows the
<spine>order from the OPF manifest rather than assuming document order. Test fixtures added for this path. - Marquee background color in the browser grid now correctly tracks the active dark theme background instead of always using the light color.
debug_runtime::BrowserWarmupDisabled()returnsfalse— warmup is active by default in release builds.
What comes next
Remaining workers to re-enable one at a time as each is confirmed stable on hardware: MOBI deferred finalize, then EPUB/FB2/MOBI reflow worker, then CBZ interactive preload, then PDF strip worker.
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.3.2 · Apr 20, 2026
3dslibris 2.3.2
Quality-of-life patch on top of the v2.3.1 stable conservative base. No workers have been re-enabled; all background processing remains on the main thread. This release restores MOBI features that were silently disabled in v2.3.1, fixes a cover-loading gap in the browser, and improves EPUB cover decoding for large and SVG covers.
Highlights
- MOBI structured TOC restored: the
html_to_textposition map is now built during safe-extractor parsing. Structured TOC entries (e.g. "CHAPTER 1", "PART TWO") are resolved to accurate page numbers instead of falling back to linear estimation. - MOBI inline images restored: images embedded in MOBI HTML (
<img recindex=...>) are now registered and rendered in the reading view. Previously the safe extractor wired up no callbacks and all inline images were silently dropped. - MOBI page cache re-enabled: the second open of a large MOBI (e.g. A Promised Land, 1365 pages) now loads from cache in ~3.7 s instead of re-parsing for ~9 s.
- Browser grid covers load on view toggle: switching from list to grid view now immediately loads covers for the visible page. Previously the grid showed empty slots until the next navigation event.
- EPUB large PNG covers decode via libpng: covers larger than 4 MB decoded no longer go through
stb_image's full RGB decode. A direct libpng thumbnail path scales to85×115while keeping peak memory low. - EPUB SVG covers rendered via MuPDF: SVG cover images are rasterized at thumbnail size using the MuPDF fitz renderer instead of being skipped or incorrectly decoded.
Fixes and behavior changes
mobi_safe_markup_extract::ExtractToTextnow accepts and populates anhtml_to_text_mapparameter, sampled at the same intervals as the main extractor.mobi_toc_finalize_policy::ShouldApplyStructuredTocgates on whether the map is usable.mobi_book_hooks::ExtractMobiMarkupToTextwires upInlineImageCallbacks(viabook->RegisterInlineImage) and passes the map pointer through to the extractor.ToggleBrowserViewSettinginapp_prefs.cppnow callsLoadVisibleBrowserCoverCaches()after marking the browser dirty, so the first grid page is populated immediately.App::LoadVisibleBrowserCoverCaches()moved to the public section ofAppso it can be called from settings code.epub_cover::Extracttries a libpng thumbnail path for large PNG covers before falling back tostb_image. On failure the stb_image path is still attempted.epub_cover::Extractrenders SVG covers via a newRenderSvgCoverThumbnailfunction usingfz_open_document_with_buffer/fz_run_pageat thumbnail scale, converting the resulting pixmap to RGB565.
What comes next
Workers will be re-enabled one at a time as each is confirmed stable on hardware: reflow worker (EPUB/FB2/MOBI), then CBZ interactive preload, then PDF strip worker, then browser warmup.
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.3.1 · Apr 20, 2026
3dslibris 2.3.1
Stable release — all background workers disabled. This release trades some speed for confirmed reliability on real hardware. All async/deferred rendering and parsing workers are turned off unconditionally; everything runs on the main thread. From here, each previously-problematic area will be re-enabled one at a time as it is proven safe, rather than all at once.
This patch is a stability-focused follow-up to v2.3.0, aimed at the real-hardware regressions reported after the menu and navigation changes in that release. The main goal of v2.3.1 is to make book opening, switching, covers, and fixed-layout rendering behave reliably again on both .3dsx and .cia, especially on new3DS.
Highlights
- All background workers disabled for this release: fixed-layout rendering (PDF, CBZ), MOBI finalization, and browser warmup all run synchronously on the main thread. The app will feel slightly slower to open large books or navigate zoom levels, but will not crash or hang from worker/heap interactions.
- Reading direction toggle for fixed-layout documents: PDF, CBZ, and XPS now have a per-book
reading directiontoggle inBOOKsettings. Switch betweenLeft to right(default, western) andRight to left(manga, Arabic, Hebrew) — page turn direction and viewport navigation flip accordingly. - Book opening and switching are much harder to break: stale open sessions are gated more carefully, browser-side background work is paused at the right time, and the transition from one book to another no longer relies on timing-sensitive state.
- Browser and cover behavior are more stable on hardware: the library no longer corrupts selected-title rendering while warming metadata, and entering a book no longer leaves behind browser artifacts in the reading view.
- PDF and CBZ now render at zoom-correct resolution: in synchronous mode the interactive tile is rendered immediately after the preview, so zoomed-in content is sharp rather than upscaled from the preview bitmap.
- MOBI crash on reopen is fixed: a large contiguous heap reservation during text merging could
std::terminateon a fragmented 3DS heap after a prior book close. The reservation is removed; the string now grows incrementally.
Included fixes and behavior changes
- Conservative runtime mode: all
debug_runtime::Force*flags returntrueunconditionally in both debug and release builds. Background workers, deferred render pumps, and browser warmup are all bypassed. This is the foundational change forv2.3.1stability. - PDF/CBZ interactive render in sync mode: after the preview bitmap is ready, the zoom-aware interactive tile is rendered immediately on the main thread. Zoom changes clear the tile cache so the next draw re-renders at the correct resolution. Strip worker no longer reloads the page on each strip — bounds and scale are captured once at render start.
- MOBI
reserve()removed from text merge:BuildMergedTextno longer callsreserve(text_len)upfront. The prior 1.8 MB contiguous reservation could fail on a fragmented heap and crash viastd::terminate. Incremental growth is safe. - MOBI page cache save skipped in conservative mode: writing a cache built under the synchronous path would produce stale or mismatched data; the save is now skipped when
ForceSynchronousMobiFinalizeis true. - EPUB inline image metadata retried on zip open failure: if
unzOpenfails due to transient memory pressure,metadata_probedis left false so the next frame retries. Previously a failed open would permanently mark the image as unloadable. - Book vector capacity released on close:
pagesandchaptersvectors now swap with an empty vector onBook::Close(), actually freeing capacity rather than just clearing size. - Opening a book is cancellable and session-safe:
opening book ...can now be cancelled withB,Start, orSelect, and switching from one book to another no longer depends on stale callbacks or unfinished work from the previous session. - Library warmup is better behaved: list-view metadata/title warmup no longer stalls after only a few entries, and gallery-view marquee/title rendering is less prone to corruption while the browser is still active.
- EPUB parsing is more robust against real-world files: better named-entity coverage, improved TOC fallback behavior, and safer page-cache handling during interrupted opens and closes.
- MOBI tradeoffs are explicit in this patch: inline MOBI images and the structured TOC/index may be unavailable when the HTML-to-text position map cannot be trusted. This is an intentional stability tradeoff for
v2.3.1, not a silent regression. - Reader entry/exit is cleaner overall: when a book finally opens, the reading screens are less likely to inherit leftover browser drawing state from the previous mode.
What comes next
Workers will be re-enabled one format at a time as each is verified stable: CBZ interactive preload, then PDF strip worker, then MOBI deferred finalize, then browser warmup. Each re-enablement will ship as a patch or minor release once confirmed on hardware.
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.3.0 · Apr 15, 2026
3dslibris 2.3.0
This release improves the reading menu structure and makes long-book navigation much faster with a dedicated in-book page jump control.
<img width="609" height="502" alt="imagen" src="https://github.com/user-attachments/assets/50d7e27f-3db4-46a6-8d5a-027708a4e72b" />
Highlights
GENERALandBOOKsettings are now separated cleanly: global preferences stay in the library settings menu, while book-specific actions appear only when you open settings during reading.- New
go to pageslider popup: books now expose a dedicated page-jump control fromBOOKsettings, with visible page number feedback and both touch and button-based adjustment.
Included fixes and behavior changes
- The in-book settings menu is more coherent: global options such as
clock format,color mode, andlibrary viewno longer appear mixed into the per-book menu. go to pageis tuned for 3DS controls: touch chooses the page directly,Left/Rightmoves by one page,Up/DownandL/Rmove in larger jumps,Aconfirms, andB/Select/Startcancel.- Left-handed orientation remains supported: the new slider and the updated settings separation continue to use the existing orientation-aware input mapping.
- Recent EPUB compatibility fixes remain included: cosmetic hidden pagebreak spans are ignored, and CSS list marker suppression such as
list-style-type: noneis still honored.
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.2.2 · Apr 15, 2026
3dslibris 2.2.2
This release is a compatibility-focused follow-up to v2.2.1, aimed at EPUB files that rely on hidden structural helpers and print-only markup.
Highlights
- Cosmetic EPUB pagebreak markers no longer disturb pagination: hidden
epub:type="pagebreak"/role="doc-pagebreak"spans are now ignored when they are purely decorative, so they no longer create bogus breaks in the reflowed text. - CSS-hidden list markers are now respected: lists styled with
list-style-type: noneorlist-style: noneno longer show bullets or numbers in 3dslibris when those rules come from EPUB CSS.
Included fixes and behavior changes
- EPUB parser hidden-content handling is more robust: the parser now distinguishes between useful structural content and hidden print-parity markers that should not affect reading flow.
- List marker suppression now works from class-based CSS too: this is no longer limited to inline styles or a few hardcoded class names.
- The EPUB rendering fixture was updated: the test book now includes a non-hardcoded
ornamentlesslist case so the behavior can be validated in both automated tests and on hardware.
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.2.1 · Apr 15, 2026
3dslibris 2.2.1
This release builds on v2.2.0 with a faster library browsing option and a cleaner debug-install workflow.
<img width="600" alt="imagen" src="https://github.com/user-attachments/assets/a13cde9f-8f62-4dde-a208-04bf062fb04a" />
Highlights
- Optional library list view: settings now let you switch the browser between the existing cover gallery and a DSLibris-style list view that loads only titles, starts faster, and is easier to navigate on large libraries.
- List view is fully integrated: the new mode is saved in the XML preferences, works even with no book currently open, supports vertical navigation, and keeps the existing browser flow intact.
- Long titles are handled better in the list: list rows now use the dedicated presentation path introduced for this feature, with clearer rendering and spacing for long display names.
- Debug and release CIA builds can coexist:
3dslibris-debug.cianow uses its own Title ID/Product Code so it installs separately instead of overwriting the release build.
Included fixes and behavior changes
- Browser presentation is split cleanly by mode: grid and list rendering now live in separate presentation files while
app_browser.cppremains the coordinator for shared navigation and actions. - Preformatted host wrapping stays correct: the host-side regression fix for hard wrapping in preformatted text is included in this release train.
- Release automation still publishes the full artifact set: the release workflow continues to generate and attach both CIA variants, both 3DSX variants, the SD package, and the source tarball.
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.2.0 · Apr 15, 2026
3dslibris 2.2.0
This release rolls up the full user-facing work completed since v2.1.4. It focuses on safer HOME/app lifecycle behavior, more reliable cover handling on old3DS, several EPUB rendering fixes, better title presentation in the library browser, and a more usable fixed-layout reading experience for PDF/CBZ/XPS.
Navigation Demo
https://github.com/user-attachments/assets/c18b085e-29c0-4520-abb9-13416200b40d
Highlights
- HOME handling is now safer across
.3dsxand.cia: the app now tracks APT suspend/restore/wakeup/exit events explicitly, pauses work during HOME transitions, and avoids the homebrew-exit crash path seen in HBL-driven.3dsxlaunches. - old3DS cover loading is more stable under memory pressure: cover extraction now uses device-aware memory guards, bounded warmup queueing, and retry backoff instead of hammering the same failing books in a tight loop.
- EPUB block spacing support is broader: paragraph and horizontal-rule margin handling now respects more CSS class-based margin definitions, improving scene breaks and block layout in real books.
- EPUB TOC / contents pages render more sanely: TOC-like documents are now detected from document metadata as well as filename/path, which prevents dense contents entries from collapsing into one run-on paragraph.
- Long book titles are easier to browse in the library: selected and grid titles now support marquee scrolling, and display names prefer embedded metadata titles over raw filenames when available.
- Preformatted text is safer: clipping for
pre/ code-heavy blocks was corrected so wrapping/truncation no longer corrupts surrounding text flow. - Fixed-layout reading is more practical on 3DS screens: PDF/CBZ/XPS now expose an extra zoom tier for small-screen readability, and fixed-layout page turns now also work on
L/Rfor the supported reader paths in this release.
Included fixes and behavior changes
- HBL
.3dsxHOME crash avoided: after app cleanup completes, homebrew launches now exit throughsvcExitProcess()instead of falling into a brokenaptExit()path after HBL has already reclaimed the APT session. - Suspend/resume lifecycle is explicit: applet hooks now pause background work on suspend, mark screens dirty on restore/wakeup, and persist prefs on exit.
- Reader/browser state is hardened across HOME: resume paths now reset transient touch/input state and avoid continuing presentation in an inconsistent applet state.
- Cover retry storms are blocked on old3DS: failed low-memory cover jobs are deferred with backoff, and speculative warmup is kept much more conservative on memory-constrained hardware.
- EPUB
<hr>rendering is more accurate: structural separators such ashr.transitionno longer force a visible line when the source CSS saysborder: none, while actual rule blocks retain block-margin handling. - Browser display names are cleaner: metadata titles are preferred when present, cached display names are invalidated correctly when titles change, and edge cases are covered by added tests.
- MuPDF page backtracking is now reliable: changing pages resets the fixed-layout viewport coherently before deferred redraw, which avoids stale pan state when moving backward through PDFs/XPS documents.
- CBZ failure diagnosis is better: debug logging now records whether loading failed during ZIP access or during image decode, making file-specific reports easier to triage.
Included assets
3dslibris.cia3dslibris-debug.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.1.4 · Apr 11, 2026
3dslibris 2.1.4
Small patch release for fixed-layout safety, lower stack usage during title-page detection, and broader debug instrumentation.
Fix
- Heap-based parsing state: move
Stateoff the stack to avoid stack overflow on 3DS-sized stacks when opening heavier books. - Fixed-layout title-page guard: skip approximate title-page search for fixed-layout books such as
PDFandCBZ, where text-page heuristics do not apply. - Extra debug coverage: expand
DSLIBRIS_DEBUGlogging across app lifecycle, main loop memory reporting, reflow worker shutdown, browser input, and cover-cache corruption paths to make field diagnosis easier without changing release-build behavior.
Included assets
3dslibris.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.1.3 · Apr 10, 2026
3dslibris 2.1.3
Patch release fixing a crash on startup when an FB2 book was saved as the last opened book.
Fix
- FB2 reopen crash on boot fixed: when
current=<book>.fb2was persisted in prefs, the app crashed during boot. Root cause was a FreeType race condition: the reflow worker (core 1) calledts->GetAdvanceinside XML parse callbacks while the main thread (core 0) simultaneously calledts->GetStringWidth/ts->PrintStringin the opening-mode status bar. FreeType is not thread-safe. The fix defersOpenBook()from the boot sequence to the first tick of the main loop, ensuring the reopen worker is never launched before the main loop is running — matching the timing of a user-initiated open and eliminating the race.
Included assets
3dslibris.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.1.2 · Apr 10, 2026
3dslibris 2.1.2
Patch release fixing cover-load gaps in the library browser and a use-after-free crash on exit.
Fix
- Cover-load gaps fixed: all visible books now have their covers queued for extraction on each warmup tick, not just the selected one. The retry counter is no longer incremented on metadata-index failures (only on actual cover-extraction failures), so transient index misses no longer permanently blacklist a book's cover. The attempt limit was raised from 2 to 3 to give marginal cases one extra pass.
- Use-after-free crash on exit fixed: the
Appdestructor now deletesBookobjects before releasingPrefsand the touchscreen handle (ts). Previously,Bookdestructors ran afterPrefs/tswere freed, producing a Luma3DS fault dump with FAR=0xE7E7996B. AButton*leak in the destructor is also plugged.
Included assets
3dslibris.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.1.1 · Apr 10, 2026
3dslibris 2.1.1
Patch release restoring page-turn performance to pre-2.1.0 levels.
Fix
- Page-turn speed restored: page rendering was ~10× slower than 2.0.4 due to a glyph cache regression introduced alongside the CJK/RTL fallback font support in 2.1.0. The glyph cache was effectively bypassed on every character because the ghost-glyph detection path called
FT_Load_Charunconditionally, even when the glyph was already cached. This is fixed by checking the cache first and restricting the ghost-glyph check to the Arabic Presentation Forms block (U+FE70–U+FEFF) where it is actually needed.
Included assets
3dslibris.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.1.0 · Apr 9, 2026
3dslibris 2.1.0
This release focuses on EPUB reading quality, typography, fallback fonts, and onboarding. It adds configurable monospace rendering for code-heavy books, broadens XHTML/CSS formatting support, improves chapter/index labels and punctuation handling, bundles broader CJK/RTL fallback coverage, and documents the install/book-copy flow more clearly in both the repository and the bundled SD quickstart.
Highlights
- Configurable EPUB monospace flow restored and expanded:
pre/codenow reflow with the active monospace font instead of measuring with the serif text face, preserving readable code blocks while keeping the new configurable mono font path. - Monospace variants now render correctly: EPUB content can distinguish regular, bold, italic, and bold-italic monospace text instead of collapsing everything to one mono style.
- More EPUB block semantics are supported: lists, nested ordered lists,
blockquote,aside,caption,figure,dl/dd, and basic table linearization now render as readable reflow blocks instead of collapsing into generic paragraph flow. - EPUB inline formatting support is broader: underline, strikethrough, overline, superscript, subscript, dotted/dashed/wavy underline styles, and common CSS-driven emphasis patterns are now recognized more consistently.
- Hidden EPUB accessibility text is ignored: common hidden-text patterns such as
visually-hidden,aria-hidden, and equivalent inline CSS are no longer shown as visible body text. - Styled punctuation stays attached to the surrounding text: closing
!/?and opening¡/¿are handled more safely across inline style boundaries, avoiding the worst split cases in Spanish text. - EPUB index labels are cleaner: chapter menus now prefer simpler labels instead of concatenating multiple headings into one noisy entry.
- EPUB page cache writes are safer: page cache files now save with the actual layout parameters used for pagination instead of stale zeroed values, avoiding invalid cache entries after fresh opens.
- Bundled quickstart and SD docs are clearer about where books go: the release package now makes the
sdmc:/3ds/3dslibris/book/path more explicit, since this is still the most common user setup question. - Book view renderer recovery is more defensive: entering or reopening a book now resets the text renderer state more aggressively, which should reduce rare cases where visible glyphs disappear until the app is restarted.
Language, fallback, and layout improvements included
- Arabic, Hebrew, Korean, Japanese, and Chinese fallback coverage improved: the SD package now bundles Noto Naskh Arabic, Noto Sans Hebrew, and Droid Sans Fallback Full alongside Liberation, with updated Apache 2.0 / OFL notices.
- Configured fallback fonts survive prefs loading correctly: loading saved preferences no longer collapses the fallback set to only one face, so CJK/RTL coverage remains available after restart.
- RTL layout support is more robust: BiDi shaping, line anchoring, and orientation-aware layout work included since
2.0.4make mixed-script content behave more predictably. - Orientation-aware inline image layout is more stable: screen metrics and image placement helpers were refactored so reflow/image combinations behave better in both orientations.
Developer and packaging work included
- EPUB regression coverage is much wider: the test suite now covers punctuation flow, underline decorations, parser style behavior, and a dedicated EPUB rendering fixture used to validate hidden text, code blocks, lists, and tables.
- Bundled release test content improved: the SD template and fixture EPUB now provide a more practical target for smoke-testing release builds on hardware and in Azahar.
- Release packaging docs were refreshed: README and SD template docs now align better with the actual release layout and the supported install paths.
Included assets
3dslibris.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.0.4 · Apr 3, 2026
3dslibris 2.0.4
This release focuses on stability and orientation correctness. It fixes settings persistence breakage caused by XML-invalid filenames, improves .cia library discovery by reading books from both SD and RomFS, and corrects left-handed reading and library navigation behavior.
Highlights
- Bookmarks and last-read page persistence fixed: prefs XML writing now escapes attribute values correctly and sanitizes invalid control characters, so filenames like
... & ...no longer break3dslibris.xmlparsing on startup. - CIA library source handling improved: the app now discovers books from both
sdmc:/3ds/3dslibris/bookandromfs:/3ds/3dslibris/book, with SD entries taking priority when names overlap. - Left-handed page screen order corrected: reflow reading now inverts first and second reading screens correctly in left-handed orientation.
- Orientation-relative library D-Pad navigation: grid navigation now follows console orientation in both modes so directional input matches visual movement in right-handed and left-handed layouts.
- Startup diagnostics improved: prefs load failures are now logged with an explicit warning instead of failing silently.
- EPUB emphasis compatibility improved: the parser now recognizes bold/italic expressed via common
styleandclassCSS patterns, not only semantic tags (<b>/<strong>/<i>/<em>). - Release pipeline stability improved: debug MOBI builds now include the correct reporter definitions so
debug-3dsxcompiles reliably in CI/release workflows.
Architecture and maintainability work included
- App monolith reduced through controller extraction: startup flow, main loop dispatch, status updates, library flow, reader flow, and settings flow were split into dedicated controllers so
Appdelegates more and owns less direct behavior. - Controller coupling reduced: broad
friendaccess was removed in favor of explicitAppAPIs for startup, loop, reader runtime state, and presentation steps. - Library and reader boundaries clarified: browser warmup/job flow and reader open/deferred-relayout paths were moved behind controller-driven entry points with less direct cross-module state access.
book_io.cppkept as a thin dispatcher: parser-heavy logic was extracted into dedicated modules (plain-text, XML, and MOBI submodules), reducing central parser coupling and making future format changes safer.
Included assets
3dslibris.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.0.3 · Apr 1, 2026
3dslibris 2.0.3
This release fixes the remaining .cia runtime and packaging issues so the installable build now behaves correctly on real hardware and in Azahar. The focus is startup robustness, bundled runtime data, and clear fatal-screen behavior when no books are present.
Highlights
- Fixed bundled RomFS for
.ciabuilds — the installable build now actually includes its bundled fonts and UI resources, instead of staging them locally but omitting them from the final CIA package. - Fixed the CIA-only startup crash — a null cache entry in the text/font teardown path could trigger an ARM11 data abort during early startup failure; font initialization and cache cleanup are now hardened.
- Better runtime asset fallback — bundled fonts and resources are resolved safely between SD and
RomFS, so.ciainstalls no longer depend on a manualfont/orresources/copy to boot. - Stable fatal boot screens — missing-book and startup error screens no longer flicker between old and new frames while waiting for
START. - Clearer first-run behavior — if no books are present, the app now shows a stable message telling you to copy your
EPUB,FB2,TXT,RTF, orODTfiles intosdmc:/3ds/3dslibris/book. - CIA build validation added to CI — GitHub Actions now builds and verifies the
.ciapath as well, including checks that the stagedRomFScontains the bundled runtime files.
Included reader functionality
v2.0.3 keeps the full reader feature set from the 2.0.x line, including:
- MuPDF-backed
PDF,CBZ, andXPSsupport - progressive fixed-layout rendering
- asynchronous/deferred
MOBIopen on New 3DS - generated library cover thumbnails
- bundled runtime assets for
.ciainstalls
Included assets
3dslibris.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.0.2 · Apr 1, 2026
3dslibris 2.0.2
This release fixes the installable .cia build so it boots correctly again on real hardware and in Azahar.
Highlights
- Fixed CIA startup on hardware and Azahar: the packaged NCCH code is now emitted without compression, avoiding the startup crash seen in previous
2.0.1CIA builds. - No change to reader features: this is a packaging-focused release intended to restore a working installable build.
- Clean CIA build path: the local CIA build also includes the small
book_io.cppdeclaration fix required for a clean rebuild.
Included assets
3dslibris.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip3dslibris-source.tar.gz
v2.0.1 · Apr 1, 2026
3dslibris 2.0.1
This release republishes the real post-2.0.0 branch state as a clean public tag. The functional reader improvements from the 2.0.0 line remain intact, but 2.0.1 is the first tag that matches the full codebase as it exists after the later cleanup, path centralization, test refactors, and repository reorganization work.
Highlights
- Full branch catch-up release:
v2.0.1includes the missing commits that were finished after the originalv2.0.0tag, so the public release now matches the maintainedmainline. - Centralized runtime paths: SD, cache, and related filesystem paths now live in a shared path layer instead of being duplicated across subsystems.
- Cleaner repo structure: shared helpers were reorganized, legacy duplicate files were removed after the move, and bundled
expatsources now live underthird_party/. - MOBI cache code split out cleanly: page-cache serialization and invalidation logic now live in a dedicated MOBI cache module instead of being embedded in the larger common book I/O unit.
- Improved native test ergonomics: the text-layout and Unicode tests now reuse a shared native build helper instead of each script compiling the same dependency objects manually.
- Expanded technical documentation: the repository now includes architecture notes plus local NDS/3DS hardware reference material derived from GBATek for future maintenance work.
Included reader functionality
v2.0.1 still includes all user-facing work shipped in the v2.0.0 line:
- MuPDF-backed
PDF,CBZ, andXPSsupport - progressive fixed-layout rendering with preview-first display
- asynchronous/deferred
MOBIopen on New 3DS - generated library cover thumbnails for
EPUB,FB2,MOBI,PDF, andCBZ - bundled runtime assets for
.ciainstalls
Included assets
3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip
v2.0.0 · Mar 31, 2026
3dslibris 2.0.0
This release rolls up the full reader evolution since the 1.1.0 line into a broader fixed-layout and reflow upgrade. The headline change is that 3dslibris is no longer just a reflowable-book reader: it now has a MuPDF-backed fixed-layout stack for PDF-class documents while also substantially improving MOBI, EPUB, FB2, packaging, and runtime stability.
Highlights
- PDF, CBZ, and XPS reading: open PDF documents, comic books (CBZ), and XPS files with zoom, full-page preview on the bottom screen, and outline navigation when available.
- Progressive page loading: you see a preview of the page immediately, then it refines to full quality in the background. No more waiting for a page to fully render before you can interact.
- Faster on New 3DS: page rendering for PDF and CBZ runs on a separate processor core, keeping the UI responsive. Old 3DS still works with automatic fallback.
- MOBI books open without freezing the UI on New 3DS thanks to asynchronous processing: you can start reading while the rest of the book finishes loading in the background.
- Library covers now work for every format: EPUB, FB2, MOBI, PDF, and CBZ all show actual page thumbnails instead of placeholders.
- All 1.1.x improvements included: inline images in MOBI and EPUB, faster image-heavy books, better text rendering, and more accurate MOBI table of contents.
- No more manual SD card setup for
.ciainstalls: fonts and UI resources are built in. - More stable startup: problematic MOBI files no longer cause crashes, and the app stays on a clear error screen instead of flickering between states when something goes wrong.
Extended details
Fixed-layout stack (PDF / CBZ / XPS)
- Adds MuPDF-backed PDF reading with zoomed top-screen viewing, full-page preview on the bottom screen, outline navigation when available, and touch-controlled viewport movement.
- Extends that fixed-layout stack to CBZ and XPS, reusing the same rendering core and viewer workflow instead of maintaining separate one-off readers.
- Introduces a progressive fixed-layout rendering pipeline: preview first, interactive cache next, then full-page refinement in the background instead of a single blocking render.
- Adds progressive strip rendering for zoomed fixed-layout pages, with strips composited on screen as they complete.
- Uses a dedicated fixed-layout worker thread on the New Nintendo 3DS extra core when available, while keeping an automatic synchronous fallback path for Old 3DS hardware.
- Improves fixed-layout cache behavior by stabilizing preview viewport updates, accelerating cache reuse, and deferring expensive prefetch work until page turns or idle periods.
- Fixed-layout reader controls are now documented consistently for PDF, CBZ, and XPS:
A/Bzoom,Left/Rightturn pages,Up/Downjump outline entries when available, touch moves the viewport, andSTART/SELECTreturn to the library or open settings. - Tightens PDF-enabled release documentation and licensing notes for MuPDF-based builds, including corresponding-source guidance for public release packaging.
MOBI & deferred open
- MOBI opening on New 3DS now uses asynchronous reflow, which removes the old long blocking open path from the UI while keeping Old 3DS on the synchronous fallback.
- Large MOBI books now complete deferred TOC work much faster by reusing structured TOC data and avoiding redundant metadata rebuilds.
- MOBI parsing and deferred reflow were reworked so large books spend less time in the slow path during open, with finer-grained timings available in debug builds.
- The deferred-open path is now much cleaner on real hardware: EPUB page-cache writes are pushed out of the async-open critical path, buffered status logging avoids per-line file reopen overhead, and deferred MOBI finalize work no longer floods debug output while background pagination runs.
Library covers & browser
- Library cover generation is now a first-class runtime feature rather than a best-effort side effect: visible-page thumbs are cached and reused, the selected book gets warmup priority after short idle, and generated covers now work across EPUB, FB2, MOBI, PDF, and CBZ.
- PDF and CBZ library thumbs now come from the first page, which makes the fixed-layout formats feel integrated with the rest of the library instead of showing generic placeholders.
- Browser and fixed-layout drawing now track dirty regions more precisely and reuse cached physical framebuffers, which cuts redraw cost and fixes the regression where valid freshly generated cover thumbs could exist in RAM and cache but still fail to appear on screen.
Text & layout
- EPUB and FB2 now share better text-layout instrumentation and a combined break/measure helper in the common layout layer, improving visibility into shaping and line-break cost in real books.
- The text engine improvements introduced around the 1.1.0 line remain part of this release: stronger Unicode-aware text runs, better line breaking, safer text-size clamping, and more resilient page-buffer handling continue to benefit EPUB, FB2, and other reflowable formats.
- MOBI support also keeps the 1.1.x improvements to inline images, safer cover extraction, more correct record decoding, and the legacy plain-text wrapping behavior that works better on real books.
Included assets
3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip
v1.1.0 · Mar 31, 2026
3dslibris 1.1.0
This release expands the recent reader work into a broader upgrade focused on embedded images, EPUB responsiveness, and day-to-day navigation on real 3DS hardware.
Highlights
- Library navigation: you can now move the selection around the book grid with the D-Pad and press
Ato open. - Images inside EPUB and MOBI books now display correctly: small icons, wide separators, and full-size figures no longer take up the entire screen or disappear.
- EPUB books with lots of images open noticeably faster thanks to internal optimizations in how images are loaded from the archive.
- Library cover thumbnails for MOBI books generate faster on subsequent visits since cover data is now remembered between sessions.
- No more manual SD card setup for
.ciainstalls: the.cianow includes all required fonts and UI resources, so a plain install from the Homebrew Menu is enough. - Better text rendering across all formats: improved line breaking, proper handling of special characters, and font sizes that can no longer be set to values that break pagination.
- Code blocks and
<pre>sections in EPUBs now wrap properly instead of running off the edge of the screen. - MOBI books benefit from multiple fixes: more accurate table of contents, better plain-text wrapping that matches how real books read, and support for
HUFF/CDICcompressed files.
Extended details
Image layout & caching
- Fixed a pagination/render mismatch that could make text immediately after inline images disappear in some books.
- Paragraph-leading icon blocks in EPUBs now stay grouped with their explanatory text more reliably.
- SVG wrapper images that cannot be resolved inside the EPUB archive are now reported cleanly instead of handing raw XML to the image decoder.
- Large-image bounds checking is now applied uniformly in both metadata probing and page-mode rendering, preventing unbounded memory allocations on malformed or oversized images.
- MOBI cover extraction now caches cover metadata between runs, avoiding repeated full rescans for books that have already been inspected.
- Large MOBI books now cap the first-pass and last-resort image-record probes used for cover discovery, reducing unnecessary scanning work.
- A rare MOBI inline-image decode failure is retried in RGB mode, fixing books where a valid JPEG reserved layout space but never rendered.
MOBI improvements
- MOBI parse logging is buffered during debug-heavy parse phases, reducing status I/O noise without losing the trace.
- Keep-with-next pagination now protects semantic MOBI headings emitted during markup extraction, without the broader line-based heuristic that could move ordinary sentences.
- MOBI inline images now load and flow through the smart image layout pipeline, including books that store
recindexreferences with zero-padded values.
Text & layout
- Text-size limits are now clamped to a safe
8..20range, preventing crashes and broken pagination from extreme font sizes in settings or persisted prefs. - Page-buffer writes are now hardened against overflow, and oversized fragments trigger safer page-breaking behavior instead of corrupting page content.
Included assets
3dslibris.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip
v1.0.3 · Mar 14, 2026
3dslibris 1.0.3
This release fixes the direction of horizontal controls in the settings UI and defers book relayout until the book is reopened. It also restores working .cia packaging for hardware and Azahar.
Highlights
- Pressing right on settings rows such as font size and paragraph spacing now increases the value.
- Pressing left now decreases the value, matching the on-screen arrows and touch layout.
- Horizontal navigation inside the settings list is aligned with the same left/right direction.
- The main browser splash now shows the app version centered at the bottom of the left screen.
- Changing font size, paragraph spacing, orientation, or reading fonts no longer tries to repaginate the book inside the settings menu.
- When layout-related settings change, the app shows a warning and applies the new layout after reopening the current book.
- MOBI parsing is more resilient against empty or corrupt files and now shows a readable error instead of a raw numeric failure.
- MOBI books now have an optional per-book
line wrap fixfor badly converted files that hard-wrap normal prose into many short blocks. - The
.ciapackaging flow was rebuilt around the samemakerom/bannertoolprocess used by Universal-Updater. - Previous
1.0.3test.ciabuilds could install but fail to boot because the packaged exheader ended up with an invalid main-thread priority. - The generated
.cianow boots correctly on original hardware and in Azahar.
Known bug
- When a book is reopened after a layout change, or after toggling the per-book MOBI
line wrap fix, reading position and existing bookmarks are remapped approximately and may land a few pages away from their original location. - Some malformed MOBI files still contain source encoding or OCR artifacts that cannot be repaired fully by the reader.
Included assets
3dslibris.cia3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip
v1.0.2 · Mar 12, 2026
3dslibris 1.0.2
This release improves installation clarity and blocks startup when the SD runtime package is incomplete.
Highlights
- Startup now stops with clear install guidance if required runtime files are missing from the SD card.
- The error message tells users to download and extract
3dslibris-sdmc.zipand shows the expectedsdmc:/3ds/3dslibris/layout. - The README now explains installation step by step for the
.3dsx+ SD package flow.
Included assets
3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip
v1.0.1 · Mar 12, 2026
3dslibris 1.0.1
This release improves cold EPUB open performance and adds a distributable debug build.
Highlights
- EPUB cold opens are now much faster on large books by indexing ZIP entries before spine parsing.
- In real tests with Don Quijote, cold open time dropped from about 50.5s to about 7.2s, roughly a 7x improvement.
- Releases now include
3dslibris-debug.3dsx, which enables verbose diagnostic logging in3dslibris.log.
Included assets
3dslibris.3dsx3dslibris-debug.3dsx3dslibris-sdmc.zip
Notes
- The debug build is intended for troubleshooting and performance investigation.
- EPUB TOC resolution remains separate from the main open path and was not the main cause of the previous cold-open slowdown.
