Skip to content
forked from boykopovar/AnyPS5

About

Tool for automatic PS5 executables porting to MacOS ARM

Topics

Resources

Contributing

Stars

41 stars

Watchers

1 watching

Forks

 
 

Repository files navigation

AnyPS5-ARM

Run PS5 games natively on Apple silicon Macs.

Full guide in English and Turkish / Türkçe rehber

The AnyPS5 app

AnyPS5.app is a launcher laid out like the PS5 home screen. Point it at the folder with your game dumps and it does the rest: it finds the games, unlocks (converts) them for the Mac, starts them, and keeps your controls, saves and trophies per game. No Terminal, build or Vulkan SDK needed.

The AnyPS5 launcher in action

▶ Full video with sound (1:39, MP4)

curl -fsSL https://github.com/utkuhalis/AnyPS5-ARM/releases/latest/download/install.sh | sh

One line installs it into Applications (and Rosetta 2 if it is missing). A download through curl carries no quarantine flag, so macOS opens the app without any "cannot be opened" warning. ⬇ Or download the zip · How to use it

On Windows or Linux? Use AnyPS5 Desktop: this launcher for those systems, with AnyTogether built in (early preview).

First start

Three steps: the language (Türkçe or English), one of three animated themes (Cosmic, Aurora, Sunset) and the games folder. The folder and its subfolders are scanned, and games you add later show up on their own.

Picking a theme on the first start

Home screen

Home screen with Hollow Knight: Silksong selected

Every game sits in a row of tiles with its icon. The selected one grows, its artwork drifts behind the screen, and below it are the facts: status, size on disk, title ID and version. A tile with a lock still has to be unlocked. Under the title:

  • Play, or Unlock, Retry and Cancel as the state calls for.
  • 🏆 8/34, the trophies earned, when the game has a trophy list.
  • ⋯ for the game's settings.

Unlocking

A game being unlocked

Unlock turns a PS5 dump into a Mac app in seconds to a few minutes, with a progress bar like the console's:

  1. Unwrap: eboot.bin and every module are opened, even when they are still SELF containers. A dump that is still encrypted is reported, not converted.
  2. Relink: the relinker writes a Mach-O executable and macOS modules. Unity titles get their Media/Modules and Media/Plugins folders too.
  3. Copy: the game files become APFS clones of the dump, so an unlocked game takes no extra space.
  4. Bundle: the libraries, MoltenVK, the per-title patches and a launch script go into the app.

Several games can be queued. When the launcher's toolkit is newer than the one a game was unlocked with, its status reads Update available; ⋯ → Unlock Again brings it up to date and keeps its saves and trophies.

Starting a game

The start screen while a game opens

Play shows a start screen with the game's icon and a timer until the game's first window appears. The first start of a title takes longest, because Rosetta translates it and its shaders compile; later starts use the caches. Esc stops the game before it shows. Once the window is up the launcher hands it the front, and it can hide itself while you play (Settings → Behaviour).

When a game stops

When a game ends on an error, the launcher reads why from that start's log and from the crash report macOS leaves, and says it in plain words, on the home screen and in the log:

  • a missing module (unlocking again may fix it);
  • a system function the engine does not support yet, by name;
  • the GPU stopping or running out of memory;
  • any other engine error, with its message;
  • a crash, such as EXC_BAD_ACCESS (SIGSEGV).

⋯ → Make a Report (or the button in the log) saves a text file to attach on Discord or GitHub: the Mac model and chip, macOS, the launcher and toolkit versions, the game, its settings, the reason and the log of its last start.

Game settings

Game settings

