Claude got Zelda running natively on the iPhone Duo at 120fps.
Ocarina of Time, full screen on the Duo's inner 7.6" screen. Claude Code did almost all of it: it built the game from source, found why it rendered black on the Duo, patched it, installed it over a cable and edited the save so I could skip to the good parts.
→This is Ship of Harkinian, a native port rebuilt from the decompiled game code and compiled for iPhone. You supply your own game file. None come bundled.
→A free tool called PadMint builds the iPhone app on a Mac. On the Duo it came out black, and Claude traced it to one thing: iOS reports the small outer screen as the main screen.
→Once that was fixed, Zelda runs at 120fps with an HD texture pack, and you can spawn as adult Link anywhere in Hyrule.
🔒Drop your email, get the full setup
Every step and Claude prompt: the Duo fix, 120fps, HD textures and the save edits.
Join 6,800+ builders already getting this. No spam.
THE FULL SETUP · 8 STEPS
01
What you need
Everything here is free apart from the hardware. The game files are yours to supply: PadMint ships no games, and the app asks for your own copy.
Thing
Why
Mac with Apple Silicon (M1 or newer) and Xcode
Builds the iPhone app. I built on a Mac mini over SSH.
Claude Code
Runs the build, the fixes and the installs from one terminal.
Free Apple ID
Signs the app. A free ID allows 3 sideloaded apps at once and they expire after 7 days, so reinstall weekly.
USB-C cable
Installs the app and copies files straight into its folder.
Your own game file
An Ocarina of Time N64 ROM.
02
Build Zelda with PadMint
PadMint downloads Ship of Harkinian (the Ocarina of Time port), its tools and dependencies, and builds an iPhone app. The first build took about 10 minutes. Hand the whole thing to Claude Code:
Install PadMint (github.com/chrissotraidis/padmint) on this Mac and build HarkinianPad (Ocarina of Time) for iOS. Install any Homebrew dependencies it needs. Tell me where the .ipa ends up.
GitHub's free Mac runners sat in a queue for an hour and got cancelled for me. Building on your own Mac was faster.
03
Fix the black screen on the Duo
On the Duo, Zelda played audio over a black screen. Claude pulled the app's logs and config off the phone and found the game window was 466x678, the size of the outer screen in portrait. iOS reports the outer panel as the main screen, so the game drew itself for the wrong display. Mario Kart's port already moves its window onto the active screen. Zelda's didn't, so Claude ported that same fix into Zelda's source and rebuilt. Paste this if your build comes out black:
This SDL game builds and plays audio but the screen is black on my foldable iPhone. Pull its config and logs off the phone with pymobiledevice3. If the saved window size matches the outer screen, patch the source so that right after SDL_CreateWindow the UIWindow is attached to the foreground UIWindowScene, its frame is set to the scene's bounds, and landscape is requested. Set the SDL landscape orientation hint before SDL_Init and allow fullscreen on iOS. Rebuild and install it.
Faking the iOS version in the app (the trick that fixed Dolphin for Wind Waker) made this one worse. SDL ports need the source fix.
04
Turn on 120fps
Setting the game to 120 alone made the picture stutter and the audio crackle. iOS caps third-party apps at 60Hz unless the app opts in with one line in its Info.plist. Mario Kart's app had it and Zelda's didn't. With both in place it's smooth.
Then in shipofharkinian.json set CVars.gSettings.InterpolationFPS to 120. Edit it with the app fully closed, the game rewrites the file when it quits.
05
Install it over the cable
Sideloadly works if you'd rather click. I had Claude do it from the terminal so it could reinstall on every rebuild: sign with your Apple ID, install with ideviceinstaller, then copy your ROM into the app's Documents folder. The first launch unpacks the ROM on a blank screen for a minute, so let it sit.
Sign this .ipa with my Apple ID, install it on my plugged-in iPhone, then push my Ocarina of Time ROM into the app's Documents folder with pymobiledevice3.
06
Add the HD textures
OoT Reloaded is a fan-made HD texture pack with a version built for Ship of Harkinian. Get the HD .o2r download (about 600 MB). It unpacks to 4 GB, so if your Mac is short on space, have Claude stream it straight to the phone without saving it first.
Extract OoT_Reloaded_v11.0.0_HD.o2r from this .7z and stream it straight into the HarkinianPad app's Documents/mods folder on my iPhone. Then set CVars.gSettings.AltAssets to 1 in shipofharkinian.json while the app is closed.
Test the .7z first. My first download came out corrupt because the Mac's disk filled up mid-download.
07
Skip to the good parts
A fresh save starts in Kokiri Forest. Ship of Harkinian stores saves as JSON, so Claude rewrote mine: adult Link, 20 hearts, magic, Master Sword, every item and song. Then it turned on the game's Remember Save Location setting and changed where the save loads, once per location I wanted to film. Back up the save first.
Spawn
Entrance
Scene
Lake Hylia, warp pad island
0x0604
0x57
Gerudo Valley
0x0117
0x5A
Temple of Time, inside
0x05F4
0x43
Pull Save/file1.sav from the HarkinianPad app and back it up. Make Link an adult with 20 hearts, magic, the Master Sword, every item and every song. Turn on gEnhancements.RememberSaveLocation and set the save to load at Lake Hylia at noon. Push it back with the app closed.
08
What's still rough
Leaving the app (Control Center, a notification, a brightness swipe) can turn the game black. Close it and reopen. Autosave keeps your spot. Screenshots blank the game picture on these ports, so film with screen recording or a second camera. And touch controls can't play the ocarina reliably, which is why I set the spawn points in the save instead. A Bluetooth controller fixes it.