Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

3DSlibris: Difference between revisions

From GameBrew
2.3.0
2.7.3
 
(10 intermediate revisions by 2 users not shown)
Line 4: Line 4:
|description=eBook Reader. Port of dslibris.
|description=eBook Reader. Port of dslibris.
|author=Rigle
|author=Rigle
|lastupdated=2026/04/10
|lastupdated=2026/05/28
|type=Utilities
|type=Utilities
|version=2.3.0
|version=2.7.3
|license=GPL-2.0
|license=GPL-2.0
|download=https://github.com/RigleGit/3dslibris/releases
|download=https://github.com/RigleGit/3dslibris/releases
|website=https://github.com/RigleGit/3dslibris
|website=https://github.com/RigleGit/3dslibris
|source=https://github.com/RigleGit/3dslibris
|source=https://github.com/RigleGit/3dslibris
|donation=https://ko-fi.com/rigle
}}
}}
Nintendo 3DS homebrew ebook reader based on the original Nintendo DS project [[DSlibris|dslibris]].
Nintendo 3DS homebrew ebook reader based on the original Nintendo DS project [[DSlibris|dslibris]].
Line 19: Line 20:


== Features ==
== Features ==
* Custom fonts.
* Reads ebooks and manga on Nintendo 3DS hardware and Azahar.
* Bookmarks.
* Library browser with grid and list views, cover thumbnails, metadata titles, and touch navigation.
* Table of contents/index support.
* Six reading themes with matching splash screens and reader gradients.
* Left- and right-handed layouts.
* Supported formats: <code>EPUB</code>, <code>FB2</code>, <code>TXT</code>, <code>RTF</code>, <code>ODT</code>, <code>MOBI</code>, <code>PDF</code>, <code>CBZ</code> and <code>XPS</code>.
* Three color modes: Daylight, Night, and Book.
* <code>EPUB</code> reflow with TOC support, bookmarks, <code>go to page</code>, cached pagination, and broad inline/block formatting support.
* Strong EPUB support.
* Fixed-layout viewer for manga and document formats (<code>CBZ</code>, <code>PDF</code> and <code>XPS</code>) with zoom, pan, outline navigation, and full-page preview.
* Good FB2, TXT, RTF and ODT support.
* Bundled fallback fonts for broader language coverage (Latin, Cyrillic, Greek, CJK, Arabic, Hebrew, Thai, and more).
* Experimental MOBI support.
* PDF, CBZ, and XPS viewing (MuPDF-backed).


== Installation ==
== Installation ==
Recommended install:
Recommended install (.cia via Universal-Updater):
* Install 3dslibris from [[Universal-Updater 3DS|Universal-Updater]].
* Launch it once so sdmc:/3ds/3dslibris/ is created if needed.
* Copy your books to sdmc:/3ds/3dslibris/book/.
* Launch the installed title.
* New users: Read the bundled QuickStart.txt inside your book library to learn about menus, settings, and navigation.


