wireless file haul for 3DS. an FTP server and client in one app — push and pull files between your console, phone, and PC over Wi-Fi. no cables, no card readers.
a reworked fork of ftpd by Michael Theall, Dave Murphy & TuxSH (GPLv3) — with an added FTP client, a touch file manager, QR connect, and a refreshed look.
- SERVER — your phone / PC connect to the 3DS to drop or grab files (classic ftpd).
- CLIENT — the 3DS connects out to another FTP server (phone / PC / NAS / another 3DS) to browse, download, and upload. runs on a background thread, so the UI never blocks.
- 3DS ↔ 3DS — hit SCAN on the CLIENT tab and porthaul finds other consoles running porthaul on the same network (mDNS). tap one — connected. haul saves, backups, whatever, console to console. no PC in the middle.
- CONNECT (QR) — point your phone camera at the on-screen QR to connect instantly.
- FILE MANAGER — browse the SD card on the bottom screen by touch: open folders, new folder / rename / delete.
| input | action |
|---|---|
| L / R | switch tabs (SERVER / CLIENT / CONNECT) |
| left stick | scroll the log (top screen) |
| touch / stylus | navigate lists, drag to scroll, tap fields to type |
| double-tap a folder | open it |
| Y | menu (Settings / About / Quit) |
| START | exit |
grab the latest release:
porthaul.cia(recommended) — drop it on your SD card, install with FBI. you get a home menu icon, banner, and the jingle.porthaul.3dsx— put it in/3ds/, run from the Homebrew Launcher.
requires a console with CFW (Luma3DS). see 3ds.hacks.guide if yours isn't modded yet.
3DS → 3DS
- both consoles: launch porthaul, same Wi-Fi.
- on one console, go to CLIENT and hit SCAN — the other console shows up as
porthaul @ ipwithin a second. tap it. - browse the other console's SD, DOWNLOAD what you want, or pick a local file on the SERVER tab and UPLOAD it. CANCEL aborts a connect / transfer any time.
Pull files from your phone → 3DS
- on the phone, start any FTP server app (e.g. "FTP Server", or CX File Explorer → network access). note its
ip:port/ user / pass. - on the 3DS, switch to CLIENT (L/R), enter the host (no
ftp://), port (often2121, not 21), user & pass on the bottom screen, hit CONNECT. - browse, select a file, DOWNLOAD (lands on
sdmc:/). to send a file the other way, pick it on the SERVER tab's file list, then UPLOAD from the client.
Send files from your phone → 3DS
- on the 3DS, the SERVER tab is already serving.
- on the phone, open an FTP client, scan the CONNECT QR or type the IP, transfer.
Requires devkitPro with the 3DS toolchain and these portlibs:
3ds-zlib 3ds-curl 3ds-mbedtls 3ds-jansson 3ds-libzstd.
export DEVKITPRO=/opt/devkitpro DEVKITARM=/opt/devkitpro/devkitARM
export PATH=$DEVKITPRO/tools/bin:$DEVKITARM/bin:$PATH
cmake -B build -DCMAKE_TOOLCHAIN_FILE=$DEVKITPRO/cmake/3DS.cmake -DCMAKE_BUILD_TYPE=Release
cmake --build build -j4
# -> build/porthaul.3dsxfor a .cia, additionally grab makerom and
bannertool:
cd build
bannertool makebanner -i ../meta/banner.png -a ../meta/audio.wav -o banner.bnr
bannertool makesmdh -s PORTHAUL -l "wireless file haul" -p filicide -i ../meta/icon.png -o icon.icn
sed 's|RootPath *: ../romfs|RootPath : romfs|' ../meta/porthaul-cia.rsf > porthaul.rsf
makerom -f cia -o porthaul.cia -elf porthaul.elf -rsf porthaul.rsf -icon icon.icn -banner banner.bnr -exefslogo -target tPORTHAUL is GPLv3, inherited from ftpd. The FTP engine (RFC 959 / 3659), MODE Z, and the platform layers are by Michael Theall, Dave Murphy, and TuxSH. Bundled libraries (Dear ImGui, libcurl, zlib, mbedTLS, jansson, Nayuki qrcodegen) keep their own licenses — see the in-app About screen for full attribution.
