A fast, open-source iOS Simulator for Xcode 27+. Bring back the classic Simulator workflow, plus deep links, push, proxy certs and hot reload in one window.
See the code
Your iOS simulators in windows again, one per device.
Xcode 27 replaced Simulator.app with Device Hub, and a decade of habits did not come across with it. OpenDeviceHub connects to the same simulators Xcode installs and brings back the familiar window, scaling and shortcuts, with a command line tool for driving a device from a script.
Signed, notarized, and it updates itself.
Download OpenDeviceHub-0.1.0.dmg, drag OpenDeviceHub to Applications and launch it. Every version, with its checksums, is on Releases. The app is signed with a Developer ID certificate and notarized, so there is no Gatekeeper warning, and it updates itself from the app menu.
The odhub command line tool ships inside the bundle. Choose OpenDeviceHub → Install Command Line
Tool and it links odhub into a folder already on your PATH, asking for your password only if
every such folder belongs to the system. Remove Command Line Tool takes it away again.
Then, in a new terminal, odhub doctor reports what it found and odhub list shows your
simulators.
odhub drives a simulator from a script: tap, swipe, pinch, type,
buttons, rotation. One menu item puts it on your PATH.| Keys | Does |
|---|---|
| ⌘1 ⌘2 ⌘3 ⌘4 | Point Accurate, Pixel Accurate, Physical Size, Fit |
| ⌘B | Show device bezel |
| ⌘T | Keep on top |
| ⌃⌘F | Enter full screen |
| ⌘W | Close window |
| ⇧⌘H | Home |
| ⌘L | Lock |
| ⌘↑ ⌘↓ | Volume up, volume down |
| ⌘← ⌘→ | Rotate left, rotate right |
| ⌘S | Save screenshot |
| ⌘R | Record screen |
| ⌘C | Copy screenshot |
| ⌘V | Paste to device |
| ⇧⌘A | Toggle appearance |
| ⌃⌘Z | Shake |
| ⇧⌘L | Show click to frame latency |
Every command takes a simulator UDID, which odhub list prints. odhub help <command> has the full
options.
| Command | Example |
|---|---|
doctor | odhub doctor |
list | odhub list |
view | odhub view A1B2C3D4 --boot |
tap | odhub tap A1B2C3D4 --x 0.5 --y 0.5 |
swipe | odhub swipe A1B2C3D4 --from-x 0.5 --from-y 0.8 --to-x 0.5 --to-y 0.2 |
pinch | odhub pinch A1B2C3D4 --from 0.2 --to 0.7 |
type | odhub type A1B2C3D4 "hello" |
paste | echo hello | odhub paste A1B2C3D4 |
copy | odhub copy A1B2C3D4 |
button | odhub button A1B2C3D4 home |
rotate | odhub rotate A1B2C3D4 landscapeLeft |
home-swipe | odhub home-swipe A1B2C3D4 |
app-switcher | odhub app-switcher A1B2C3D4 |
Want to help close one of these? Pull requests are welcome. ROADMAP.md is where that list is going: location, push, biometrics, proxy certificates, device management, and the project aware tooling this exists for.
Xcode 27 opens Device Hub itself when you run an app on a simulator, and other tools may launch it too. OpenDeviceHub shows the same devices, so both can be on screen at once. Two of Apple's own settings make them share better.
Quitting Device Hub can shut down the simulators it started, which closes their windows here. To stop that, quit Device Hub and run:
defaults write com.apple.dt.Devices shutdownStartedDevicesOnQuit -bool false
To stop Xcode opening Device Hub at all, quit Xcode and run:
defaults write com.apple.dt.Xcode DVTiPhoneSimulatorAlwaysLaunchInCoreSimulatorSession -bool true
Xcode then boots the simulator without a window of its own and yours is the one you use. With this on, boot the device here before pressing Run, or Xcode may shut it down when you press Stop.
OpenDeviceHub → Settings → Links offers to open devices:// links here instead. That covers
links only. Nothing can take over from a tool that launches Device Hub directly, because it is
launched by name rather than through the link.
macOS 14 or later, Apple silicon, and Xcode 26 or 27 with at least one iOS simulator runtime.
Apple silicon only, and not by preference: the simulator frameworks this app loads from Xcode ship
as arm64e with no Intel slice, so an Intel build would launch and then fail at the first framework
load.
scripts/build.sh # the executables
scripts/build-app.sh release # build/OpenDeviceHub.app
swift test --package-path engine
Use scripts/build.sh rather than swift build directly: SwiftPM records the deployment target as
the linked SDK version, and AppKit then gives the window its pre macOS 26 appearance. Tests that
need a booted simulator are gated behind ODH_INTEGRATION=1 and skip otherwise.
Source builds are signed ad hoc and need no Apple account or certificates. They report version
0.0.0-dev and carry no update channel, so in-app updates stay off unless an update signing key is
configured and a source build can never replace itself with a release.
Bug reports, feature ideas and pull requests are welcome. A bug report is far more useful with the
output of odhub doctor, which names your macOS version, Xcode version, device and runtime.
For a vulnerability, please read SECURITY.md instead of opening an issue. It also describes what the app does to your machine, which is worth knowing given it loads private frameworks out of your Xcode. Maintainers cutting a release want RELEASING.md.
MIT. The Indigo touch message layout and hardware button constants are adapted from idb (Meta Platforms, MIT) and the rotation path from Siniulator (MIT); see third-party notices.
OpenDeviceHub is an independent open source project. It is not affiliated with, endorsed by or sponsored by Apple Inc.
It bundles no Apple frameworks, simulator runtimes or device bezel assets. It uses your local Xcode installation and the components installed through it, loaded at runtime.
72 commits
Swift
94.9%
Shell
3.6%
Objective-C
1.0%
A fast, open-source iOS Simulator for Xcode 27+. Bring back the classic Simulator workflow, plus deep links, push, proxy certs and hot reload in one window.
See the code
Your iOS simulators in windows again, one per device.
Xcode 27 replaced Simulator.app with Device Hub, and a decade of habits did not come across with it. OpenDeviceHub connects to the same simulators Xcode installs and brings back the familiar window, scaling and shortcuts, with a command line tool for driving a device from a script.
Signed, notarized, and it updates itself.
Download OpenDeviceHub-0.1.0.dmg, drag OpenDeviceHub to Applications and launch it. Every version, with its checksums, is on Releases. The app is signed with a Developer ID certificate and notarized, so there is no Gatekeeper warning, and it updates itself from the app menu.
The odhub command line tool ships inside the bundle. Choose OpenDeviceHub → Install Command Line
Tool and it links odhub into a folder already on your PATH, asking for your password only if
every such folder belongs to the system. Remove Command Line Tool takes it away again.
Then, in a new terminal, odhub doctor reports what it found and odhub list shows your
simulators.
odhub drives a simulator from a script: tap, swipe, pinch, type,
buttons, rotation. One menu item puts it on your PATH.| Keys | Does |
|---|---|
| ⌘1 ⌘2 ⌘3 ⌘4 | Point Accurate, Pixel Accurate, Physical Size, Fit |
| ⌘B | Show device bezel |
| ⌘T | Keep on top |
| ⌃⌘F | Enter full screen |
| ⌘W | Close window |
| ⇧⌘H | Home |
| ⌘L | Lock |
| ⌘↑ ⌘↓ | Volume up, volume down |
| ⌘← ⌘→ | Rotate left, rotate right |
| ⌘S | Save screenshot |
| ⌘R | Record screen |
| ⌘C | Copy screenshot |
| ⌘V | Paste to device |
| ⇧⌘A | Toggle appearance |
| ⌃⌘Z | Shake |
| ⇧⌘L | Show click to frame latency |
Every command takes a simulator UDID, which odhub list prints. odhub help <command> has the full
options.
| Command | Example |
|---|---|
doctor | odhub doctor |
list | odhub list |
view | odhub view A1B2C3D4 --boot |
tap | odhub tap A1B2C3D4 --x 0.5 --y 0.5 |
swipe | odhub swipe A1B2C3D4 --from-x 0.5 --from-y 0.8 --to-x 0.5 --to-y 0.2 |
pinch | odhub pinch A1B2C3D4 --from 0.2 --to 0.7 |
type | odhub type A1B2C3D4 "hello" |
paste | echo hello | odhub paste A1B2C3D4 |
copy | odhub copy A1B2C3D4 |
button | odhub button A1B2C3D4 home |
rotate | odhub rotate A1B2C3D4 landscapeLeft |
home-swipe | odhub home-swipe A1B2C3D4 |
app-switcher | odhub app-switcher A1B2C3D4 |
Want to help close one of these? Pull requests are welcome. ROADMAP.md is where that list is going: location, push, biometrics, proxy certificates, device management, and the project aware tooling this exists for.
Xcode 27 opens Device Hub itself when you run an app on a simulator, and other tools may launch it too. OpenDeviceHub shows the same devices, so both can be on screen at once. Two of Apple's own settings make them share better.
Quitting Device Hub can shut down the simulators it started, which closes their windows here. To stop that, quit Device Hub and run:
defaults write com.apple.dt.Devices shutdownStartedDevicesOnQuit -bool false
To stop Xcode opening Device Hub at all, quit Xcode and run:
defaults write com.apple.dt.Xcode DVTiPhoneSimulatorAlwaysLaunchInCoreSimulatorSession -bool true
Xcode then boots the simulator without a window of its own and yours is the one you use. With this on, boot the device here before pressing Run, or Xcode may shut it down when you press Stop.
OpenDeviceHub → Settings → Links offers to open devices:// links here instead. That covers
links only. Nothing can take over from a tool that launches Device Hub directly, because it is
launched by name rather than through the link.
macOS 14 or later, Apple silicon, and Xcode 26 or 27 with at least one iOS simulator runtime.
Apple silicon only, and not by preference: the simulator frameworks this app loads from Xcode ship
as arm64e with no Intel slice, so an Intel build would launch and then fail at the first framework
load.
scripts/build.sh # the executables
scripts/build-app.sh release # build/OpenDeviceHub.app
swift test --package-path engine
Use scripts/build.sh rather than swift build directly: SwiftPM records the deployment target as
the linked SDK version, and AppKit then gives the window its pre macOS 26 appearance. Tests that
need a booted simulator are gated behind ODH_INTEGRATION=1 and skip otherwise.
Source builds are signed ad hoc and need no Apple account or certificates. They report version
0.0.0-dev and carry no update channel, so in-app updates stay off unless an update signing key is
configured and a source build can never replace itself with a release.
Bug reports, feature ideas and pull requests are welcome. A bug report is far more useful with the
output of odhub doctor, which names your macOS version, Xcode version, device and runtime.
For a vulnerability, please read SECURITY.md instead of opening an issue. It also describes what the app does to your machine, which is worth knowing given it loads private frameworks out of your Xcode. Maintainers cutting a release want RELEASING.md.
MIT. The Indigo touch message layout and hardware button constants are adapted from idb (Meta Platforms, MIT) and the rotation path from Siniulator (MIT); see third-party notices.
OpenDeviceHub is an independent open source project. It is not affiliated with, endorsed by or sponsored by Apple Inc.
It bundles no Apple frameworks, simulator runtimes or device bezel assets. It uses your local Xcode installation and the components installed through it, loaded at runtime.
72 commits
Swift
94.9%
Shell
3.6%
Objective-C
1.0%