Each game keeps its own settings, applied at every start:

  • Output resolution, for titles with a resolution patch (such as Stray).
  • Window or full screen, and the window size.
  • Vertical sync.
  • Frame generation (experimental): a frame made between each two of the game's, from the motion between them, so a 60 fps game shows 120 on a 120 Hz display. It needs vertical sync and turns itself off where it would cost the game frames (a 60 Hz display, or Low Power Mode, which holds the display at 60 Hz).
  • Controls (below).
  • Trophies (below).
  • Advanced (below).
  • Performance overlay, off or in any corner of the window: Minimal, one line in a small capsule (frames per second, generated frames, frame time, GPU and CPU use, memory), or Detailed, the panel with the frame-time graph.
  • Game language: the launcher's, or any of the console's languages.
  • Screenshots: the game's F12 shots and clips in a grid, and one at a time over the whole screen, a clip playing.
  • Back Up Saves and Restore Saves: the game's saves and trophies as a zip in Documents → AnyPS5 → Backups; a restore backs up what the game had first.
  • Unlock Again, Show in Finder, Open Log, Make a Report, Clear Shader Cache and Remove Installation.

Controls

Waiting for a key for Square

The keyboard and mouse layout of each game. Pick a pad button or stick direction and press the key you want; Esc cancels. A key you give to one button leaves the button that had it, and mouse buttons stay where they were. Reset to Default Keys brings back the layout below. A connected game controller keeps its own buttons.

Pad Keys
Left stick W A S D
✕ / □ / ○ / △ K (also Space, Return) / J (also left click) / L / I
L1 / R1 Q / E
L2 / R2 U (also mouse button 4) / O (also right click)
L3 / R3 Shift / Ctrl
D-pad Arrow keys (also the mouse wheel for up and down)
Right stick T F G H
Options / touchpad Esc / Backspace (left) and Tab (right)
Slow movement none: give it a key to walk with the keyboard

For Unreal Engine games, each button also shows what the game itself does with it (Jump, Sprint, Move forward), read from the game's own input settings in its .pak. Games whose pak is encrypted or that keep their controls only in Enhanced Input assets show nothing there.

The launcher writes the layout to ~/Library/Application Support/AnyPS5/Controls/<game>.ini at each start and passes it to the game (format).

Advanced settings

The advanced settings of a game

⋯ → Advanced holds the finer settings of each game, each with a line on what it does:

  • Controller sticks: a deadzone for each stick, which stops a drifting stick.
  • Mouse as the camera (middle mouse button or F7 captures the mouse and drives the right stick):
    • sensitivity;
    • vertical speed;
    • the response curve;
    • the minimum tilt, so slow movement is not lost in the game's own deadzone;
    • the maximum speed;
    • smoothing;
    • how soon the camera stops after the mouse does.
  • Keyboard:
    • how far the sticks tilt while Slow Movement is held;
    • how long a key takes to tilt a stick fully;
    • how long a key takes to press L2 or R2 fully, for racing games.
  • Graphics: the shader cache, on or off.
  • Sharing: Export Settings saves the game's keys and every setting as one file, and Import Settings applies a file someone shared. Post a setup that works for a game, or take one from a friend.
  • Reset Advanced Settings brings back the engine's defaults.

Engine versions: Settings → Engine lists the engine builds published with this project's releases. Download one (it is checked before use) and choose it for every game or for one game only; a game unlocked with another engine offers Update and Play. Engine Folder uses an engine you built yourself. A game's options show which engine unlocked it.

Crash reports: when a game stops on an error, Export Report saves the log, macOS's crash report and the game's settings in one file, and Open Issue opens a pre-filled GitHub issue (your name, email and sign-in tokens are removed first). Detailed logging (trace) in a game's settings records more for a hard bug.

Trophies

The trophy list of Hollow Knight: Silksong

The progress in this screenshot is sample data.

When a game earns a trophy while you play, a card drops in at the top of the screen, over the game and in full screen too, with the trophy's icon, name and grade and a sound. It never takes the keyboard or the mouse from the game.

A trophy card over the game

The card as the launcher draws it, over a Silksong screenshot.

Every trophy is kept and listed as on the console:

  • The percentage, weighted by grade as on the PS5, and the count of platinum, gold, silver and bronze trophies earned.
  • Every trophy with its icon, name, description, grade and the day and time you earned it. Trophies you have not earned yet are greyed out.
  • Hidden trophies stay hidden until you earn them.
  • Trophies that count something (Acquire all Tools, Bind all Silk Skills) show how far you are, such as 23/51.

