NINTENDO WII NODE SETUP

This guide covers taking a stock, unmodified Nintendo Wii and turning it into a rehosted node — a solar-powered web server on your LAN that syncs and serves static sites.

  [WII SPECS]
  CPU         : IBM Broadway (PowerPC 729MHz)
  RAM         : 88 MB (24 MEM1 + 64 MEM2)
  Storage     : SD card via EXI bus (slow)
  Network     : WiFi 802.11b/g / USB Ethernet adapter
  Power draw  : 15-20W under load
  OS target   : wii-linux-ngx (Debian-based)
      
Time estimate: ~2 hours for first-time setup. Most of that is waiting for file copies and NAND backup.
WHAT YOU NEED
PHASE 1: SOFTMOD THE WII

The Wii needs to run unsigned code. This is a well-documented, reversible process. We use the LetterBomb exploit to install the Homebrew Channel.

1.1 Get the Wii's MAC Address

  1. Power on the Wii, go to Wii Settings (bottom-left of main menu)
  2. Go to Internet > Console Information
  3. Note down the MAC Address (format: AA:BB:CC:DD:EE:FF)

1.2 Prepare the SD Card

  1. Format the SD card as FAT32 (use 32KB cluster size if card is >2GB)
  2. Go to please.hackmii.com
  3. Enter your MAC address, select your Wii's region (check System Menu version in settings — 4.3U = USA, 4.3E = Europe, 4.3J = Japan)
  4. Cut the red or blue wire (it doesn't matter which — it's just a CAPTCHA)
  5. Download the zip, extract it to the root of the SD card
  6. You should have a private/ folder and a boot.elf on the SD root

1.3 Run the LetterBomb Exploit

  1. Insert the SD card into the Wii
  2. Go to the Wii Message Board (envelope icon, bottom-right of main menu)
  3. Browse back 1-2 days — look for a red letter (bomb icon)
  4. Open it. The HackMii installer will launch.
  5. If the letter doesn't appear, check your date/time settings and try again

1.4 Install the Homebrew Channel

  1. In the HackMii installer, select Install The Homebrew Channel
  2. Wait for it to complete
  3. If offered, also install BootMii:
    • As boot2 (preferred) — runs before the system menu, best brick protection. Only available on early Wii revisions.
    • As IOS — fallback for newer Wiis. Still useful but less powerful.
  4. Exit the installer. The Homebrew Channel should now appear on the Wii's main menu.
IMPORTANT: Do not skip step 1.5. A NAND backup is your only recovery option if something goes wrong later.

1.5 NAND Backup via BootMii

  1. Launch BootMii (from Homebrew Channel: press HOME, select "Launch BootMii")
  2. If BootMii is installed as boot2, it runs automatically on power-on — navigate with POWER (right) and RESET (select) buttons on the console
  3. Select the gear icon (options), then the green arrow (backup)
  4. Wait for the NAND dump to complete (~5 minutes, 512MB). It will write nand.bin and keys.bin to the SD card.
  5. Copy both files to your computer for safekeeping

1.6 Install Priiloader

Priiloader adds a pre-system-menu layer that lets you auto-boot into homebrew apps — essential for making the Wii boot straight into Linux on power-on.

  1. Download Priiloader from oscwii.org
  2. Extract to apps/priiloader/ on the SD card
  3. Launch it from the Homebrew Channel
  4. Select Install Priiloader and wait
  5. Once installed, hold RESET while powering on the Wii to access the Priiloader menu
  6. For now, leave it on default settings. We'll configure auto-boot after Linux is working.
PHASE 2: INSTALL WII LINUX

We use wii-linux-ngx, a community-maintained Linux distribution for the Wii based on Debian. It runs from the SD card.

2.1 Download wii-linux-ngx

  1. Get the latest image from the wii-linux-ngx GitHub releases
  2. You need the SD card image (usually named something like wii-jessie-*.img.xz)
  3. Decompress: xz -d wii-jessie-*.img.xz

2.2 Prepare the SD Card

You'll need two partitions on the SD card — one FAT32 for the Wii boot files and Homebrew Channel, one ext3 for Linux. Some wii-linux-ngx images handle this layout already.
  1. Write the image to the SD card:
      dd if=wii-jessie-*.img of=/dev/sdX bs=4M status=progress
    Replace /dev/sdX with your SD card device. Double-check this — dd will happily overwrite the wrong disk.
  2. If needed, resize the ext3 partition to fill the card:
      # After writing the image:
      sudo parted /dev/sdX resizepart 2 100%
      sudo e2fsck -f /dev/sdX2
      sudo resize2fs /dev/sdX2
  3. Mount the FAT32 partition and verify it contains the Homebrew Channel files from the softmod. If the image overwrote them, copy boot.elf and apps/ back.

2.3 Boot Into Linux

  1. Insert the SD card into the Wii
  2. Power on, enter the Homebrew Channel
  3. Launch the wii-linux-ngx bootloader (should appear as an app)
  4. Linux will boot to a console. Default login is usually root / root (check the release notes)
  5. Plug in the USB keyboard to interact with the console

2.4 Network Setup

  1. Plug in the USB Ethernet adapter
  2. Check it's detected: dmesg | grep -i eth — you should see the ASIX driver loading
  3. Configure a static IP:
      # /etc/network/interfaces
      auto eth0
      iface eth0 inet static
          address 192.168.4.60
          netmask 255.255.255.0
          gateway 192.168.4.1
          dns-nameservers 192.168.4.1
  4. Bring up the interface: ifup eth0
  5. Test connectivity: ping 192.168.4.48 (the Pi controller)

2.5 Enable SSH

  1. Check if SSH is installed: which sshd
  2. If present, enable it:
      update-rc.d ssh defaults
      /etc/init.d/ssh start
  3. If not present:
      apt-get update
      apt-get install openssh-server
    Note: this requires internet access. You may need to configure DNS first.
  4. Test from your computer: ssh root@192.168.4.60
  5. Copy your SSH key for passwordless access:
      ssh-copy-id -i deploy/deploy_key.pub root@192.168.4.60
From this point on, you can do everything over SSH. Put the Wii somewhere out of the way and forget the keyboard.
PHASE 3: DEPLOY THE NODE AGENT

The node agent is a single Python file. No pip, no virtualenv, no dependencies.

3.1 Check Python

  python --version    # Likely Python 2.7
  python3 --version   # Might be 3.2 or 3.4 if available

Either version works. The agent is written for Python 2.7+ / 3.2+ compatibility.

3.2 Deploy the Agent

  1. On the Wii, create the agent directory:
      mkdir -p /opt/rehosted
      cd /opt/rehosted
  2. From your computer, copy the files:
      scp -i deploy/deploy_key node_agent/node_agent.py root@192.168.4.60:/opt/rehosted/
      scp -i deploy/deploy_key node_agent/config.example.json root@192.168.4.60:/opt/rehosted/config.json
  3. Edit config.json on the Wii:
      {
        "controller_url": "http://192.168.4.48:8080",
        "hardware_id": "wii-001",
        "port": 8080,
        "sync_interval": 120,
        "sites_dir": "/opt/rehosted/sites"
      }
    Note: sync_interval is set to 120 seconds (not 60) to reduce SD card write wear.

3.3 Test It

  1. Run the agent manually:
      cd /opt/rehosted
      python node_agent.py
  2. You should see:
      [server] Listening on port 8080, serving from /opt/rehosted/sites/
      [agent] Sync interval: 120s
      [agent] Controller: http://192.168.4.48:8080
      [agent] Hardware ID: wii-001
      [sync] Downloaded xrouter/index.html
      ...
  3. From another machine, test file serving:
      curl -H "Host: xrouter.rehosted.net" http://192.168.4.60:8080/
  4. Ctrl+C to stop

3.4 Auto-Start on Boot

Wii Linux uses sysvinit (no systemd). Create an init script:

  cat > /etc/init.d/rehosted-agent << 'INITEOF'
#!/bin/sh
### BEGIN INIT INFO
# Provides:          rehosted-agent
# Required-Start:    $network $local_fs
# Required-Stop:     $network $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Description:       Rehosted node agent
### END INIT INFO

AGENT_DIR=/opt/rehosted
PIDFILE=/var/run/rehosted-agent.pid
LOGFILE=/var/log/rehosted-agent.log

case "$1" in
  start)
    echo "Starting rehosted-agent..."
    cd "$AGENT_DIR"
    python node_agent.py >> "$LOGFILE" 2>&1 &
    echo $! > "$PIDFILE"
    ;;
  stop)
    echo "Stopping rehosted-agent..."
    if [ -f "$PIDFILE" ]; then
      kill $(cat "$PIDFILE") 2>/dev/null
      rm -f "$PIDFILE"
    fi
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  status)
    if [ -f "$PIDFILE" ] && kill -0 $(cat "$PIDFILE") 2>/dev/null; then
      echo "rehosted-agent is running (PID $(cat "$PIDFILE"))"
    else
      echo "rehosted-agent is not running"
    fi
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
    ;;
esac
exit 0
INITEOF

  chmod +x /etc/init.d/rehosted-agent
  update-rc.d rehosted-agent defaults

Test it: /etc/init.d/rehosted-agent start, then check tail -f /var/log/rehosted-agent.log

PHASE 4: REGISTER IN REHOSTED

The controller needs to know about the Wii so it can route traffic and generate the manifest.

4.1 Create the Node in Django Admin

  1. Go to https://rehosted.net/admin/
  2. Under Panel > Node types, create:
      Name:        Nintendo Wii
      Description: Nintendo Wii (Broadway PPC, 88MB RAM, SD storage)
      Power watts: 18
  3. Under Panel > Nodes, create:
      Name:        wii-001
      Node type:   Nintendo Wii
      Hardware ID: wii-001
      IP Address:  192.168.4.60
      Port:        8080
      Is Active:   True (once tested) / False (to use fallback)

4.2 Assign Buckets

  1. Under Panel > Buckets, edit the bucket you want to serve from the Wii
  2. Set its Node to wii-001
  3. The next time the agent syncs, it will pull that bucket's files

4.3 Regenerate Nginx Configs

  # On the Pi, inside the container:
  docker exec rehosted-web-1 python rehosted_site/manage.py generate_nginx_conf
  docker exec rehosted-web-1 nginx -s reload

This generates a vhost that proxies bucketname.rehosted.net to 192.168.4.60:8080, with a fallback to the local copy if the Wii is unreachable (502/503/504).

PHASE 5: AUTO-BOOT INTO LINUX

The final step: make the Wii boot straight into Linux on power-on, with no human interaction needed. This is what makes it a proper unattended server.

  1. Power on the Wii, hold RESET to enter Priiloader
  2. Go to Settings
  3. Set Autoboot to Installed File
  4. Point it at the wii-linux-ngx bootloader
  5. Save and exit

Power cycle the Wii. It should boot straight into Linux, the network should come up, and the rehosted agent should start automatically. Verify by checking last_seen in Django admin — it should update within a couple of minutes.

TROUBLESHOOTING

Wii won't boot into Linux

Agent can't reach the controller

Files aren't syncing

SD card wear / corruption

Wii Linux is too unstable

This is a known risk. If the Wii can't maintain a reliable Linux install, mark the node as inactive in Django admin. Nginx will serve the fallback copy from the Pi. The Wii stays listed as the node for branding purposes — the site still says "hosted on a Nintendo Wii" — while the Pi does the actual serving. You can revisit when wii-linux-ngx improves.