Last updated: July 30, 2026
eide.ai AS
Norway
Contact: pgpilot@eide.ai
pgpilot is a paragliding flight instrument and communication app. This policy explains what personal data we collect, why, on what legal basis, and what rights you have.
pgpilot offers several ways to sign in:
| Method | Data collected |
|---|---|
| Guest (anonymous) | Display name only. A random user ID is generated on your device. No email, password, or real name. Guest mode is legacy and being phased out; most cloud features need a real account. |
| Email sign-up / magic link | Email address, password (hashed by Supabase - we never see it in plaintext), and optional display name. |
| Google OAuth | Email address and profile name provided by Google. Authentication is handled by Supabase and Google; we do not receive or store your Google password. |
| Apple Sign In | Email address and name provided by Apple (on first sign-in only). Authentication is handled by Supabase and Apple; we do not receive or store your Apple password. |
Regardless of sign-in method, your Supabase user ID, display name, and authentication tokens are stored.
Your profile is readable by other pgpilot users, and appears publicly on any flight you leave public (Section 6). It may hold your username (a unique handle that also appears in public flight URLs; a previous username is kept so old links keep resolving), display name, nickname, profile photo, Instagram handle, and glider details.
Optional pilot-profile fields synced to the cloud: pilot name, glider type, glider ID, competition class, all-up weight, XContest username, OGN ID and OGN enabled flag, and Garmin InReach MapShare ID.
pgpilot can upload flights to, and stream your live position to, XContest, Flightlog.org and LiveTrack24. Because this runs in the background (phone locked, app closed), the backend must authenticate as you without prompting.
So when you connect one of these accounts, your username and password for that platform are stored on our servers, with the password encrypted at rest (Fernet) under a key held only by the backend. It is never returned to the app or exposed to other users, and is decrypted in memory only for the duration of an upload or live-track push. We also store connection status, last sync time, and any last sync error. Disconnecting a platform in Settings deletes the stored credentials, as does deleting your account.
Separately, the XContest Live map layer reads XContest's public live-flight API using an OAuth token borrowed from a connected pilot's session. Only public data is read; nothing about you is written.
pgpilot uses GPS (or an external BLE vario GPS, if connected) to provide flight instruments, map display, and pilot tracking. Your location is:
mqtt.bircom.in broker, decrypts packets using the published
default Meshtastic keys, and broadcasts node positions to other pgpilot
users. Meshtastic is a public network: anyone on the same channel is
visible, including your own node if you operate one.While a flight is recording, location collection continues in the background via a foreground service (Android) or background location updates (iOS), so your track survives the screen turning off.
Saved flights are public by default. Other pgpilot users can see your flight on the social feed, including your pilot name, glider type, launch location, flight statistics, XC score, simplified track polyline, attached photos and videos, and full GPS track (IGC file). Only flights that exceed minimum thresholds (duration, distance, and track length) appear in the feed.
Public flights are also reachable on the open web, not just
in the app: each has a page at /flight/{id} and, if you have a
username, an alias like /flight/{username}-{date}. Anyone with the
link can view it without an account, and such pages may be indexed by search
engines or previewed by messaging apps. Aliases are never rewritten, so links
already shared keep working after a username change.
You can toggle any flight to private at any time; its public page then stops resolving. Flights imported from another platform (e.g. Flightlog) are always private on upload.
The camera is used to scan QR codes (for importing shared
tasks) and to capture flight photos and video clips; you can
also import media from your gallery. Media is stored on your device and, when a
flight syncs, uploaded to the flight-media bucket
with thumbnails embedded in the flight record. On a public flight that media is
visible to others, including on the flight's public page. QR scanning is
processed on-device and never uploaded.
If you generate a highlight reel from flight video, the clips are read server-side, their audio transcribed with OpenAI Whisper, and a further OpenAI model pass selects and captions the best spoken remarks - so flight-video audio reaches OpenAI (US) when you use this feature.
The microphone is used for push-to-talk (PTT) voice communication, voice messages in group flights, and optionally the voice assistant (Section 9). Audio is:
voice-messages bucket, attached to the chat message. This is
what lets a group member replay a transmission they missed, and it means
group voice audio is retained as a stored recording, not merely passed
through.The voice assistant lets you operate the app hands-free. Common commands are matched by a local grammar on your device and never leave the phone. Anything it does not recognise goes to our backend and on to OpenAI: your utterance is transcribed with Whisper, and a language model picks the in-app action. To answer questions like "what is the wind doing" or "what did the group just say", the request includes a snapshot of relevant app state - position and flight state, navigation target, and, when asked about the conversation, recent group chat messages. The model returns a reply and actions your device executes behind an allowlist; nothing is executed on our servers. Spoken replies are synthesised by OpenAI text-to-speech.
The wake word ("hey pgpilot") is an always-listening mode that is off by default and enabled per user. While on, the microphone is monitored continuously but detection runs on your device; audio is sent onward only once the wake word or a PTT press starts a request.
pgpilot supports the KV4P HT VHF radio module, an external device connected via USB, enabling voice communication over VHF frequencies (e.g. 154.175 MHz, 143.9875 MHz) commonly used in paragliding.
VHF requires a foreground service with connectedDevice type to
hold the USB connection while the app is backgrounded.
Bluetooth Low Energy (BLE) is used to connect external PTT
buttons, BLE variometers (e.g. XCTracer, SkyDrop,
SkyBean, BlueFlyVario) and head-up displays. BLE scanning uses
the neverForLocation flag - it is not used for Bluetooth-based
location tracking.
A connected vario may provide GPS position, altitude, vario readings, battery level, and FLARM traffic. If it provides GPS it replaces the phone GPS as primary position source, and that data then follows Sections 5 and 6.
FLARM relay: if your instrument reports FLARM traffic, your device can relay those nearby aircraft positions to our backend, which merges them into the traffic feed for all pgpilot users and forwards them to the public APRS-IS / OGN network. These positions belong to surrounding aircraft rather than to you, and become publicly visible on OGN sites. Stale positions are dropped after 60 seconds.
PTT button presses stay on your device. Diagnostic logs about BLE connection problems may be uploaded so we can debug pairing issues.
The optional paid "Supporter" subscription is processed entirely by the
Apple App Store or Google Play, with
entitlements managed through RevenueCat.
We never see or store your card, bank details, or billing
address. The app identifies you to RevenueCat by your pgpilot user ID,
so RevenueCat processes that identifier plus purchase, renewal, cancellation and
platform/device data needed to manage entitlements. RevenueCat notifies our
backend of lifecycle events and we store only the resulting tier
(e.g. free, supporter_monthly) on your profile, which
only our server can write.
The app embeds no third-party analytics, advertising or crash-reporting SDK - no Google Analytics, Firebase Analytics, Meta SDK or similar. (Our backend does use one tracing service for the voice assistant; see Section 16.) Usage events go to our own Supabase project and include your user ID, a random session ID, event name, category and technical properties, and app version and platform. Performance events recorded during flights may also include battery level and drain rate, device capabilities (memory, CPU cores), user agent string, and frame rate metrics. We do not collect IP addresses or precise coordinates in analytics events.
Crashes. Native crashes and unclean shutdowns (e.g. the OS killing the app to reclaim memory) are captured by our own in-app mechanism, written to a file on your device, and uploaded as ordinary events on the next launch.
Debug telemetry. The app continuously records a detailed rolling snapshot of app, flight, sensor, battery, alert and navigation state into an on-device ring buffer that is discarded as it ages. It uploads only while a debug-telemetry flag is on for your account - which we do deliberately, typically while investigating a problem you reported - or if you enable the override yourself.
Bug reports you submit from the app include your current GPS position, an app-state snapshot (active tab, flight status, sensor status, group info, permissions), device information (platform, app version, user agent, screen dimensions, language), roughly the last 500 console log lines, and roughly the last 20 analytics events. Log lines may include error payloads such as request URLs and short response snippets, and the embedded events may include your display name. Bug reports are used solely for diagnosis. Guests can submit them; these are stored with a null user ID.
We process personal data on the following grounds (GDPR Art. 6):
Some of these process data outside the EU/EEA, notably OpenAI, RevenueCat, Fly.io, Apple, Google, Esri and AWS in the United States. Where this applies, transfers are protected by Standard Contractual Clauses or adequacy decisions as required by GDPR Chapter V.
On-device: flight recordings, photos and videos, settings, debug telemetry, and auth tokens live in IndexedDB, localStorage and the app's filesystem. You can clear them any time via your device settings.
Kept while your account exists (unless you delete the item sooner): your account and profile, saved flights and IGC files, flight media, synced settings, platform credentials, buddies, waypoints and tasks, chat messages, and stored voice messages.
Fixed retention windows: analytics, crash and error events and uploaded debug telemetry, 30 days; OGN/FLARM beacons, a rolling window currently 30 days; relayed external tracks (InReach, Meshtastic), up to 90 days; service health metrics, 90 days. Inactive groups are archived after 4 hours. Live track chunks are compacted into the saved flight once finalised. Server-side voice chunk buffers exist in memory only and are dropped within about an hour, or 30 seconds after assembly. Deleted voice messages are hidden immediately and their audio removed by a daily job. Bug reports and VHF research samples are kept while needed for debugging or filter development, and deleted on request; bug reports are detached from your user ID if you delete your account.
We do not sell your data, or share it with advertisers or data brokers. Data is shared with:
pgpilot is not directed at children under 16. We do not knowingly collect data from children.
Depending on your jurisdiction, you have the right to:
Deleting your account: you can do this yourself in the app, under Settings. It permanently removes your stored files (flights, flight media, profile photo, voice messages) and your account, cascading to your profile, flights, live tracks, settings, gliders, buddies, messages, groups, memberships, platform credentials, tasks and diagnostic logs. It cannot be undone.
To exercise any other right, contact pgpilot@eide.ai. We will respond within 30 days. For guest accounts with no email, clear all local data via your device settings; server-side analytics for guests use random IDs that cannot be linked to a real-world identity.
If you believe your data protection rights have been violated, you have the right to lodge a complaint with a supervisory authority. Since the data controller is established in Norway, the lead supervisory authority is:
Datatilsynet (Norwegian Data Protection Authority)
www.datatilsynet.no
If you reside in the EU/EEA, you may also lodge a complaint with your local data protection authority.
We may update this policy from time to time. Changes will be reflected by the "Last updated" date above.
eide.ai AS · Norway · pgpilot@eide.ai