The list, the texts and the icons come from the game's own trophy package (sce_sys/trophy2), in the game's language when it has one. The engine records each unlock in the installed game, and the list updates when the game closes. Unlocking a game again keeps them.

Library and settings

Game library Settings
Game library Settings

The library button shows every game as a grid. Settings hold:

  • Appearance: the theme, the accent color, and the background (the theme animation, your own picture or a looping video). Also the selected game's artwork behind the home screen and animations.
    • Theme Studio: make your own theme: the motion, its color, highlight and lightness, the accent, a picture or video behind it and menu music. Every change shows behind the panel at once. Save as a file makes one .anyps5theme to give to anyone; opening one in Finder installs it.
    • Themes: the built-in themes, yours, and the ones people share on the AnyPS5 Hub (hub/), installed with one press. Share on the Hub saves your theme and opens the page to send it. The phone wears the launcher's theme too.
  • Library: the games folder and scanning it again.
  • Language: Türkçe or English.
  • Behaviour: the profile name, the volume of the interface sounds and of the selected game's theme song (the PS5 plays it while a game is selected, for games whose dump has one), hiding the launcher while a game runs, Discord, update checks, and installing Rosetta if it is missing. Also:
    • Clips: the launcher keeps the last 15 to 120 seconds of the game playing, picture and sound; Create on a DualSense (Share on a DualShock 4), ⌥F12 or Create on the phone saves them as an MP4 beside the screenshots. macOS asks once for the screen recording permission.
    • Save Sync: each game's saves and trophies stay the same on your other Macs through iCloud Drive or any folder you choose (Dropbox, a shared or USB folder). Newer saves from another Mac come down before a game starts, and the Mac's go up when it ends; whatever is replaced is backed up first.
  • Advanced: where F12 screenshots go (~/Pictures/AnyPS5 unless you pick another folder), and a folder of console system fonts for games that ask for them.
  • Links: anyps5://game/<title ID> selects a game and anyps5://play/<title ID> starts it (Copy Link in a game's settings); a folder opened with AnyPS5 from Finder can become the games folder.
  • About: the app and toolkit versions, Check for Updates, and Update to … when a newer AnyPS5 is out: the launcher downloads it, takes its place and opens again.

Broadcasting

