Description
Kavita 3DS
A Nintendo 3DS homebrew client for Kavita — browse your comic, manga, and book library from your 3DS.
Features
- Browse libraries, series, volumes, and chapters
- Cover art thumbnails with lazy loading
- Full-screen comic/manga page reader
- Reading progress sync back to Kavita
- Credentials saved to SD card
Build Setup
1. Install devkitPro
Download and install devkitPro.
On Windows: use the devkitPro MSYS2 installer, then open a devkitPro MSYS2 shell.
2. Install 3DS packages
dkp-pacman -S 3ds-dev 3ds-citro2d 3ds-citro3d
3. Download vendored libraries
bash bootstrap.sh
This downloads cJSON and stb_image into the libs/ directory.
4. Python (for icon / CIA assets)
The first make runs tools/prepare_cia_assets.py, which resizes icon.png to 48×48 (for the .smdh), builds the CIA banner from icon-large.png, and writes a short silent audio clip for the banner. Install Python 3 and Pillow:
pip install Pillow
5. Build
make
Output: kavita-3ds.3dsx and kavita-3ds.smdh
6. CIA package (optional)
Installing a .cia on the HOME Menu requires bannertool and makerom, which are not included in devkitPro’s 3dstools package. Download release binaries and put them on your PATH (for example copy bannertool.exe and makerom.exe into %DEVKITPRO%\tools\bin), or pass explicit paths when invoking Make.
- makerom: Project_CTR releases — use the Windows x86_64 zip (contains
makerom.exe). - bannertool: Epicpkmn11/bannertool releases — extract
bannertool.zipand usewindows-x86_64/bannertool.exe.
From a devkitPro MSYS2 shell (same environment as make):
make cia
If the tools are not on PATH, use MSYS-style paths, for example:
make cia BANNERTOOL=/c/path/to/bannertool.exe MAKEROM=/c/path/to/makerom.exe
Output: kavita-3ds.cia in the project root. Ensure make has already been run at least once so kavita-3ds.elf and the CIA banner/icon assets under build/ exist.
Running
Copy kavita-3ds.3dsx to /3ds/kavita-3ds/kavita-3ds.3dsx on your SD card, then launch via the Homebrew Launcher.
Controls
Displayed on touchscreen.
In reader, press the A button to show the following controls:
- X: Adjust Zoom Level
- Circle Pad (Whilst Zoomed): Pan Viewport
- Start: Go To page
- B: Back to Chapter List
- Left / Right D-Pad: Previous / Next Page
Config
Server URL and credentials are saved to /3ds/kavita-3ds/config.ini on the SD card. Delete this file to reset.
Project Structure
kavita-3ds/
├── Makefile
├── bootstrap.sh # Downloads vendored libs
├── icon.png # app icon
├── romfs/ # Read-only filesystem embedded in .3dsx
├── libs/ # Vendored: cJSON.h/c, stb_image.h (after bootstrap)
├── include/ # Header files
└── source/ # C source files
├── main.c # Entry point, service init, main loop
├── app.c # State machine
├── config.c # SD card config INI
├── http_client.c # libctru httpc wrapper
├── kavita_api.c # Kavita REST API calls
├── image_loader.c # JPEG/PNG decode → GPU texture
├── ui.c # UI primitives
├── screen_setup.c # Login screen
├── screen_libraries.c
├── screen_series.c # Cover grid with lazy loading
├── screen_detail.c # Volume/chapter list
└── screen_reader.c # Full-screen page reader