Site Logo
Site Logo
  • Home
  • Contact
  • Projects
  • Blog
  • The Watering Can
Site Logo
Site Logo

Josh Wood © 2026

esp32-wiimmfi

My ESP32 Wi-Fi bridge for getting original Nintendo DS hardware back online through Wiimmfi by redirecting Nintendo WFC DNS traffic.

I built esp32-wiimmfi to make original Nintendo DS and DS Lite networking usable on a modern home network. An ESP32 joins normal Wi-Fi for uplink, hosts a DS-compatible access point, and redirects Nintendo WFC DNS traffic toward Wiimmfi or another revival target.

Repository
Tech
C++ArduinoESP32DNSDockerGoPostgreSQL

Summary

esp32-wiimmfi turns a small ESP32 board into a purpose-built bridge for Nintendo DS Wi-Fi Connection games. The board connects to a modern home network, exposes a handheld-compatible access point, and handles the DNS redirection needed to point WFC-era traffic at Wiimmfi or another revival service.

Problem

Original DS and DS Lite hardware were built around open or WEP networks, while modern networks generally use WPA2 or better. Many WFC-era games also try to reach Nintendo domains that no longer operate as they did originally. I wanted a small bridge that solved both problems without weakening the rest of the home network.

My Role

I built the ESP32 Arduino sketch, the DNS redirect behavior, the AP+STA network flow, and the documentation around flashing, configuring, and validating the setup. I also included a self-hosted server path for cases where the bridge should point at a LAN-hosted WFC backend instead of a public revival IP.

Stack

The bridge uses C++ on the Arduino ESP32 core with WiFi.h and WiFiUdp.h. The optional self-hosted backend path uses Docker and a vendored WFC server stack with Go and PostgreSQL components.

Architecture

The ESP32 runs in AP+STA mode. The STA side joins the normal Wi-Fi network for internet access. The AP side hosts the network the DS connects to. NAPT routes handheld traffic through the uplink, while a small UDP DNS server answers *.nintendowifi.net lookups with a configurable WFC revival IP and forwards unrelated DNS queries upstream.

Interesting Technical Decisions

  • The AP defaults to open mode because original DS Gen IV titles cannot join WPA2 and the ESP32 cannot host WEP in SoftAP mode.
  • The WFC target is configurable because community revival service IPs can change over time.
  • The self-hosted path keeps DNS on the ESP32 and lets the LAN server focus on the WFC service ports.

Status

Active technical project. The current version documents both the ESP32 bridge path and the optional self-hosted backend path.

Links

Repository and related topic hub: Pokemon ACE and retro game experiments.

Install the ESP32 Arduino core

Set up arduino-cli with Espressif's ESP32 board index and install the ESP32 core.

bash
arduino-cli config init
arduino-cli config add board_manager.additional_urls \
https://espressif.github.io/arduino-esp32/package_esp32_index.json
arduino-cli core update-index
arduino-cli core install esp32:esp32

Compile and flash

Replace the board FQBN and serial port for your ESP32 board.

bash
arduino-cli compile --fqbn esp32:esp32:esp32 esp32-wiimmfi.ino
arduino-cli upload --fqbn esp32:esp32:esp32 -p /dev/ttyUSB0 esp32-wiimmfi.ino
arduino-cli monitor -p /dev/ttyUSB0 -c baudrate=115200

Optional self-hosted WFC server

The repo includes Docker tooling for running the vendored WFC backend on a LAN host.

bash
cp .env.example .env
# set DB_PASSWORD and API_SECRET
docker compose up -d --build
docker compose logs -f wwfc