Like the console's Broadcast, the launcher streams the game playing live to Twitch, YouTube or any RTMP / RTMPS server (another service's ingest address, or your own nginx-rtmp or MediaMTX).

  • Set it up once in Settings → Broadcasting: the service, the stream key (typed in a hidden field or pasted from the clipboard; Get your key opens the service's page for it), the quality (720p60 · 3 Mbit/s, 1080p30 · 4.5 Mbit/s or 1080p60 · 6 Mbit/s), the microphone for commentary with its own level, the LIVE badge and the link viewers watch on.
  • Go live from the game's panel while it plays (PS, then ⋯ / △ on the running game), or Go Live on the phone's launcher screen. The panel then shows how long you have been on air, the bit rate going out, dropped frames, Copy viewer link, the microphone and Stop broadcast; the broadcast also ends with the game.
  • The game's window and sound are captured as for clips (macOS asks once for the screen recording permission) and encoded on the Mac's media engine: H.264 High with a key frame every two seconds and no B-frames, AAC at 48 kHz stereo 160 kbit/s, as Twitch and YouTube ask. When the upload cannot keep up, frames are dropped instead of the stream falling behind, and a lost connection is made again by itself.
  • The stream key is kept in ~/Library/Application Support/AnyPS5/Broadcast/keys.json, readable by your user only, rather than the Keychain: the app is signed ad hoc, so the Keychain would ask for it again after every update. The launcher never shows the key in full. The LIVE badge is drawn over the game for you and is not part of the broadcast.

Getting around

The launcher works like a console: the arrow keys, Return (✕) and Esc (○), O (△) for options, Q / E (L1 / R1) for the previous or next game, also inside a game's panels, or a game controller (D-pad, ✕, ○, △, L1, R1; its PS button brings the launcher in front of the game, and back). The mouse and trackpad work too: click a tile, double-click to play, scroll through the row.

Your phone as a controller

AnyPS5 Remote (mobile/, Android and iOS) turns a phone on the same Wi-Fi, or on a cable, into a DualSense. It finds the launcher by itself; the first time, the Mac asks once and both show the same code.

  • On a cable, no Wi-Fi needed: plug an iPhone into the Mac and it connects through the cable by itself. An Android phone does the same with USB debugging on and adb installed on the Mac.

  • Remote Play: turn it on in the phone's About sheet and the game plays on the phone's screen behind the pad, picture and sound. It is off by default: the phone stays the controller alone. The Mac needs the screen recording permission for it.

  • Launcher on the phone: the Mac's games with their icons over the selected one's background. Picking a game on the phone picks it on the Mac too; Play, Back to Game and Close Game work from the phone, and the arrows, ✕, ○ and ≡ move around the launcher's own screen.

  • The pad: both sticks, ✕ ○ □ △, L1 R1, L2 R2, the D-pad, Options and the touchpad (slide to move the touch, tap to click), any of them at once, with the latency shown. It takes over as soon as a game starts.

  • Up to four players: four phones, and the Mac's game controllers, are four DualSenses for games with local co-op. Each becomes the next player the first time a button is pressed on it in the game; the launcher shows every connected phone with its player number. A new phone can pair while others are connected.

  • What the Mac is doing: while a game is unlocked, updated or started, the phone shows the step, a bar that fills and the time it has taken.

  • Trophies: a trophy earned in the game drops in at the top of the phone too, and the phone buzzes.

  • PS takes the phone back to the launcher and brings the launcher in front of the game on the Mac.

  • Create (◉, left of the touchpad) saves the last seconds of the game as a clip, as on the DualSense.

  • Go Live / End Broadcast beside Back to Game starts and stops the launcher's broadcast of the game playing.

  • Rumble, trigger effects and light: the game's vibration on the phone, a pulse on L2/R2 where the trigger would push back, and the pad glowing with the game's light bar colour.

  • Motion: the phone's accelerometer and gyroscope are the DualSense's motion sensors, for games that tilt or aim with them.

  • Your own layout, per game: the lock on the pad opens an editor to move, size, fade or hide any control, or make it a toggle or turbo button; the Mac keeps it with the game's settings.

  • The phone uses the launcher's language (English by default, or Turkish).

The launcher, with the phone in the corner Silksong played on the phone
The launcher with the phone connected Silksong played with the phone

▶ Video: the launcher and Silksong driven from the phone (1:22, the phone's own screen in the corner, in sync)

Launcher mode The pad
The phone in launcher mode The phone pad

⬇ Download the Android app (APK; on the phone, allow installing from your browser when asked).

On an iPhone (iOS 15 or newer), install AnyPS5-Remote.ipa with AltStore (or SideStore, or Sideloadly from a computer): it signs the app with your own Apple ID as it installs it. With a free Apple ID the app has to be refreshed every 7 days, which AltStore does by itself.

Games unlocked before phone support need Update and Play once, so they carry the engine that reads the phone.

AnyTogether

AnyTogether is the launcher's online home: friends, profiles, messages, parties and voice. It is optional; signed out, the launcher works exactly as before. The server is open source (AnyTogether, MIT) and anyone can run their own.

  • Sign-in: Settings → AnyTogether, with a code sent to your email, or with one tap on your phone if it is already signed in (and the other way round). No password, no sign-up form. On the website you can also add a passkey.
  • Friends: add someone by their handle and see who is online and what they are playing.
  • Play time and trophies: each session and trophy goes to your account, so friends see them on your profile and hear of a new trophy as you earn it.
  • Profiles: yours and your friends': games, hours, trophies and points, and the latest trophies with how rare they are. Change your name, bio, country and handle, and who sees your games, trophies, friends and online status.
  • Messages: chats with a friend and group chats, also on the phone and the website.
  • Parties and voice: up to eight friends together, with voice that goes straight between you; push-to-talk on ⌥V works over a game, and a ring shows who is speaking. The leader invites, removes and hands the lead over.
  • Join a friend's game: friends see the game you play as joinable and can start the same one, checked against your game's version first.
  • Another server: Settings → AnyTogether → Server, for a self-hosted AnyTogether.
  • Discord status: the game you play shows on Discord (Settings → Behaviour), with or without AnyTogether.
  • Share play: while you play, start Share play from the Friends panel. Friends watch in their browser, on the phone or in their launcher, and you can let one play as player 2, 3 or 4: local co-op together from anywhere. Your controller stays player 1.
  • Activity, leaderboards and notifications: what friends unlock and play with reactions, boards per game and overall, and a bell in the top bar.
  • Theme Hub: Settings → Appearance → Themes lists the themes people share on AnyTogether; Share on the Hub uploads yours.
  • How did it run? After a session, one tap sends a compatibility report for the compatibility list.
A friend's profile Friends
A friend's profile with games, trophies and activity The friends panel
Activity Messages
Friends' activity with reactions A conversation with a friend
Party with voice Share play
A party in voice, one friend speaking Sharing a game with two friends
Leaderboard Notifications
A game's leaderboard The notifications list
Themes from the Hub
Themes people share on the Hub

The people, messages and numbers in these screenshots are made up.

Games on a Mac

Hollow Knight: Silksong Plants vs. Zombies: Replanted Dreaming Sarah AnyPS5 Breakout
Silksong PvZ Replanted Dreaming Sarah AnyPS5 Breakout
120 fps, playable opening screens at 60 fps, work in progress 60 fps, playable 60 fps, test title

Game status notebook → (Türkçe) one page per game with screenshots, the steps behind it and technical details: DOOM (homebrew) plays too, Stray plays its first chapter, at a low frame rate (~12 FPS) for now, and Minecraft gets into a world.

MacBook Pro M3 Pro, macOS 26.6.2. Silksong is unlocked and started from AnyPS5.app; PvZ was converted by hand and has not been tried in it yet.

Status

libraries shaders

progress map

Progress history

Unsupported or unexpected states strictly throw std::runtime_error. what() is printed to stderr and the process terminates.

The shader recompiler successfully produces SPIR-V (validated via Spirv-Tools when built with ANYPS5_ENABLE_SPIRV_TOOLS).

Compatibility

Tested games and their frame rates

Per-game status and test reports live in the Game bring-up discussions, one thread per title.

About

AnyPS5-ARM is the macOS port of AnyPS5. AnyPS5 is not an emulator: its relinker turns a PS5 executable into a native program, and its system libraries are reimplemented as ordinary shared libraries the program links against. On Apple silicon:

  • CPU: the game's x86-64 code runs under Rosetta 2. A native arm64 mode without Rosetta is in development on the native-arm64 branch.
  • Executable: the relinker writes a Mach-O executable.
  • Graphics: the PS5 graphics driver runs on Vulkan through MoltenVK, which runs on Metal.
  • Distribution: the result is a normal .app you open from Finder.

Building from source · macOS port changes · Input mapping · Technical debt

Built on boykopovar/AnyPS5 and the community macOS port mugurc/AnyPS5 macos-port.

Branches

Each branch is its own project, with its own README:

Branch What it holds
main The whole project: the engine, the launcher and the phone app. Releases are made from it.
launcher The launcher (AnyPS5.app) only.
mobile-controller The phone app (AnyPS5 Remote) only.
rosetta The engine only, the way it runs today: x86-64 code under Rosetta 2.
native-arm64 The engine running games as native arm64 code, without Rosetta (experimental).

Disclaimer

This project is intended for interoperability, research, preservation and compatibility purposes. It does not include, distribute or require copyrighted software, firmware, cryptographic keys or proprietary libraries. Users are responsible for obtaining and using any binaries with this project in accordance with applicable laws and their license terms.

AnyPS5 is an independent project and is not affiliated with, authorized or endorsed by Sony Interactive Entertainment. "PlayStation" and "PS5" are trademarks of Sony Interactive Entertainment Inc.

License

GNU General Public License version 2 only.

About

Tool for automatic PS5 executables porting to MacOS ARM

Topics

Resources

Contributing

Stars

41 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages