Nintendo Switch OLED Modding

Modifying and installing homebrew on a Nintendo Switch OLED.

Winning a Nintendo Switch

My wife won a Nintendo Switch at a meetup we attended. We initially regretted our decision to attend. On the night of the event, transport workers were taking industrial action, it was raining, the food and drinks were poor and the place was tightly crowded. The next day she got the call notifying her of the winning the Wordle competition the night prior which made up for everything!

competition

Unfortunately, it was the regular model without the OLED screen. Luckily, the device was brand new and we had the receipt, so I swapped it over to the OLED model at JB Hi-Fi for an extra $40.

switch oled

Modchip

To install homebrew (I am not condoning piracy) on an OLED Switch, a hardmod/modchip is required. The modchip runs a custom bootloader instead of Nintendo's, allowing unsigned code to execute.

I bought the HWFly v4.1 from Aliexpress for roughly $150 AUD. I would recommend the cheaper v4, as at the time of installation, there was no instructions available for the v4.1. The difference is the v4.1 uses ribbon cables to ease installation, but ultimately the difficulty is the same and not as secure.

I loosely followed this amazing tutorial by Sthetix to install the modchip. This video is for the v3, but I applied the solder points and connections to v4.1. The following equipment is also required along with my suggestions (photo from the Sthetix video):

equipment

  • Soldering iron: I use a Quicko T12-959. Hakko is also a good brand.
  • T12-JL02 and T12-KU tips: They are included in this set from Quicko.
  • Solder flux: I used a flux pen.
  • Microscope: A digital microscope with a screen is ideal, but I use a magnifying glass.
  • PCB Holder: I don't have this either. I set it down on some bubble wrap.
  • Precision tweezers: I like the iFixit set. A bad pair of tweezers won't hold items as their noses don't align.
  • PCB Cleaner: I used isopropyl alcohol.

This was my setup on my desk:

setup

Before starting, I downloaded and updated the firmware on the modchip using HWFly's GitHub repo.

chip

Next was disassembly. Only the mainboard is required.

disassembly 1

disassembly 2

With everything diassembled, I begun soldering while following the Sthetix's video guide.

soldering

solder 1

solder 2

Finally, reassembly and turning it back on.

finished

microSD Setup

Picking a microSD Card

The microSD card is responsible for running the EmuNAND and storing files (such as homebrew, backed-up games and themes).

SD cards have lot of specifications that define their speed. I recommend a microSD card that is:

  • Size: 512GB or 1TB
  • Bus: UHS-I
  • Video Speed Class: U3 V30
  • Application Performance Class: A2. A1 will also work, but it'll be slow to transfer files from/to a computer.

I went with Samsung 512GB Pro Plus UHS-I U3 A2 V30 (mouthful) microSD card for $95 AUD. Worthwhile alternatives from Sandisk are the 1TB A2 Extreme and Extreme Pro, however they are more are double the price of 512GB A2 cards (not worth it).

samsung

A card reader with UHS-I DDR200 is required to unlock the full speeds of the card when connected to a computer. I have the Lexar Multi-card 2-in-1 3.1 Reader which is roughly 20 MB/s faster than my other card readers (an increase of 70 MB/s to 90 MB/s).

reader

Creating an EmuNAND

I followed these guides to create an EmuNAND:

  1. Backup NAND

  2. Backup keys

  3. Consider if you want to run Android and/or Linux. This isn't yet support on the OLED, but work has started. These partitions are easier created now as doing a backup and re-partitioning takes a lot of time and risk.

    partition

  4. Create the EmuNAND following any of these guides:

  5. Before booting into Atmosphere, I strongly recommend doing the following:

  6. Create bootloader/hekate_ipl.ini with the following. This autoboots into EmuMMC unless the VOL- is pressed within 3 seconds:

    [config]
    ; 0: Disable, #: Boot entry number to auto boot.
    autoboot=1
    
    ; 0: Read autoboot boot entry from hekate_ipl.ini, 1: Read from ini folder (ini files are ASCII ordered).
    autoboot_list=0
    
    ; 0: Disable (It also disables bootlogo. Having VOL- pressed since injection goes to menu.), #: Time to wait for VOL- to enter menu. Max: 20s.
    bootwait=3
    
    ; 0: Animated line is drawn during custom bootlogo, signifying time left to skip to menu. 1: Disable.
    noticker=0
    
    ; 0: Disable, 1: If woke up from HOS via an RTC alarm, shows logo, then powers off completely, 2: No logo, immediately powers off.
    autohosoff=2
    
    ; 0: Disable, 1: Automatically applies nogc patch if unburnt fuses found and a >= 4.0.0 HOS is booted.
    autonogc=1
    
    ; 0: Disable, 1: Protect bootloader folder from being corrupted by disallowing reading or editing in HOS.
    bootprotect=0
    
    ; 0: Disable, 1: Force updates (if needed) the reboot2payload binary to be hekate.
    updater2p=1
    
    ; Screen backlight level. 0-255.
    backlight=100
    
    [CFW EmuMMC]
    ; chain loading fusee instead of fss0/package3 removes the need for other patches.
    ; this includes having to load kips manually.
    ; https://rentry.org/SwitchTerminology#fusee
    payload=bootloader/payloads/fusee.bin
    icon=bootloader/res/emummc.bmp
    
    [CFW SysMMC]
    fss0=atmosphere/package3
    kip1patch=nosigchk
    emummc_force_disable=1
    icon=bootloader/res/sysnand.bmp
    
    ; Use the reboot OFW option in Hekate instead.
    ; [Stock SysMMC]
    ; fss0=atmosphere/package3
    ; stock=1
    ; emummc_force_disable=1
    ; icon=bootloader/res/stock.bmp

