Custom Install 3DS

From GameBrew - a wiki dedicated to Video Game Homebrew.

Author(s) ihaveamac
Type Utilities
Version 2.1b4 & 1.6
Licence Mixed
Last Updated 2021/07/08
Website Website
Download Download
Source Source

custom-install is a Python 3.6+ tool that will install CIA files to a Nintendo 3DS SD card entirely on a PC. This completely bypasses the slow wireless and I/O speeds of the hardware.

It was initially created late June 2019 as an experimental script to automate the process of a manual title install for Nintendo 3DS.



Setup for Linux

  • Linux users must build wwylele/save3ds and place save3ds_fuse in bin/linux.
  • Install rust using rustup, then compile with: cargo build. The compiled binary is located in target/debug/save3ds_fuse, copy it to bin/linux.
  • (Optional) GUI setup.

Building standalone

  • Using a 32-bit version of Python is recommended to build a version to be distributed. Please refer to the readme from repo.

User guide

Usage summary

  • Use custom-insall on your laptop/pc and install titles onto the micro SD (with boot9+movable).
  • After it's finished, re-insert to 3DS and run custom-install-finalize at the end to insert the ticket and seed for it to show on the homemenu.
  • You can use the Windows standalone with GUI for simpler process, or setup your own enviroment (for Windows 32/Linux/macOS).

Windows standalone

  • Extract custom-install and copy over custom-install-finalize.3dsx to the 3ds folder on your SD card.
  • Run ci-gui to bring up the custom-install GUI.
  • Select your SD card root, boot9, seeddb, and movable.sed files (in some cases these will be automatically selected for you).
  • Add the CIA files and click Start install.
  • Once it's finished, start up the homebrew launcher and run custom-install-finalize to finish the process.

With installed Python

  • Download the repo and extract custom-install.
  • Download custom-install-finalize.3dsx and copy over to the 3ds folder of your SD card.
  • Put boot9.bin, seeddb.bin and movable.sed to the root of the custom-install folder (see also Additional notes).
  • Paste the .cia files you want to install to the root of the custom-install folder.
  • Install the packages:
    • For Windows, double-click
    • Alternate manual method py -3 -m pip install --user -r requirements-win32.txt
    • For macOS/Linux, python3 -m pip install --user -r requirements.txt
  • Run with boot9.bin, movable.sed, path to the SD root, and CIA files to install:
    • Use -h to view arguments. Insert the following code (with some examples below).
    • py -3 -b boot9.bin -m movable.sed --sd *yoursdcarddiskletter:\* *yourgamename*.cia *yourgamename*.cia
    • py -3 -b boot9.bin -m movable.sed --sd E:\ file.cia file2.cia
    • python3 -b boot9.bin -m movable.sed --sd /Volumes/GM9SD file.cia file2.cia
    • python3 -b boot9.bin -m movable.sed --sd /media/GM9SD file.cia file2.cia
  • Wait for install. Once it's finished, start up the homebrew launcher and run custom-install-finalize to finish the process.

Additional notes

movable.sed can be provided with -m or --movable.

boot9 can be placed in one of the following places:

  • -b or --boot9 argument (if set)
  • BOOT9_PATH environment variable (if set)
  • %APPDATA%\3ds\boot9.bin (Windows-specific)
  • ~/Library/Application Support/3ds/boot9.bin (macOS-specific)
  • ~/.3ds/boot9.bin
  • ~/3ds/boot9.bin

SeedDB is checked in order of:

  • -s or --seeddb argument (if set)
  • SEEDDB_PATH environment variable (if set)
  • %APPDATA%\3ds\seeddb.bin (Windows-specific)
  • ~/Library/Application Support/3ds/seeddb.bin (macOS-specific)
  • ~/.3ds/seeddb.bin
  • ~/3ds/seeddb.bin

If you get an error during installation, you'll have to manually delete the partially installed title from the SD card (Nintendo 3DS -> {id0} -> {id1} -> title -> {first half of Title ID} -> {second half of Title ID}), or delete other things to make enough space, then try again.


custom-install 2.1b4 & finalize 1.6 2021/07/08

custom-install 2.1b4:

  • Show 300 application warning with the cli script.
  • This fixes a minor issue with an exception being raised at the end (but it didn't actually affect anything) #42
  • Auto-set boot9.bin and seeddb.bin if found in SD:/gm9/out (movable.sed was already detected this way) #43 Thanks @Jisxu.
  • Force reading save3ds_fuse output as UTF-8 all the time.
  • This should hopefully fix #41 but haven't been fully tested. In particular this seems to affect Windows systems set to Chinese.

custom-install-finalize 1.6:

  • Skip installing tickets for titles that don't need it #46 #47 Thanks @TimmSkiller.

custom-install 2.1b3 2021/03/09

  • Show a warning if more than 300 applications (not all titles, but executable ones) are detected.
  • Create title.db and import.db if missing #40.
  • Fix CDN content install.
  • Require pyctr==0.4.6 and comtypes==1.1.8 (only relevant to non-standalone build users).

custom-install 2.1b2 2021/02/13

  • Fix selected boot9 and seeddb not working for adding titles & require boot9 to be loaded before adding any titles.
  • Show current status on each title's line.

custom-install 2.1b1 2021/02/10

custom-install 2.1b1:

  • Installs are written to a visible temporary folder before being moved into place. If an install fails in the middle, it won't leave a half-written title buried in the Nintendo 3DS folder.
  • CDN contents can be installed directly.
  • Title contents are verified during install and an error is shown if verification fails.
  • Titles that succeeded and failed to be installed are shown at the end.
  • All titles are loaded and parsed at the beginning so a broken one won't stop the others.
  • Certain kinds of titles such as DSiWare and duplicate files are blocked.
  • This doesn't yet stop two files with the same Title ID however! This only stops adding the same file twice.
  • Free space is checked to make sure all titles can be installed.
  • cifinish.bin is loaded and checked for corruption early (if it exists), which can happen if an issue exists on the SD card filesystem.
  • File list replaced with a column list that shows Title ID and title name, and is sorted alphabetically.

custom-install-finalize 1.5:

  • Delete cifinish.bin if no errors occurred during ticket install.


  • Save3DS is used to interact with the Title Database (details in bin/README).
  • Thanks to nek0bit for redesigning to work as a module, and for implementing an earlier GUI.
  • Thanks to LyfeOnEdge from the brewtools Discord for designing the second version of the GUI. Special thanks to CrafterPika and archbox for testing.
  • Thanks to BpyH64 for researching how to generate the cmacs.

External links