Package an IPA on Windows
Assemble a playable D2R Mobile iOS package on Windows 10 or 11 without a Mac or Xcode. Using official release shells, your legally owned Switch game files, and source-built SPIRV-Cross, the d2rm_pack.py tool produces an unsigned IPA ready for sideloading.
Overview
The experimental no-Xcode route assembles an iOS package (.ipa) on Windows 10 or 11 without a Mac. Upstream reports an end-to-end Windows 11 packaging test, but states that the resulting no-Xcode IPA and signing route have not completed an iPhone/iPad physical installation test. This site has not reproduced that test either.
Instead of compiling native iOS code from scratch, you download an official pre-built shell package (which contains no copyrighted game content) from GitHub Releases and use the upstream Python packaging tool to inject your legally owned game files, translated shaders, and UI assets into an unsigned .ipa.
Windows Requirements
Ensure the following dependencies are installed on Windows 10 or 11 (64-bit):
- Python 3.9 or later (with Add python.exe to PATH checked during installation):
cmd python -m pip install pillow numpy lz4 capstone unicorn - C Compiler & Toolchain:
- Install LLVM (providing
clangandclang++). - Install .NET SDK.
- Install Git, CMake, and Ninja.
- SPIRV-Cross Compiler (Version 1.4.357.0):
- Follow the upstream source-build route, pinned to SPIRV-Cross tag
vulkan-sdk-1.4.357.0:cmd git clone --branch vulkan-sdk-1.4.357.0 --depth 1 https://github.com/KhronosGroup/SPIRV-Cross cmake -S SPIRV-Cross -B SPIRV-Cross/build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ -DSPIRV_CROSS_ENABLE_TESTS=OFF cmake --build SPIRV-Cross/build --target spirv-cross - Add the directory containing the resulting
spirv-cross.exe(SPIRV-Cross\build\) to your systemPATH. (Note: Version 1.4.357.0 is strictly required because shader translations differ across versions; the packaging tool validates shader source digests and halts on mismatches). - Disk Space: Approximately 12 GB free for intermediate caches and working files.
- Game Files: Switch release 1.0.34.0 (3.3.94012), dumped from your own console, containing
ExeFSandRomFS.
Step 1: Download the Shell and Source
- Clone the repository, then check out the exact source tag or commit identified by the shell’s Release before packaging. A plain clone selects the current development branch and does not establish a match:
cmd git clone https://github.com/d2r-mobile/d2r-mobile.git cd d2r-mobile - Download the pre-built shell archive from the upstream repository's GitHub Releases page:
D2RMobile-shell-build-input.zip: For iOS 26 and later.D2RMobile-shell-ios18-build-input.zip: For iOS 18 through iOS 25. (The repository source and the shell must be from the exact same release).
Step 2: Run the Packaging Tool
Execute dm/tools/d2rm_pack.py with positional arguments:
python dm/tools/d2rm_pack.py <shell.zip> <game_files_directory> <output.ipa>
Example:
python dm/tools/d2rm_pack.py D2RMobile-shell-build-input.zip C:\d2r\Update d2r-output.ipa
Argument Details
<shell.zip>: Path toD2RMobile-shell-build-input.zip(orD2RMobile-shell-ios18-build-input.zip).<game_files_directory>: The directory containing bothExeFS/andRomFS/.<output.ipa>: Desired path for the generated package.
What the Packager Does
- Rewrites the Switch game executable into a dynamic library.
- Extracts and generates UI assets and data tables from game files.
- Translates game shaders into Metal Shading Language (MSL) text using
spirv-cross. - Assembles the final package (approx. 130 MB).
- The first run takes 10–12 minutes (primarily shader translation); subsequent runs skip already-completed steps.
(Note: During shader translation, the tool updates dm/gfx/tools/dmsh_chain.lock and dm/gfx/nvn/dmsh_chain.h with local toolchain versions; this is expected behavior).
Older Devices (A16 and Earlier Chips)
If packaging for an iPhone 14 series, iPhone 15 / 15 Plus, or older device:
1. Download astcenc for Windows (bin/astcenc-avx2.exe from the official ARM release: https://github.com/ARM-software/astc-encoder/releases).
2. Generate the texture pack:
cmd
python dm/tools/astc_pack.py <game_files_directory>/RomFS legacy-pack/work --astcenc <path_to_astcenc> --preset thorough
python dm/tools/casc_overlay.py pack <game_files_directory>/RomFS legacy-pack/pack legacy-pack/work/repl.tsv 0-8
python dm/tools/astc_pack.py finalize legacy-pack/pack
3. Set the environment variable before packaging:
cmd
set "D2RM_ASTC_PACK=%CD%\legacy-pack\pack"
python dm/tools/d2rm_pack.py <shell.zip> <game_files_directory> <output.ipa>
4. Copy the resulting legacy-pack\pack\Legacy Device Pack folder to your phone alongside the 18 .data files.
Step 3: Sign and Sideload onto Your iOS Device
- Connect your iPhone or iPad to your PC via USB.
- Open Sideloadly or AltStore.
- Drag your generated
d2r-output.ipainto the tool. - Enter your personal Apple ID to sign the package.
- Click Start to install the app on your device.
- On your iOS device:
- Navigate to Settings > General > VPN & Device Management, find your developer certificate under Developer App, and tap Trust.
- If using iOS 16 or newer, enable Developer Mode in Settings > Privacy & Security > Developer Mode and reboot.
Step 4: Transfer Game Resources
The install package does not bundle the 5.6 GB of game assets:
1. Put the 18 .data files from RomFS/data into one folder.
2. Connect your phone to your PC, open iTunes or the Apple Devices app, go to File Sharing > D2R Mobile, and transfer the folder. Alternatively, transfer the folder via local network/cloud and place it in Files > On My iPhone > D2R Mobile.
3. Return to the app and tap Retry.
First Launch: Preparing Shaders
Because the package was assembled on Windows without Apple's Metal shader compiler: - Upon launching, the app displays a \"First launch: preparing shaders\" screen with a progress bar and remaining time estimate. - It compiles all 7,212 shaders on the phone once (measured at approx. 7 minutes on an iPhone 17 Pro Max). - The device will become warm as CPU cores run at full capacity. - Interruption is supported: You can safely switch apps or close the game. When reopened, already-compiled shaders are verified in less than a millisecond, and compilation resumes from cache. - Once complete, the game boots directly into the main menu. Subsequent launches skip compilation entirely.
Operational Notes
- End-to-End Test Status: Upstream verified the Windows packaging workflow on Windows 11 with Python 3.12, confirming byte-identical executable outputs compared to Mac-generated packages.
- Performance Expectations: In-game performance depends on device SoC and thermal limits; figures cited represent upstream test logs rather than guaranteed site benchmarks.
Frequently Asked Questions
Can I download a prebuilt spirv-cross.exe installer for Windows?
The reviewed upstream route builds SPIRV-Cross from source using Git, CMake, Ninja and LLVM. SPIRV-Cross—not LLVM itself—is pinned to vulkan-sdk-1.4.357.0. Other versions translate shaders differently and fail the packaging tool's digest validation.
What happens during first launch on the phone?
Because Windows lacks Apple's Metal shader compiler, shaders are included as MSL source text. On first launch, the phone compiles all 7,212 shaders on-device (approx. 7 minutes). You may safely switch apps or close the app; the system caches compiled shaders and resumes quickly upon relaunch.
Does sideloading with a free Apple ID last permanently?
No. Apple enforces a 7-day expiration policy for personal free Apple ID certificates. You must re-sign and refresh the application weekly using Sideloadly or AltStore. Keep the same app identity, install over the existing app and back up saves first. Do not uninstall it as a renewal step.