I used icons from Sthetix's HATS Pack

configs

Homebrew

Once loaded into Atmosphere, a good source of information and general guides can be found at:

atmosphere

There are a few all-in-one homebrew packs on the Internet. Personally, I don't have the time to dig into each pack to see if they do anything strange, or trust they can be maintained forever. Instead, I prefer to download and install each piece of homebrew myself. Installation is usually a drag-and-drop onto the microSD card, but read the instructions to be sure.

To access the homebrew menu, hold R while opening a game/title. It can also be accessed by opening the Album application, but this opens in Applet mode, giving the homebrew less memory. Only use the Album method if you don't have any games/titles installed. Also read up on Forwarders later in this post.

I recommend making a note of all the homebrew that installs folders into /atmosphere/content. This folder must be empty during a firmware upgrade. An error screen may appear after upgrading if folders are left inside of the folder, but clearing it will solve the problem. That's why it's important to know what has been installed here.

Must Haves

Gaming

I am not condoning piracy.

  • sys-patch: Patch Atmosphere to run unsigned code (such as backups).
  • sigpatches: Same as sys-patch, but static instead of dynamic.
  • Tinfoil: Title/game manager.
  • DBI: Title/game manager alternative to Tinfoil. I prefer it's MTP feature over Tinfoil's.
  • JKSV: Save game manager.
  • Breeze: Cheats. An updated version of EdiZon SE by the same author.
  • Mission Control: Use controllers from other consoles.
  • SimpleModManager: Run mods from GameBanana.

File Management and Backup

Screen Overlay (Tesla)

Ultrahand is an libtesla overlay available at any time by pressing L + DPad Down + R3. nx-ovlloader+ is also required to load Tesla. The following overlays are available:

tesla

Screen capture and Streaming

Tools and Utilities

Updating Horizon OS

  1. Boot into Stock SysMMC and update the firmware.
  2. Wait for the modchip to retrain and boot back into Hekate.
  3. Run Lockpick_RCM and select Dump from SysNAND.
  4. Run TegraExplorer, select Browse the SD card option and run this modified script and select Dump sysmmc.
  5. Copy the latest hekate release over to the SD card.
  6. Copy the latest Atmosphere release over to the SD card.
  7. Copy the latest sys-patch release over to the SD card.
  8. Copy the latest fusee.bin to sdcard:/bootloader/payloads/
  9. Replace sdcard:/payload.bin with hekate_ctcaer_X.Y.Z.bin from hekate.
  10. Backup the sdcard:/atmosphere/contents/ folder to the computer and delete the folder.
  11. Run Daybreak and select sdcard:/tegraexplorer/Firmware/xxx. Choose Perserve settings and Install (FAT32 + exFAT). Reboot and check everything works.
  12. Restore sdcard:/atmosphere/contents/ and update all homebrew to be compatible with the new firmware.
  13. Themes will have to be reinstalled. Delete the 0100000000001000 and 0100000000001007 folders if they exists under sdcard:/atmosphere/contents/ or Atmosphere will crash.

Theming

I followed the guide on Rentry about theming. It requires NXThemesInstaller, and comes packaged with a tool to build and unpack themes.

Themes can be downloaded them Themezer and copied onto the microSD card, or by using themezer-nx to download them directly on the Switch.

I built my own theme using images from the movie Your Name. It uses:

Download my theme from here.

home

all

lock

Forwarders

Forwarders are shortcuts to homebrew apps that can be launched from the home screen without going through the homebrew menu.

