is an Arduino Nano ESP32 + OTG adapter that changes profiles for the RetroTink 4K based on gameID. Now also featuring WebCtl.
See it in action: https://youtu.be/ldbfFbKzjh8
- Note: In version v0.7.x you can still access this gameID only version at http://donutshop.local/gameid
Base URL: http://donutshop.local
GET /api/info| Device and firmware informationGET /api/status| Current RetroTink and DonutShop statusPOST /api/command| Send a RetroTink serial command- Body:
{"command": "status"}
- Body:
GET /api/files/| List the SD card rootGET /api/files/<path>| List a directory or download a filePUT /api/files/<path>| Create or overwrite a fileDELETE /api/files/<path>| Delete a file or empty folderPOST /api/files/mkdir| Create a folder- Body:
{"path": "profile/SVS/New Folder"}
- Body:
POST /api/files/move| Move or rename a file or folder- Body:
{"source": "profile/SVS/Old.rt4", "destination": "profile/SVS/New.rt4"}
- Body:
- Additional info/status fields imminent
- Requires RT4K v1.75+ experimental firmware, not the latest 1.9.6 stable firmware.
- This version integrates the gameID functionality into the RT4K WebCtl internal test app. It's still very much a work in progress, but I wanted to share the experience thus far.
- In a nutshell, with WebCtl on DonutShop, you gain:
- Dashboard of RT4K status, ability to change Input/Output
- Flash latest experimental firmware over Wi-Fi directly from Github
- Remote + OSD
- Load profiles by double-clicking on the filename, allowing you to quickly try out new profiles.
- File Manager with bulk file operations including, copy/move/delete/download,drag & drop uploads.
- Load profiles by double-clicking on the filename, allowing you to quickly try out new profiles.
- Save live profile to current directory with the option to change name
- View .txt & .html files immediately in-browser. Great for reading various guides found on the SD Card image.
- Edit & Save .txt files in-browser for immediate changes to various features that use .txt files.
- RetroTink "kitchen sink" Diagnostics page
- Console to manually run commands
Dark Theme Glazed Theme
- "Glazed" is the new daytime theme alternative to the default "Dark" theme.
- Firmware Installer only takes a few clicks.
- WiP DonutShop ft. RT4K WebCtl now available to experience the new features of the RT4K v1.75+ firmware
- .3mf added for printing a case.
- NEW Terminal to relay Remote Control Commands. Toggle Keyboard Nav Mode to navigate the RT4K interface with keyboard keys.
- New flash / setup method can now all be done via web browser.
- ALL settings are now configured in the Web UI.
- New Captive Portal for joining to your home network.
- New Settings page allows you to Update Firmware and Load S0 profile if all Consoles are off.
- OTA updates now available. "donutshop" shows up as a Network port in Arduino IDE 2.x
- New Web UI!
- Detection rates have been sped up!
- Unpowered consoles that are DNS address based, timeout after 7 seconds. This is reduced to 2 seconds after a console's first power up.
- console DNS addresses will be automatically replaced by IP in order for the 2 second timeout to work.
- Quickest if IP address is used versus Domain address.
- Unpowered consoles that are DNS address based, timeout after 7 seconds. This is reduced to 2 seconds after a console's first power up.
(links help support RetroRGB!)
- OTG Adapter: The following were tested on 4/27/2026. Not all OTG adapters work.
- Jadebones USB C to USB OTG
- USB C OTG Adapter, 2 in 1 USB-C to USB
- IT: IVIVTOR USB-C OTG Cable Adapter (tested on 8/24/26)
- Nano or XIAO ESP32: pick one based on availability or WiFi performance.
- WaveShare Nano ESP32 or from Aliexpress
- Arduino Nano ESP32
- XIAO ESP32-S3 or from Amazon
- The External antenna of the XIAO has shown to have 10 dBm better WiFi reception.
- 3D Printed cases
Nano_ESP32.3mffiles listed aboveXIAO_ESP32.3mf3 types to choose from
- USB-A to C cable
| Device | Supported | Notes |
|---|---|---|
| PS1Digital | yes, confirmed first hand | |
| N64Digital | yes, confirmed first hand | |
| RetroGEM N64 | yes | |
| RetroGEM PS1 | yes | |
| MemCardPro 2 | yes, for GameCube, PS1, & PS2 | MCP 2.0 firmware requires https instead of http. MCP 3.0 firmware requires disabling "WebUI v2 (Beta)" access and then you can use the http method. Ex: http://10.0.1.52/api/currentState |
| Fenrir ? | ||
| more on the way... |
| Color | Blinking | On | Notes |
|---|---|---|---|
| 🟠 XIAO | WiFi active, querying gameID addresses. Longer blinks represent an unsuccessful query of gameID address. Usually a powered off console in the list. | Wifi not connected | XIAO has a single ORANGE led for status. Ignore the RED led as it only pertains to the not used battery status. |
| 🟠 Nano | Wifi not connected | If DonutShop cannot connect to its saved WiFi network during startup, DonutShop_Setup will appear so you can reconnect. | |
| 🔵 Nano | WiFi active, querying gameID addresses | Longer blinks represent an unsuccessful query of gameID address. Usually a powered off console in the list. | After initial power, no BLUE light means WiFi not found. |
| 🟢 Nano | 1 second blink is gameID match found and SVS profile being sent to RT4K | ||
| 🔴 Nano | Power | No way to control as it's hardwired in. May just need to cover with tape. |
- Open the DonutShop Firmware Installer in Brave/Chrome/Edge.
- Once complete, reconnect the USB cable of the device and continue Setup below...
- If you get an error, try the Alternative Flashing steps at the bottom of the page.
- Upon reconnecting the USB cable, your board should Successfully boot DonutShop and leave you with an ORANGE led.
- With your computer or smartphone, join the broadcasted
DonutShop_SetupWiFi to connect it to your home network.- You can now also change the default "donutshop" Hostname. Must follow the rules listed and will have .local appended automatically.
- ONLY "a-z", "0-9", and "-" (hyphen) characters are allowed. (edge hyphens not allowed)
- Follow the instructions listed and once complete, you should see a BLUE led (Nano only) indicating it's connected to WiFi and looking for addresses to connect to. If the BLUE led does not show, press the RST button one time.
- For XIAO, re-connect the usb-c once more and ORANGE led activity should indicate it's connected.
- You should now be able to visit http://donutshop.local to confirm WiFi connectivity.
- Disconnect the Nano/XIAO and connect it to the OTG adapter. Connect the OTG assembly to the RT4K and everything should power on.
- Reconfirm connectivity to http://donutshop.local and refresh the page after the RT4K has fully booted.
- For all updates you can visit the "Firmware Update" section in Settings to "Check for Updates" and auto update to the latest.
- There is also a manual update section where you can apply any version's _update .bin file. Updating manually with the _full version will not work.
For Consoles, quickest if IP address is used versus Domain address:
If you have multiple consoles on when DonutShop is booting, the console furthest down the list wins. If more than 2 consoles are active when one is powered off, the console that was on prior takes over. (Order is remembered.)
There are a multiple moving parts with this setup, and if you have issues, please use the "DonutShop_usb-only-test.ino". More info in the troublehshooting section at the end.
The Web UI allows you to live update the Consoles and gameID table. You no longer have to reflash for changes. You can also now import and export your config if anything were to happen and you need to rebuild.
ONLY compatible with 2.4GHz WiFi APs. Configured during initial setup process. If you need to change SSID or password, "DonutShop_Setup" will automatically reappear after not being able to connect.
I recommend the Official Arduino IDE and guide if you're unfamiliar with Arduinos. All .ino files used for programming are listed above. The following Libraries will also need to be added in order to Compile successfully.
- Add Additional Boards
- In the Arduino IDE open up "Settings", find the section "Additional boards manager URLs:"
- Add in: https://espressif.github.io/arduino-esp32/package_esp32_index.json and select "OK"
- First, you must have completed the steps shown in the "Flashing" section above at least once before continuing.
- "Double click" the RST button right after connecting to your PC/Mac to put into "recovery mode". You'll see a GREEN led strobe if successful.
- Open up Donut_Dongle_gameID.ino in the Arduino IDE to make your custom changes.
- Under the "Tools" menu, make sure...
- Board - "esp32" -> "Arduino Nano ESP32" is selected. DO NOT select "Arduino ESP32 Boards" -> "Arduino Nano ESP32"
- Port - The listed "Serial" port is chosen, not dfu one.
- If Donut_Shop is currently running, you should also see a "DonutShop" Network Port that connects via WiFi.
- Core Debug Level - "None"
- Partition Scheme - "With SPIFFS partition (advanced)" is chosen
- Pin Numbering - "By Arduino pin (default)"
- USB Mode - "Debug mode (Hardware CDC)" / Important that this is selected!
- To flash the changes, select "Sketch" -> "Upload"
- BIG Thanks goes to Mike Chi of RetroTink for early access to the documentation and most importantly the WebCtl test app that made this possible.
- The RetroTink Discord for beta testing feedback.
- Bob @ RetroRGB for always supporting and being an invaluable resource to the community.
- Huge thanks to @CielFricker249 / "Aru" on the RetroTink Discord for the gameID idea and testing of the Donut Dongle project as well!
The 🔵 and 🟢 leds indicate WiFi and usb serial/gameID lookup. This should help diagnose as a first step.
If you are sure of these settings, and it still does not work, try the following to test the usb serial connection:
-
Configure your Arduino Nano ESP32 with the provided "DonutShop_usb-only-test.ino". This is configured to only load "remote profile 8".
- You can change the 8 to 1 - 9 if needed.
-
Verify that everything is connected with your OTG adapter and has power.
-
Press the reset button on top of the device and within a couple of seconds it should load the remote profile.
If this works, then there must be a wifi connectivity issue somewhere.
Here is a video of the "usb only test" being performed: https://www.youtube.com/watch?v=XP7OSW7X0DQ
- Open ESP Tool in Chrome, Brave, or Edge
- Connect your XIAO / Nano ESP32 via USB directly to your PC or Mac (not through a usb-hub) and for Nano-based boards, double click the Reset button immediately following to enter recovery mode (a GREEN led will strobe when successful). For XIAO, hold down the Reset button while connected the usb-c cable.
- Clicking Connect opens up a selection menu and you should see something like (depending on OS and Nano brand) Nano ESP32, TinyUSB, or USB JTAG.
- For XIAO, select "USB JTAG" and jump to step 8 and then skip step 10.
- With the Connect menu still open, single click the Nano button once more and quickly select the new device named USB JTAG; click Connect
- If it disappears, click the Nano button again for it to return. Be faster this time! ;)
- If Step 4 is not working, In the Connect menu, select "Nano ESP32" or "Tiny USB" and click Connect.
- Refresh the page and click Connect once more. You should now see USB JTAG available for Connect
- Click Erase Flash to format your device (required for LittleFS)
- Download the latest files from the Github Releases section.
- Set Flash Address to 0x0 and Choose the file
DonutShop_vX.X.X_full.binorDonutShop_vX.X.X_XIAO_full.bindepending on board used. - Click Add File, set the next Flash Address to 0xF70000, Choose
nora_recovery.bin(XIAO can skip this step) - Click Program
- Once complete, reconnect the USB cable of the device and continue Setup below...