Wii setup guide

Follow these once to prepare the Wii. After that, staged games transfer automatically whenever you start the Wii's FTP server.

Shortcut: this app can put every homebrew app below onto the SD card for you — use Sync → SD card items (search the Open Shop Channel or upload a zip), tick “Push SD items”, and Sync. The SD card mounts over FTP even on the oldest servers, so you can stage the cIOS installer, WiiXplorer and USB Loader GX before anything USB works.

Prefer an AI to walk you through it?

Copies a ready-made prompt with all the context + the steps below onto your clipboard — paste it into ChatGPT or Claude and it'll guide you through the whole setup, one step at a time, for your Wii. You don't need to read it.

Where are my games? (reading the Library's Location badge)

A game's files can exist in up to three separate places, and the Library's badge tells you which — it does not mean "everywhere":

A game staged on the Pi (the default, "active" case) can ALSO be copied onto the USB drive by hand with 📀 Copy to drive — that's a separate, manual action from Wii-syncing. Once it is, its badge shows a "+ on drive" tag alongside the Wii state, and the button switches to 🗑️ Remove from drive so you can pull it back off without touching the Pi copy or Wii sync state.

1. What you need

2. Install the Homebrew Channel

The Homebrew Channel is the launcher that runs everything else. The easiest, up-to-date method is the “Let's Go Gambling / str2hax / LetterBomb” style exploit guide at wii.hacks.guide — follow it end to end. When done you'll have the Homebrew Channel installed.

Download / reference: https://hbc.hackmii.com/

3. Install cIOS (d2x) — required for USB drives

This is the piece everything USB depends on. A stock Wii can't read a USB hard drive at all — not USB Loader GX, not an FTP server, nothing. A cIOS (custom IOS, the d2x build) adds USB-HDD support. Install it once, up front.

Skip this and the USB drive simply never appears — you'll only ever see the SD card over FTP.

4. Install USB Loader GX and Nintendont

These are the apps that actually launch games from the USB drive — USB Loader GX for Wii games, Nintendont for GameCube games. Put each app's folder in SD:/apps/<appname>/, then launch it from the Homebrew Channel.

USB Loader GX can install a channel and launch Nintendont for you, so you mainly interact with USB Loader GX.

5. Install an FTP server — use WiiXplorer

This app pushes games to the Wii over FTP; the FTP server just has to expose the USB drive. Use WiiXplorer — it mounts SD and USB through the cIOS from step 3, has a built-in FTP server, and a proper Wiimote-pointer UI.

Avoid the old FTPii (0.0.22). It only mounts the SD card and small flash drives — it cannot mount a USB hard drive, and its Wiimote support is minimal. Fine if you only sync to the SD, but for USB games use WiiXplorer.

6. Format the USB drive and pick the right port

7. Find the Wii's IP address

8. Point this app at the Wii

Open the Sync page and enter the Wii's IP from step 7 (e.g. 192.168.1.50) — it saves instantly, no restart, and the Wii can be powered off when you set it. Also set the FTP root there, usually /usb.

The FTP server exposes each device as a top-level folder, so staged wbfs/ and games/ land at /usb/wbfs and /usb/games. (You can also preset WII_IP/FTPII_ROOT as container env vars — they're just the initial defaults.)

9. Start the FTP server and let it sync

Faster: copy over USB plugged into the Pi (recommended)

The Wii's WiFi FTP is slow (~0.5–1.5 MB/s) and can drop on big transfers. For the initial bulk load especially, it's far faster to plug the Wii's USB drive into the Pi, let the app copy games straight to it at full USB speed, then move the drive back to the Wii.

It's a one-time host setup that persists across reboots:

  1. Plug the drive into the Pi and find its UUID: lsblk -f.
  2. Pin it in /etc/fstab so only that drive mounts there, owned by the container user (uid 1000) and writable — the uid/umask are required or the app can't write:
    UUID=XXXX /mnt/wii-usb vfat defaults,uid=1000,gid=1000,umask=000,nofail 0 0
    then sudo systemctl daemon-reload && sudo mount /mnt/wii-usb.
  3. Bind-mount it into the container: add - /mnt/wii-usb:/wii-usb under the wii-sync service's volumes:, then recreate the stack (mount the drive first, or the bind captures an empty folder).
  4. On the Sync page set USB drive path to /wii-usb (or pick it from the dropdown), then Sync to USB. Move the drive back to the Wii when done.
  5. Optional but recommended: a fstab entry only mounts at boot or on an explicit mount command — plugging the drive in later won't mount it on its own. Add a udev rule so it auto-mounts the instant you plug it in (see below).

vfat can't change ownership on a remount — if you mounted it wrong first, unmount and mount fresh: docker stop wii-sync; sudo umount /mnt/wii-usb; sudo mount /mnt/wii-usb; docker start wii-sync.

That copies a ready-made prompt (all the context + exact steps) to your clipboard — paste it into ChatGPT or Claude and it'll walk you through the setup for your specific drive. You don't need to read it.

Automatic USB mount/unmount (recommended)

Why this matters: a drive left mounted while idle is at real risk of directory-table corruption if it's ever unplugged without unmounting first — this has actually happened. With this set up, the app mounts the drive only while it's doing something (syncing, browsing, copying, patching) and unmounts the instant it's done, so it's essentially always safe to unplug.

  1. On the Pi, from a checkout of the app's repo: sudo ./deploy/setup-usb-bridge.sh — this installs a tiny root-owned control script, generates a dedicated SSH keypair, and restricts that key (via a forced command= in authorized_keys) so it can only run mount/unmount — nothing else, even with the key in hand.
  2. Move the generated wii_usb_ssh_key next to your compose.yaml, then add under the wii-sync service:
    environment:
      WII_USB_SSH_HOST: root@<the Pi's own LAN IP>
    volumes:
      - ./wii_usb_ssh_key:/run/secrets/wii_usb_ssh_key:ro
  3. Recreate the stack. The header banner then shows live "USB drive mounted — DO NOT unplug" / "unmounted — safe to unplug" on every page.

Full walkthrough with troubleshooting: see DEPLOY.md → "Automatic USB mount/unmount" in the repo. Skip this entirely and every USB feature still works — it just requires the drive to already be mounted (sudo mount /mnt/wii-usb) before you use it.

Replacing or adding a USB drive

Swapping in a new/replacement drive (e.g. after a failed one) — same steps as the very first setup, pointed at the new drive:

  1. Format the new drive FAT32. Plug it into the Pi, find its UUID: lsblk -f.
  2. Update the /etc/fstab line from the first-time setup above to the new UUID (same mountpoint, same uid=1000,gid=1000,umask=000,nofail options), then sudo systemctl daemon-reload && sudo mount /mnt/wii-usb.
  3. If you're using the automatic mount/unmount bridge (below), re-run sudo ./deploy/setup-usb-bridge.sh — it's safe to re-run and picks up the new drive automatically (the control script always targets the fstab mountpoint, not a specific UUID itself).
  4. On the Library page, use 📀 Copy to drive (per-game, or select several and Copy selected to drive) to hand-pick which games go on first — this only copies files, your Pi library and sync state are untouched.
  5. Once the drive has a games/ or wbfs/ folder on it (the copy above creates one), turn on "Auto-sync & import when this drive is connected" on the Sync page — future reconnects then sync/import automatically. It deliberately won't auto-fire on a completely blank drive with neither folder yet, as a safety check against writing to the wrong device.

ISO patches (optional)

Riivolution mods (optional)

Riivolution mods (Project+, texture packs, romhacks distributed as a riivolution/*.xml + content folder) normally patch a game at boot, from files on SD/USB — that's what USB Loader GX's own Riivolution screen reads. This app offers two ways to use one:

Cover art (optional)

GameTDB's automatic cover lookup (used across the app) is keyed by Game ID, so a baked patch-ISO copy (its ID is invented locally — see above) can never have one automatically. Hit 🖼️ Cover on a game in the Library to upload and crop one by hand — works on any game, not just patched copies.

Cheat codes (optional)

Auto-boot into USB Loader GX or the Homebrew Channel (optional)

To skip the System Menu and land straight in a loader on power-on, use Priiloader (a small tool you install alongside the Homebrew Channel — see the guide in step 2). This is a one-time Wii-side setup; wii-sync only syncs game files, it doesn't install loaders or homebrew.

Priiloader + forwarders: wii.hacks.guide/priiloader.

Online play with Wiimmfi (optional)

Nintendo's original online servers are shut down; Wiimmfi is the community replacement that revives online for supported games (Mario Kart Wii, Brawl, etc.). Nothing extra to sync — USB Loader GX patches the game on launch, so it's a loader setting, not a file.

More: wiimmfi.de. Riivolution mods like Project+ run their own online, so you don't need this for those.

Then: play

Move the USB drive back to the Wii's bottom port (if you unplugged it), launch USB Loader GX for Wii games or Nintendont for GameCube games, and your transferred titles appear in the list.