This is a fix release with 101 fixes; details below.
What changed
- Exports now deliver a single game image. New packages keep the game's resources in one image file; iPhone / iPad only installs the original resources and reads them through a prebuilt index at launch instead of rebuilding the directory on the device. Installation shows its progress in stages (unpacking / extracting small files / verifying).
- 60 fps is now opt-in per game. Games run at their original frame rate by default; games verified to run at the right speed at 60 fps, and games that are natively 60 fps, stay at 60. Takes effect with the new app on existing packages, no re-export needed.
- iOS display settings are now saved per game instead of applying to every game.
- iOS home-screen quick actions are now "Export diagnostics" and "Settings", and they work from the library; save management moved to long-pressing a game card ("Manage saves…"); the performance overlay uses one switch in both library settings and in game.
- Mac: local multiplayer with several controllers in the game window (2 / 4 players); Joy-Con can be split into separate slots. (#282 #592, thanks @kaiying1994 and @lucaAce1024)
- iPhone / iPad now support several local controllers too: system controllers are assigned to 1P–4P in connection order and return to their slot after reconnecting; rumble and motion currently go to 1P only.
- Controller button layout can be set to Auto / Switch / Xbox for all games; Auto follows the letters printed on the buttons. The Mac game window now also accepts third-party controllers that only provide a basic profile.
- Local players: switch players from the top of the iPhone / iPad library or the Mac launcher's top bar; each player has separate saves for the same game, and existing saves belong to the first player. (#623)
- The landscape game library is now a cover-flow deck you can drag and fling. (#191, thanks @Tiaoge-tou)
- The launcher and in-game menu show the specific Switch 2 controller model. (#535, thanks @nevenhsu)
- Folder paths shown in the launcher are now clickable and open in Finder / File Explorer.
- The S2Arm version is now shown in the Mac / Windows launcher top bar and at the top of the iPhone library and in its settings, so a screenshot shows which version you are on.
- Mac launch settings gain "Game language": follow the system or pick a language; it applies the next time you start the game.
- Launcher entries tidied up: "Environment check" in the top bar is now "Settings", which also holds the interface language; the library, iPhone packages and disk space are together under "Storage locations"; clicking the brand name returns to the welcome page; one-click export on the Mac welcome page opens the same export page as the library.
- New Mac game launch page: a cover card with two stages; errors show one plain sentence and the next step, and a game that quits on its own while running is reported as a crash.
- When a button is greyed out because another task is running, hovering over it tells you which task it is waiting for; on Mac, changing covers, freeing space and save actions also show what they are waiting on.
- New 5.1 downmix option for audio on Apple devices; default behavior is unchanged. (#610, thanks @kurtzou1)
- The game's preferred language list in iOS Settings now shows every available language. (#593)
- Diagnostic bundles now use a short file name, easier to attach to reports.
- Mac / Windows launcher: when S2Arm on your iPhone is older than the launcher, an "Update S2Arm on iPhone" button appears at the top of the library. It replaces only the app and does not re-push unchanged game resources; games the new version can no longer run are listed first, and you can re-export them together or later.
- When a fix lands in the game-code rewriter, affected games only have the rewritten parts replaced, applied with "Update S2Arm on iPhone" or at the next game start, with no re-export and no resource re-push.
- How to install to iPhone is now a single card in the environment check, where the signing identity is set; the export page shows one line with the current install method and a "Change" button.
- If pushing a game image to the device is interrupted, the next install resumes where it stopped instead of starting over.
- Self-signing / sideloading players can copy game.img into the "Import Here" folder of S2Arm in the Files app; it is picked up automatically when the library opens, when the app returns to the foreground, or on "Check again".
- The Mac installer (DMG) has a new drag-to-install window. (#107, thanks @Xc1Ym)
- New Windows installer: installs for the current user with Start menu and desktop shortcuts, can be uninstalled from Windows without touching game data, and matches the Mac installer's look; the main Windows button on the download page now gets the installer, with the zip kept as the "portable" option.
- Smaller downloads: the Windows build no longer bundles an extra copy of .NET and drops unused Git components; the Mac build keeps only the Apple silicon signing tool.
- With 60 fps on, if the device temporarily can't hold it you are told the game is back at its original frame rate; it retries automatically and tells you when 60 fps is restored.
- Automatic updates now download new versions from the official download site (dl.s2arm.com) and fall back to GitHub if that fails; either way the download is checked against the signed manifest. Takes effect for updates from 0.3.0 onward.
- Installing to iPhone no longer stops when something is uncertain: if the games on the phone can't be read, or whether S2Arm is installed can't be determined, the install goes ahead; when saves can't be backed up before overwriting, other games on the phone need rebuilding for the new version, or games installed from another computer would be dropped, you are told the consequence and can confirm to continue; if the resources are already on the phone and only unpacking is left, the transfer counts as done and you are reminded to open the app to finish. The "Install to iPhone" button is no longer greyed out just because the environment check hasn't fully passed.
- Mac launcher: deleting a game / clearing cache now responds immediately and never stops halfway; device connection status matches reality; devices that had S2Arm self-signed before can use one-click install.
- Touch input on iPhone / iPad is now also recognized by games as gestures. (#568)
- Fixed controller rumble not working on some iOS devices. (#584)
- Safe stubs for unimplemented graphics functions are now decided by who calls them, fixing at the root the 0.2.8 issue of taking over functions from a game's own libraries. (#601)
- Switch 2 games: fixed a final boss fight dropping to 1–2 fps (#41) and another game crashing when reading a specific address (#351). Please retest and let us know.
- The on-device shader cache moved to a location excluded from iCloud backup; the old cache is moved over automatically on first launch.
- The launcher now checks for updates via a signed version manifest on the official site first and falls back to GitHub, so update checks work even when GitHub rate-limits the connection. Takes effect from v0.3.0 on.
- iOS library: deleting a game responds immediately, runs in the background, and tells you how much space was freed.
- iOS: fixed the app being terminated by the system about 10 seconds after going to the background. (#543, thanks @Xc1Ym)
- iOS: overlay switches in Settings now take effect after relaunch. (#153 #208, thanks @jazz-zzzz)
- Automatic quality tiers no longer change docked / handheld mode; the mode is always your own choice. (#522, thanks @nevenhsu)
- Switch 2 controllers: reconnecting a remembered Joy-Con 2 also looks for the other side, and a failed link no longer stops scanning; on Mac, a controller connected in S2Arm after the game has started now reaches the game. (#525 #526, thanks @nevenhsu)
- Apple devices now report 5.1 support based on the actual number of output channels. (#577, thanks @kurtzou1)
- A Switch 2 game: fixed black patches on island vegetation and incomplete models near the coast. (#505 #508, thanks @nevenhsu)
- Fixed some games' exports staying on "Preparing resources" for a very long time. (#509, thanks @ckuffff)
- Exporting failed for games whose program has no resource section (NCA section 1 does not exist); they now export with empty resources. (#620)
- Games that only support Polish or Thai are no longer treated as having no language and falling back to English.
- Windows: multi-program collections could not be exported for iPhone (#613); importing NSZ wrote temporary files to the system drive and failed when it was full (#612). Temporary files now go to the library's drive.
- The pre-export space check now uses the drive that is actually written to, so an external storage location is no longer checked against the wrong drive; NUP games no longer have their required space overestimated twofold.
- Store banners could not be saved when the library was on an external drive. (#571, thanks @ha7rock)
- When the launcher reports a problem with its built-in engine on first launch, it now shows the actual git error instead of always asking you to reinstall. (#638)
- Mac: fixed installs to iPad failing when the device information contained invalid characters. (#633, thanks @albionlee)
- Windows installs no longer look for the signing tool in Desktop / Downloads, so a same-named program there can't be picked up.
- Save folder: changes are detected by content; the first save you drop in no longer has folders stripped by mistake; write-back keeps the user ID so the game doesn't treat you as a new player; an interrupted write-back is recovered on next launch.
- Windows launcher: pages such as export and library no longer jump down or back to the top every second.
- Batch export: a batch paused for a full disk can no longer be resumed by mistake, only retried; games with platforms still pending count as unfinished. The last progress lines of an export are no longer lost, so the screen doesn't freeze on old readings.
- Export progress now only moves forward instead of jumping back (for example from 91% to 40%). (Mac / Windows)
- Exporting now works when the storage location is on an external drive; most writes go to that drive and the system drive only needs a small fixed amount of space.
- When unpacking Switch 2 NUP games, files that are identical in the base game and the update are written only once, so exports need much less space.
- For games with a very large number of shaders, export re-checks free space by shader count before translation starts, so it no longer fills the disk halfway through.
- Large games no longer sit on "Extracting" for a long time during export; the extraction step no longer opens every file one by one. (#606)
- Old-version leftovers and remnants of interrupted runs in the export cache are now cleaned up automatically. (#338, thanks @kurtzou1)
- After an automatic launcher update, the unpacked files, deltas and downloads of earlier versions are deleted instead of taking up another full copy on the system drive each time. (#660)
- "Free up space" now shows how much deleting each item alone would free, and the total follows your selection without counting shared data twice.
- Adding games recognizes Switch 2 .nup files: the Windows file picker shows .nup and has separate buttons for files and folders; on Mac, dropping a .nup on a game card is no longer treated as a save. (#611)
- The Mac launcher's storage location now shows the full path instead of just the volume name. (#553, thanks @kurtzou1)
- Mac batch export: installing automatically after the batch is no longer blocked, and an export started separately during a batch runs after the batch finishes.
- With several devices connected, installing, re-signing and "Update S2Arm on iPhone" only target the device you selected; if it is offline you are told directly, unpaired devices are named as such, and you are told to plug in or join the same Wi-Fi.
- Install failures explain themselves: if unpacking fails on the phone, the app's reason is shown right away instead of reporting "unpacking did not start" after 180 seconds; install / import failures on iPhone / iPad show one sentence and the next step; if the app cannot write to a game folder it says why and moves to a new folder automatically; library cards say what they are waiting for, and games with data no longer disappear silently. (#569 #540, thanks @Catnip202X)
- Mac: after a large push is interrupted, S2Arm no longer falls back to a system transfer that reads the whole file into memory and could freeze the Mac; it asks you to reconnect and install again, resuming next time. (#641)
- Windows: adding games failed when the private folder was owned by another account; it is now repaired in place, and if that is not possible you are told how to recover. (#672)
- Windows first run: "Open official page" for the Metal compiler now goes straight to the download section, and the welcome page has step-by-step instructions.
- iOS: the file pickers for cheats and cloud saves now open in their folders instead of hanging on "Recents"; game resources moved out of the folders visible in the Files app to a location excluded from iCloud backup, and existing ones are moved on first launch.
- Lower game audio latency on Apple devices; the extra 64 ms start-up buffer is no longer applied. (#260, thanks @kurtzou1)
- Mac: fixed a game crashing randomly after 10+ minutes of play (#668), and some games quitting after a while because the GPU was wrongly judged to be hung (#647).
- Mac direct mode: the first time new visuals appear, the frame no longer stalls waiting for shaders, so hitches are much shorter; also fixed two cases of flicker caused by reading stale image content. (#187, thanks @Xc1Ym and @DanielZhangyc)
- Fixed a racing game crashing on entering a race on iPhones without BC texture support (such as A16 models). (#407, thanks @wowkiseki)
- Fixed a game's intro video freezing on a dark frame. (#529)
- Fixed a game stuck on its "connecting" loading screen: when offline, the account selection step now fails as on real hardware, and the game continues offline. (#621, thanks @albionlee)
- Switch 2 games: fixed a game crashing when it sets a target frame rate (#679), and another game flickering with models popping in and out the first time a new area is entered (#674).
- Fixed a game that exported fine on Mac but crashed after launch. (#515)
- Content drawn with polygon primitives is no longer dropped. (#635)
- Export: games whose code happens to contain certain bytes no longer end up with no direct library (#477); a shader without an entry point is now skipped instead of failing the whole export (#518). (thanks @Catnip202X and @wwmogu)
- Rewriter: functions that keep using data below the stack pointer after restoring it are no longer rejected wholesale. One Switch 2 game previously had 27 spots that could not be rewritten and could not be built at all; it now builds. (#704) When a build hits code the rewriter doesn't support yet, the message now says plainly that the game can't be built yet and we're working on it, and that a copy already on your iPhone keeps working.
- Rewriter: when an instruction that computes an address from its own location (adr / adrp) sits inside a jump table sequence, it is now re-encoded for its original target when moved into the patch area instead of being recorded as a rewrite gap. One game could not be built because of this. (#716)
- Windows: building large games failed with an out-of-memory error (MemoryError) while extracting shaders. Extraction no longer copies the whole file for every shader, and the number of parallel extraction and compile jobs is capped by available memory; if memory still runs out, the error says so and suggests closing memory-heavy apps or increasing virtual memory. (#711)
- A Switch 2 game stopped during the "refresh" step (NRR hash table out of range). The newer NRR layout is now recognized; an unrecognized NRR or a damaged NRO is skipped and logged instead of stopping the whole build. (#713)
- A sports game showed black patches on the near-shore water. Task / mesh shader payloads larger than 16 KB now go through device memory. (#712, thanks @nevenhsu)
- Garbled edges in in-game videos. VP9 intra prediction now extends edges according to the coded, aligned range. (#362, thanks @DanielZhangyc)
- Includes all fixes from v0.2.9 (#602 and others).
- Android now always uses the direct graphics path and no longer falls back to the generic backend.
- Four-finger long press opens a touch menu: drag to edit the virtual controller layout (saved per game) and toggle touch passthrough; the menu is now available in Chinese. (#544 #605, thanks @wwmogu and @ahearnlam)
- Built-in joystick-like sensors are no longer treated as a connected controller, so the virtual controller is no longer hidden.
- Games whose modules come in the imported package now start on release builds, and the game screen is locked to landscape.
- Automatic quality tiers, frame-rate notices and thermal / power-saving downgrades now work on Android. (#500 #600, thanks @yyan160 and @wwmogu)
- Community patches are now included in Android packages. (#504, thanks @wwmogu)
- Direct graphics coverage and fixes: games built with SDK 10 or earlier no longer abort at launch; buffer / texture copies support more formats (#537); binding only a compute program no longer replaces the draw program (#538); indirect draws and indirect compute dispatch are wired up (#574); replay state is kept across submits (#539); a failed clear submit no longer frees commands the frame queue still holds (#572). (thanks @ha7rock, @wwmogu and @n06ody)
- Exporting Android packages on Mac now passes signature verification with a Homebrew-installed JDK.
- The touch menu can switch between handheld and docked mode; it applies immediately when the running game allows it, otherwise at the next launch.
- Game threads in multithreaded games are no longer all squeezed onto one CPU core, fixing a 3D game running at only a few frames per second on its title screen.
- Windows: when updating from an older version inside the launcher while Impactor is running, the update fails and the button goes back to "Update and restart". End Impactor in Task Manager first, then click "Update and restart" again; or download the installer and install the new version directly — installing to a new location is not affected.
Before updating
Back up saves and review migration notes for your installed version. Release notes describe upstream changes, not independent compatibility testing by this site.
Read the full upstream release