Realistic route-based location simulation for iOS developers
Simulate Walk, Bike, Drive, Bus, or Custom movement along real routes — with steady 1 Hz GPS updates, derived speed & course, and a Life360-tuned Driving profile.
Getting Started · Features · Build IPA · Architecture · Contributing
RouteSim is a focused iOS app for developer testing of location-based services. It injects simulated GPS coordinates system-wide along a user-defined or imported route, with realistic movement profiles and playback controls.
RouteSim is a clean fork of StikDebug. All JIT, process inspection, scripting, and multi-tab debugger bloat has been removed. What remains is the debug tunnel (pairing file + LocalDevVPN + DVT location simulation) and a modern SwiftUI route editor built around a RoutePlayer engine.
Developer tool only. RouteSim is intended for testing your own apps and services on devices you control. It is not a consumer spoofing product.
| Area | What you get |
|---|---|
| Movement modes | Walk · Bike · Drive · Bus · Custom — each with tuned speed, accel, braking, and jitter |
| Life360 Drive mode | Sustained 30–40 mph cruise, realistic ramp/brake, turn slowdown, strict 1 Hz ticks at 1× |
| Route editor | MapKit map — tap waypoints, drag, delete, reorder; polyline overlay |
| GPX import | GPX, KML, GeoJSON, CSV, plain lat/lon text via Files app |
| PSTA bus routes | Runtime GTFS download (Pinellas Suncoast Transit Authority) — pick route + trip |
| Playback | Play / pause / scrub, 0.5×–10× multiplier, loop, live stats HUD (mph, course, distance, ETA) |
| Persistence | Save/load named routes as JSON; export GPX |
| Onboarding | Guided setup: pairing file → LocalDevVPN → Developer Mode → permissions |
| Background | Silent audio + location keep-alive so simulation survives screen lock |
Location-based apps (maps, fitness, family safety, transit, geofencing) are hard to test on a desk. Simulator location is app-scoped; real-world driving is slow and non-repeatable.
RouteSim lets you:
- Replay the same route with controlled speed and timing
- Validate driving detection heuristics (e.g. Life360) with GPS-realistic movement
- Test bus dwell and stop logic with GTFS-backed routes
- Iterate quickly without a Mac after initial sideload setup
Add captures to
docs/screenshots/and uncomment the block below.
Suggested screenshots
- Simulate tab — map with waypoints, blue route polyline, mode chips, playback bar
- Live stats HUD — mph, course°, distance, progress while playing
- Library — saved routes list with mode icons
- PSTA browser — route list with bus colors / trip picker
- Onboarding — pairing file import step
- Settings — tunnel status, device IP, GTFS feed URL
| Requirement | Notes |
|---|---|
| iOS 17.4+ | Uses DVT/RSD location simulation (same family as StikDebug) |
| Developer Mode | Settings → Privacy & Security → Developer Mode |
| Pairing file | .plist / .mobiledevicepairing from a trusted Mac (StikDebug pairing guide) |
| LocalDevVPN | Routes to device tunnel 10.7.0.1:49152 |
| Sideload tool | SideStore, AltStore, or similar |
- Download
RouteSim-Debug.ipafrom the latest GitHub Actions run (Artifacts section). - Sideload with SideStore or AltStore.
- Trust the certificate: Settings → General → VPN & Device Management.
- Complete onboarding — import pairing file.
- Open LocalDevVPN and connect the VPN.
- Enable Developer Mode and reboot if prompted.
- RouteSim mounts the Developer Disk Image (DDI) automatically when the tunnel connects.
- On the Simulate tab, add waypoints and press Play.
- Tap the map to add waypoints (green = start, red = end).
- Choose a mode chip: Walk / Bike / Drive / Bus / Custom.
- Import GPX via the toolbar download icon.
- Save from the ⋯ menu → Library.
| Control | Behavior |
|---|---|
| Play | Prepares densified polyline, then ticks at 1 Hz wall-clock |
| Pause | Holds last coordinate (4 s keep-alive) so iOS does not revert to real GPS |
| Scrubber | Jump along route by progress % |
| Speed | 0.5×–10× — use 1× for Life360 Drive testing |
| Loop | Repeat route from start |
- Library → PSTA Routes (or bus icon).
- Download/refreshes GTFS feed (URL configurable in Settings).
- Pick a route and trip → saved to Library with stop dwell metadata.
You do not need a Mac to obtain a build. CI produces an unsigned Debug IPA on every push to main.
- Fork or clone this repo.
- Push to
main(or run Actions → Build Debug IPA → Run workflow). - When the job finishes, download artifact
RouteSim-Debug.ipa. - Sideload as above.
The workflow uses Xcode 26.0.1 on macos-latest, scheme StikDebug (internal name kept for stability), and packages RouteSim-Debug.ipa.
git clone https://github.com/DasVR/RouteSim.git
cd RouteSim
open StikDebug.xcodeproj- Select the StikDebug scheme and your device.
- Signing: automatic or ad-hoc; bundle ID is
com.stik.routesim, display name RouteSim. - Do not move
StikDebug/idevice/—libidevice_ffi.ais linked via build settings.
┌─────────────────────────────────────────────────────────────┐
│ Features/ Simulate · Library · Onboarding · Settings │
│ Routes/ Models · RouteStore · GPX · GTFSService │
│ Simulation/ RoutePlayer · MovementProfile · Geometry │
│ Tunnel/ LocationSimulationBridge · TunnelManager │
│ idevice/ libidevice_ffi.a (prebuilt, do not move) │
└─────────────────────────────────────────────────────────────┘
- Odometer-based interpolation along a densified polyline (not per-segment
Task.sleep). DispatchSourceTimerat ~1 Hz for stable derived speed/course.DrivingDynamics— accel, brake, turn slowdown, jitter.BusDwell— stop anchors and dwell windows from GTFS or defaults.LocationSimulator— serial-queue wrapper over the C bridge.
The FFI (location_simulation_set) accepts latitude and longitude only. CoreLocation derives speed and course from the rate of change between successive fixes. RouteSim spaces updates accordingly — realism is cadence-driven, not a direct CLLocation.speed write.
RouteSim’s Drive profile is tuned for GPS-side realism:
| Setting | Value |
|---|---|
| Tick cadence | 1 Hz at 1× multiplier |
| Cruise | ~13.4 m/s (30 mph), floor ≥ 8 m/s (17 mph) |
| Accel / brake | 2.0 / 2.5 m/s² |
| Turn slowdown | Yes — bearing changes on densified polyline |
- Use Drive mode, 1× speed — not 2×+ (inflates derived speed).
- Use routes with gentle turns and enough length to sustain cruise speed.
- Keep LocalDevVPN connected and simulation playing (or paused with hold active).
Life360 and similar apps also fuse Core Motion (accelerometer / activity). The DVT location service does not spoof motion coprocessor data — only GPS position. RouteSim optimizes everything on the GPS side; driving detection is not guaranteed.
Use RouteSim to test your own location logic and to understand GPS-derived behavior — not to mislead people or violate app terms of service.
RouteSim/
├── .github/workflows/build_ipa.yml # CI → RouteSim-Debug.ipa
├── StikDebug/ # App source (Xcode synced root)
│ ├── App/ # RouteSimApp, RootView
│ ├── Tunnel/ # Pairing, VPN tunnel, location bridge
│ ├── Simulation/ # RoutePlayer engine
│ ├── Routes/ # Persistence, GPX, GTFS
│ ├── Features/ # SwiftUI screens
│ ├── Services/ # Background keep-alive
│ └── idevice/ # libidevice_ffi.a + headers (committed)
├── StikDebug.xcodeproj/ # Scheme name: StikDebug
├── StikDebugTests/
└── StikDebugUITests/
| Project | Role |
|---|---|
| StikDebug by Stephen | Original debug tunnel, pairing, DDI, location FFI — fork base |
| idevice | Rust/C FFI for RSD and DtSimulateLocation |
| RouteSim fork | Route engine, UI, GTFS, persistence, documentation |
- RouteSim documentation and new application code in this repository: MIT License.
- Upstream: StikDebug and bundled
idevicecomponents are subject to their original licenses — see NOTICE.
RouteSim is provided for legitimate developer testing on devices you own or are authorized to use. You are responsible for compliance with applicable law, Apple Developer policies, and third-party app terms. The authors do not encourage location misrepresentation, stalking, fraud, or circumvention of safety or parental-control products. Use responsibly.