Privacy Policy
SoOPNav is a research project that builds a positioning system out of radio signals that were never meant for navigation. Doing that means measuring the transmitters around a phone and recording where they were heard from. This page states exactly what those measurements contain, where they go, what we keep, and how to switch the whole thing off.
The short version. There are no accounts, no advertising, no analytics or attribution SDKs, and no third-party trackers — in the app or on this website. By default the app contributes the radio measurements it takes, together with the coordinates they were taken from, to the shared transmitter database at soopnav.com. Those contributions carry no device identifier and no user identifier. Local mode (Settings → Advanced) stops all of it: no measurements sent, no positions requested, no diagnostics uploaded.
1. Who this is from
SoOPNav is an independent, non-commercial research project, part of DomainsProject.org. It publishes the SoOPNav Android application and operates the backend service at soopnav.com. In this policy, “the app” means the SoOPNav Android application, “the backend” means the service at soopnav.com, and “we” means the project that runs both.
Questions, requests and complaints: [email protected].
2. What the app collects
2.1 Radio measurements — collected, and sent by default
Every few seconds the app records what it can hear. For each transmitter it observes:
- Wi-Fi access points: BSSID (the access point's hardware address), SSID (network name), channel frequency, signal strength.
- Bluetooth LE devices: device address, the name the device advertises if it advertises one, transmit power, signal strength.
- Cell towers: country and network code, tracking area, cell identity, RSRP/RSRQ, timing advance.
- Meshtastic mesh nodes: node identifier, signal-to-noise ratio, hop count, and the position the node itself broadcasts.
- APRS stations: the station's callsign. A position an APRS station broadcasts about itself is used on the device, but is not part of what is contributed.
Each measurement is stamped with the time and with the coordinates of the observing device, and — unless local mode is on — submitted to the backend. That is how the transmitter database is built, and the database is what lets any device get a fix without satellites. It is the app's function, not a side effect of it.
These identifiers are broadcast publicly by the devices that emit them. The app only listens. It does not connect to, join, authenticate against, or attempt to access any network or device it observes, and it does not capture any traffic carried on them.
2.2 Location — collected, and sent by default as part of 2.1
The app computes its own position from radio signals. That position — or, when a recent and accurate satellite fix is available and agrees with it, the satellite position — is attached to each measurement as the observer's coordinates, so the backend can work out where the transmitter is. This is precise location data.
Satellite (GNSS) location is used for exactly three things: as the observer coordinate described above, as ground truth for measuring how wrong the radio solution is, and to detect disagreement between the two. It is never an input to the position the app computes, and never the position the app displays. Radio in, radio out.
2.3 Diagnostic decision log — off unless you turn it on
Settings → Advanced has a Location decision log switch, off by default. Turned on, the app records one entry per positioning cycle — the radio estimate, the satellite coordinates and their accuracy, and the transmitters that contributed to the fix — writes it to a file in the app's own storage, and, unless local mode is on, uploads it to the backend. These entries are labelled with the device identifier described in 2.4.
This is the only data the app sends that ties a sequence of positions to a single device. It exists so that positioning errors can be diagnosed after the fact. If you do not turn the switch on, none of it happens.
2.4 Device identifier
The app reads Android's ANDROID_ID: an identifier scoped to this app on
this device, different for every app signing key, and regenerated on factory reset.
It is used in exactly two places — labelling diagnostic decision logs (2.3), and
naming this device to its peers when you deliberately link devices on your own
network (2.6).
It is not attached to radio measurements, it is not an advertising identifier, and it is never used for profiling, tracking across apps, or advertising.
2.5 Queries made to position you
To turn observations into a fix, the app asks the backend where the transmitters it can currently hear are located, sending their identifiers. It also fetches terrain elevation tiles for the surrounding area, and map tiles from OpenStreetMap. Like any map application, these requests reveal your approximate location to the server that answers them, along with your IP address.
2.6 Local network peer sharing — off by default
SoOPNav can share signal measurements between several devices on the same local network, so they can pool observations. This is off by default. When it is on, the traffic stays on your own network — it is not relayed through us and never reaches the backend.
2.7 What stays on your device
Recorded drives and tracks, waypoints, any transmitter database you import, cached map and terrain tiles, and your settings are stored in the app's private storage. None of it is uploaded. All of it is removed when you uninstall the app. Exporting a track to GPX or CSV is something you initiate, and it writes only where you choose.
3. What the app does not do
- No account, sign-in, email address, phone number, name or postal address.
- No advertising, no advertising identifiers, no advertising SDKs.
- No analytics, crash-reporting or attribution SDK of any kind.
- No access to contacts, photos, files, microphone, camera, calls or messages — the app does not request those permissions and cannot read them.
- No selling or sharing of personal data with data brokers, and no transfer of data to third parties for their own purposes.
- No cookies, no analytics and no trackers on this website.
4. Local mode: the switch that stops it
Settings → Advanced → Local mode. Turned on, the app submits no observations, requests no positions from the backend, and uploads no diagnostic logs. Positioning then runs entirely from transmitter data you imported yourself and signals this device has observed on its own, stored on the device.
Two things deliberately keep working in local mode, and it is more honest to name them than to imply a total blackout: terrain elevation tiles and app update checks. A terrain tile is the elevation of a map square — it is neither a position nor a measurement, it reveals nothing beyond the map area you are already looking at, and blocking it would quietly degrade altitude accuracy anywhere the tiles are not already cached.
5. Where data goes
| Destination | What is sent | When |
|---|---|---|
| soopnav.com (positioning) |
Radio measurements with observer coordinates; identifiers of currently-heard transmitters, as queries; diagnostic logs if you enabled them | By default. All three stop in local mode. |
| soopnav.com (terrain & updates) |
Terrain tile coordinates; app version check | Always, including in local mode |
| OpenStreetMap tile servers |
Coordinates of the map tiles being displayed, and your IP address | While the map is on screen |
| celestrak.org | Satellite orbital-element requests. No position, no identifier. | Only when LEO satellite positioning is used |
Requests identify the app as soopnav/<version>. As with any HTTP
request, the receiving server sees your IP address.
6. How long data is kept
- Radio measurements are kept for as long as the transmitter database exists — they are the database. Each row holds a transmitter identifier, a signal strength, the coordinates it was heard from and a timestamp. No device identifier and no user identifier is stored with them, so we cannot attribute a row to a device or a person.
- Diagnostic decision logs, when enabled, are stored as files labelled with the device identifier, for as long as they are useful for accuracy analysis. They can be deleted on request (see 7).
- Server logs — the ordinary web-server record of IP address, timestamp, path and user agent — are kept short-term for operating the service and preventing abuse.
7. Your choices and your rights
- Stop contributing: turn on local mode. It takes effect immediately and for everything.
- Withdraw permissions: Android Settings → Apps → SoOPNav → Permissions. Denying location stops Wi-Fi and cell scanning outright — Android does not return those scan results to an app without it. Bluetooth scanning is governed separately by the Nearby devices permission.
- Delete everything held on the device: uninstall the app.
- Delete uploaded diagnostic logs: email [email protected]. The device identifier is not displayed in the app, so tell us roughly when the logging was enabled and we will find and delete the matching records.
- Radio measurements cannot be deleted individually, and we would rather say so than pretend otherwise: they carry no identifier that links them to you, so there is nothing to search on. If you do not want to contribute them, turn local mode on before scanning rather than after.
Depending on where you live — for example under the GDPR in the EEA and UK, or the CCPA in California — you may have rights of access, correction, deletion, portability or objection. Write to [email protected] and we will do what we can within the limits described above. Where the GDPR applies, we rely on legitimate interests for operating a non-commercial positioning database, and on your consent — given by enabling the switch, withdrawn by disabling it — for diagnostic logs.
8. Permissions, and why each one exists
| Permission | Why the app needs it |
|---|---|
| Location (precise & approximate) |
Android returns Wi-Fi and cell scan results only to apps holding location permission. Also supplies the satellite fix used as ground truth and as the observer coordinate for contributions. |
| Nearby devices (Bluetooth) |
Scanning for Bluetooth LE transmitters, and connecting to an external radio (TNC) when you choose to use one. |
| Phone state | Reading cell identity and signal strength from the modem. The app does not read your phone number, call log or messages. |
| Physical activity | Optional. Uses the step detector for pedestrian dead reckoning on the inertial screen. Denying it simply leaves that display idle. |
| Foreground service (location) |
Keeps scanning while the app is in the background, with a permanent notification for as long as it runs. |
| Notifications | Showing that foreground-service notification. |
| USB device access | Optional. Talking to a plugged-in software-defined radio or mesh radio, only when you attach one. |
| Mock location | Optional and off by default. Publishes the app's radio-derived fix to Android's test-location provider so other apps can use it. Requires you to select SoOPNav in Android's developer options first. |
9. Security
Traffic between the app and the backend uses HTTPS, and the app pins the certificate chain for soopnav.com — a network attacker holding a fraudulent certificate cannot read or alter it. The backend holds no passwords and no account credentials, because it has no accounts.
Local network peer sharing (2.6) is unauthenticated by design and is meant for networks you control. Do not enable it on a network you do not trust.
10. App updates
Builds installed from Google Play are updated by Google Play. Builds downloaded directly from soopnav.com check that site for a newer version and verify the signature of anything they download before installing it.
11. Children
SoOPNav is not directed to children. We do not knowingly collect data from anyone under 13, or under the minimum age of digital consent where that age is higher.
12. Changes to this policy
If this policy changes, the effective date above changes with it and the current version is always the one published here. Changes that materially affect what is collected or where it goes will be called out on this page.
13. Contact
SoOPNav Project — [email protected]
← Back to soopnav.com