To create a forwarder, I used a tool called SAK which has a NRO forwarder feature. Fill in the details about the application and also include an icon. I used icons from these posts on gbatemp.net:

nro forwarder

Copy the .NSP file onto the Switch's microSD card. The .NSP file can be installed through DBI or Tinfoil.

dbi

Aftewards, go to the home screen and it will then appear as a game/title with all the information provided to SAK.

Download the Homebrew Menu forwarder I created above here.

installed

Overclocking and Undervolting

I overclocked and undervolted following the Really Simple Overclocking (OC) Guide on Rentry. The overclocking utility Switchcraft EOS can be found on GitHub.

My Switch details are:

Setting Value
DRAM ID WT:F
CPU Speedo 0 1680
CPU Speedo 2 1687
SoC Speedo 1704

hw fuses

With my values, I followed the guide and used their recommended overclocked settings. To achieve a higher RAM clock than 1600 MHz, the loader.kip file has to be modified by the webpage configurator.

oc toolkit sc

Games

I do not condone piracy.

NSZ

The NSZ format is a compressed version of NSP using the loseless zstd compression algorithim. I prefer storing my games in the uncompressed NSP format, as this works with emulators such as yuzu and Ryujinx. To (de)compress games, I use the official nsz GUI by nicoboss. Make sure to enable 'Parse Cnmt' under Settings > Advanced.

decompress

If games are over 4GB and the microSD card is FAT32 formatted, they are split into multiple files. To merge these together, I use ns-usbloader by developersu.

merge split

Management

I manage my .NSP game files using Switch Library Manager. After decompressing my .NSZ files above, I move them into my games folder and it does the rest. What I love about it:

  • Shows missing DLC and updates
  • Renames files
  • Organise files into folders
  • Finds duplicates
  • Warns if older update files exist (updates are cumulative)

switch manager

Network Install

Installing games, updates and DLC over the network are supported in both Tinfoil and DBI. The files only need to be served over HTTP/HTTPS using a web server with directory listing enabled. However, all files must be within the same directory can cannot be in separate subdirectories.

Instead of a traditional web server, I use PHPinfoil. It supports subdirectories, as it scans through all files and folders and creates a JSON file to be provided to Tinfoil. This makes it pair well with Switch Library Manager for file management. One downside is the /?reset endpoint needs to be called manually to refresh the directory listing.

phpinfoil

Accessories

Screen protector

I was given this free tempered glass screen protector at JB Hi-Fi. It's probably like any other.

screen protector

Case

For general protection, I use the HeysTop Dockable Case from AliExpress. Compared to other cases on the market:

  • It can dock with the case on
  • The kickstand is still accessible
  • Ergonomic grips for handheld
  • Joy-Cons are easily removable
  • Fits two game cartridges
  • Only $15 AUD

HeyStop make another case for the OLED Switch, but I returned it as it had issues making a connection to the TV when docked. Another review on Amazon mentioned the same thing.

case 00

case 0

case 1

case 2

case 3

Carrying Case

I went with the official Nintendo carrying case, for when travelling somewhere with the device. It comes with a plastic screen protector as well, but I preferred my tempered glass one. It fits perfectly with the HeyStop case. and can also hold more game cartridges and a glass cleaner.

carrying case 0

carrying case 1

Controllers and Charger

We have two sets of Joy-Cons and two Pro Controllers. This is a perfect balance between party games (Switch Sports) and games that require finer control (Mario Kart). The reason is that Joy-Cons can be attached to the grip, turning them into regular controllers, to give a total of four controllers (two sets of Joy-Cons and two Pro Controllers).

controllers

To charge all these controllers, I purchased a 6-in-1 charging station. It charges over a USB-C cable connected to the dock.

charger 1

charger 2

It recommends a 5V/2A power source, but I didn't see it having any issues when measuring with the dock or an external charger.

charger 3

Note, I've had to return two chargers already after one Joy-Con charger would no longer charge, so buy from somewhere with an easy return policy.

HORI Taiko No Tatsujin Drum Mod

Taiko No Tatsujin is a popular rhythm drumming game from Japan by Bandai Namco. The most popular controller for the game is a licensed drum kit made by HORI.

taiko drum

The HORI drum has low sensitivity, and you have to hit fairly hard to register hits. I followed the popular 'dollroom mod' to increase sensitivity using cork trivets and rubber adhesives. There are similarly guides in English on Reddit and YouTube.

taiko foam

taiko cork

taiko mid

For the 'ka' mod, I used a 1cm wide strip to cover the entire sensor. This resulted in an almost perfect amount of sensitivity, I think it needed just a bit more.

taiko rubber

Here are the final results, tested on https://melon.cx/tatacon/: