Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: Bug report
description: Report reproducible GeoShift behavior.
title: "[Bug]: "
labels: [bug]
body:
- type: markdown
attributes:
value: |
Read the troubleshooting guide first. Never attach pairing records or unredacted logs.
- type: input
id: version
attributes:
label: GeoShift version
placeholder: 1.5.0
validations:
required: true
- type: input
id: environment
attributes:
label: macOS, iOS, and iPhone model
placeholder: macOS 15.x, iOS 18.x, iPhone model
validations:
required: true
- type: dropdown
id: connection
attributes:
label: Connection type
options:
- iOS 27+ Wi-Fi RemotePairing
- Trusted USB
- Legacy trusted Wi-Fi
- Unknown
validations:
required: true
- type: textarea
id: steps
attributes:
label: Reproduction steps
description: Include the visible GeoShift state and what happened before it.
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected behavior
validations:
required: true
- type: textarea
id: diagnostics
attributes:
label: Redacted diagnostics
description: Remove UDIDs, IPs, usernames, local paths, pairing data, and trust material.
render: text
- type: checkboxes
id: safety
attributes:
label: Privacy confirmation
options:
- label: I removed device identifiers, IP addresses, personal paths, pairing records, and credentials.
required: true
- label: This is not a security vulnerability or private report.
required: true
5 changes: 5 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Security or privacy report
url: https://github.com/Lemelson/GeoShift/security/advisories/new
about: Report vulnerabilities and privacy issues privately.
29 changes: 29 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Feature request
description: Suggest an improvement for authorized iOS location testing.
title: "[Feature]: "
labels: [enhancement]
body:
- type: textarea
id: problem
attributes:
label: Testing problem
description: What development or QA workflow is difficult today?
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Proposed behavior
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives considered
- type: checkboxes
id: scope
attributes:
label: Scope confirmation
options:
- label: This request is for devices I own or am authorized to test.
required: true
17 changes: 17 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## Summary

Describe the user-visible behavior and why the change is needed.

## Verification

- [ ] `swift test`
- [ ] Python worker tests
- [ ] `git diff --check`
- [ ] English and Russian UI resources remain synchronized
- [ ] No generated app/build files, logs, device IDs, local paths, or pairing data

## Safety impact

Explain any effect on Start, Restore GPS, target-device selection, reconnect,
heartbeat, worker termination, or pending-clear behavior. Write “None” when the
change cannot affect those paths.
44 changes: 44 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: CI

on:
push:
branches: [main]
pull_request:

permissions:
contents: read

jobs:
swift:
name: Swift build and tests
runs-on: macos-26
steps:
- name: Check out repository
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with:
persist-credentials: false
- name: Show Swift toolchain
run: swift --version
- name: Run Swift tests
run: swift test
- name: Validate packaging script
run: bash -n Scripts/package_app.sh Scripts/install_app.sh

python:
name: Python worker tests
runs-on: macos-26
steps:
- name: Check out repository
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with:
python-version: "3.13"
- name: Install worker dependency
run: python -m pip install 'pymobiledevice3==9.31.0'
- name: Run worker tests
env:
PYTHONDONTWRITEBYTECODE: "1"
run: python -m unittest discover -s Tests/Python -v
13 changes: 13 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,16 @@ __pycache__/
*.xcuserstate
DerivedData/
*.log
.env
.env.*
!.env.example
.pymobiledevice3/
remote_*.plist
config.json
status.json
pairing-status.json
*.p12
*.pfx
*.pem
*.key
*.mobileprovision
Binary file added Assets/GeoShiftScreenshot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 33 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Changelog

All notable changes to GeoShift are documented here.

## 1.5.0 — 2026-07-20

### Added

- English interface by default with an in-app English/Russian language switch.
- Guided iOS 27+ device-initiated Wi-Fi pairing with a six-digit code.
- Durable worker status, exact target-device identity, and pending restore queue.
- Five-minute application heartbeat watchdog and startup recovery.
- Rotating diagnostics with a collapsed last-50-events view.
- Python regression tests for device selection, clear safety, stale heartbeat,
RemotePairing discovery, and corrupt-configuration recovery.

### Changed

- Restore GPS is now mandatory on normal app termination.
- Command-Q is refused if a safe restore handoff cannot be confirmed.
- RemotePairing discovery waits long enough for delayed Bonjour advertisements.
- City search supports both English and Russian names, countries, and regions.

### Fixed

- A simulated location could remain on the phone after the app or worker stopped.
- A stale worker could overwrite a confirmed clear with `clearPending`.
- A forced worker termination could incorrectly report success before clear.
- Missing or invalid configuration could abandon a device-side simulation.

## 1.0.0

- Initial public release.
9 changes: 9 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Code of Conduct

GeoShift is an open-source engineering project. Be respectful, constructive,
and specific. Discuss the work rather than the person, welcome corrections,
and avoid harassment, discrimination, threats, or publication of private data.

Maintainers may edit or remove abusive, unsafe, off-topic, or privacy-violating
contributions and may restrict participation when necessary. Report conduct or
privacy concerns privately through the repository's Security Advisory channel.
39 changes: 39 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Contributing to GeoShift

Thank you for helping improve GeoShift. Bug reports, documentation fixes,
compatibility results, translations, and focused code contributions are welcome.

## Before opening an issue

1. Read the [troubleshooting guide](docs/TROUBLESHOOTING.md).
2. Search existing issues.
3. Reproduce with the latest `main` branch when practical.
4. Redact device UDIDs, IP addresses, usernames, local paths, and pairing data.

Use GitHub Security Advisories, not a public issue, for security or privacy bugs.

## Development setup

```bash
brew install uv
uv tool install --python 3.13 'pymobiledevice3==9.31.0'
swift test
PYTHONDONTWRITEBYTECODE=1 uv run --with 'pymobiledevice3==9.31.0' \
python -m unittest discover -s Tests/Python -v
```

See [Installation](docs/INSTALLATION.md) for the complete setup.

## Pull requests

- Keep changes focused and explain the user-visible behavior.
- Add or update tests for safety-critical worker and state transitions.
- Keep English and Russian UI resources synchronized.
- Do not commit generated `.app` bundles, `.build`, logs, runtime JSON, pairing
records, credentials, or device identifiers.
- Run `swift test`, the Python test suite, and `git diff --check` before opening
a pull request.

GeoShift controls a persistent device-side location simulation. Changes to
start, stop, reconnect, process termination, or target-device selection must
fail safe toward a durable Restore GPS request.
1 change: 1 addition & 0 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import PackageDescription

let package = Package(
name: "GeoShift",
defaultLocalization: "en",
platforms: [
.macOS(.v14),
],
Expand Down
Loading
Loading