3DS Store › Apps › 3dslibris

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 screen in the BOOK menu. Available on Old/New 3DS (including XL) and New 2DS XL; the original 2DS stays at 400×240.
  • Optional disable ebook images setting under style 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.cia or 3dslibris.3dsx for normal use.
  • 3dslibris-sdmc.zip: runtime files for Homebrew Launcher installs; use with the .3dsx download.
  • Debug builds (3dslibris-debug.cia / 3dslibris-debug.3dsx) and 3dslibris-source.tar.gz are 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 u without 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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 1em gaps 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 5 comes before Chapter 10 and 2.png comes before 10.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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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-indent rules 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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: right and text-align: center rendering 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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>, &amp;, &lt;) and adapting inline style parsing (including font-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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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.jpg or Book.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 were 1%, and CSS-driven breaks avoid compressed separation at screen edges).
  • #77: added block-level padding-top support for %/px/em in inline styles, and upgraded page-break-before: always handling 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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: START now closes folders, like B.
  • #127: START now 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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 B or 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 bannertool to 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; B or touch back returns to the root library; optional sibling folder covers supported via FolderName.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-size is always applied; absolute px values scale relative to the publisher's declared body { font-size } baseline; reader's font-size preference acts as a global scale factor
  • #108: CSS em/rem lengths now resolve against the actual font size: text-indent, margin-left, margin-right, and related properties previously converted em to pixels using a hardcoded 12px baseline
  • #102 add conservative Markdown reading for .md and .markdown files: headings, emphasis, lists, blockquotes, code spans, and link text are converted into the existing reflowable text renderer
  • battery percentage now uses the real mcu::HWC reading, 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-top and margin-bottom on 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.cpp into focused translation units (app_accessors.cpp, app_lifecycle.cpp, app_menu_frames.cpp, app_views.cpp); app.cpp is now 446 lines and holds only initialization, screens/orientation, status, and gradient backgrounds
  • add -fdata-sections and 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.txt and sdmc:/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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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 .css now 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 (and right) 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-indent property for first-line paragraph indentation (px, em, pt, in units)
  • #84: honor CSS margin-top and margin-bottom on block elements (div, aside, blockquote, figure, caption, dd); default spacing preserved when no CSS value is specified
  • fix CSS class font-weight: bold and font-style: italic being 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, and epub_css_tokenizer into 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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: none is 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.figure content 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 .3dsx HOME/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::Index to book_parser::Index
  • remove Book::Open, move open/parse/index dispatch into book_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 from App
  • 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, and book_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-host reporting 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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 ContainsRTL in BiDi utils

Fixes

  • #87: render large EPUB images by moving pixel budget guard from metadata probe to draw time
  • #84: support CSS margin-top and margin-bottom in 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 toc link is absent
  • #82: accumulate nested list indentation correctly per depth level
  • apply CSS display:block promotion 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: none on <ol> and <ul>
  • #35: keep adjacent length values on CSS margin shorthand with auto values
  • 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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.xml chapter index: .cbz files that include a ComicInfo.xml file (as embedded by tools such as ComicTagger) now expose a table of contents. Pages with a Bookmark attribute in the <Pages> section appear as named chapters in the index menu. Files without ComicInfo.xml or 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 Y to use Link Mode, D-Pad Right now moves to the next inline link and D-Pad Left moves to the previous inline link, continuing onto nearby pages when needed. D-Pad Up/Down still 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-align on block containers such as body, div, section, and display:block elements 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 CSS width: 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: always is now respected: block elements with page-break-before: always (or the CSS3 equivalent break-before: page) in their inline style= attribute or stylesheet class now force content onto a new page, as intended by EPUB authors. page-break-after: always is also supported. See #72.
  • CSS page-break-inside: avoid is now respected: blocks marked with page-break-inside: avoid (or break-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-size with pt units and absolute keywords (xx-small through xx-large), and margin-top/margin-bottom with em, rem, and pt units. Both inline style= attributes and class rules are recognised.
  • CSS horizontal margins are now applied: margin-left and margin-right on EPUB block elements now affect both wrapping width and visible line starts, including stylesheet classes, percentages, shorthand margins, and negative values.
  • CSS text-indent and text-transform are now applied: text-indent controls 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, and capitalize transform 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: start and text-align: end are now supported.
  • CSS white-space modes are now respected: pre, pre-wrap, pre-line, and nowrap control whitespace and line-break preservation in EPUB content, so code blocks and preformatted passages render as the author intended. On the 3DS screen, nowrap still wraps when needed after collapsing spaces so long lines remain readable.
  • CSS float and clear are now applied to images: float: left pins an image to the left margin and float: right pins it to the right margin. clear: both, clear: left, and clear: right force 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-size and <small>/<big> tags are now rendered: any element with a CSS font-size, via inline style= or a stylesheet class, renders text at the specified size. The <small> tag applies the smaller scale factor (~83% of the current size) and <big> applies larger (~120%). All units are supported: px, em, rem, pt, %, smaller, larger, and the absolute keywords xx-small through xx-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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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 Y on a page with inline links to enter link focus mode, move with the D-pad, and press A to follow the selected link. See #27.
  • Alternative SD data path support: runtime data can now also be loaded from sdmc:/config/3dslibris in addition to the legacy sdmc:/3ds/3dslibris layout. 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 GENERAL settings 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 GENERAL settings 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: .3dsx exits 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-h6 now respect heading-specific font-size styling 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 applies vertical-align: super/sub rules 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 when list-style-type: none is 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/3dslibris are now supported alongside the existing sdmc:/3ds/3dslibris layout. 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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: center and text-align: right are now honoured in EPUB reflow. Each paragraph emits an alignment token that Page::Draw uses 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 unzFile handle 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 osGetTime calls and unnecessary allocations with DSLIBRIS_DEBUG only.
  • 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_image decoding, 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: ParseMuPdfFile is now split into three independently cancellable steps (fz_open_document, fz_count_pages, fz_load_outline), each separated by an APT yield point via open_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_Wait in CancelMuPdfIncrementalRenderState replaced with a 100 ms polling loop; ShutdownMuPdfWorker and ShutdownCbzWorker now use a 500 ms join timeout instead of U64_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: kMaxPagesInMemory raised 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.y after <hr> rules, preventing <hr/> <p>Text</p> from overlapping text. See #37.
  • PagedListMenu overflow: pagination indices changed from u8 to u16 so 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 ForceSynchronousBookOpen flag and deferred_pumped references; ShouldUseAsyncReflowOpen is 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.zip now contains only SD card runtime files. The .3dsx builds 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: center and text-align: right support 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip (runtime files only; pair it with the .3dsx asset 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() used std::map::operator[], which silently inserted a NULL FT_Face for missing style keys. Callers then dereferenced face->size, causing a data abort at offset 0x58 from NULL. GetFace() now uses find() and returns NULL for missing keys; all callers (GetHeight(), GetGlyphIndex(), both GetFontName() overloads) guard against NULL before dereferencing.
  • Division by zero in browser marquee: the background color averaging loop in BrowserGridView divided by vis_w * sh without checking for zero-dimension covers, leading to a divide-by-zero when a book had no valid thumbnail. Guarded with if (bg_pixels > 0).
  • Degenerate layout when font height is zero: if GetHeight() returned 0 (for example, when no valid face was loaded), button and line heights collapsed to 0 and produced unreadable or non-interactive menus. Added a line_height floor of 10 pixels in font.cpp and paged_list_menu.cpp.
  • Out-of-bounds touch in empty list menus: PagedListMenu::HandleTouchInput() accessed buttons[0] without checking whether the vector was empty, causing an out-of-bounds read on menus with no entries. Added an early return when buttons.empty().
  • Infinite loop in text wrapping: WrapTextToLines() could spin forever when Utf8BytesForDisplayChars() returned 0 (for example, on a zero-width or unrecognised code point). Forced a minimum advance of 1 byte 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-source.tar.gz

v2.4.1 · Apr 22, 2026

3dslibris 2.4.1

Crash-at-boot fix.

Fix

  • Crash on launch (reported on #55 ): FontMenu is constructed during App::App() before fonts are loaded (FontManager is still null). Calling GetHeight() and GetAdvance() 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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.jpg with theme-aware 3DSLibris_dark_small.jpg / 3DSLibris_light_small.jpg.
  • Cycle themes with X in the browser: press X in 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

  • TryLoadCoverCache no longer runs synchronous cover extraction when browser warmup is active — extraction is now deferred to idle ProcessJobs calls. This prevents the freeze-on-toggle regression seen with warmup enabled.
  • Button::SetLabel3 / GetX / GetY added to support three-line button labels in menus.
  • PagedListMenu row 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() returns false — 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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_text position 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 to 85×115 while 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::ExtractToText now accepts and populates an html_to_text_map parameter, sampled at the same intervals as the main extractor. mobi_toc_finalize_policy::ShouldApplyStructuredToc gates on whether the map is usable.
  • mobi_book_hooks::ExtractMobiMarkupToText wires up InlineImageCallbacks (via book->RegisterInlineImage) and passes the map pointer through to the extractor.
  • ToggleBrowserViewSetting in app_prefs.cpp now calls LoadVisibleBrowserCoverCaches() after marking the browser dirty, so the first grid page is populated immediately.
  • App::LoadVisibleBrowserCoverCaches() moved to the public section of App so it can be called from settings code.
  • epub_cover::Extract tries a libpng thumbnail path for large PNG covers before falling back to stb_image. On failure the stb_image path is still attempted.
  • epub_cover::Extract renders SVG covers via a new RenderSvgCoverThumbnail function using fz_open_document_with_buffer / fz_run_page at 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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 direction toggle in BOOK settings. Switch between Left to right (default, western) and Right 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::terminate on 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 return true unconditionally in both debug and release builds. Background workers, deferred render pumps, and browser warmup are all bypassed. This is the foundational change for v2.3.1 stability.
  • 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: BuildMergedText no longer calls reserve(text_len) upfront. The prior 1.8 MB contiguous reservation could fail on a fragmented heap and crash via std::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 ForceSynchronousMobiFinalize is true.
  • EPUB inline image metadata retried on zip open failure: if unzOpen fails due to transient memory pressure, metadata_probed is left false so the next frame retries. Previously a failed open would permanently mark the image as unloadable.
  • Book vector capacity released on close: pages and chapters vectors now swap with an empty vector on Book::Close(), actually freeing capacity rather than just clearing size.
  • Opening a book is cancellable and session-safe: opening book ... can now be cancelled with B, Start, or Select, 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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

  • GENERAL and BOOK settings 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 page slider popup: books now expose a dedicated page-jump control from BOOK settings, 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, and library view no longer appear mixed into the per-book menu.
  • go to page is tuned for 3DS controls: touch chooses the page directly, Left/Right moves by one page, Up/Down and L/R move in larger jumps, A confirms, and B / Select / Start cancel.
  • 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: none is still honored.

Included assets

  • 3dslibris.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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: none or list-style: none no 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 ornamentless list case so the behavior can be validated in both automated tests and on hardware.

Included assets

  • 3dslibris.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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.cia now 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.cpp remains 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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 .3dsx and .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 .3dsx launches.
  • 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 / R for the supported reader paths in this release.

Included fixes and behavior changes

  • HBL .3dsx HOME crash avoided: after app cleanup completes, homebrew launches now exit through svcExitProcess() instead of falling into a broken aptExit() 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 as hr.transition no longer force a visible line when the source CSS says border: 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.cia
  • 3dslibris-debug.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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 State off 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 PDF and CBZ, where text-page heuristics do not apply.
  • Extra debug coverage: expand DSLIBRIS_DEBUG logging 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.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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>.fb2 was persisted in prefs, the app crashed during boot. Root cause was a FreeType race condition: the reflow worker (core 1) called ts->GetAdvance inside XML parse callbacks while the main thread (core 0) simultaneously called ts->GetStringWidth / ts->PrintString in the opening-mode status bar. FreeType is not thread-safe. The fix defers OpenBook() 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.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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 App destructor now deletes Book objects before releasing Prefs and the touchscreen handle (ts). Previously, Book destructors ran after Prefs/ts were freed, producing a Luma3DS fault dump with FAR=0xE7E7996B. A Button* leak in the destructor is also plugged.

Included assets

  • 3dslibris.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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_Char unconditionally, 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.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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 / code now 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.4 make 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.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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 break 3dslibris.xml parsing on startup.
  • CIA library source handling improved: the app now discovers books from both sdmc:/3ds/3dslibris/book and romfs:/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 style and class CSS patterns, not only semantic tags (<b>/<strong>/<i>/<em>).
  • Release pipeline stability improved: debug MOBI builds now include the correct reporter definitions so debug-3dsx compiles 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 App delegates more and owns less direct behavior.
  • Controller coupling reduced: broad friend access was removed in favor of explicit App APIs 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.cpp kept 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.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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 .cia builds — 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 .cia installs no longer depend on a manual font/ or resources/ 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, or ODT files into sdmc:/3ds/3dslibris/book.
  • CIA build validation added to CI — GitHub Actions now builds and verifies the .cia path as well, including checks that the staged RomFS contains 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, and XPS support
  • progressive fixed-layout rendering
  • asynchronous/deferred MOBI open on New 3DS
  • generated library cover thumbnails
  • bundled runtime assets for .cia installs

Included assets

  • 3dslibris.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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.1 CIA 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.cpp declaration fix required for a clean rebuild.

Included assets

  • 3dslibris.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-sdmc.zip
  • 3dslibris-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.1 includes the missing commits that were finished after the original v2.0.0 tag, so the public release now matches the maintained main line.
  • 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 expat sources now live under third_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, and XPS support
  • progressive fixed-layout rendering with preview-first display
  • asynchronous/deferred MOBI open on New 3DS
  • generated library cover thumbnails for EPUB, FB2, MOBI, PDF, and CBZ
  • bundled runtime assets for .cia installs

Included assets

  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-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 .cia installs: 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/B zoom, Left/Right turn pages, Up/Down jump outline entries when available, touch moves the viewport, and START/SELECT return 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.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-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 A to 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 .cia installs: the .cia now 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/CDIC compressed 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 recindex references with zero-padded values.

Text & layout

  • Text-size limits are now clamped to a safe 8..20 range, 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.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-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 fix for badly converted files that hard-wrap normal prose into many short blocks.
  • The .cia packaging flow was rebuilt around the same makerom/bannertool process used by Universal-Updater.
  • Previous 1.0.3 test .cia builds could install but fail to boot because the packaged exheader ended up with an invalid main-thread priority.
  • The generated .cia now 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.cia
  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-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.zip and shows the expected sdmc:/3ds/3dslibris/ layout.
  • The README now explains installation step by step for the .3dsx + SD package flow.

Included assets

  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-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 in 3dslibris.log.

Included assets

  • 3dslibris.3dsx
  • 3dslibris-debug.3dsx
  • 3dslibris-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.

v1.0.0 · Mar 12, 2026

No notes for this release.