* Download <code>3dslibris-sdmc.zip</code> from [https://github.com/RigleGit/3dslibris/releases GitHub Releases].
Manual install (3dsx):
* Download <code>3dslibris.3dsx</code> and <code>3dslibris-sdmc.zip</code> from [https://github.com/RigleGit/3dslibris/releases GitHub Releases].
* Copy <code>3dslibris.3dsx</code> to <code>sdmc:/3ds/3dslibris/3dslibris.3dsx</code>.
* Extract that zip into the root of your SD card, so it expands into <code>sdmc:/</code>.
* Extract that zip into the root of your SD card, so it expands into <code>sdmc:/</code>.
* Put your books in <code>sdmc:/3ds/3dslibris/book/</code>.
* Put your books in <code>sdmc:/3ds/3dslibris/book/</code>.
* Launch <code>sdmc:/3ds/3dslibris/3dslibris.3dsx</code> from Homebrew Launcher.
* Launch <code>sdmc:/3ds/3dslibris/3dslibris.3dsx</code> from Homebrew Launcher.


Alternative install:
Manual install (.cia):
 
* Install <code>3dslibris.cia</code>.
* Install <code>3dslibris.cia</code>.
* Launch the installed title once so it creates <code>sdmc:/3ds/3dslibris/</code> if needed.
* Launch the installed title once so it creates <code>sdmc:/3ds/3dslibris/</code> if needed.
* Put your books in <code>sdmc:/3ds/3dslibris/book/</code>.
* Put your books in <code>sdmc:/3ds/3dslibris/book/</code>.
* Launch the installed title.
* Launch the installed title.
Important:
* The <code>.cia</code> bundles the default <code>font/</code> and <code>resources/</code> runtime assets inside RomFS, so it can boot without manually extracting <code>3dslibris-sdmc.zip</code>.
* Books are discovered from <code>sdmc:/3ds/3dslibris/book/</code> and <code>romfs:/3ds/3dslibris/book/</code>.
* If the same filename exists in both places, SD takes priority.
* <code>3dslibris-sdmc.zip</code> is still the recommended install for <code>.3dsx</code>, and it remains useful if you want the same runtime files laid out explicitly on SD.
* <code>3dslibris-debug.3dsx</code> uses the same SD layout and writes verbose diagnostics to <code>sdmc:/3ds/3dslibris/3dslibris.log</code>.
* The <code>.cia</code> build uses the Universal-Updater-style packaging flow and now also validates the bundled RomFS path in GitHub Actions.
Generated install package targets:
* <code>make package-sdmc</code> stages <code>dist/sdmc/...</code> with <code>3dslibris.3dsx</code> included
* <code>make zip-sdmc</code> creates <code>dist/3dslibris-sdmc.zip</code>
* <code>make cia</code> creates <code>3dslibris.cia</code>
* <code>make source-release</code> creates <code>dist/3dslibris-source.tar.gz</code>
* GitHub Releases: pushing a tag like <code>v2.0.4</code> triggers <code>.github/workflows/release.yml</code> and attaches <code>3dslibris.cia</code>, <code>3dslibris.3dsx</code>, <code>3dslibris-debug.3dsx</code>, <code>dist/3dslibris-sdmc.zip</code>, and <code>dist/3dslibris-source.tar.gz</code> to the release
Bundled runtime files:
* <code>sdmc/3ds/3dslibris/resources/splash.jpg</code>
* <code>sdmc/3ds/3dslibris/resources/ui/icons/png/*.png</code>
* <code>sdmc/3ds/3dslibris/book/README.md</code>
* <code>sdmc/3ds/3dslibris/font/README.md</code>
* <code>sdmc/3ds/3dslibris/font/Liberation*.ttf</code>
* <code>sdmc/3ds/3dslibris/font/OFL-1.1.txt</code>


Notes:
Notes:
* The <code>.cia</code> includes default <code>font/</code> and <code>resources/</code> assets in <code>RomFS</code>.
* Books are read from <code>sdmc:/3ds/3dslibris/book/</code> and optionally <code>romfs:/3ds/3dslibris/book/</code>.
* Runtime data can also be installed under <code>sdmc:/config/3dslibris/</code> (for example <code>book/</code>, <code>font/</code>, <code>resources/</code>, cache, prefs, and log files).
* If the same filename exists in both places, the SD version wins.
* Releases also provide <code>3dslibris-debug.3dsx</code> and <code>3dslibris-debug.cia</code>, which enable verbose logging to <code>sdmc:/3ds/3dslibris/3dslibris.log</code>.


* Homebrew Launcher path: keep the app at <code>sdmc:/3ds/3dslibris/3dslibris.3dsx</code>
==Supported formats==
* Debug build path: keep <code>3dslibris-debug.3dsx</code> in the same <code>sdmc:/3ds/3dslibris/</code> folder if you want verbose logs
Strong support:
* Default Liberation fonts are bundled in the SD package for <code>.3dsx</code>, and inside RomFS for <code>.cia</code>
* <code>EPUB</code>: EPUB2 and EPUB3 reflow, NAV and NCX TOC support, cached pagination, bookmarks, configurable fonts, and broad inline/block formatting support.
* You can replace them with other <code>.ttf</code>, <code>.otf</code>, or <code>.ttc</code> fonts if you want to customize the reading/UI typefaces
* Runtime files such as <code>3dslibris.xml</code>, <code>3dslibris.log</code>, and <code>cache/*</code> are created by the app on first run


<pre>sdmc:/3ds/3dslibris/3dslibris.3dsx
Good support:
sdmc:/3ds/3dslibris/book/*.epub|*.fb2|*.txt|*.rtf|*.odt|*.mobi
sdmc:/3ds/3dslibris/font/*.ttf
sdmc:/3ds/3dslibris/resources/splash.jpg
sdmc:/3ds/3dslibris/resources/ui/icons/png/{back,gear,home,next,prev}.png</pre>
 
== Supported formats ==
=== Strong support ===
* <code>EPUB</code>
** EPUB2 + EPUB3 content parsing with NAV and NCX table-of-contents support, plus fallback chapter labels when source metadata is incomplete
** Persistent page cache keyed by layout inputs, so repeated opens can reuse compatible pagination instead of rebuilding every page
** Configurable serif, sans, and monospace font families; <code>pre</code> / <code>code</code> blocks now reflow and measure with the active monospace face
** Monospace regular, bold, italic, and bold-italic variants are preserved when matching fonts are available
** Inline formatting support includes bold, italic, underline, strikethrough, overline, superscript, subscript, and CSS-driven dotted/dashed/wavy underline markers
** Block formatting covers headings, paragraphs, lists, nested ordered lists, blockquotes, asides, figures, captions, definition lists, and horizontal rules
** Tables are linearized into readable label/value blocks for the 3DS screen instead of trying to preserve wide desktop table layout
** Common hidden accessibility/helper text is ignored when marked with <code>hidden</code>, <code>aria-hidden</code>, <code>display:none</code>, <code>visibility:hidden</code>, or <code>visually-hidden</code>-style classes
** Cosmetic EPUB print-page markers such as hidden <code>epub:type=&quot;pagebreak&quot;</code> / <code>role=&quot;doc-pagebreak&quot;</code> spans are ignored instead of forcing bogus page breaks in the reflowed text
** CSS list marker suppression is honored for reflowed lists, including class-driven rules such as <code>list-style-type: none</code>
** Switching from one already-open book to another from the library no longer reuses stale reader state or leaves the app stuck on the opening screen after a failed open
** Punctuation handling keeps Spanish opening/closing punctuation attached across inline style boundaries in common cases
** Inline SVG image wrappers are detected and resolved when they point to supported raster image assets
 
=== Good support (text-oriented) ===
* <code>FB2</code>
* <code>FB2</code>
* <code>TXT</code>
* <code>TXT</code>
Line 107: Line 66:
* <code>ODT</code>
* <code>ODT</code>


=== Experimental / best-effort ===
Experimental or best-effort:
* <code>MOBI</code>
* <code>MOBI</code>: can be slow on first open, TOC quality depends on file structure, and some files may fall back to safer but more limited parsing.
** First open can be slow on large books (decompress + parse + pagination)
* <code>PDF</code>: viewer mode with zoomed reading area and full-page preview.
** Subsequent opens are accelerated by persistent page cache
* <code>CBZ</code>: viewer mode for manga and image-based books.
** TOC quality is heuristic for many files (can be approximate)
* <code>XPS</code>: viewer mode with the same fixed-layout reader controls.
** Inline MOBI images now reuse the same smart <code>inline / band / page</code> layout pipeline used by EPUB/FB2, with better caption flow on mixed photo spreads
** Includes an optional per-book <code>line wrap fix</code> for badly converted files that hard-wrap prose line by line, while preserving embedded image markers during cleanup
** Empty or corrupt books are reported with a readable error instead of a raw numeric code
* <code>PDF</code>
** Viewer-only path with MuPDF-backed rendering
** Top screen shows a zoomed page region; bottom screen shows the full-page preview and viewport box
** Uses the shared fixed-layout reader controls documented below
** PDF-enabled builds in this branch are distributed with AGPL-driven notice and source-release requirements; see the license section below
* <code>CBZ</code>
** Viewer-only path with MuPDF-backed image-page rendering
** Uses the shared fixed-layout reader controls documented below
* <code>XPS</code>
** Viewer-only path with MuPDF-backed rendering
** Uses the shared fixed-layout reader controls documented below


== Known limitations ==
== Limitations ==
* Some EPUB files have malformed anchors; index jumps can be approximate when source metadata is broken.
* No DRM support.
* MOBI TOC extraction depends on file structure and may omit or merge entries in some books.
* EPUB is a reflow renderer, not a full browser engine. Complex CSS, JavaScript, multi-column layouts, and wide tables are simplified.
* MOBI inline images depend on recoverable image references in the source markup, including the zero-padded <code>recindex</code> values commonly found in Kindle-generated books; malformed files can still miss some images.
* EPUB tables are converted into text-oriented blocks for readability on 3DS screens.
* SVG support in EPUB is limited to common wrappers that reference supported raster images.
* Some malformed EPUB anchors and MOBI tables of contents can produce approximate navigation.
* Large or malformed MOBI files may open slowly or lose some rich formatting in safer fallback paths.
* MOBI inline images depend on recoverable image references in the source markup; malformed files can still miss some images.
* Some malformed MOBI sources still contain encoding or OCR artifacts that cannot be repaired reliably on the reader side.
* Some malformed MOBI sources still contain encoding or OCR artifacts that cannot be repaired reliably on the reader side.
* After changing font size, paragraph spacing, orientation, reading fonts, or the per-book MOBI <code>line wrap fix</code>, reopen the current book to apply the new layout.
* After changing layout-related settings such as font size, spacing, orientation, reading fonts, or the per-book MOBI <code>line wrap fix</code>, reopening the current book may be necessary.
* Reading position and existing bookmarks are remapped approximately after that reopen and can shift a few pages from their original location.
* Reading position and existing bookmarks are remapped approximately after that reopen and can shift a few pages from their original location.
* No DRM support.


== Controls ==
== Controls ==
=== Library controls ===
=== Library ===
D-Pad - Move the current selection around the library grid
D-Pad - Move selection


A - Open the selected book
A - Open the selected book


L / R - Jump to the previous or next library page
L/R - Jump to the previous or next library page


Touch - Tap a book to select it, tap it again to open it
Touch - Tap a book to select it, tap it again to open it


Y / Select - Open settings
Y/Select - Open "General" settings


=== Default reading controls ===
=== Standard reading ===
A/B/L/R - Turn pages
A/B/L/R - Turn pages
ZL/ZR (New 3DS) - Previous or next page


D-Pad Left/Right - Jump between bookmarks
D-Pad Left/Right - Jump between bookmarks


Y - Toggle bookmark
Y - Toggle bookmark, Hold Y on a page with inline links to enter link-focus mode, then D-Pad to move and A to follow


X - Change background color
X - Change background color


Select - Settings
Select - Open "BOOK" Settings


Start - Return to library
Start - Return to library
Line 163: Line 113:
Touch UI for library, settings, index, bookmarks, font menus...
Touch UI for library, settings, index, bookmarks, font menus...


=== PDF / CBZ / XPS controls ===
=== Fixed-layout (PDF / CBZ / XPS) ===
A - Zoom in
A - Zoom in


B - Zoom out
B - Zoom out


Left/Right - Previous or next page
Left/L/ZR/Right/R/ZL - Previous/Next page


Up/Down - Next or previous chapter when the document exposes an outline; otherwise previous or next page
Up/Down - Next/Previous chapter when the document exposes an outline; otherwise previous or next page


Touch - Move the viewport by tapping or dragging on the page preview
Touch/Circle Pad/C-Stick - Move the viewport by tapping or dragging on the page preview


Select - Open settings
Select - Open "BOOK" settings


Start - Return to library
Start - Return to library
Line 184: Line 134:


== Changelog ==
== Changelog ==
'''v2.7.3'''
* New Features
** [https://github.com/RigleGit/3dslibris/issues/131 #131]: added '''Time Remaining (ETA)''' in the reader HUD as an optional setting.
** [https://github.com/RigleGit/3dslibris/issues/115 #115]: added '''Book Information''' in book settings with quick stats (title, author, format, current page, total pages, chapters, last read...).
** [https://github.com/RigleGit/3dslibris/issues/94 #94]: added '''custom adjacent cover overrides'''. If present next to the book, 3dslibris now prioritizes <code>Book.jpg</code> or <code>Book.png</code> (including <code>.txt</code>, <code>.md</code>, <code>.rtf</code>, and <code>.odt</code>).
* Bug Fixes
** Keeping the Y:lnk hint visible to standardize the reader HUD.
** [https://github.com/RigleGit/3dslibris/issues/77 #77]: improved CSS paragraph spacing consistency near page bottoms (percent-based margins like <code>1.5%</code> no longer collapse as if they were <code>1%</code>, and CSS-driven breaks avoid compressed separation at screen edges).
** [https://github.com/RigleGit/3dslibris/issues/77 #77]: added block-level <code>padding-top</code> support for <code>%</code>/<code>px</code>/<code>em</code> in inline styles, and upgraded <code>page-break-before: always</code> handling to a hard page break so entry separators start on a new logical page.
** [https://github.com/RigleGit/3dslibris/issues/128 #128]: fixed wide leading EPUB images that could be forced into an isolated full-width block on their own reading screen.
'''v2.7.2'''
* New Features
** [https://github.com/RigleGit/3dslibris/issues/93 #93], [https://github.com/RigleGit/3dslibris/issues/132 #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
** [https://github.com/RigleGit/3dslibris/issues/130 #130]: EPUB cover images no longer appear smaller than full screen.
** [https://github.com/RigleGit/3dslibris/issues/128 #128]: wide landscape block images no longer force an unnecessary pre-advance.
'''v2.7.1'''
* Fixes
** [https://github.com/RigleGit/3dslibris/issues/126 #126]: open the index on the page for the current chapter.
** [https://github.com/RigleGit/3dslibris/issues/127 #127]: <code>START</code> now closes folders, like <code>B</code>.
** [https://github.com/RigleGit/3dslibris/issues/127 #127]: <code>START</code> now also leaves settings opened from the library.
** [https://github.com/RigleGit/3dslibris/issues/106 #106]: publisher font sizes no longer change image width.
** [https://github.com/RigleGit/3dslibris/issues/106 #106]: text following a large-text section no longer overflows to the right screen.
** [https://github.com/RigleGit/3dslibris/issues/108 #108]: body font-size no longer makes the whole book too small.
** [https://github.com/RigleGit/3dslibris/issues/108 #108]: EPUB style settings now control publisher indents, margins, and paragraph spacing.
** [https://github.com/RigleGit/3dslibris/issues/108 #108]: EPUB style settings can now be changed per book.
** Line spacing can now be adjusted from reader settings, globally and per book.
** [https://github.com/RigleGit/3dslibris/issues/77 #77]: indented block text no longer loses its indent at the top of a new page.
** [https://github.com/RigleGit/3dslibris/issues/84 #84]: child zero margins no longer erase parent block spacing.
** [https://github.com/RigleGit/3dslibris/issues/128 #128]: block images with custom width now keep block layout.
** [https://github.com/RigleGit/3dslibris/issues/128 #128]: right-aligned block images now align right.
** [https://github.com/RigleGit/3dslibris/issues/128 #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.
'''v2.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 <code>B</code> 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 <code>bannertool</code> to 1.2.2 (matches stable homebrew like Anemone3DS, Checkpoint...)
* Improvements
** [https://github.com/RigleGit/3dslibris/issues/41 #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; <code>B</code> or touch '''back''' returns to the root library; optional sibling folder covers supported via <code>FolderName.jpg</code>
** [https://github.com/RigleGit/3dslibris/issues/24 #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
** [https://github.com/RigleGit/3dslibris/issues/106 #106]: '''unify publisher font-size rendering''': publisher CSS <code>font-size</code> is always applied; absolute <code>px</code> values scale relative to the publisher's declared <code>body { font-size }</code> baseline; reader's font-size preference acts as a global scale factor
** [https://github.com/RigleGit/3dslibris/issues/108 #108]: '''CSS <code>em</code>/<code>rem</code> lengths now resolve against the actual font size''': <code>text-indent</code>, <code>margin-left</code>, <code>margin-right</code>, and related properties previously converted <code>em</code> to pixels using a hardcoded 12px baseline
** [https://github.com/RigleGit/3dslibris/issues/102 #102] add conservative Markdown reading for <code>.md</code> and <code>.markdown</code> files: headings, emphasis, lists, blockquotes, code spans, and link text are converted into the existing reflowable text renderer
** battery percentage now uses the real <code>mcu::HWC</code> reading, following the approach used by 3DSident; PTMU's coarse 0-5 level is only kept as a fallback
** [https://github.com/RigleGit/3dslibris/issues/83 #83]: fix center- and right-aligned paragraphs containing narrow inline elements
** [https://github.com/RigleGit/3dslibris/issues/84 #84]: '''CSS <code>margin-top</code> and <code>margin-bottom</code> on block elements''': section spacing in poetry-style EPUBs now respects the declared CSS margin size
* Fixes
** [https://github.com/RigleGit/3dslibris/issues/98 #98]: fix "Clear Cache" not triggering a book re-parse on the next open
** [https://github.com/RigleGit/3dslibris/issues/96 #96]: fix CSS keyword font sizes in inline <code>style=</code> attributes being silently ignored
** [https://github.com/RigleGit/3dslibris/issues/99 #99]: fix incomplete TOC index in very large anthology EPUBs (regression from v2.6.4)
** [https://github.com/RigleGit/3dslibris/issues/100 #100]: fix link navigation performance on TOC pages with many inline links
** [https://github.com/RigleGit/3dslibris/pull/112 #112]: fix filenames with decomposed/combining UTF-8 accents not matching their saved settings and metadata entries
** [https://github.com/RigleGit/3dslibris/pull/116 #116]: fix CIA banner audio
** fix CSS <code>margin-top: 0</code> / <code>margin-bottom: 0</code> (and negative values) on block elements incorrectly applying the default inter-paragraph spacing instead of suppressing it
** [https://github.com/RigleGit/3dslibris/issues/77 #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. <code>&lt;p class="centered"&gt;&lt;span&gt;…&lt;/span&gt;&lt;/p&gt;</code>) 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 <code>app.cpp</code> into focused translation units (<code>app_accessors.cpp</code>, <code>app_lifecycle.cpp</code>, <code>app_menu_frames.cpp</code>, <code>app_views.cpp</code>); <code>app.cpp</code> is now 446 lines and holds only initialization, screens/orientation, status, and gradient backgrounds
** add <code>-fdata-sections</code> 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 (<code>sdmc:/3dslibris_boot_trace.txt</code> and <code>sdmc:/3dslibris_apt_trace.txt</code>) to diagnose CIA launch and HOME suspend crashes on real hardware
** add <code>debug-safe-cia</code>, 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 <code>errno</code>/<code>strerror(errno)</code> when the filesystem layer exposes a useful error
** [https://github.com/RigleGit/3dslibris/pull/121 #121]: optimize PNG UI/readme assets to shave a little size from the repository and packaged resources
** [https://github.com/RigleGit/3dslibris/pull/124 #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
'''v2.6.4'''
* Improvements
** [https://github.com/RigleGit/3dslibris/issues/91 #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 <code>(text)</code> at 75% size; bold column and row headers in table output
* Fixes
** [https://github.com/RigleGit/3dslibris/issues/98 #98]: fix "Clear Cache" button showing stale "cleared!" text when re-entering Settings after a cache clear
** [https://github.com/RigleGit/3dslibris/issues/97 #97]: fix CSS keyword font sizes (<code>font-size: small</code>, <code>x-small</code>, <code>smaller</code>, etc.) rendering at the wrong size when "Respect publisher font size" is off
** [https://github.com/RigleGit/3dslibris/issues/99 #99]: fix incomplete TOC index in large books
** [https://github.com/RigleGit/3dslibris/issues/76 #76]: fix only the first linked CSS stylesheet being loaded; books with a non-CSS file (e.g. <code>.xpgt</code>) before the <code>.css</code> now apply all CSS rules correctly
** [https://github.com/RigleGit/3dslibris/issues/78 #78]: (hopefully™️) fix HOME button crashes in debug builds caused by SD card I/O in the APT hook callback on the system thread
** [https://github.com/RigleGit/3dslibris/issues/100 #100]: fix DPad controls in inline link focus mode: UP/DOWN now navigate across pages; LEFT/RIGHT corrected for portrait orientation
** [https://github.com/RigleGit/3dslibris/issues/96 #96]: fix transparent PNG inline images (e.g. decorative banners/ornaments) rendering with a white background instead of compositing against the page
** [https://github.com/RigleGit/3dslibris/issues/96 #96]: fix images inside EPUB table cells producing a stray <code>[image]</code> text artifact or white squares at the top of pages; table-cell images are now silently suppressed
** fix superscript (<code>&lt;sup&gt;</code>) and subscript (<code>&lt;sub&gt;</code>) text rendering: replaced box-filter downscaling with native FreeType rendering at 70% pixel size for sharper glyphs
** [https://github.com/RigleGit/3dslibris/issues/83 #83]: fix <code>text-align: center</code> (and <code>right</code>) 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 (<code>text-align: center</code>/<code>right</code>) 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 <code>&lt;p&gt;</code> element rendering the list marker on a separate line instead of inline with the content
** support CSS <code>text-indent</code> property for first-line paragraph indentation (px, em, pt, in units)
** [https://github.com/RigleGit/3dslibris/issues/84 #84]: honor CSS <code>margin-top</code> and <code>margin-bottom</code> on block elements (<code>div</code>, <code>aside</code>, <code>blockquote</code>, <code>figure</code>, <code>caption</code>, <code>dd</code>); default spacing preserved when no CSS value is specified
** fix CSS class <code>font-weight: bold</code> and <code>font-style: italic</code> 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 <code>book_xml_parser.cpp</code>: 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: <code>mupdf_view.cpp</code>, <code>book_xml_css_style_utils.cpp</code>, <code>text_renderer.cpp</code>, <code>book_xml_parser.cpp</code> (support helpers), <code>path_utils.h</code>
** extract <code>cover_cache</code>, <code>GoToPageDialog</code>, fixed-layout and reflowable input handlers, and <code>epub_css_tokenizer</code> into dedicated modules
** expand FB2 integration test coverage
** add page alignment utils test coverage (<code>MeasureFirstVisualLineWidth</code>, centered/right-aligned overflow)
** replace hardcoded screen dimensions and consolidate repeated screen-dimension constants into shared headers
'''v2.6.3'''
* Improvements
** [https://github.com/RigleGit/3dslibris/issues/83 #83]: apply global CSS element rules (<code>p {}</code>, <code>body {}</code>, <code>li {}</code>, <code>h1 {}</code>, <code>blockquote {}</code>, etc.) to block layout, margins, font-size, and text-align
** [https://github.com/RigleGit/3dslibris/issues/76 #76]: suppress list markers when <code>list-style-type: none</code> is declared on <code>&lt;ol&gt;</code> or <code>&lt;ul&gt;</code> 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 <code>&lt;dd&gt;</code> indentation by using block margins instead of injecting literal leading spaces
** improve inline image layout for <code>&lt;figure&gt;</code> / <code>div.figure</code> 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
** [https://github.com/RigleGit/3dslibris/issues/77 #77]: fix random empty space when rendering caused by pending block-spacing not flushing correctly at page boundaries
** [https://github.com/RigleGit/3dslibris/issues/83 #83]: fix text-align not rendering when declared on a bare element selector (<code>p { text-align: center }</code>)
** [https://github.com/RigleGit/3dslibris/issues/76 #76]: fix list markers not suppressing when the CSS rule targets the parent <code>&lt;ol&gt;</code>/<code>&lt;ul&gt;</code> element rather than the <code>&lt;li&gt;</code> 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
** [https://github.com/RigleGit/3dslibris/issues/68 #68]: mitigate Old 3DS <code>.3dsx</code> 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 <code>Book::Index</code> to <code>book_parser::Index</code>
** remove <code>Book::Open</code>, move open/parse/index dispatch into <code>book_parser</code>, and unify the fixed-layout book path
** move public rendering and fixed-layout dispatch into <code>book_renderer</code>
** remove <code>Text::app</code>
** extract gradient drawing from <code>App</code>
** decouple <code>Text</code>, touch utilities, browser views, library helpers, and menu layer from <code>App</code>
** move the NDS/3DS hardware reference docs out of this repository into [https://github.com/RigleGit/gba-ds-3ds-specs gba-ds-3ds-specs]
** expand host integration, CSS, NCX/NAV, FB2 metadata, TXT/FB2/RTF, and page-cache test coverage
** [https://github.com/RigleGit/3dslibris/issues/68 #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 <code>epub_parser::Open</code>, <code>epub_parser::Index</code>, <code>book_parser::Open -> EPUB</code>, and <code>book_parser::Index -> EPUB</code>
** add regression coverage for preformatted wrapping, inline figure placement, bounded inline-image JPEG decode sizing, and old-3DS cover warmup thresholds
** add <code>coverage-host</code> reporting for host-testable code paths
'''v2.6.2'''
* Improvements
** add battery level indicator in the reader HUD
** add publisher font-size toggle in settings
** [https://github.com/RigleGit/3dslibris/issues/85 #85]: support basic <code>&lt;hr/&gt;</code> 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 <code>ContainsRTL</code> in BiDi utils
* Fixes
** [https://github.com/RigleGit/3dslibris/issues/87 #87]: render large EPUB images by moving pixel budget guard from metadata probe to draw time
** [https://github.com/RigleGit/3dslibris/issues/84 #84]: support CSS <code>margin-top</code> and <code>margin-bottom</code> in EPUB reflow
** [https://github.com/RigleGit/3dslibris/issues/68 #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 <code>toc</code> link is absent
** [https://github.com/RigleGit/3dslibris/issues/82 #82]: accumulate nested list indentation correctly per depth level
** apply CSS <code>display:block</code> promotion to block-level layout properties
** restore EPUB open path after parser-reuse regression
** [https://github.com/RigleGit/3dslibris/issues/83 #83]: ensure text-align from CSS class definitions applies to block elements properly
** [https://github.com/RigleGit/3dslibris/issues/76 #76]: respect <code>list-style-type: none</code> on <code>&lt;ol&gt;</code> and <code>&lt;ul&gt;</code>
** [https://github.com/RigleGit/3dslibris/issues/35 #35]: keep adjacent length values on CSS <code>margin</code> shorthand with <code>auto</code> values
** use the document base instead of the inherited context size for heading font-size restore
** [https://github.com/RigleGit/3dslibris/issues/81 #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
'''v2.6.1'''
* New
** '''CBZ <code>ComicInfo.xml</code> chapter index''': <code>.cbz</code> files that include a <code>ComicInfo.xml</code> file (as embedded by tools such as ComicTagger) now expose a table of contents. Pages with a <code>Bookmark</code> attribute in the <code>&lt;Pages&gt;</code> section appear as named chapters in the index menu. Files without <code>ComicInfo.xml</code> or without bookmarks are unaffected.
* 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.
** '''Link Mode can move across pages''': while holding <code>Y</code> to use Link Mode, <code>D-Pad Right</code> now moves to the next inline link and <code>D-Pad Left</code> moves to the previous inline link, continuing onto nearby pages when needed. <code>D-Pad Up/Down</code> still keep the existing spatial navigation within the current page.
** '''EPUB raster images no longer turn into <code>[illustration]</code> after cache rebuilds'''.
** '''EPUB centered block text is aligned correctly again''': <code>text-align</code> on block containers such as <code>body</code>, <code>div</code>, <code>section</code>, and <code>display:block</code> elements is now applied to the text inside them and inherited by child paragraphs/headings unless they override it.
** '''EPUB ornament images now render at their intended size''': inline images with an explicit <code>width="X%"</code> attribute or a CSS <code>width: X%</code> 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.
** '''CSS <code>page-break-before: always</code> is now respected''': block elements with <code>page-break-before: always</code> (or the CSS3 equivalent <code>break-before: page</code>) in their inline <code>style=</code> attribute or stylesheet class now force content onto a new page, as intended by EPUB authors. <code>page-break-after: always</code> is also supported.
** '''CSS <code>page-break-inside: avoid</code> is now respected''': blocks marked with <code>page-break-inside: avoid</code> (or <code>break-inside: avoid</code>) are kept together and will not be split across two pages.
** '''More CSS properties are now applied from stylesheets''': EPUB stylesheets can now control <code>text-decoration: none</code> (suppress underline on an element), <code>font-weight: normal/lighter/100–500</code> (reset inherited bold), <code>font-style: normal</code> (reset inherited italic), <code>font-size</code> with <code>pt</code> units and absolute keywords (<code>xx-small</code> through <code>xx-large</code>), and <code>margin-top</code>/<code>margin-bottom</code> with <code>em</code>, <code>rem</code>, and <code>pt</code> units. Both inline <code>style=</code> attributes and class rules are recognised.
** '''CSS horizontal margins are now applied''': <code>margin-left</code> and <code>margin-right</code> on EPUB block elements now affect both wrapping width and visible line starts, including stylesheet classes, percentages, shorthand margins, and negative values.
** '''CSS <code>text-indent</code> and <code>text-transform</code> are now applied''': <code>text-indent</code> controls the first-line paragraph indent; a CSS value overrides the default indent, and a negative or zero value suppresses it entirely. <code>text-transform: uppercase</code>, <code>lowercase</code>, and <code>capitalize</code> transform text casing at parse time, and transformed inline spans are measured before line wrapping so they no longer overflow or get clipped.
** '''CSS <code>text-align: start</code> and <code>text-align: end</code> are now supported'''.
** '''CSS <code>white-space</code> modes are now respected''': <code>pre</code>, <code>pre-wrap</code>, <code>pre-line</code>, and <code>nowrap</code> control whitespace and line-break preservation in EPUB content, so code blocks and preformatted passages render as the author intended. On the 3DS screen, <code>nowrap</code> still wraps when needed after collapsing spaces so long lines remain readable.
** '''CSS <code>float</code> and <code>clear</code> are now applied to images''': <code>float: left</code> pins an image to the left margin and <code>float: right</code> pins it to the right margin. <code>clear: both</code>, <code>clear: left</code>, and <code>clear: right</code> 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.
** '''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 <code>font-size</code> and <code>&lt;small&gt;</code>/<code>&lt;big&gt;</code> tags are now rendered''': any element with a CSS <code>font-size</code>, via inline <code>style=</code> or a stylesheet class, renders text at the specified size. The <code>&lt;small&gt;</code> tag applies the <code>smaller</code> scale factor (~83% of the current size) and <code>&lt;big&gt;</code> applies <code>larger</code> (~120%). All units are supported: <code>px</code>, <code>em</code>, <code>rem</code>, <code>pt</code>, <code>%</code>, <code>smaller</code>, <code>larger</code>, and the absolute keywords <code>xx-small</code> through <code>xx-large</code>.
** '''HOME Menu no longer crashes after returning to the library''': pressing HOME or powering off after leaving a book no longer crashes the HOME Menu process. Three issues were fixed: preferences were being written to the SD card inside an APT hook callback; 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.
'''v2.5.0'''
* Highlights
** '''Text alignment support''': <code>text-align: center</code> and <code>text-align: right</code> are now honoured in EPUB reflow. Each paragraph emits an alignment token that the draw routine uses to compute per-line offset, so wrapped lines stay correctly aligned across the whole paragraph.
** '''Performance improvements''': EPUB CSS scanning now reads only the <code>&lt;head&gt;</code> section of each spine document, reducing zip I/O on large books (~1 second less loading time). A single zip handle is recycled across all spine CSS scans (~20% less loading time). Plain text pagination eliminates per-line heap allocation. First-time EPUB cover extraction is ~3× faster on old 3DS via MuPDF subsampled thumbnail decode.
* Included fixes and behavior changes
** '''Browser return and suspend handling stabilized''': returning from the reader to the library now correctly resumes browser jobs and handles applet suspend/resume, avoiding tearing down in-flight async opens during HOME suspension.
** '''Gallery covers clipped correctly''': cover thumbnails in gallery view are clipped to the rounded frame, preventing image pixels from bleeding outside the card border.
** '''PDF HOME button crash fixed''': PDF file parsing is now split into independently cancellable steps, each with an APT yield point, so pressing HOME during PDF loading is handled cleanly instead of causing a console restart.
** '''Large EPUB page limit raised''': the maximum pages in memory raised from 5,000 to 25,000 (cache guard to 50,000), fixing books that stopped loading halfway through.
** '''HR overflow tracking fixed''': parser and renderer now agree on vertical position after <code>&lt;hr&gt;</code> rules, preventing text overlap after horizontal rules.
** '''PagedListMenu overflow fixed''': pagination indices changed from <code>u8</code> to <code>u16</code> so menus with more than 255 entries no longer wrap and corrupt the page list.
** '''SDMC zip trimmed''': <code>3dslibris-sdmc.zip</code> now contains only SD card runtime files; the <code>.3dsx</code> builds are separate release assets instead of being duplicated inside the zip.
'''v2.4.2'''
* Highlights
** '''Stability and crash-fix release''': addresses several null dereference, divide-by-zero, out-of-bounds, and infinite-loop issues identified on real hardware.
* Included fixes and behavior changes
** '''FontManager null dereference crash fixed''': <code>GetFace()</code> now uses <code>find()</code> and returns <code>NULL</code> for missing style keys instead of silently inserting a null entry via <code>operator[]</code>; all callers guard against <code>NULL</code> before dereferencing.
** '''Division by zero in browser marquee fixed''': the background color averaging loop now guards against zero-dimension covers before dividing.
** '''Degenerate layout when font height is zero fixed''': a <code>line_height</code> floor of 10 pixels is enforced so menus do not collapse to unreadable or non-interactive rows when no valid face is loaded.
** '''Out-of-bounds touch in empty list menus fixed''': <code>PagedListMenu::HandleTouchInput()</code> now returns early when the button vector is empty, avoiding an out-of-bounds read.
** '''Infinite loop in text wrapping fixed''': <code>WrapTextToLines()</code> now forces a minimum advance of 1 byte so the loop always makes progress on zero-width or unrecognised code points.
'''v2.4.1'''
* Highlights
** '''Crash-at-boot fix''': <code>FontMenu</code> is constructed during <code>App::App()</code> before fonts are loaded. Calling <code>GetHeight()</code> and <code>GetAdvance()</code> through the null font manager cascaded into a heap Data Abort immediately at startup. Both methods now return safe defaults until the font manager is initialised.
'''v2.4.0'''
* Highlights
** '''Six-color theme system''': 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''': the startup splash now uses a dark or light version that matches the active color mode.
** '''Cycle themes with X in the browser''': press <code>X</code> 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.
** '''Improved chapter menu''': 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.
** '''Browser warmup re-enabled''': cover extraction now runs incrementally on idle frames (3 ms budget), so covers populate without stalling the UI.
* Included fixes and behavior changes
** '''EPUB NAV spine ordering fixed''': chapter detection now correctly follows the <code>&lt;spine&gt;</code> order from the OPF manifest rather than assuming document order.
** '''Marquee background color fixed''': the browser grid marquee now correctly tracks the active dark theme background instead of always using the light color.
** '''Long font filenames wrap in FontMenu''': font file paths too long for a single line now wrap cleanly instead of being clipped.
'''v2.3.2'''
* Highlights
** '''MOBI structured TOC restored''': the HTML-to-text position map is now built during safe-extractor parsing, so structured TOC entries are resolved to accurate page numbers instead of falling back to linear estimation.
** '''MOBI inline images restored''': images embedded in MOBI HTML 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 now loads from cache in roughly 3.7 s instead of re-parsing for roughly 9 s.
** '''Browser grid covers load on view toggle''': switching from list to grid view now immediately loads covers for the visible page instead of showing empty slots until the next navigation event.
** '''EPUB large PNG covers decode via libpng''': covers larger than 4 MB now use a direct libpng thumbnail path that scales to 85×115 px 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.
'''v2.3.1'''
* 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, trading some speed for confirmed reliability on real hardware.
** '''Reading direction toggle for fixed-layout documents''': PDF, CBZ, and XPS now have a per-book <code>reading direction</code> toggle in <code>BOOK</code> settings. Switch between <code>Left to right</code> (default, western) and <code>Right to left</code> (manga, Arabic, Hebrew).
** '''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 between books no longer relies on timing-sensitive state.
** '''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 <code>std::terminate</code> on a fragmented 3DS heap after a prior book close; the reservation is removed and the string now grows incrementally.
* Included fixes and behavior changes
** '''EPUB inline image metadata retried on zip open failure''': if <code>unzOpen</code> fails due to transient memory pressure, <code>metadata_probed</code> is left false so the next frame retries instead of permanently marking the image as unloadable.
** '''Book vector capacity released on close''': <code>pages</code> and <code>chapters</code> vectors now swap with an empty vector on <code>Book::Close()</code>, actually freeing capacity rather than just clearing size.
** '''Opening a book is cancellable and session-safe''': an in-progress open can now be cancelled with <code>B</code>, <code>Start</code>, or <code>Select</code>, and switching books no longer depends on stale callbacks or unfinished work from the previous session.
'''v2.3.0'''
'''v2.3.0'''
* Highlights
* Highlights
** '''<code>GENERAL</code> and <code>BOOK</code> 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.
** '''<code>GENERAL</code> and <code>BOOK</code> 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 <code>go to page</code> slider popup''': books now expose a dedicated page-jump control from <code>BOOK</code> settings, with visible page number feedback and both touch and button-based adjustment.
** '''New <code>go to page</code> slider popup''': books now expose a dedicated page-jump control from <code>BOOK</code> settings, with visible page number feedback and both touch and button-based adjustment.
* Included fixes and behavior changes
* Included fixes and behavior changes
** '''The in-book settings menu is more coherent''': global options such as <code>clock format</code>, <code>color mode</code>, and <code>library view</code> no longer appear mixed into the per-book menu.
** '''The in-book settings menu is more coherent''': global options such as <code>clock format</code>, <code>color mode</code>, and <code>library view</code> no longer appear mixed into the per-book menu.
** '''<code>go to page</code> is tuned for 3DS controls''': touch chooses the page directly, <code>Left/Right</code> moves by one page, <code>Up/Down</code> and <code>L/R</code> move in larger jumps, <code>A</code> confirms, and <code>B</code> / <code>Select</code> / <code>Start</code> cancel.
** '''<code>go to page</code> is tuned for 3DS controls''': touch chooses the page directly, <code>Left/Right</code> moves by one page, <code>Up/Down</code> and <code>L/R</code> move in larger jumps, <code>A</code> confirms, and <code>B</code> / <code>Select</code> / <code>Start</code> cancel.
** '''Left-handed orientation remains supported''': the new slider and the updated settings separation continue to use the existing orientation-aware input mapping.
** '''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 <code>list-style-type: none</code> is still honored.
** '''Recent EPUB compatibility fixes remain included''': cosmetic hidden pagebreak spans are ignored, and CSS list marker suppression such as <code>list-style-type: none</code> is still honored.


'''v2.2.2'''
'''v2.2.2'''
* Highlights
* Highlights
** '''Cosmetic EPUB pagebreak markers no longer disturb pagination''': hidden <code>epub:type=&quot;pagebreak&quot;</code> / <code>role=&quot;doc-pagebreak&quot;</code> spans are now ignored when they are purely decorative, so they no longer create bogus breaks in the reflowed text.
** '''Cosmetic EPUB pagebreak markers no longer disturb pagination''': hidden <code>epub:type=&quot;pagebreak&quot;</code> / <code>role=&quot;doc-pagebreak&quot;</code> 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 <code>list-style-type: none</code> or <code>list-style: none</code> no longer show bullets or numbers in 3dslibris when those rules come from EPUB CSS.
** '''CSS-hidden list markers are now respected''': lists styled with <code>list-style-type: none</code> or <code>list-style: none</code> no longer show bullets or numbers in 3dslibris when those rules come from EPUB CSS.
* Included fixes and behavior changes
* 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.
** '''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.
** '''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 <code>ornamentless</code> list case so the behavior can be validated in both automated tests and on hardware.
** '''The EPUB rendering fixture was updated''': the test book now includes a non-hardcoded <code>ornamentless</code> list case so the behavior can be validated in both automated tests and on hardware.


'''v2.2.1'''
'''v2.2.1'''
Line 208: Line 448:
** '''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.
** '''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.
** '''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''': <code>3dslibris-debug.cia</code> now uses its own Title ID/Product Code so it installs separately instead of overwriting the release build.
** '''Debug and release CIA builds can coexist''': <code>3dslibris-debug.cia</code> now uses its own Title ID/Product Code so it installs separately instead of overwriting the release build.
* Included fixes and behavior changes
* Included fixes and behavior changes
** '''Browser presentation is split cleanly by mode''': grid and list rendering now live in separate presentation files while <code>app_browser.cpp</code> remains the coordinator for shared navigation and actions.
** '''Browser presentation is split cleanly by mode''': grid and list rendering now live in separate presentation files while <code>app_browser.cpp</code> 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.
** '''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.
** '''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.
Line 216: Line 456:
'''v2.1.0'''
'''v2.1.0'''
* Highlights
* Highlights
** Configurable EPUB monospace flow restored and expanded: <code>pre</code> / <code>code</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.
** Configurable EPUB monospace flow restored and expanded: <code>pre</code> / <code>code</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.
** 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, <code>blockquote</code>, <code>aside</code>, <code>caption</code>, <code>figure</code>, <code>dl</code> / <code>dd</code>, and basic table linearization now render as readable reflow blocks instead of collapsing into generic paragraph flow.
** More EPUB block semantics are supported: lists, nested ordered lists, <code>blockquote</code>, <code>aside</code>, <code>caption</code>, <code>figure</code>, <code>dl</code> / <code>dd</code>, 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.
** 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 <code>visually-hidden</code>, <code>aria-hidden</code>, and equivalent inline CSS are no longer shown as visible body text.
** Hidden EPUB accessibility text is ignored: common hidden-text patterns such as <code>visually-hidden</code>, <code>aria-hidden</code>, and equivalent inline CSS are no longer shown as visible body text.
** Styled punctuation stays attached to the surrounding text: closing <code>!</code> / <code>?</code> and opening <code>¡</code> / <code>¿</code> are handled more safely across inline style boundaries, avoiding the worst split cases in Spanish text.
** Styled punctuation stays attached to the surrounding text: closing <code>!</code> / <code>?</code> and opening <code>¡</code> / <code>¿</code> 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 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.
** 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 <code>sdmc:/3ds/3dslibris/book/</code> path more explicit, since this is still the most common user setup question.
** Bundled quickstart and SD docs are clearer about where books go: the release package now makes the <code>sdmc:/3ds/3dslibris/book/</code> 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.
** 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.



Latest revision as of 04:14, 29 May 2026

3DSlibris
General
AuthorRigle
TypeUtilities
Version2.7.3
LicenseGPL-2.0
Last Updated2026/05/28
Links
Download
Website
Source
Support Author

Nintendo 3DS homebrew ebook reader based on the original Nintendo DS project dslibris.

3dslibris ports the original architecture to libctru, keeps the fast text-first reading model, and adds practical 3DS UX improvements (grid library, cover thumbs, indexed navigation, procedural UI skin, orientation-aware touch, etc.).

The current .cia packaging flow is based on the same makerom/bannertool process used by Universal-Updater, adapted to this project's assets and release layout.

Features

  • Reads ebooks and manga on Nintendo 3DS hardware and Azahar.
  • Library browser with grid and list views, cover thumbnails, metadata titles, and touch navigation.
  • Six reading themes with matching splash screens and reader gradients.
  • Supported formats: EPUB, FB2, TXT, RTF, ODT, MOBI, PDF, CBZ and XPS.
  • EPUB reflow with TOC support, bookmarks, go to page, cached pagination, and broad inline/block formatting support.
  • Fixed-layout viewer for manga and document formats (CBZ, PDF and XPS) with zoom, pan, outline navigation, and full-page preview.
  • Bundled fallback fonts for broader language coverage (Latin, Cyrillic, Greek, CJK, Arabic, Hebrew, Thai, and more).

Installation

Recommended install (.cia via Universal-Updater):

  • Install 3dslibris from Universal-Updater.
  • Launch it once so sdmc:/3ds/3dslibris/ is created if needed.
  • Copy your books to sdmc:/3ds/3dslibris/book/.
  • Launch the installed title.
  • New users: Read the bundled QuickStart.txt inside your book library to learn about menus, settings, and navigation.

Manual install (3dsx):

  • Download 3dslibris.3dsx and 3dslibris-sdmc.zip from GitHub Releases.
  • Copy 3dslibris.3dsx to sdmc:/3ds/3dslibris/3dslibris.3dsx.
  • Extract that zip into the root of your SD card, so it expands into sdmc:/.
  • Put your books in sdmc:/3ds/3dslibris/book/.
  • Launch sdmc:/3ds/3dslibris/3dslibris.3dsx from Homebrew Launcher.

Manual install (.cia):

  • Install 3dslibris.cia.
  • Launch the installed title once so it creates sdmc:/3ds/3dslibris/ if needed.
  • Put your books in sdmc:/3ds/3dslibris/book/.
  • Launch the installed title.

Notes:

  • The .cia includes default font/ and resources/ assets in RomFS.
  • Books are read from sdmc:/3ds/3dslibris/book/ and optionally romfs:/3ds/3dslibris/book/.
  • Runtime data can also be installed under sdmc:/config/3dslibris/ (for example book/, font/, resources/, cache, prefs, and log files).
  • If the same filename exists in both places, the SD version wins.
  • Releases also provide 3dslibris-debug.3dsx and 3dslibris-debug.cia, which enable verbose logging to sdmc:/3ds/3dslibris/3dslibris.log.

Supported formats

Strong support:

  • EPUB: EPUB2 and EPUB3 reflow, NAV and NCX TOC support, cached pagination, bookmarks, configurable fonts, and broad inline/block formatting support.

Good support:

  • FB2
  • TXT
  • RTF
  • ODT

Experimental or best-effort:

  • MOBI: can be slow on first open, TOC quality depends on file structure, and some files may fall back to safer but more limited parsing.
  • PDF: viewer mode with zoomed reading area and full-page preview.
  • CBZ: viewer mode for manga and image-based books.
  • XPS: viewer mode with the same fixed-layout reader controls.

Limitations

  • No DRM support.
  • EPUB is a reflow renderer, not a full browser engine. Complex CSS, JavaScript, multi-column layouts, and wide tables are simplified.
  • EPUB tables are converted into text-oriented blocks for readability on 3DS screens.
  • SVG support in EPUB is limited to common wrappers that reference supported raster images.
  • Some malformed EPUB anchors and MOBI tables of contents can produce approximate navigation.
  • Large or malformed MOBI files may open slowly or lose some rich formatting in safer fallback paths.
  • MOBI inline images depend on recoverable image references in the source markup; malformed files can still miss some images.
  • Some malformed MOBI sources still contain encoding or OCR artifacts that cannot be repaired reliably on the reader side.
  • After changing layout-related settings such as font size, spacing, orientation, reading fonts, or the per-book MOBI line wrap fix, reopening the current book may be necessary.
  • Reading position and existing bookmarks are remapped approximately after that reopen and can shift a few pages from their original location.

Controls

Library

D-Pad - Move selection

A - Open the selected book

L/R - Jump to the previous or next library page

Touch - Tap a book to select it, tap it again to open it

Y/Select - Open "General" settings

Standard reading

A/B/L/R - Turn pages

ZL/ZR (New 3DS) - Previous or next page

D-Pad Left/Right - Jump between bookmarks

Y - Toggle bookmark, Hold Y on a page with inline links to enter link-focus mode, then D-Pad to move and A to follow

X - Change background color

Select - Open "BOOK" Settings

Start - Return to library

Touch UI for library, settings, index, bookmarks, font menus...

Fixed-layout (PDF / CBZ / XPS)

A - Zoom in

B - Zoom out

Left/L/ZR/Right/R/ZL - Previous/Next page

Up/Down - Next/Previous chapter when the document exposes an outline; otherwise previous or next page

Touch/Circle Pad/C-Stick - Move the viewport by tapping or dragging on the page preview

Select - Open "BOOK" settings

Start - Return to library

Screenshots

3dslibris2.png

3dslibris3.png

Changelog

v2.7.3

  • 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.

v2.7.2

  • New Features
    • #93#132: library sort now supports six modes: by titleby filenameby authorby file typeby 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.

v2.7.1

  • Fixes
    • #126: open the index on the page for the current chapter.
    • #127START now closes folders, like B.
    • #127START 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.

v2.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, 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

v2.6.4

  • 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

v2.6.3

  • 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

v2.6.2

  • 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

v2.6.1

  • 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.
  • 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.
    • 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.
    • EPUB raster images no longer turn into [illustration] after cache rebuilds.
    • 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.
    • 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.
    • 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.
    • 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.
    • 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.
    • 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.
    • HOME Menu no longer crashes after returning to the library: pressing HOME or powering off after leaving a book no longer crashes the HOME Menu process. Three issues were fixed: preferences were being written to the SD card inside an APT hook callback; 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.

v2.5.0

  • Highlights
    • Text alignment support: text-align: center and text-align: right are now honoured in EPUB reflow. Each paragraph emits an alignment token that the draw routine uses to compute per-line offset, so wrapped lines stay correctly aligned across the whole paragraph.
    • Performance improvements: EPUB CSS scanning now reads only the <head> section of each spine document, reducing zip I/O on large books (~1 second less loading time). A single zip handle is recycled across all spine CSS scans (~20% less loading time). Plain text pagination eliminates per-line heap allocation. First-time EPUB cover extraction is ~3× faster on old 3DS via MuPDF subsampled thumbnail decode.
  • Included fixes and behavior changes
    • Browser return and suspend handling stabilized: returning from the reader to the library now correctly resumes browser jobs and handles applet suspend/resume, avoiding tearing down in-flight async opens during HOME suspension.
    • Gallery covers clipped correctly: cover thumbnails in gallery view are clipped to the rounded frame, preventing image pixels from bleeding outside the card border.
    • PDF HOME button crash fixed: PDF file parsing is now split into independently cancellable steps, each with an APT yield point, so pressing HOME during PDF loading is handled cleanly instead of causing a console restart.
    • Large EPUB page limit raised: the maximum pages in memory raised from 5,000 to 25,000 (cache guard to 50,000), fixing books that stopped loading halfway through.
    • HR overflow tracking fixed: parser and renderer now agree on vertical position after <hr> rules, preventing text overlap after horizontal rules.
    • PagedListMenu overflow fixed: pagination indices changed from u8 to u16 so menus with more than 255 entries no longer wrap and corrupt the page list.
    • SDMC zip trimmed: 3dslibris-sdmc.zip now contains only SD card runtime files; the .3dsx builds are separate release assets instead of being duplicated inside the zip.

v2.4.2

  • Highlights
    • Stability and crash-fix release: addresses several null dereference, divide-by-zero, out-of-bounds, and infinite-loop issues identified on real hardware.
  • Included fixes and behavior changes
    • FontManager null dereference crash fixed: GetFace() now uses find() and returns NULL for missing style keys instead of silently inserting a null entry via operator[]; all callers guard against NULL before dereferencing.
    • Division by zero in browser marquee fixed: the background color averaging loop now guards against zero-dimension covers before dividing.
    • Degenerate layout when font height is zero fixed: a line_height floor of 10 pixels is enforced so menus do not collapse to unreadable or non-interactive rows when no valid face is loaded.
    • Out-of-bounds touch in empty list menus fixed: PagedListMenu::HandleTouchInput() now returns early when the button vector is empty, avoiding an out-of-bounds read.
    • Infinite loop in text wrapping fixed: WrapTextToLines() now forces a minimum advance of 1 byte so the loop always makes progress on zero-width or unrecognised code points.

v2.4.1

  • Highlights
    • Crash-at-boot fix: FontMenu is constructed during App::App() before fonts are loaded. Calling GetHeight() and GetAdvance() through the null font manager cascaded into a heap Data Abort immediately at startup. Both methods now return safe defaults until the font manager is initialised.

v2.4.0

  • Highlights
    • Six-color theme system: 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: the startup splash now uses a dark or light version that matches the active color mode.
    • 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.
    • Improved chapter menu: 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.
    • Browser warmup re-enabled: cover extraction now runs incrementally on idle frames (3 ms budget), so covers populate without stalling the UI.
  • Included fixes and behavior changes
    • EPUB NAV spine ordering fixed: chapter detection now correctly follows the <spine> order from the OPF manifest rather than assuming document order.
    • Marquee background color fixed: the browser grid marquee now correctly tracks the active dark theme background instead of always using the light color.
    • Long font filenames wrap in FontMenu: font file paths too long for a single line now wrap cleanly instead of being clipped.

v2.3.2

  • Highlights
    • MOBI structured TOC restored: the HTML-to-text position map is now built during safe-extractor parsing, so structured TOC entries are resolved to accurate page numbers instead of falling back to linear estimation.
    • MOBI inline images restored: images embedded in MOBI HTML 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 now loads from cache in roughly 3.7 s instead of re-parsing for roughly 9 s.
    • Browser grid covers load on view toggle: switching from list to grid view now immediately loads covers for the visible page instead of showing empty slots until the next navigation event.
    • EPUB large PNG covers decode via libpng: covers larger than 4 MB now use a direct libpng thumbnail path that scales to 85×115 px 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.

v2.3.1

  • 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, trading some speed for confirmed reliability on real hardware.
    • 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).
    • 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 between books no longer relies on timing-sensitive state.
    • 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 and the string now grows incrementally.
  • Included fixes and behavior changes
    • 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 instead of permanently marking 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: an in-progress open can now be cancelled with B, Start, or Select, and switching books no longer depends on stale callbacks or unfinished work from the previous session.

v2.3.0

  • 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.

v2.2.2

  • 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.

v2.2.1

  • 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.

v2.1.0

  • 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.

v2.0.4

  • 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.
    • Release pipeline stability improved: debug MOBI builds now include the correct reporter definitions so debug-3dsx compiles reliably in CI/release workflows.

v2.0.3

  • 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
    • 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

v2.0.2

  • 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.

v2.0.1

  • 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 (from 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

v2.0.0

  • 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: a preview of the page is shown immediately, then it refines to full quality in the background.
    • 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.

v1.1.0

  • 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 <code></code> <pre></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.

v1.0.3

  • 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.

v1.0.2

  • 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.

v1.0.1

  • 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.
  • 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

  • First release.

Credits

  • Original dslibris: Ray Haleblian
  • 3DS port and maintenance: Rigle

External links

Advertising: