More actions
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.
Installation
Requirements
- seeddb.bin - Required for newer games (2015+) that use seeds.
- boot9.bin and moveable.sed - Dumped from a 3DS system.
- custom-install-standalone - For Windows user, it includes GUI for simpler process and custom-install-finalize.
- custom-install-module - For Windows/macOS/Linux user, to be used with Python (or setup your own GUI).
- custom-install-finalize - Installs a ticket, plus a seed if required. Provided as a separate download primarily for non-Windows users.
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 intarget/debug/save3ds_fuse
, copy it tobin/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 (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 notes 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
windows-install-dependencies.py
- Alternate manual method
py -3 -m pip install --user -r requirements-win32.txt
- For macOS/Linux,
python3 -m pip install --user -r requirements.txt
- For Windows, double-click
- Run
custominstall.py
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 custom-install.py -b boot9.bin -m movable.sed --sd *yoursdcarddiskletter:\* *yourgamename*.cia *yourgamename*.cia
py -3 custominstall.py -b boot9.bin -m movable.sed --sd E:\ file.cia file2.cia
python3 custominstall.py -b boot9.bin -m movable.sed --sd /Volumes/GM9SD file.cia file2.cia
python3 custominstall.py -b boot9.bin -m movable.sed --sd /media/GM9SD file.cia file2.cia
- Use
- 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.
Credits
save3ds by wwylele is used to interact with the Title Database (details in bin/README).
Thanks to nek0bit for redesigning custominstall.py 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.