GEFI is a local web application for simulating GPS coordinates on a USB-connected iPhone. It combines a Flask backend, an interactive Leaflet map, and pymobiledevice3 to maintain a location-simulation session without jailbreaking the device.
GEFI is intended for development and testing. Use it only on devices and applications you are authorized to test.
- USB and network iOS device detection with selectable targets
- Developer Disk Image mounting for location simulation
- Address search with map-based geocoding
- Instant teleportation to any map coordinate
- Automated movement along a selected route
- Manual movement through an on-screen joystick and keyboard controls
- Adjustable speed presets for walking, cycling, and driving
- GPX route import with timestamp-aware playback
- Map styles: standard, satellite, and dark
- One-click restore to the device's physical GPS location
- Live console logging for session monitoring
Movement controls are map-relative. GEFI updates latitude and longitude only; it does not emulate device heading or altitude.
GEFI is built and tested for macOS. The web interface can run on other systems, but reliable iPhone GPS emulation depends on macOS, USB connectivity, and the iOS 17+ userspace workflow used by pymobiledevice3.
- macOS
- Python 3.10 or newer
- iPhone with Developer Mode enabled
- USB connection and a trusted computer
- Internet access for installation, map tiles, and address search
GEFI is designed around the iOS 17+ userspace tunnel supported by pymobiledevice3. Compatibility can change with new iOS and pymobiledevice3 releases.
git clone https://github.com/olaftnt/GEFI.git
cd GEFI
chmod +x run.sh
./run.shOpen http://127.0.0.1:5001, connect the iPhone, select Scan, and mount the DDI if required.
The launcher creates a local venv, installs dependencies, attempts to mount the DDI, and starts the server.
python3 -m venv venv
source venv/bin/activate
python -m pip install -r requirements.txt
python app.pyOptional environment variables:
GEFI_HOST=127.0.0.1
GEFI_PORT=5001
GEFI_DEBUG=falseDo not expose the Flask server to untrusted networks. The API can control the location of a connected device and does not include authentication.
- Connect and select an iPhone.
- Right-click the map and choose Teleport Here or Walk Here.
- Use the joystick or keyboard controls for manual movement.
- Press Space to stop movement.
- Select Reset GPS when testing is complete.
Load a .gpx file containing trkpt elements in the GPX Route Player. By default, GEFI replays the route using the original <time> timestamps from the recording, so movement speed matches the source GPX.
GEFI validates GPX files on load and shows warnings in the GPX panel and console when a file is incomplete or not ideal for playback, for example:
- invalid XML
- no
<trkpt>track points - only waypoints or route points instead of track points
- missing or partial
<time>timestamps - reversed or duplicate timestamps
- very long pauses between points
- unrealistic implied speeds for navigation apps
If a GPX file has no timestamps, playback falls back to 1 point per second. Enable Use Manual Speed only when you want to ignore GPX timing and follow the movement speed slider instead.
convert_logs.py converts files named gps_log_*.json in the current directory into GPX:
python convert_logs.pyGET /health— service healthGET /api/devices— connected iOS devicesPOST /api/mount— mount the Developer Disk ImagePOST /api/spoof— set{ "udid", "latitude", "longitude" }POST /api/clear— clear simulated locationGET /api/status— current simulation status
- No device found: unlock the iPhone, reconnect USB, accept the trust prompt, and select Scan.
- DDI mount fails: enable Developer Mode, restart the iPhone if requested, and try Mount DDI Image again.
- Location does not update: keep the device unlocked during setup and check the GEFI console and terminal output.
- An iOS update breaks connectivity: install a compatible
pymobiledevice3release and review its upstream compatibility notes.
GEFI runs locally by default. Address searches use OpenStreetMap Nominatim, and map views load tiles from OpenStreetMap, CARTO, or Esri. Search terms and tile requests are therefore sent to those providers.
This project is not affiliated with or endorsed by Apple Inc. Simulated locations may violate the rules of third-party services. You are responsible for complying with applicable laws, platform terms, and application policies.
This project is licensed under the MIT License. See LICENSE for details.
