Privacy Policy (GDPR Art 13 + ePrivacy)

Status: self-authored draft (AI-assisted), appropriate for the current closed-beta scale, revised against an external legal research memo dated 7 August 2026 and then reconciled, the same day, against a line-by-line audit of the shipped source code. Where the two disagreed, the code won: several passages that described an intended design now say plainly what the app does today, and are marked [planned] where the design is still being built. This notice is drafted to satisfy the information obligations of GDPR Article 13 (information to be provided where personal data are collected from the data subject) and the device-access consent rule of Article 5(3) of the ePrivacy Directive 2002/58/EC (as amended by 2009/136/EC), transposed in Denmark as cookiebekendtgørelsen, BEK nr 1148 of 9 December 2011, § 3. It also reflects Apple App Store Guideline 5.1.1(i) and Google Play's User Data / Data safety requirements. These documents are not legal advice and are not a substitute for a professional review — a lawyer review is recommended as the user base and data processing grow, and is advisable before enabling ID/biometric verification.

Last updated: 7 August 2026 — second revision the same day, reconciling this notice against a source-code audit of the shipped build Applies to: the Flybi mobile application ("Flybi", "the app", "we", "us")


1. Who we are (the controller) — GDPR Art 13(1)(a)

Flybi is operated by:

EU representative (GDPR Art 27): Not applicable — the controller is established in the EU (Denmark). Art 27 applies only to controllers not established in the Union (Art 3(2)). The Danish establishment is itself the contact point for the supervisory authority and for data subjects.

Data Protection Officer — GDPR Art 13(1)(b)

No Data Protection Officer is appointed; one is not legally required at the current scale. The controller (Nicholas Gerster Toft Simonsen, ngts91@gmail.com) is the contact for privacy matters. This position is re-assessed if scale grows or biometric/ID verification is enabled. We do not consider a DPO mandatory under GDPR Art 37(1): we are not a public authority, and our core activity is operating a single consumer app rather than large-scale monitoring or large-scale special-category processing as our core business in the Art 37 sense. At the current closed-beta size the "large scale" thresholds in Art 37(1)(b) and (c) are not met. That will change as we grow: a proximity service doing background location and processing special-category data crosses those thresholds well before it feels like a large company, and we re-run the assessment at each order of magnitude of growth.

Note that a DPO is not required for a Data Protection Impact Assessment to be required — see Section 12.


2. Who Flybi is for — 18+ only (children) — GDPR Art 8

Flybi is an 18-and-over service. You must be at least 18 to create an account. We do not knowingly process the personal data of anyone under 18.

If we learn that a user is under 18, we will close and erase the account.


The table below lists each category of personal data, the purpose, and the lawful basis under GDPR Art 6 (and, where relevant, the special-category condition under Art 9(2)). The field names in brackets are the actual Firestore fields (see lib/core/constants/firestore_fields.dart) and are given for transparency.

3.1 Account & authentication

3.2 Profile & personality

3.3 Interests as "tags", including secret tags

3.4 Location — proximity discovery, including in the background when the app is closed — see also Section 9 (ePrivacy)

Read this section carefully. It is the most intrusive processing Flybi does.

3.5 Location — live "Hot/Cold" game (real-time precise distance)

3.6 Chat messages

3.7 Safety: reports, blocks & moderation

3.8 Date of birth / 18+ age gate

3.9 Push notifications & device tokens

3.10 Technical, security & abuse-prevention data

App Check. Firebase App Check is integrated, but its enforcement is currently switched off on our server functions, including account deletion — the device-attestation providers it depends on are not yet registered with Apple and Google. So while it is listed here and in Section 6.2 as something we use, it is not protecting those paths today. Section 13 says the same.

3.11 Crash diagnostics, performance monitoring and analytics

⚠️ Read this first — what happens today, 7 August 2026

The consent design described in the rest of this section is not yet built. In the app as it ships right now:

We are not describing that as a design. It is a defect, it is the top of our engineering list, and until it is fixed the legal bases set out below are not being properly obtained. Everything marked [planned] below is where we are going, not what the app does now. If you want us to delete diagnostics data already collected about you, e-mail us (Section 1) — note that account deletion does not currently reach these systems (Section 10).

[planned] These will be off by default, with nothing running unless you switch it on, and the app working identically either way.

3.12 Best-fit / ML signals

3.13 Advertising — not active at launch

At launch Flybi shows no advertising. The Google AdMob SDK is integrated but ships disabled ("dark"), and we do not use your data for advertising, behavioural targeting, or ad measurement. There is therefore no Art 6 basis claimed for advertising at this time. If advertising is later enabled, we will update this notice first and, for any behavioural/targeted advertising or device-storage access for ads, obtain your Art 6(1)(a) consent (and the separate ePrivacy device-access consent — Section 9) and, on iOS, your App Tracking Transparency permission before any tracking occurs.


Flybi uses automated processing to rank and surface profiles (best-fit and soulmate/strong-fit scans) and an automated text filter to screen names, bios and chat for disallowed language. These help us run the service and keep it safe.

We do not make decisions producing legal effects concerning you or similarly significantly affecting you solely by automated means within the meaning of Art 22(1). Moderation actions that restrict an account or content (warn / hide / suspend) are taken by a human moderator, who issues a statement of reasons (DSA Art 17).


5. How we keep the service safe

We operate: an in-app report flow and block capability; a human moderation process with a ~24-hour review target, statements of reasons, and warn/hide/suspend actions; a disallowed-language filter on names, bios and chat; an 18+ age gate; and Terms/EULA acceptance at registration. These underpin the safety processing described in Sections 3.6–3.8.


6. Who receives your data — GDPR Art 13(1)(e)

6.1 Other users

By design, your profile (name, photo, bio, public tags, approximate area, badges and — if you make it visible — your personality profile) is shown to other signed-in users so they can discover and connect with you. Chat content is shared with the people in that conversation. Secret tags are shared only via a mutual reveal.

More than that is currently readable, and you should know it. Your profile record as stored today also carries your e-mail address and your precise last-known coordinates, and it is readable by any signed-in Flybi user, not only by the people we choose to show you to. Nothing in the app displays those fields — but "not displayed" is not the same as "not shared", and we are not going to describe it as if it were. Removing them from the readable copy is [planned]; see Section 3.4.

Open rooms. If you create or join an open ("Stop Bi") room, that room is listed to other signed-in users so they can find and join it. The listing shows its title and image, its join tags, and its approximate area — a geohash cell of roughly 1.2 km × 0.6 km, the same coarse grid used for profile discovery. Your precise coordinates are not in the room record: it holds only the cell, so the point you were standing on when you opened the room is not recoverable from it (#1033). Rooms you keep private are visible only to their participants and to anyone you invite.

⚠️ What an open-room listing actually carries. Everything in the room's record travels to the device of every signed-in user who lists open rooms — not just the parts the app puts on screen. That includes the e-mail addresses of the room's participants, of anyone invited to it, and of whoever created it (room membership is keyed by e-mail throughout Flybi), and the text of the last message sent in the room. The app does not display the last message or the addresses in the discovery card, but they are delivered all the same, and a determined person can read them. If you would not want your e-mail address known to strangers, do not join open rooms until we have fixed this. Re-keying membership from e-mail to an opaque ID is tracked as #696 / #600.

What a new joiner can see. When someone joins an open room, they are shown messages sent before they arrived — currently up to the most recent 200 messages of that conversation. There is no server-side limit behind that number: it is a cap the app applies, and one we can change remotely, so it is a product setting rather than a guarantee. People who were not present when you wrote something can therefore read it. A real cap — post-join only, or a short window — is [planned].

6.2 Processors (sub-processors) acting on our instructions

We use Google Firebase as our backend processor (the contracting Google entity — e.g. Google Ireland Limited and/or Google LLC, as applicable under Google's Cloud/Firebase terms). The specific services are:

And, for crash, performance and usage data (Section 3.11) — which, as that section explains, are currently running by default rather than on your switch:

Google processes this data on our behalf as a processor under the Google Cloud / Firebase Data Processing and Security Terms (an Art 28 Data Processing Agreement is in place via acceptance of Google's DPA). For the three diagnostic and analytics services above, the contracting entity is Google LLC and the data reaches the United States — see Section 7. We keep Google's data-sharing settings off so that Google does not become an independent controller of that data. No other processors (for example a third-party e-mail provider) are shipped in the current build; this list will be updated if any are added. (Current position; to be confirmed in a professional review as the project grows.)

We may disclose data to public authorities (e.g. Danish Police) where required by law or to address a serious risk to life or safety, and to our advisers to establish, exercise or defend legal claims.


7. International transfers — GDPR Art 13(1)(f) / Arts 44–49

Our processing is configured for the EU/EEA: Cloud Functions run in europe-west1 (Belgium) and Firestore/Storage are provisioned in an EU region (e.g. eur3 / europe-west1). (Current configuration; to be confirmed in a professional review as the project grows.)

Two things nonetheless leave the EEA:

The mechanism is the same in both cases. Google LLC is certified under the EU–US Data Privacy Framework, which the European Commission has found to provide an adequate level of protection (Art 45), and the EU Standard Contractual Clauses are incorporated into Google's Data Processing Terms as an Art 46 safeguard that stands behind it. We keep the SCCs in the contract chain deliberately, so that the transfer remains covered if the Framework is ever suspended or annulled — a legal challenge to it is pending before the Court of Justice. You can request a copy of the relevant safeguard using the contact details in Section 1.


8. How long we keep your data (retention) — GDPR Art 13(2)(a)

We keep personal data only as long as needed for the purposes above. Every period below is anchored to an event we actually record — the date you deleted your account, the timestamp of the last message in a conversation, the date a report was closed — so that you can work out the period that applies to your data rather than reading a general promise.

⚠️ How these periods are enforced today, 7 August 2026. Deletion you ask for — account deletion, erasing your location — runs immediately, as a real server-side job, and you can rely on it. The time-based periods in the table below are a different matter: the scheduled clean-up job that is meant to enforce them has not been built yet. Rows marked [not yet automatic] describe the limits we hold ourselves to and will delete to on request, not a sweep that runs on its own. We are telling you this instead of quietly loosening the wording, and building the job is the fix.

Data Retention
Account, profile, tags, photos, personality, stats Kept while your account exists. Erased when you delete your account (Section 10) — see the erasure timing note below.
Location (Section 3.4) One point only. Each reading overwrites the previous one, so no trail is built. The stored point is deleted when you turn location off, when you use "Erase my stored location", and when you delete your account. The 30-day expiry for un-refreshed points is [not yet automatic].
Live Hot/Cold game session data The live position record written during a game stays on the chat room after the game ends until a later game overwrites it or your account is deleted (Section 3.5). Clearing it when the game stops, and sweeping old records, are [planned].
Chat messages Kept for the life of the conversation. The 12 months after the last message limit is [not yet automatic] — no job currently deletes dormant conversations. On account deletion your profile is erased, but messages you sent stay in the conversations they were delivered to, on our legitimate interest in the other participants' own record of their conversation (Art 6(1)(f)); you can object to that under Art 21 and we will weigh it. The images you sent are an exception: they are deleted from Storage by the erasure cascade, so a retained message shows the text but no longer the photo (#1021).
User reports / safety & moderation records Our limit is 24 months from the date the report is closed (actionedAt), and these are kept beyond your account deletion, because they are needed to keep other users safe and to establish, exercise or defend legal claims (Art 17(3)(e), and our legitimate interest under Art 6(1)(f) in the safety of the people who reported). [not yet automatic] — deletion at 24 months is done on request or by hand until the scheduled job ships. Reports that led to a ban, or that concern serious harm, may be kept longer where a specific matter is live — we will tell you the period if you ask.
Date of birth / age-gate record Kept while your account exists (age-assurance evidence); erased with the account.
Encounter & ML/connection-outcome rows about other users On your deletion these are stripped of your name and photo and your identifier is replaced with a placeholder, rather than the rows being deleted, so other users' history and counts survive. Be aware that one of those placeholders is currently built from your account's internal ID rather than being a fresh, unlinkable token — so it is not the dead end we would like it to be. Fixing that is [planned]; see Section 10.
Blocks placed on you by other users Kept as long as the blocking user's account exists, so that their block continues to work — and removed when you delete your account, since the erasure cascade scrubs you from other people's block lists.
Technical logs, rate-limit and security data Our limit is 30 days from the date of the log entry, and up to 6 months for logs retained for a specific abuse or security investigation. [not yet automatic].
Crash, performance and analytics data (Section 3.11) Retained by Google: Crashlytics 90 days; Performance Monitoring 30 days where associated with an IP address and 60 days where associated with an installation. These are enforced by Google, not by us.
Backups Our backup rotation is 30 days. A deleted record may survive in a backup until that backup is overwritten in the ordinary cycle; it is not used for any other purpose in the meantime, and if a backup is ever restored the deletions are replayed against it.

Timing of erasure. When you ask us to erase data, or delete your account, we act on it promptly — the deletion runs when you confirm it, not on a clean-up schedule, and well inside the one month Art 12(3) gives us to respond. That is deliberately a different clock from the periods in the table above, which is why the box above tells you which of those periods are not yet enforced by a job.

Where a period above depends on something we cannot predict — an open safety investigation, a legal claim — we keep the data for as long as that specific matter requires and no longer, and we will tell you the expected period if you ask (Art 13(2)(a)).


9. Access to your device (ePrivacy) — Art 5(3) ePrivacy Directive / cookiebekendtgørelsen § 3

Two things Flybi does count as storing information on, or gaining access to information stored in, your terminal equipment under Art 5(3) of the ePrivacy Directive 2002/58/EC, transposed in Denmark as BEK nr 1148 of 9 December 2011 § 3:

  1. Reading your device's location and sending it to our servers — for discovery and background updates (Section 3.4) and the live game (Section 3.5). Sensor readings are outside Art 5(3) only while they stay on the device; once the reading, or any derivation of it such as a geohash, leaves the device, Art 5(3) applies (EDPB Guidelines 2/2023 v2.0, §44).
  2. Writing and reading the installation identifiers used by Crashlytics, Performance Monitoring and Analytics (Section 3.11). ⚠️ Those identifiers are currently being written at launch without asking you first — see the box at the top of Section 3.11. The rule below is the rule; we are not yet meeting it for this second item, and the consent prompt that will fix it is being built.

Both require your prior consent, and this is a separate legal hook that sits in front of our GDPR Art 6 basis — if we do not clear Art 5(3), no Art 6 basis can rescue the processing, and Art 5(3) has no legitimate-interest option. We do not rely on the "strictly necessary for a service you explicitly requested" exemption for any of it. In particular, that exemption cannot cover collection that continues while the app is closed, and it cannot cover crash reporting or analytics, because the test is what is strictly necessary from your point of view — Flybi works the same without them.

The operating-system permission dialog is not this consent. An OS permission prompt is a technical control over a resource; it does not name a purpose, a retention period, a recipient or a withdrawal right, and it cannot be a valid consent on its own. Our own in-app consent screen is what asks you, and the OS prompt is only triggered after you have said yes there. If you decline in Flybi, we do not show you the OS prompt at all.

Withdrawal. Turn location off in Profile → Location — one tap, at the same depth as switching it on. You can additionally revoke the permission in your device settings. Turning location off in-app stops every location read, foreground and background, and also erases the location already stored for you, both the copy on your profile and the private copy (Section 3.4). Withdrawing leaves the rest of Flybi working. For diagnostics and analytics there is no in-app switch yet (Section 3.11); until there is, e-mail us and we will stop it for you.

Supervision. GDPR matters are supervised by Datatilsynet; Digitaliseringsstyrelsen supervises the Danish cookiebekendtgørelse — the rules in this section — and can impose penalties under it. See Section 11.


10. Your rights — GDPR Art 13(2)(b)–(d)

You have the following rights over your personal data. To exercise them, use the in-app controls described below or contact us (Section 1).

A separate deactivation option lets you hide your account without deleting it.

What "delete your account" does, and what "clear chat history" does — they are not the same. Deleting your account really deletes data, as described above. The control still labelled "Clear chat history" deletes nothing: it records a point in time against your e-mail address on that conversation and hides everything before it from your own view. Everyone else in the room still sees every message, and the messages remain in our database. We are renaming the control, because the current name promises deletion and delivers hiding. If you want data gone rather than hidden, delete your account or ask us. - Restriction (Art 18) — ask us to stop using your data while a dispute about its accuracy or our legal basis is resolved, instead of deleting it. Hiding a conversation from your own view is a form of restriction, not erasure — see above. - Objection (Art 21) — object to processing based on legitimate interests (Sections 3.7, 3.10 and 3.12); we will stop unless we have overriding legitimate grounds (e.g. ongoing safety/abuse handling). - Data portability (Art 20) — receive data you provided, based on consent or contract, in a structured, commonly used, machine-readable format. - Withdraw consent (Art 13(2)(c); Art 7(3)) — where we rely on consent, you can withdraw at any time, as easily as you gave it, without affecting the lawfulness of processing before withdrawal. We rely on consent for: - Foreground location and, separately, background location (Sections 3.4 / 3.5) — withdraw either in Profile → Location, or in your device settings. Withdrawing also erases the location already stored for you, and the same screen has a standalone "Erase my stored location" control. - Crash & performance diagnostics and, separately, usage analytics (Section 3.11) — the in-app switches are [planned] and not there yet, so for now withdraw by e-mailing us and we will switch it off for your account and delete what has been collected. - Your tags, where they reveal special-category data (Section 3.3), and optional profile fields — withdraw by removing them or editing your profile. - Any future advertising (Section 3.13).

Withdrawing any one of these leaves the rest of Flybi working. We do not make access to the app conditional on background location, diagnostics or analytics, and we will not re-ask after you have refused.

Access and data-portability requests are handled via the contact e-mail in Section 1 (ngts91@gmail.com), with a response target of within one month as required by Art 12(3). (Current process; to be confirmed in a professional review as the project grows.)


11. Right to complain — GDPR Art 13(2)(d)

If you believe we have processed your data unlawfully, you may lodge a complaint with the Danish supervisory authority. You do not need to raise it with us first, though we would rather you did.

Datatilsynet (Danish Data Protection Agency) — https://www.datatilsynet.dk — supervises our compliance with the GDPR. Its current postal address and complaint channel are published on datatilsynet.dk; refer to the site for the authoritative details.

Digitaliseringsstyrelsen (Danish Agency for Digital Government) — https://digst.dk — supervises the Danish cookiebekendtgørelse (BEK nr 1148 of 9 December 2011), which is the rule that governs access to information on your device: our reading of your location, and the installation identifiers used by crash reporting, performance monitoring and analytics (Section 9). Complaints about those go to Digitaliseringsstyrelsen rather than Datatilsynet. Digitaliseringsstyrelsen is also Denmark's Digital Services Coordinator under the Digital Services Act.

You may also complain to the supervisory authority in your EU/EEA country of residence.


12. Accountability records we maintain (informational)

For transparency, and because the Art 30(5) "<250 employees" exemption does not apply to us (our location processing is not occasional and is likely to result in a risk to data subjects — these are alternative triggers, any one of which removes the exemption), we maintain a Record of Processing Activities (ROPA) under Art 30(1).

A Data Protection Impact Assessment (DPIA) under Art 35 is mandatory for our location processing. The route is not "large scale" — at our current size we do not meet the Art 35(3)(b)/(c) scale triggers — but Datatilsynet's own Art 35(4) list, item 3: processing of location data in combination with at least one further criterion. We process location data and meet at least two further WP248 rev.01 criteria (systematic monitoring, and sensitive or highly personal data). That list item carries no size threshold, so a closed beta of 26 users does not escape it. The DPIA covers the foreground/background split and why background collection is necessary, the Art 9 analysis, the sampling frequency and stored precision, retention, the outing / stalking / physical-safety risk model, processors and transfers, and withdrawal and deletion mechanics. If a high residual risk remains after mitigation we will undertake Art 36 prior consultation with Datatilsynet. The ROPA and DPIA are maintained on file.


13. Security & data breaches

We protect your data with measures including encryption in transit, Firebase Authentication, server-side security rules (firestore.rules) and rate limiting. App Check is integrated but its enforcement is currently off on our server functions (Section 3.10), so it is not adding protection today. No system is perfectly secure, and Sections 3.4, 3.5, 6.1 and 10 name the specific places where our current rules are looser than we intend them to stay.

If a personal data breach occurs, we will notify Datatilsynet without undue delay and, where feasible, within 72 hours of becoming aware of it, unless the breach is unlikely to result in a risk to your rights and freedoms (GDPR Art 33), and we maintain an internal breach register (Art 33(5)). Where a breach is likely to result in a high risk to you, we will inform affected users without undue delay (Art 34). Because a breach affecting precise location, chat and identity could be high-risk (per EDPB Guidelines 01/2021 breach-severity factors: nature/sensitivity/volume of data, ease of identification, and severity of consequences), we treat such incidents accordingly.


14. Future features (not active)

The following are not part of the live service and are listed only so this notice stays accurate as the app evolves:


15. Changes to this policy

We may update this notice. We will post the new version at https://flybi.app/privacy and, for material changes (e.g. a new processing purpose or legal basis), notify you in-app or by e-mail and, where required, seek fresh consent.


*Drafting note for counsel: every legal requirement above is grounded in the research brief and in the external legal research memo of 7 August 2026 (MEMO.md) — GDPR Arts 3, 5, 6, 7, 8, 9, 12, 13, 17, 18, 21, 22, 25, 27, 30, 33, 34, 35; ePrivacy Art 5(3) + EDPB Guidelines 2/2023 v2.0 §44, transposed as BEK nr 1148 § 3; Danish Data Protection Act § 6(2); e-handelsloven § 7. Data-flow descriptions are taken from the live code (firestore_fields.dart, firestore.rules, discovery_repository_impl.dart, chat_room_game_wrapper.dart, the deleteAccount Cloud Function, and the moderation runbook). The first revision of 7 August 2026 brought the notice into line with the memo on: background location and the Art 9 condition (§3.4, §3.5, §9), Crashlytics/Performance/Analytics as consent-gated device access (§3.11), event-anchored retention (§8), the honest account of chat clearing versus deletion (§3.6, §10), and controller contact details (§1).

The second revision of the same day reconciled the notice against a line-by-line source-code audit (code-audit-2026-08-07.md), and the code won every disagreement. Corrected: the reach and the gaps of the deletion cascade (§10, §8); the App Check claim (§3.10, §6.2, §13); world-readable profile e-mail and coordinates (§3.4, §6.1); what an open-room listing actually delivers and how much backlog a new joiner sees (§6.1); telemetry running by default rather than on consent, with the Flybi user ID and, in one path, an e-mail address attached (§3.11, §7, §9, §10); published retention periods that no scheduled job enforces (§8); the live-position record left behind by the Hot/Cold game (§3.5); the "clear chat history" watermark (§3.6, §10); and the client-side-only age gate (§3.8). Passages describing a design that is not yet shipped are marked [planned]; that marker is load-bearing and must not be removed ahead of the code.

The open questions behind those markers — founder decisions, and points the audit listed as not determined — are tracked internally in docs/legal/open-items-2026-08-07.md and in #1167. They are deliberately kept out of this file: tool/build_site.py renders this document to https://flybi.app/privacy, and markdown passes HTML comments through to the published page.*