Roam Control: a source-available iPhone location simulator for iOS 27
Choose, test and move an iPhone’s reported location.
At a glance
- What is it?
- Roam Control is a SwiftUI beta app that sets or clears an iPhone's reported location over an encrypted developer session. It is built for testing on hardware you own, and it is not an App Store download.
- Who is it for?
- Adopt Roam Control if you are a developer or QA engineer testing location behaviour on an iPhone you own and you accept a side-loaded beta with a seven-day refresh cycle on free Apple accounts. Do not adopt it if you need App Store distribution, Android support, or a tool that hides what it is doing; the app is explicit that simulation affects every app reading the reported position.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly Swift, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 21, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What Roam Control actually does, and who it is for
The README frames the project in one line: choose, test and move an iPhone's reported location. That is narrower than a general purpose location spoofing tool. The stated audience is location-based development, quality assurance and responsible personal testing on a phone you own and control. If you write code that branches on coordinates, or you test a check-in flow that only fires inside a geofence, the app gives you a way to put the device at that coordinate without leaving your desk.
The feature list is organised around that workflow rather than around spoofing for its own sake. You can search places live with MapKit, type coordinates, or tap the map. A fixed location can be updated without reconnecting. Walking routes can be previewed as an Apple Maps walking route before you start, then paused, resumed, reversed or redirected while active. Named favourites and recent locations are kept. There is an explicit restore step for returning to the real location when testing is finished, and a recovery path after an interrupted fixed or walking session.
That last pair of features is the tell. Most of the design effort visible in the README goes into getting out of a simulated state cleanly, not into getting into one. The app also carries accessibility work: Dynamic Type, VoiceOver and Reduce Motion, plus automatic, light or dark appearance and standard, satellite or hybrid maps.
The pairing handshake and the Rust bridge behind it
Roam Control does not intercept location at the app layer. According to the README, it generates or imports an RPPairing record for the same iPhone and stores it in the device-only Keychain. When a location session starts, the app discovers that iPhone's remote-pairing service through LocalDevVPN, verifies the device identity, and opens the encrypted developer session used to set or clear a simulated location.
So the data path is: the app on the phone, over a LocalDevVPN session, to the phone's own remote-pairing service. Nothing about the coordinate travels to a third party. The README states that locations, coordinates, searches, favourites, history, walking routes and pairing records stay on the iPhone, and that the pairing record is never uploaded.
The native engine is described as a narrow Rust-to-Swift bridge around the MIT-licensed idevice library, pinned to an exact revision. That pinning matters for anyone building from source: you inherit a specific upstream commit rather than whatever the library's main branch looks like today. The shipped binary is Frameworks/RoamPairingFFI.xcframework, which contains arm64 iPhone and Apple Silicon simulator slices. The README says to rebuild it only after changing Native/RoamPairingFFI, and points at Documentation/BuildAndRelease.md for the procedure.
One consequence of this architecture is worth stating plainly. The simulator is useful for interface work, but per the README it cannot complete the physical pairing handshake or start a location session. You need a real device for anything past layout.
Installing the beta IPA with SideStore
Roam Control is not distributed through the App Store or TestFlight. The current public beta preview is 0.9.2 Build 61. The README directs you to download RoamControl-0.9.2-build61.ipa from the Build 61 release page and sign it with SideStore using your own Apple account. The stated requirements are an iPhone on iOS 27 or newer, Developer Mode enabled, LocalDevVPN, and SideStore or Xcode on a Mac.
The README does not publish a download command, so the first step is a manual download of the IPA named in the release notes. Sign and install that file with SideStore on the device. The README notes that free Apple accounts remain subject to Apple's app-count and seven-day refresh limits, so plan for a re-sign every week if you are not on a paid account.
After the app opens, the README gives a seven-step first-time setup. Complete the four-page introduction, then tap Pair This iPhone on Device Setup. On the phone, go to Settings, Privacy & Security, Developer Mode, Pair with Roam Control, and enter the six-digit code shown in the app. Then install and connect LocalDevVPN and pick a location or walking route.
If you would rather build it yourself, the README describes the following sequence: clone the repository, open RoamControl.xcodeproj in Xcode 27 or newer, select the Roam Control target, choose your own Apple development team under Signing & Capabilities, select a connected iPhone and press Run. The repository layout matches that description: a RoamControl.xcodeproj directory, a RoamControl source directory, Configuration, Frameworks, Native and scripts at the top level.
Where Roam Control is the wrong tool
The README is direct about the blast radius. Location simulation can affect every app using the iPhone's reported position, and the project asks you to restore the real location before using navigation, emergency, safety, transport or location-sharing features. If your phone is also your daily driver, that is a real operational risk rather than a footnote. A simulated position left active is a problem for maps, ride hailing and anything that shares where you are.
The responsible use section goes further: do not use it to mislead another person, falsify evidence, access something you are not entitled to use, evade safeguards, or breach a third-party service's rules. That rules out a large class of casual use cases people might bring to a tool with this name.
There are practical constraints too. iOS 27 or newer is a hard floor, so an older device is simply out of scope. The simulator cannot complete pairing or start a session. On a free Apple account, the seven-day refresh limit means the install decays unless you re-sign it. And the build is a preview: the release history shows Builds 56 through 60 superseded by Build 61 within days, with the README telling current testers not to use earlier builds for new installations. That cadence is normal for a beta, but it is not a stable target to build a team process around.
Finally, the licence. The README badge says PolyForm Noncommercial 1.0.0, which points away from commercial use, while the repository metadata reports the licence as NOASSERTION. If you are evaluating this for work, resolve that discrepancy before you invest time in it.
How it differs from Xcode's built-in location simulation
The obvious alternative is the location simulation already in Xcode, which lets you feed a GPX file or a set of preset coordinates to a running app. The difference is where the coordinate is applied. Xcode's simulation is scoped to a debug session on a tethered device: you set it from the Mac, and it exists for the lifetime of that run.
Roam Control applies the location through the iPhone's own remote-pairing service over LocalDevVPN, from an app running on the phone. That means the simulated position is not tied to a debug session, which is why the README can promise updating a fixed location without reconnecting and pausing or reversing an active walk. It also means the effect is device-wide rather than confined to the app you are debugging, which is the trade-off you accept in exchange for that flexibility.
The README also positions Roam Control against a plain VPN-based approach: it documents separate guided LocalDevVPN flows for Wi-Fi and mobile data. That separation is a hint that connectivity type changes what the pairing discovery looks like, and the app walks you through each case rather than assuming one.
Telemetry, licensing and what a build actually sends
Anonymous usage statistics are optional and off by default. When enabled, the README says a narrow first-party sender reports a fixed set of activity events, app version and build, a hashed random installation identifier, and fixed failure and scheduler categories to a maintainer-operated service and, in configured beta builds, TelemetryDeck. The stated exclusions are locations, searches, routes, pairing data, device names, raw error messages and diagnostic reports. No third-party analytics SDK is embedded.
The part worth reading twice is the build-time behaviour. The public project contains the self-hosted ingestion URL but no ingestion token, no TelemetryDeck identifiers and no Apple signing team. A checkout therefore sends no statistics unless the builder deliberately supplies a private local configuration. That is a clean default for anyone auditing the source, and it is a stronger statement than a settings toggle alone.
On licensing, the README badge names PolyForm Noncommercial 1.0.0. The repository metadata reports NOASSERTION, and the LICENSE file is present at the top level. This article cannot give legal advice, and the two signals do not agree, so treat the noncommercial reading as the working assumption and confirm the actual terms with the maintainer before commercial deployment.
Upgrade cost is a function of the distribution model rather than the code. Releases arrive as numbered preview builds, so staying current means watching the releases page and re-signing. The repository carries a CHANGELOG.md, a Documentation/RegressionChecklist.md and a Documentation/BuildAndRelease.md, which suggests the project expects contributors and testers to follow a defined upgrade path rather than pull from main blindly.
Editorial conclusion
Adopt Roam Control if you are a developer or QA engineer testing location behaviour on an iPhone you own and you accept a side-loaded beta with a seven-day refresh cycle on free Apple accounts. Do not adopt it if you need App Store distribution, Android support, or a tool that hides what it is doing; the app is explicit that simulation affects every app reading the reported position. Before installing, verify that your device runs iOS 27 or newer, that you can enable Developer Mode, and that you have read Documentation/Installation.md and Documentation/ResponsibleUse.md. The licence question is the one to settle first: the README badge says PolyForm Noncommercial 1.0.0 while the repository LICENSE is flagged NOASSERTION, so confirm the terms with the maintainer before any commercial use.
Frequently asked questions
How do I install Roam Control on my iPhone?
Download the RoamControl-0.9.2-build61.ipa attached to the Build 61 release and sign it with SideStore using your own Apple account. The README states that Roam Control is not distributed through the App Store or TestFlight, and that you need an iPhone on iOS 27 or newer with Developer Mode enabled plus LocalDevVPN.
Does Roam Control work in the iPhone simulator?
No. The README states that the iPhone simulator is useful for interface work but cannot complete the physical pairing handshake or start a location session, so a real device is required.
Is Roam Control free to use commercially?
The README badge lists PolyForm Noncommercial 1.0.0, while the repository metadata reports the licence as NOASSERTION, so the two signals disagree. Confirm the terms with the maintainer before any commercial use.
Community notes