{"id":48654770,"url":"https://github.com/riglegit/3dslibris","last_synced_at":"2026-04-10T09:02:38.204Z","repository":{"id":343950828,"uuid":"1179766845","full_name":"RigleGit/3dslibris","owner":"RigleGit","description":"An ebook and manga reader for Nintendo 3DS","archived":false,"fork":false,"pushed_at":"2026-04-09T20:57:01.000Z","size":71531,"stargazers_count":73,"open_issues_count":10,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-04-09T22:25:10.236Z","etag":null,"topics":["ebook-reader","homebrew","manga-reader","nintendo-3ds"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RigleGit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-12T11:06:40.000Z","updated_at":"2026-04-09T20:57:05.000Z","dependencies_parsed_at":"2026-03-12T19:01:01.877Z","dependency_job_id":null,"html_url":"https://github.com/RigleGit/3dslibris","commit_stats":null,"previous_names":["riglegit/3dslibris"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/RigleGit/3dslibris","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RigleGit%2F3dslibris","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RigleGit%2F3dslibris/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RigleGit%2F3dslibris/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RigleGit%2F3dslibris/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RigleGit","download_url":"https://codeload.github.com/RigleGit/3dslibris/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RigleGit%2F3dslibris/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31635969,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ebook-reader","homebrew","manga-reader","nintendo-3ds"],"created_at":"2026-04-10T09:02:34.098Z","updated_at":"2026-04-10T09:02:38.192Z","avatar_url":"https://github.com/RigleGit.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1\u003e\n  \u003cimg src=\"assets/release/icon-64x64.png\" alt=\"3dslibris icon\" width=\"64\" /\u003e\n  3dslibris\n\u003c/h1\u003e\n\n[![Release](https://img.shields.io/github/v/release/RigleGit/3dslibris?label=release)](https://github.com/RigleGit/3dslibris/releases)\n[![CI](https://img.shields.io/github/actions/workflow/status/RigleGit/3dslibris/ci.yml?branch=main\u0026label=ci)](https://github.com/RigleGit/3dslibris/actions/workflows/ci.yml)\n\nNintendo 3DS homebrew ebook reader based on the original Nintendo DS project `dslibris`.\n\n`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, EPUB reflow improvements, fallback fonts, procedural UI skin, orientation-aware touch, and fixed-layout document viewing.\n\nThe current `.cia` packaging flow is based on the same `makerom`/`bannertool` process used by [Universal-Updater](https://github.com/Universal-Team/Universal-Updater), adapted to this project's assets and release layout.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\"\u003e\u003cimg src=\"assets/readme/screenshot1.jpeg\" alt=\"Library view screenshot\" /\u003e\u003c/td\u003e\n    \u003ctd width=\"50%\"\u003e\u003cimg src=\"assets/readme/screenshot2.jpeg\" alt=\"Reading view screenshot\" /\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Project status\n- Current app version: `2.1.1`\n- Focus: stable daily reading on 3DS hardware and Azahar\n- Repository status: public release available and under active maintenance\n- Latest downloadable binaries and SD package: [GitHub Releases](https://github.com/RigleGit/3dslibris/releases)\n- Releases also include `3dslibris-debug.3dsx`, which enables verbose diagnostic logging in `3dslibris.log`\n- Supported install paths: `.3dsx` plus `3dslibris-sdmc.zip`, or `3dslibris.cia` with books stored on SD and optional bundled books in RomFS.\n- Main reading focus in `2.1.1`: page-turn performance restored to pre-2.1.0 levels.\n\n## Install\n\nRecommended install:\n1. Download `3dslibris-sdmc.zip` from [GitHub Releases](https://github.com/RigleGit/3dslibris/releases).\n2. Extract that zip into the root of your SD card, so it expands into `sdmc:/`.\n3. Put your books in `sdmc:/3ds/3dslibris/book/`.\n4. Launch `sdmc:/3ds/3dslibris/3dslibris.3dsx` from Homebrew Launcher.\n\nAlternative install:\n1. Install `3dslibris.cia`.\n2. Launch the installed title once so it creates `sdmc:/3ds/3dslibris/` if needed.\n3. Put your books in `sdmc:/3ds/3dslibris/book/`.\n4. Launch the installed title.\n\nImportant:\n- The `.cia` bundles the default `font/` and `resources/` runtime assets inside `RomFS`, so it can boot without manually extracting `3dslibris-sdmc.zip`.\n- Books are discovered from `sdmc:/3ds/3dslibris/book/` and `romfs:/3ds/3dslibris/book/`.\n- If the same filename exists in both places, SD takes priority.\n- `3dslibris-sdmc.zip` is still the recommended install for `.3dsx`, and it remains useful if you want the same runtime files laid out explicitly on SD.\n- `3dslibris-debug.3dsx` uses the same SD layout and writes verbose diagnostics to `sdmc:/3ds/3dslibris/3dslibris.log`.\n- The `.cia` build uses the Universal-Updater-style packaging flow and now also validates the bundled `RomFS` path in GitHub Actions.\n\nAdding books:\n- Copy supported ebook files into `sdmc:/3ds/3dslibris/book/`.\n- You can do this either before first launch or after the app has already created its folders.\n- On `.cia`, the app can also read bundled books from `romfs:/3ds/3dslibris/book/`, but the normal user drop folder is still the SD path above.\n- The included `sdmc:/3ds/3dslibris/book/QuickStart.txt` also explains the expected folder layout and controls.\n\nGenerated install package targets:\n- `make package-sdmc` stages `dist/sdmc/...` with `3dslibris.3dsx` included\n- `make zip-sdmc` creates `dist/3dslibris-sdmc.zip`\n- `make cia` creates `3dslibris.cia`\n- `make source-release` creates `dist/3dslibris-source.tar.gz`\n- GitHub Releases: pushing a tag like `v2.1.1` triggers `.github/workflows/release.yml` and attaches `3dslibris.cia`, `3dslibris.3dsx`, `3dslibris-debug.3dsx`, `dist/3dslibris-sdmc.zip`, and `dist/3dslibris-source.tar.gz` to the release\n\n## Supported formats\n\n### Strong support\n- `EPUB`\n  - EPUB2 + EPUB3 content parsing with NAV and NCX table-of-contents support, plus fallback chapter labels when source metadata is incomplete\n  - persistent page cache keyed by layout inputs, so repeated opens can reuse compatible pagination instead of rebuilding every page\n  - configurable serif, sans, and monospace font families; `pre` / `code` blocks now reflow and measure with the active monospace face\n  - monospace regular, bold, italic, and bold-italic variants are preserved when matching fonts are available\n  - inline formatting support includes bold, italic, underline, strikethrough, overline, superscript, subscript, and CSS-driven dotted/dashed/wavy underline markers\n  - block formatting covers headings, paragraphs, lists, nested ordered lists, blockquotes, asides, figures, captions, definition lists, and horizontal rules\n  - tables are linearized into readable label/value blocks for the 3DS screen instead of trying to preserve wide desktop table layout\n  - common hidden accessibility/helper text is ignored when marked with `hidden`, `aria-hidden`, `display:none`, `visibility:hidden`, or `visually-hidden`-style classes\n  - punctuation handling keeps Spanish opening/closing punctuation attached across inline style boundaries in common cases\n  - inline SVG image wrappers are detected and resolved when they point to supported raster image assets\n\n### Good support (text-oriented)\n- `FB2`\n- `TXT`\n- `RTF`\n- `ODT`\n\n### Experimental / best-effort\n- `MOBI`\n  - First open can be slow on large books (decompress + parse + pagination)\n  - Subsequent opens are accelerated by persistent page cache\n  - TOC quality is heuristic for many files (can be approximate)\n  - Inline MOBI images now reuse the same smart `inline / band / page` layout pipeline used by EPUB/FB2, with better caption flow on mixed photo spreads\n  - Includes an optional per-book `line wrap fix` for badly converted files that hard-wrap prose line by line, while preserving embedded image markers during cleanup\n  - Empty or corrupt books are reported with a readable error instead of a raw numeric code\n- `PDF`\n  - Viewer-only path with MuPDF-backed rendering\n  - Top screen shows a zoomed page region; bottom screen shows the full-page preview and viewport box\n  - Uses the shared fixed-layout reader controls documented below\n  - PDF-enabled builds in this branch are distributed with AGPL-driven notice and source-release requirements; see the license section below\n- `CBZ`\n  - Viewer-only path with MuPDF-backed image-page rendering\n  - Uses the shared fixed-layout reader controls documented below\n- `XPS`\n  - Viewer-only path with MuPDF-backed rendering\n  - Uses the shared fixed-layout reader controls documented below\n\n## Known limitations\n- Some EPUB files have malformed anchors; index jumps can be approximate when source metadata is broken.\n- EPUB is a reflow renderer, not a browser engine: complex CSS layout, JavaScript, floats, multi-column pages, and wide tables are intentionally simplified for the 3DS screens.\n- EPUB tables are converted to text blocks. This improves readability on 3DS, but it does not preserve the original grid geometry.\n- EPUB SVG support is limited to common wrapper patterns that reference raster images; arbitrary SVG drawing is not rendered as vector graphics.\n- After changing font size, paragraph spacing, orientation, reading fonts, or other EPUB layout settings, reopen the current book if a cached layout is still visible.\n- MOBI TOC extraction depends on file structure and may omit or merge entries in some books.\n- MOBI inline images depend on recoverable image references in the source markup, including the zero-padded `recindex` values commonly found in Kindle-generated books; malformed files can still miss some images.\n- Some malformed MOBI sources still contain encoding or OCR artifacts that cannot be repaired reliably on the reader side.\n- After changing font size, paragraph spacing, orientation, reading fonts, or the per-book MOBI `line wrap fix`, reopen the current book to apply the new layout.\n- Reading position and existing bookmarks are remapped approximately after that reopen and can shift a few pages from their original location.\n- No DRM support.\n\n## Build (Docker, recommended)\n\n```bash\ndocker build -f docker/Dockerfile.cia -t 3dslibris-build .\n\ndocker run --rm \\\n  -v \"$(pwd):/project\" -w /project \\\n  -e DEVKITPRO=/opt/devkitpro \\\n  -e DEVKITARM=/opt/devkitpro/devkitARM \\\n  3dslibris-build \\\n  sh -lc 'make clean \u0026\u0026 make -j2 \u0026\u0026 make zip-sdmc \u0026\u0026 make debug-3dsx \u0026\u0026 make cia \u0026\u0026 make source-release'\n```\n\nThe Dockerfile in [`docker/Dockerfile.cia`](docker/Dockerfile.cia) matches the\nrelease packaging flow used by the project, including the `.cia` toolchain.\n\nExpected outputs:\n- `3dslibris.cia`\n- `3dslibris.3dsx`\n- `3dslibris-debug.3dsx`\n- `3dslibris.smdh`\n- `3dslibris.elf`\n- `dist/3dslibris-source.tar.gz`\n\n## Library controls\n- `D-Pad`: move the current selection around the library grid\n- `A`: open the selected book\n- `L` / `R`: jump to the previous or next library page\n- `Touch`: tap a book to select it, tap it again to open it\n- `Y` / `Select`: open settings\n\nBundled runtime files:\n- `sdmc/3ds/3dslibris/resources/splash.jpg`\n- `sdmc/3ds/3dslibris/resources/ui/icons/png/*.png`\n- `sdmc/3ds/3dslibris/book/README.md`\n- `sdmc/3ds/3dslibris/font/README.md`\n- `sdmc/3ds/3dslibris/font/Liberation*.ttf` (Latin; SIL OFL 1.1)\n- `sdmc/3ds/3dslibris/font/NotoNaskhArabic-VariableFont_wght.ttf` (Arabic; SIL OFL 1.1)\n- `sdmc/3ds/3dslibris/font/NotoSansHebrew-VariableFont_wdth,wght.ttf` (Hebrew; SIL OFL 1.1)\n- `sdmc/3ds/3dslibris/font/DroidSansFallbackFull.ttf` (CJK fallback; Apache 2.0)\n- `sdmc/3ds/3dslibris/font/OFL-1.1.txt`\n- `sdmc/3ds/3dslibris/font/Apache-2.0.txt`\n\nNotes:\n- Homebrew Launcher path: keep the app at `sdmc:/3ds/3dslibris/3dslibris.3dsx`\n- Debug build path: keep `3dslibris-debug.3dsx` in the same `sdmc:/3ds/3dslibris/` folder if you want verbose logs\n- Default fonts are bundled in the SD package for `.3dsx`, and inside `RomFS` for `.cia`\n- You can replace them with other `.ttf`, `.otf`, or `.ttc` fonts if you want to customize the reading/UI typefaces\n- Runtime files such as `3dslibris.xml`, `3dslibris.log`, and `cache/*` are created by the app on first run\n\n```text\nsdmc:/3ds/3dslibris/3dslibris.3dsx\nsdmc:/3ds/3dslibris/book/*.epub|*.fb2|*.txt|*.rtf|*.odt|*.mobi|*.pdf|*.xps|*.oxps|*.cbz\nsdmc:/3ds/3dslibris/font/*.ttf\nsdmc:/3ds/3dslibris/resources/splash.jpg\nsdmc:/3ds/3dslibris/resources/ui/icons/png/{back,gear,home,next,prev}.png\n```\n\n## Controls (default)\n- `A/B/L/R`: turn pages\n- `D-Pad Left/Right`: jump between bookmarks\n- `Y`: toggle bookmark\n- `X`: change background color\n- `SELECT`: settings\n- `START`: return to library\n- Touch UI for library, settings, index, bookmarks, font menus...\n\n## Controls (PDF / CBZ / XPS)\n- `A`: zoom in\n- `B`: zoom out\n- `Left/Right`: previous or next page\n- `Up/Down`: next or previous chapter when the document exposes an outline; otherwise previous or next page\n- `Touch`: move the viewport by tapping or dragging on the page preview\n- `SELECT`: open settings\n- `START`: return to library\n\n## Documentation\n- Contribution guide: [CONTRIBUTING.md](CONTRIBUTING.md)\n- Third-party notices: [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)\n- PDF source-release guide: [docs/PDF_SOURCE_RELEASE.md](docs/PDF_SOURCE_RELEASE.md)\n\nInternal planning, release notes, and working docs are kept out of the public repo.\n\n## License\nThis repository now carries a split licensing model:\n\n- inherited and base 3dslibris code remains under **GNU GPL v2 or later**\n- PDF-enabled builds in this branch combine that code with MuPDF and must be\n  distributed with the AGPL-related obligations documented in:\n  - [LICENSE](LICENSE)\n  - [LICENSES/GPL-2.0-or-later.txt](LICENSES/GPL-2.0-or-later.txt)\n  - [LICENSES/AGPL-3.0-or-later.txt](LICENSES/AGPL-3.0-or-later.txt)\n  - [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)\n  - [docs/PDF_SOURCE_RELEASE.md](docs/PDF_SOURCE_RELEASE.md)\n\n## Credits\n- Original `dslibris`: Ray Haleblian\n- 3DS port and maintenance: [Rigle](https://rigle.dev)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Friglegit%2F3dslibris","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Friglegit%2F3dslibris","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Friglegit%2F3dslibris/lists"}