diff --git a/.github/workflows/deploy-web.yml b/.github/workflows/deploy-web.yml index 38ad245..1a3835e 100644 --- a/.github/workflows/deploy-web.yml +++ b/.github/workflows/deploy-web.yml @@ -5,6 +5,9 @@ on: branches: [main] paths: - 'public/**' + - 'docs/blog/**' + - 'scripts/release/lib/build-blog.mjs' + - 'scripts/release/release.config.json' - '.github/workflows/deploy-web.yml' workflow_dispatch: @@ -28,6 +31,7 @@ jobs: with: persist-credentials: false - uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6 + - run: node scripts/release/lib/build-blog.mjs - uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5 with: path: public diff --git a/README.md b/README.md index 213afa6..b78ecb2 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@

Deliberate private introductions on an open protocol.
- An Expo React Native reference client for the OpenDating protocol. + A live browser dating app and Expo reference client for the OpenDating protocol.
+ Open the web app →

@@ -16,12 +17,12 @@ TypeScript strict React Native 0.86 CI status - Platforms iOS Android + Platforms Web iOS Android


-> **Release status:** 0.1.1 is a proposed launch candidate; approval is not effective until `release/manifest.json` records the reviewed source SHA, artifact IDs, and checksums. See [Release Status](docs/RELEASE-STATUS.md) for verified capabilities, and the [1.0 Execution Roadmap](docs/ROADMAP-1.0.md) for the path through GA. +> **Release status:** The [web app is live](https://opendating-mobile.expo.app/). Native 0.1.1 remains a proposed launch candidate; approval is not effective until `release/manifest.json` records the reviewed source SHA, artifact IDs, and checksums. See [Release Status](docs/RELEASE-STATUS.md) for verified capabilities. ## What is OpenDating? diff --git a/docs/SEO-BLOG-RESEARCH.md b/docs/SEO-BLOG-RESEARCH.md new file mode 100644 index 0000000..e9348d2 --- /dev/null +++ b/docs/SEO-BLOG-RESEARCH.md @@ -0,0 +1,201 @@ +# SEO blog research + +**Checked:** 2026-08-29; product and publication state refreshed 2026-08-31 + +**Scope:** product truth, live site, and current primary sources for two +competitor-alternative articles and one narrow direct comparison. + +Only the four articles explicitly marked `draft: false` were rechecked for the +August 31 web release. Every other article remains fail-closed until its claims +are checked again against then-current sources and product state. + +## Product truth that article copy must preserve + +- OpenDating is live as a browser app at `opendating-mobile.expo.app`. Native + Mobile 0.1.1 remains a proposed launch candidate, and iOS/Android store + availability must not be promised. Sources: the production URL, + `docs/RELEASE-STATUS.md`, and `release/manifest.json`. +- Web is the currently available platform. Native iOS and Android remain + pre-release. Source: `scripts/release/release.config.json` plus the release + files above. +- The core app is free. The candidate also contains an optional **$4.99 US + lifetime** purchase for three accent themes; purchase/restore is not yet + proven on a physical iOS device. It does not buy discovery, ranking, + matching, messaging, recovery, deletion, or safety. Source: + `docs/MONETIZATION.md`. +- Account creation requires no phone number, email address, password, or social + login. On the web, the recovery key is encrypted in local storage behind a + browser-lock passphrase; plaintext exists temporarily in JavaScript memory + while unlocked. There is no conventional password reset. Sources: + `src/app/(onboarding)/welcome.tsx`, `src/app/(onboarding)/create-account.tsx`, + `docs/SECURITY.md`, and `docs/RELEASE-STATUS.md`. +- Raw coordinates are converted on-device to a geohash of at most five + characters; only that prefix crosses the location module boundary. Describe + it as an **approximate area**, not an exact or invariant 5 km square. Sources: + `src/lib/location/index.ts`, `src/lib/location/geohash.ts`, and + `src/features/discovery/use-discovery.ts`. +- Direct-message content is end-to-end encrypted after mutual interest. The + service can still observe timing and traffic volume, recipients can retain + screenshots/copies, and message history already delivered to another device + cannot be remotely erased. Sources: `docs/PRIVACY.md`, + `src/lib/opendating/open-dating-client.ts`, and + `src/app/(tabs)/passport.tsx`. +- The current deployment uses OpenDating-operated first-party services. The + wire protocol is open, but independent providers, federation, full data + portability, and provider migration are post-GA. Sources: `README.md`, + `docs/ROADMAP-1.0.md`, and the public + `blog/how-decentralized-dating-works` correction. +- One-at-a-time introductions, their explanation, and the privacy receipt exist + in current source. Physical-device proof from the release candidate remains + open. Sources: `src/app/(tabs)/discover.tsx`, + `src/features/discovery/private-introduction.ts`, + `docs/RELEASE-STATUS.md`, and `release/manifest.json`. + +## Six-article starting set + +| Category | Working title | Decision-useful angle | Review state | +|---|---|---|---| +| User-problem guide | How to use a dating app without sharing exact GPS | Permission choices, what coarse location does and does not protect, and why an approximate area is not anonymity | Safest first publication after release-state caveat and source review | +| User-problem guide | How to date without using a phone number or email login | Recovery-key trade-off, loss/recovery risk, and when a conventional account is the better choice | Keep draft until recovery language is security-reviewed | +| Alternative | A Tinder alternative for people who want less account and location data | Compare disclosed account/location inputs, message-policy boundary, platforms, availability, and paid model | Supportable from current primary sources below | +| Alternative | A Bumble alternative for people who want coarse location and encrypted chats | Compare phone verification, coordinates, message processing, platforms, availability, and paid model | Supportable from current primary sources below | +| Direct comparison | OpenDating vs Tinder: privacy model, availability, and pricing | A dated fact table only; no winner score, efficacy, audience-size, or safety-superiority claims | Supportable only within the bounded matrix below; keep draft for legal review | +| Evergreen advantage | What OpenDating's on-device coarse location and encrypted messages actually protect | Explain the genuine implementation and its metadata, recovery, operator, portability, and release limitations | Publishable after source audit; avoid calling today's service decentralized | + +## Competitor facts from current primary sources + +### Tinder + +- **Availability:** free core matching/chat on iOS, Android, and web. Tinder's + current help page states iOS 16+, Android 10+, and current major browsers. + [Official overview](https://www.help.tinder.com/hc/en-us/articles/115004647686-Tinder-Overview) +- **Paid model:** Plus, Gold, and Platinum subscriptions add features such as + unlimited Likes, Passport, Rewinds, Likes You, Incognito, and prioritized + Likes. Benefits can vary under testing. + [Official subscription matrix](https://www.help.tinder.com/hc/en-us/articles/115004487406-Tinder-subscriptions) +- **Price:** do not quote a universal monthly price. Tinder's terms permit price + variation by region, duration, bundle, past purchases, account activity, + promotions, and tests; the US App Store lists SKUs without enough plan and + duration context for an honest monthly comparison. + [Terms, section 8](https://policies.tinder.com/terms/intl/en/), + [US App Store](https://apps.apple.com/us/app/tinder-dating-app-date-chat/id547702041) +- **Account data:** the current policy lists phone number, email address, and + date of birth as examples of account data provided to create an account. + [Privacy policy, section 3](https://policies.tinder.com/privacy/intl/en/) +- **Location:** official help says device/browser location access is required; + the privacy policy says latitude and longitude may be collected with + permission. Do not claim Tinder always collects background location. + [Location help](https://www.help.tinder.com/hc/en-us/articles/115005668326-Grant-access-to-device-location), + [privacy policy](https://policies.tinder.com/privacy/intl/en/) +- **Chats and data use:** the policy includes chats in collected `Content` and + says content and activity can be processed for service operation, safety, + research, improvement, machine learning, advertising, and other listed + purposes. It also permits defined sharing with vendors, advertising partners, + Match Group affiliates, authorities, and transaction successors. State what + the policy says; do not write “employees read every message” or “Tinder sells + chats.” + [Privacy policy, sections 3-6](https://policies.tinder.com/privacy/intl/en/) +- **Encryption:** no current primary source found promises end-to-end encryption + or user-held message keys. Google Play's developer declaration says data is + encrypted **in transit**, which is not evidence of E2EE. + [Google Play](https://play.google.com/store/apps/details?id=com.tinder) +- **Deletion:** do not promise immediate, total deletion. The policy describes a + three-month safety window after closure plus longer retention for bans, + transactions, logs, legal duties, and disputes. + [Privacy policy, section 9](https://policies.tinder.com/privacy/intl/en/) + +### Bumble + +- **Availability:** free to download/use with in-app purchases on iOS and + Android. Bumble Web was discontinued in March 2026. + [US App Store](https://apps.apple.com/us/app/bumble-dating-app-meet-date/id930441707), + [Google Play](https://play.google.com/store/apps/details?hl=en-US&id=com.bumble.app), + [official web discontinuation notice](https://support.bumble.com/hc/en-us/articles/30996192802973-An-update-on-Bumble-web) +- **Paid model:** Boost, Premium, Premium+, Spotlight, SuperSwipe, and Notes are + optional paid products. Paid benefits include features such as unlimited + likes, match extension/rematch, advanced filters, Incognito, Travel Mode, and + feed priority. + [Official plan matrix](https://support.bumble.com/hc/en-us/articles/32668790872733-Understanding-Bumble-s-paid-features-and-subscription-plans) +- **Price:** do not quote a universal monthly price. Bumble says cost varies by + tier, duration, and package size and directs members to the in-app Pay Plan + page for current pricing. + [Official pricing notice](https://support.bumble.com/hc/en-us/articles/30614091973149-Pricing-information-for-paid-features) +- **Account data:** Bumble's policy says a phone number is required for account + verification/one-member-one-account; photo or ID verification can be required + in some cases. Do not simplify this to “every user is ID verified.” + [Privacy policy](https://bumble.com/privacy-policy) +- **Location:** with permission, Bumble says it can collect Wi-Fi access-point + information and longitude/latitude and can save device coordinates for + features. The policy says permission can be turned off. Do not call the + location public: Bumble says other members see general location information. + [Privacy policy, geolocation section](https://bumble.com/privacy-policy) +- **Messages:** Bumble says it reviews message content to identify topics, + sentiments, and trends after taking steps to remove identifying information. + Its policy also names moderation providers that may process reports, messages, + and media. This is a policy claim, not evidence that a specific employee reads + all messages. + [Privacy policy, messages and service-provider sections](https://bumble.com/privacy-policy) +- **Encryption:** no current primary source found promises end-to-end encryption + or user-held message keys. Do not infer “plaintext” merely from that absence. + +## Narrow direct-comparison matrix that is supportable now + +| Dimension | OpenDating current truth | Tinder current primary-source truth | +|---|---|---| +| Availability | Live free web app; native iOS/Android candidates remain pre-release | Available free on iOS, Android, and web | +| Account | No phone/email/password/social login; recovery key and no conventional password reset | Policy lists phone/email/DOB account data | +| Location | Raw GPS becomes a max-five-character geohash on-device; only the prefix leaves the module | Device/browser location access required; latitude/longitude may be collected with permission | +| Messages | E2EE content after mutual interest; service still sees network metadata | Policy treats chats as collected Content; no primary-source E2EE promise found | +| Discovery | One explained introduction at a time with a privacy receipt | Swipe Right/Like; mutual likes create a match | +| Price | Free on web; native billing remains candidate-only | Free core plus variable-price Plus/Gold/Platinum subscriptions | +| Who should choose it | Only testers who accept pre-release, small-network, recovery, and operator/portability limits | Someone needing a generally available product, web access, broad geographic support, or conventional account/support expectations | + +The comparison must identify the date checked and link each Tinder row to the +official sources above. “More private,” “safer,” “better matches,” and fixed +monthly savings are conclusions, not verified facts, and should not appear. + +## Unsupported or stale claims already present + +- Resolved August 31: `scripts/release/release.config.json` now describes the + live web app, first-party operation, four reviewed articles, and fail-closed + generation without “decentralized dating” or “surveillance capitalism” copy. +- The live/indexed `how-decentralized-dating-works` page correctly discloses the + first-party operator and post-GA federation goal, but its stronger statements + that relay enforcement prevents every unmatched message and hides blockers + from discovery exceed the current release evidence. Re-audit against the + deployed relay before retaining them. +- `public/blog/location-privacy-dating-apps/index.html` is `noindex`, but its + “most dating apps” data-use claims are unsourced and “eliminates these risks” + is an absolute OpenDating cannot prove. Coarse location reduces precision; it + does not eliminate inference, screenshots, compromised endpoints, or metadata. +- `public/blog/why-privacy-matters-in-dating/index.html` is `noindex`, but claims + that major competitors store all messages in plaintext, sell data to brokers, + retain photos permanently, and allow employee access are unsupported as + written. Its OpenDating statement “delete your key, and your presence + disappears” is false: deletion must route through the advertised deletion + service, and another member can retain delivered content. +- The archived encryption article's general breach, subpoena, merger, and named + competitor framing is unsourced. Keep it unpublished unless every example is + replaced with a current primary source. +- Do not claim current federation, independent providers, full profile/match/ + message portability, zero central servers, anonymity, precise risk + elimination, universal 5 km geometry, immediate complete deletion, or public + App Store/Play availability. + +## Live production evidence + +Read-only HTTP checks on 2026-08-29: + +| URL requested | Result | What it proves | +|---|---|---| +| `https://jongan69.github.io/opendating-mobile/` | 301 to `https://pages.jongan.com/opendating-mobile/`, then 200 | Public landing page responds; response `Last-Modified` was 2026-08-14, so it does not prove current source is deployed | +| `/blog/` | 200 | Public legacy blog index exists | +| `/blog/how-decentralized-dating-works/` | 200 | One legacy article is publicly reachable and listed in the live sitemap | +| `/blog/this-is-a-draft/` | 404 | That nonexistent/draft probe is not public; it does not prove the new generator's gating | +| `/sitemap.xml` | 200 XML | Lists `/blog` and only the legacy decentralized article under `/blog`; no new six-article set is live | + +Resolved August 31: `https://opendating-mobile.expo.app` is the canonical origin +in the app shell, generated articles, sitemap, robots file, product facts, and +machine-readable product summary. The secondary Pages copy points back to EAS. + +No deployment or external write was performed. diff --git a/docs/STORE_LISTING.md b/docs/STORE_LISTING.md index e37aa7f..ec20bd2 100644 --- a/docs/STORE_LISTING.md +++ b/docs/STORE_LISTING.md @@ -24,9 +24,9 @@ Console records. | Price | Free | | Primary category | Social Networking | | Secondary category | Lifestyle | -| Privacy policy URL | `https://jongan69.github.io/opendating-mobile/privacy/` | -| Support URL | `https://jongan69.github.io/opendating-mobile/safety/` | -| Marketing URL | `https://jongan69.github.io/opendating-mobile/` | +| Privacy policy URL | `https://opendating-mobile.expo.app/privacy/` | +| Support URL | `https://opendating-mobile.expo.app/safety/` | +| Marketing URL | `https://opendating-mobile.expo.app/` | ## Store Description diff --git a/docs/blog/bumble-alternative-for-coarse-location-encrypted-chats.md b/docs/blog/bumble-alternative-for-coarse-location-encrypted-chats.md new file mode 100644 index 0000000..1286ad8 --- /dev/null +++ b/docs/blog/bumble-alternative-for-coarse-location-encrypted-chats.md @@ -0,0 +1,38 @@ +--- +title: "A Bumble Alternative for Coarse Location and Encrypted Chats" +description: "Compare Bumble and pre-release OpenDating on verification, location, messages, platforms, pricing, and who each product serves better." +pubDate: 2026-08-29 +draft: true +category: "alternative" +keywords: ["Bumble alternative", "encrypted dating chat", "coarse location dating app"] +--- + +OpenDating is not a drop-in Bumble replacement. Bumble is an available iOS and Android product with an established account, safety, support, and paid-feature system. OpenDating is useful only to testers who specifically want a no-phone account, approximate-area discovery, and end-to-end encrypted message content. + +## Verification and account recovery + +Bumble's current privacy policy says a phone number is required for account verification and its one-member-one-account approach. It may require photo or identity verification in some cases; that is not the same as every member being identity verified. + +OpenDating does not require a phone number or email address. Its recovery-key model has no conventional password reset and remains a pre-release security limitation. People who value support-assisted recovery may prefer Bumble's conventional account model. + +## Location and messages + +Bumble's policy says that, with permission, it can collect Wi-Fi access-point information and longitude and latitude, and it presents general location information to other members. It also says location permission can be disabled. + +OpenDating converts coordinates on-device to a geohash prefix of at most five characters. The approximate area and network metadata still reach OpenDating-operated services; coarse location is not anonymity. + +Bumble's policy says it analyzes message content for topics, sentiment, and trends after steps intended to remove identifying information, and that moderation providers may process reports, messages, and media. OpenDating encrypts direct-message content end to end, while still allowing a member to intentionally send selected evidence to moderation. No claim here implies Bumble employees read every message. + +## Pricing and platform support + +Bumble is free to download and use on iOS and Android, with optional Boost, Premium, Premium+, Spotlight, SuperSwipe, and Notes products. Bumble says prices vary by tier, duration, and package and directs members to the in-app Pay Plan page. Bumble Web was discontinued in March 2026. + +OpenDating targets iOS and Android but has no generally available store release. Its free core and optional one-time theme purchase remain part of a blocked release candidate. + +## Who should choose Bumble instead + +Choose Bumble for a live member network, current store distribution, conventional recovery and support, or optional paid discovery tools. Consider OpenDating only for testing when its narrower data inputs and encrypted message content justify its recovery, availability, network, and first-party-operator limits. + +## Primary sources checked + +Checked August 29, 2026: [Bumble privacy policy](https://bumble.com/privacy-policy), [paid plan matrix](https://support.bumble.com/hc/en-us/articles/32668790872733-Understanding-Bumble-s-paid-features-and-subscription-plans), [pricing notice](https://support.bumble.com/hc/en-us/articles/30614091973149-Pricing-information-for-paid-features), and [Bumble Web notice](https://support.bumble.com/hc/en-us/articles/30996192802973-An-update-on-Bumble-web). Keep this article unpublished until legal review. diff --git a/docs/blog/how-to-date-without-phone-number-or-email.md b/docs/blog/how-to-date-without-phone-number-or-email.md new file mode 100644 index 0000000..d89baee --- /dev/null +++ b/docs/blog/how-to-date-without-phone-number-or-email.md @@ -0,0 +1,36 @@ +--- +title: "How to Date Online Without a Phone Number or Email Login" +description: "Understand account-recovery trade-offs before choosing a dating app that does not require a phone number, email address, or password." +pubDate: 2026-08-31 +draft: false +category: "guide" +keywords: ["dating app without phone number", "dating without email", "dating account privacy"] +--- + +Avoiding a phone number or email can reduce account linkage, but it moves responsibility for recovery onto you. Before choosing that model, decide whether you are willing to protect a recovery secret and accept that support may not be able to reset your account. + +## What no-phone signup changes + +A conventional account can connect your dating profile to an inbox, phone account, password reset history, and identity-verification provider. Removing those inputs reduces that connection. It does not make a profile anonymous: photos, profile text, device and network data, purchases, coarse location, and conversations can still identify someone. + +## The recovery trade-off + +OpenDating creates a cryptographic account on the device without an email address, phone number, password, or social login. Its recovery flow uses a standard recovery key. There is no conventional "forgot password" process. + +On the web, OpenDating encrypts the recovery key before storing it in the browser. The browser-lock passphrase is required again after a reload and is not stored. This protects the browser copy at rest, but the decrypted key still exists temporarily in JavaScript memory while the app is unlocked. + +A lost device and lost recovery key can still mean lost access. Copying the key into an insecure note, message, screenshot, or synchronized clipboard can expose the account. Store an offline recovery copy you control, and do not treat the browser-lock passphrase as a substitute for that backup. + +## Pricing, platforms, and privacy boundaries + +OpenDating is live as a free browser app. Its native iOS and Android clients remain pre-release. Billing and OpenDating Plus are disabled on the web. + +No-phone signup does not hide a member from OpenDating-operated discovery, matching, moderation, media, and deletion services. Current federation and cross-provider migration are not available. People you match with can keep what you send them. + +## Who should choose another product + +Choose a conventional account if support-assisted recovery, a mature member network, phone-based verification, or native store availability matters more than minimizing signup data. Consider OpenDating if you can secure a recovery key and accept its current network, first-party-operator, and portability limits. + +## Sources checked + +Checked August 31, 2026 against OpenDating's [browser vault implementation](https://github.com/jongan69/opendating-mobile/blob/main/src/lib/storage/identity-vault.web.ts), [security model](https://github.com/jongan69/opendating-mobile/blob/main/docs/SECURITY.md), and [live product facts](https://opendating-mobile.expo.app/about/). diff --git a/docs/blog/how-to-use-dating-app-without-sharing-exact-location.md b/docs/blog/how-to-use-dating-app-without-sharing-exact-location.md new file mode 100644 index 0000000..e1be071 --- /dev/null +++ b/docs/blog/how-to-use-dating-app-without-sharing-exact-location.md @@ -0,0 +1,50 @@ +--- +title: "How to Use a Dating App Without Sharing Your Exact Location" +description: "A practical guide to dating-app location settings, coarse areas, privacy limits, and choosing an app that matches your risk tolerance." +pubDate: 2026-08-31 +draft: false +category: "guide" +keywords: ["dating app location privacy", "coarse location dating", "private dating app"] +--- + +You can use a dating app without giving its servers your exact coordinates, but you cannot make location irrelevant. The useful goal is to reduce precision, understand what still leaks, and choose a product whose trade-offs fit your situation. + +## Start with the permission screen + +On iOS or Android, deny precise location when the app can work with an approximate location. Avoid background access unless a feature you value genuinely needs it. If an app stops working, check its current privacy policy before deciding whether the service is worth that access. + +Changing the operating-system permission limits what the app receives from that point forward. It does not necessarily delete location already associated with your account. Use the app's deletion controls and read its retention terms for that separate question. + +## Treat distance as a disclosure + +Even an app that shows only a distance can reveal more than expected. Repeated measurements from different places can narrow down a location. A small town, rare profile details, recognizable photos, work schedules, and message timing can also identify someone without a precise map pin. + +Practical steps still matter: + +- Avoid profile photos that expose a home, workplace, license plate, or daily route. +- Do not name a small employer, school, or neighborhood before trust is established. +- Delay real-time location sharing and meet in a public place. +- Pause discovery when you do not want your profile included in nearby results. +- Block and report inside the service when someone tries to triangulate or pressure you. + +Coarse location reduces one source of precision. It is not anonymity. + +## How OpenDating handles location + +OpenDating's mobile source converts coordinates on the device into a geohash prefix of at most five characters. Only that approximate-area code crosses the location module boundary. The geometry varies by latitude and cell boundaries, so it should be described as a general area, not a guaranteed five-kilometer square. + +That design prevents the OpenDating location flow from sending raw GPS coordinates. The current OpenDating-operated services still receive the coarse area, account identifier, request timing, and other data needed to return introductions. A match can also infer location from what you disclose in your profile or conversation. + +## Pricing, platforms, and availability + +OpenDating is live as a free browser app. Its native iOS and Android clients remain pre-release, and billing is disabled on the web. The live service is early and should not be mistaken for an established dating network. + +## Who should choose another product + +Choose an established alternative if you need a large active member pool, current App Store or Play Store availability, conventional account recovery, or mature staffed support today. OpenDating's recovery-key model, JavaScript key handling, first-party service operation, and small early network are meaningful limits. + +Consider OpenDating's web app if its approximate-area design matters more to you than a mature network and you accept those constraints. + +## Sources checked + +This article was checked on August 31, 2026 against the [OpenDating privacy model](https://github.com/jongan69/opendating-mobile/blob/main/docs/PRIVACY.md), [location source](https://github.com/jongan69/opendating-mobile/tree/main/src/lib/location), and [live product facts](https://opendating-mobile.expo.app/about/). diff --git a/docs/blog/opendating-vs-tinder-privacy-availability-pricing.md b/docs/blog/opendating-vs-tinder-privacy-availability-pricing.md new file mode 100644 index 0000000..78d4ebb --- /dev/null +++ b/docs/blog/opendating-vs-tinder-privacy-availability-pricing.md @@ -0,0 +1,48 @@ +--- +title: "OpenDating vs Tinder: Privacy Model, Availability, and Pricing" +description: "A dated, source-based comparison of OpenDating and Tinder across signup, location, messages, discovery, availability, and pricing." +pubDate: 2026-08-29 +draft: true +category: "comparison" +keywords: ["OpenDating vs Tinder", "Tinder privacy comparison", "dating app pricing comparison"] +--- + +As of August 29, 2026, Tinder is the usable choice for someone who needs a generally available dating service. OpenDating is a pre-release reference client with a narrower data model and meaningful release, recovery, network, and operator limitations. This comparison does not score safety, match quality, or popularity. + +## Availability + +Tinder's official overview lists iOS 16 or later, Android 10 or later, and current major web browsers. The core matching and chat product is free. + +OpenDating targets iOS and Android, but public distribution is blocked. Its Android artifact is superseded and its current iOS candidate still has release gates. It has no consumer web dating client. + +## Account inputs + +Tinder's policy lists phone number, email address, and date of birth as examples of data used to create an account. + +OpenDating creates an account without phone, email, password, or social login. Its recovery key replaces conventional password reset, creating a loss and custody risk that is not release-ready. + +## Location + +Tinder's help center says location access is required, and its privacy policy says latitude and longitude may be collected with permission. + +OpenDating converts raw coordinates on-device to a maximum five-character geohash and sends only that approximate-area prefix through its location boundary. Its operator still receives the coarse area and request metadata. + +## Messages and discovery + +Tinder's policy classifies chats as collected content and lists service, safety, research, improvement, machine-learning, advertising, and other purposes for content and activity. No current primary source reviewed for this article promises end-to-end encryption. + +OpenDating encrypts direct-message content end to end after mutual interest. Its current experience presents one explained introduction with a privacy receipt. That design does not prove better matches, and a recipient can retain any message. + +## Pricing + +Tinder offers a free core plus Plus, Gold, and Platinum subscriptions. Tinder's terms say pricing can vary by region, duration, bundle, purchase history, account activity, promotions, and tests; quoting one monthly number would be inaccurate. + +OpenDating's core is free. Its current US candidate has an optional $4.99 one-time purchase for three themes, with store-localized pricing elsewhere. Physical-device purchase and restore proof is still open, so this is candidate configuration rather than a live offer. + +## Who should choose which + +Choose Tinder for availability, web access, geographic reach, a mature member network, and conventional product expectations. Test OpenDating only if no-phone signup, coarse location, and encrypted message content matter enough to accept a small pre-release network, recovery-key risk, one current operator, and no federation or provider migration. + +## Primary sources checked + +Tinder claims were checked August 29, 2026 against its [overview](https://www.help.tinder.com/hc/en-us/articles/115004647686-Tinder-Overview), [subscriptions](https://www.help.tinder.com/hc/en-us/articles/115004487406-Tinder-subscriptions), [location help](https://www.help.tinder.com/hc/en-us/articles/115005668326-Grant-access-to-device-location), [privacy policy](https://policies.tinder.com/privacy/intl/en/), and [terms](https://policies.tinder.com/terms/intl/en/). OpenDating claims were checked against current repository source and release documents. Keep this comparison unpublished until legal review. diff --git a/docs/blog/privacy-focused-dating-app-without-precise-location.md b/docs/blog/privacy-focused-dating-app-without-precise-location.md new file mode 100644 index 0000000..5962ffb --- /dev/null +++ b/docs/blog/privacy-focused-dating-app-without-precise-location.md @@ -0,0 +1,38 @@ +--- +title: "A Privacy-Focused Dating App Without Precise Location Tracking" +description: "Evaluate OpenDating's no-phone signup, coarse location, encrypted chats, browser storage, availability, and practical privacy limits." +pubDate: 2026-08-31 +draft: false +category: "privacy" +keywords: ["privacy-focused dating app", "dating app without precise location", "private dating app"] +--- + +A privacy-focused dating app should make specific, testable claims about what it collects and what it cannot see. A hidden profile mode can reduce exposure to other members; it does not automatically reduce the location, account, message, device, or usage data available to the service operator. + +## What OpenDating minimizes + +OpenDating does not require an email address, phone number, password, or social login to create an account. On the web, the recovery key is encrypted in browser storage behind a user-chosen passphrase. The passphrase is not stored, and reopening the browser requires unlocking again. + +When location permission is used, coordinates are converted on-device to a geohash prefix of at most five characters. OpenDating's discovery service receives that approximate area rather than the raw coordinates from the location module. + +Direct-message content is encrypted end to end after a mutual match. One-way likes are private, and blocking takes effect locally before network confirmation. + +## What privacy-focused does not mean + +OpenDating is not anonymous. The service still receives an account identifier, approximate area, request timing, routing information, profile data, and media needed to operate the product. Matches can retain messages and infer identity or location from photos, profiles, and conversations. A person may also intentionally submit selected evidence with a safety report. + +The decrypted recovery key exists temporarily in JavaScript memory while the web app is unlocked. Browser storage is tied to the current site origin. Losing both the browser copy and recovery backup can mean losing the account. + +## Availability and price + +The browser app is live and free at [opendating-mobile.expo.app](https://opendating-mobile.expo.app/). It has no ads or product analytics, and billing is disabled on the web. Native iOS and Android clients remain pre-release. + +The current member network is early, services are operated by OpenDating on Cloudflare, and independent-provider portability is not generally available. People who need a mature member pool, conventional account recovery, identity verification, mature support, or native store distribution should choose an established product. + +## Compare privacy mechanics, not labels + +Before choosing any dating app, check its current first-party privacy policy for account inputs, location precision, message processing, advertising, retention, deletion, verification, and paid visibility controls. Separate what other members can see from what the operator and its vendors process. + +## Sources checked + +Checked August 31, 2026 against OpenDating's [product facts](https://opendating-mobile.expo.app/about/), [privacy model](https://github.com/jongan69/opendating-mobile/blob/main/docs/PRIVACY.md), [browser vault source](https://github.com/jongan69/opendating-mobile/blob/main/src/lib/storage/identity-vault.web.ts), and [location source](https://github.com/jongan69/opendating-mobile/tree/main/src/lib/location). diff --git a/docs/blog/tinder-alternative-for-less-account-location-data.md b/docs/blog/tinder-alternative-for-less-account-location-data.md new file mode 100644 index 0000000..af40f27 --- /dev/null +++ b/docs/blog/tinder-alternative-for-less-account-location-data.md @@ -0,0 +1,38 @@ +--- +title: "A Tinder Alternative for People Who Want Less Account and Location Data" +description: "Compare Tinder and pre-release OpenDating on account inputs, location handling, messages, availability, pricing, and practical trade-offs." +pubDate: 2026-08-29 +draft: true +category: "alternative" +keywords: ["Tinder alternative", "private dating app", "dating app location privacy"] +--- + +OpenDating is a possible Tinder alternative only for testers who put data minimization ahead of availability and network size. Tinder is the practical choice for most people today because it is a generally available service on iOS, Android, and the web. OpenDating is pre-release and its current services are operated by one provider. + +## Account and location differences + +Tinder's current privacy policy lists phone number, email address, and date of birth as examples of account data. Its official help says device or browser location access is required, and its policy says latitude and longitude may be collected with permission. + +OpenDating creates an account without a phone number, email address, password, or social login. Its mobile location module converts coordinates into an approximate geohash prefix before sending anything to OpenDating's services. The service still learns that coarse area and request metadata, and profile details can still reveal where someone lives or works. + +## Messages and discovery + +Tinder's policy includes chats in collected content and describes how content and activity may be processed for operation, safety, research, improvement, machine learning, advertising, and other listed purposes. That statement does not mean Tinder sells chats or that employees read every conversation. + +OpenDating encrypts direct-message content end to end after mutual interest. Its service can still observe network metadata, recipients can copy messages, and user-submitted report evidence is intentionally shared with moderation. + +Tinder uses its familiar Like and match flow. OpenDating shows one explained introduction at a time with a privacy receipt. Neither interface proves better matches. + +## Pricing and availability + +Tinder has a free core and optional Plus, Gold, and Platinum subscriptions. Tinder says pricing can vary by region, duration, bundle, account history, promotions, and tests, so a universal monthly price would be misleading. + +OpenDating's core is free. Its pre-release iOS candidate includes an optional $4.99 US lifetime theme purchase, with localized prices elsewhere, but purchase and restore proof remains incomplete. There is no public OpenDating store release to switch to today. + +## Who should choose Tinder instead + +Choose Tinder if you need a live member network, web access, broad geographic availability, conventional product support, or a mature release. Consider OpenDating only for testing if no-phone signup, coarse location, and encrypted message content outweigh its small network, recovery-key risk, first-party operation, and unfinished release gates. + +## Primary sources checked + +Checked August 29, 2026: [Tinder overview](https://www.help.tinder.com/hc/en-us/articles/115004647686-Tinder-Overview), [Tinder subscriptions](https://www.help.tinder.com/hc/en-us/articles/115004487406-Tinder-subscriptions), [Tinder location help](https://www.help.tinder.com/hc/en-us/articles/115005668326-Grant-access-to-device-location), [Tinder privacy policy](https://policies.tinder.com/privacy/intl/en/), and [Tinder terms](https://policies.tinder.com/terms/intl/en/). Keep this article unpublished until legal review. diff --git a/docs/blog/tinder-vs-bumble-vs-opendating.md b/docs/blog/tinder-vs-bumble-vs-opendating.md new file mode 100644 index 0000000..78ef3b3 --- /dev/null +++ b/docs/blog/tinder-vs-bumble-vs-opendating.md @@ -0,0 +1,52 @@ +--- +title: "Tinder vs Bumble vs OpenDating: Privacy, Availability, and Price" +description: "A dated comparison of Tinder, Bumble, and OpenDating across account data, location, messages, visibility controls, availability, and price." +pubDate: 2026-08-31 +draft: false +category: "comparison" +keywords: ["Tinder vs Bumble vs OpenDating", "private dating app comparison", "Tinder Bumble alternative"] +--- + +Tinder and Bumble are established consumer dating services with large networks, native distribution, conventional support, and optional paid features. OpenDating is a free, early browser app with a narrower account and location model. This comparison does not score safety, popularity, match quality, or the size of each member network. + +## Availability and account setup + +Tinder supports mobile apps and the web. Its current privacy policy lists phone number, email address, and date of birth as examples of account data. + +Bumble supports mobile apps. Its privacy policy says members are required to provide a phone number for its one-member-one-account approach and may be asked for photo or identity verification. + +OpenDating is live on the web; its native iOS and Android clients remain pre-release. It creates an account without a phone number, email address, password, or social login. Recovery is self-custodied, so losing the recovery key can mean losing access. + +## Location + +Tinder's privacy policy says it may collect device latitude and longitude with permission and that some precise-location-dependent features will not be available without it. + +Bumble's privacy policy says location data can include Wi-Fi access points and longitude and latitude, and that device coordinates are used to understand proximity. Members can turn off geolocation through device settings. + +OpenDating converts coordinates on-device to a geohash prefix of at most five characters before its discovery service receives location data. The service still receives that coarse area and operational metadata. This reduces precision; it does not provide anonymity. + +## Messages and profile visibility + +Tinder classifies chats as collected content and documents service, safety, research, improvement, machine-learning, advertising, and other listed processing purposes. No Tinder primary source reviewed for this article promises end-to-end encryption for member chats. + +Bumble says it reviews message content for topics, sentiment, and trends after steps intended to remove identifying information, and also uses automated systems and moderators for safety. Bumble's paid Incognito Mode hides a profile from everyone except people the member likes first. + +OpenDating encrypts direct-message content end to end after mutual interest. Its service can still observe delivery metadata, recipients can retain content, and selected evidence can be intentionally disclosed with a report. Visibility can be paused without buying a paid plan. + +## Price and paid visibility + +Tinder has a free core and optional paid subscriptions and features. Its prices vary by market and offer, so this comparison does not quote a universal monthly price. + +Bumble says its core works without paid features. Boost, Premium, Premium+, and consumable products add capabilities including extra likes, filters, profile priority, travel, and Incognito Mode. + +OpenDating is free on the web. Billing and OpenDating Plus are disabled there. OpenDating does not currently sell ranking, boosts, hidden admirers, messaging, recovery, deletion, or safety features. + +## Which product fits which need? + +Choose Tinder or Bumble if a mature network, current native distribution, conventional account support, or their specific discovery and verification tools matter most. Evaluate their current settings and policies for the privacy controls you need. + +Consider OpenDating if no-phone signup, coarse location, encrypted message content, and deliberate introductions matter enough to accept an early network, self-custodied recovery, first-party service operation, and no native store release. + +## Primary sources checked + +Checked August 31, 2026 against Tinder's [privacy policy](https://policies.tinder.com/privacy/intl/en/) and [product overview](https://www.help.tinder.com/hc/en-us/articles/115004647686-Tinder-Overview); Bumble's [privacy policy](https://bumble.com/privacy-policy), [Incognito Mode](https://bumble.com/features/incognito-mode/), and [paid-feature guide](https://support.bumble.com/hc/en-us/articles/32668790872733-Understanding-Bumble-s-paid-features-and-subscription-plans); and OpenDating's [product facts](https://opendating-mobile.expo.app/about/), [privacy model](https://github.com/jongan69/opendating-mobile/blob/main/docs/PRIVACY.md), and current source repository. diff --git a/docs/blog/what-opendating-location-encryption-protects.md b/docs/blog/what-opendating-location-encryption-protects.md new file mode 100644 index 0000000..993ed28 --- /dev/null +++ b/docs/blog/what-opendating-location-encryption-protects.md @@ -0,0 +1,40 @@ +--- +title: "What OpenDating's Coarse Location and Message Encryption Protect" +description: "Understand what OpenDating's on-device coarse location and encrypted messages protect, what metadata remains, and where the limits are." +pubDate: 2026-08-29 +draft: true +category: "evergreen" +keywords: ["OpenDating privacy", "coarse location", "encrypted dating messages"] +--- + +OpenDating's genuine privacy advantage is narrow and technical: its mobile location flow does not send raw coordinates, and direct-message content is end-to-end encrypted. Those choices reduce what the current service operator can learn. They do not make the service anonymous or decentralized today. + +## What happens to location + +The mobile app obtains coordinates, converts them on-device into a geohash, truncates that value to at most five characters, and passes only the prefix onward. A geohash cell is an approximate area whose shape and real-world dimensions vary by latitude and boundary. + +The service still needs the prefix to find introductions in nearby areas. It can observe when an account asks for discovery and can associate those requests with an account identifier. Profile details, photos, repeated behavior, and conversations may reveal more precise location than the geohash itself. + +## What happens to messages + +Direct-message content is encrypted for the matched recipient before transport. The operator does not receive the plaintext needed to display the conversation. + +Encryption does not hide every fact. The service can observe delivery timing, traffic volume, and routing identifiers. A recipient can screenshot, copy, or forward a message. When someone reports abuse, they may intentionally include selected evidence for moderation. Content already delivered to another device cannot be remotely erased. + +## Current operator and recovery limits + +OpenDating uses an open protocol, but the deployed discovery, matching, policy, moderation, media, and deletion roles are currently operated by OpenDating. Independent providers, federation, full portability, and provider migration are post-GA work. + +Account identity is based on a cryptographic key. The current JavaScript signer and legacy recovery-key export are pre-release limitations. A safer native signer and passkey-encrypted recovery remain release blockers. + +## Pricing, platforms, and availability + +The intended platforms are iOS and Android. OpenDating is not generally available. The core is free, and the current candidate contains an optional one-time purchase for themes only. That purchase does not change discovery, ranking, matching, messaging, recovery, deletion, or safety. + +## Who should choose another product + +Choose another service if you need current store availability, a large member network, conventional password recovery, independent-provider portability, or mature support. OpenDating's approach is relevant to technical reviewers and early users who value minimized location precision and encrypted message content enough to accept those limits. + +## Sources checked + +Draft checked August 29, 2026 against the [privacy model](https://github.com/jongan69/opendating-mobile/blob/main/docs/PRIVACY.md), [security model](https://github.com/jongan69/opendating-mobile/blob/main/docs/SECURITY.md), [location source](https://github.com/jongan69/opendating-mobile/tree/main/src/lib/location), [roadmap](https://github.com/jongan69/opendating-mobile/blob/main/docs/ROADMAP-1.0.md), and [release status](https://pages.jongan.com/opendating-mobile/status/). diff --git a/docs/marketing/open-dating-ai-visibility-2026-08-31.md b/docs/marketing/open-dating-ai-visibility-2026-08-31.md new file mode 100644 index 0000000..c768e78 --- /dev/null +++ b/docs/marketing/open-dating-ai-visibility-2026-08-31.md @@ -0,0 +1,145 @@ +# OpenDating AI and Search Visibility Audit + +**Snapshot date:** 2026-08-31 + +**Product:** OpenDating + +**Official URL supplied for this audit:** [opendating-mobile.expo.app](https://opendating-mobile.expo.app/) + +**Category:** Privacy-focused dating app + +**Audience:** Privacy-conscious singles + +**Core job:** Find compatible dates without exposing a phone number, email address, or precise location, and without an addictive swipe feed + +**Named competitors:** Tinder, Bumble, Hinge + +## Method and definitions + +The five phrases below were submitted verbatim in two lanes: an unquoted web search and a fresh, isolated ChatGPT web-search conversation for each query. The first four did not contain the OpenDating name. This is a dated sample of one search engine and one assistant, **not** a claim that every assistant or user will see the same results. Results vary by engine, model, locale, personalization, and time. + +Retrieval caveat: the original run did not retain the underlying search provider, exact ChatGPT model label, locale, UTC timestamp, or verbatim answer captures. The linked results and summarized positions below are the surviving evidence. Consequently, this is a directional snapshot rather than a reproducible benchmark; a future rerun must record those fields and archive each raw result or answer per query. + +A supplementary branded search (`OpenDating privacy dating app`) and direct checks of the supplied official origin were used only to diagnose gaps; they are not included in the five-query mention totals. + +- **Mentioned** means the returned result text or linked source named OpenDating as a product. The product name appearing in the query itself does not count. +- **Cited with a live link** means a returned result linked to an OpenDating-owned product, documentation, repository, or another source specifically about OpenDating. A bare name is not a citation. +- Ranks below are the order in this snapshot, not an endorsement of product quality or claim accuracy. + +## Web search retrieval snapshot + +| Query | OpenDating mentioned? | OpenDating cited with a live link? | Top recommendations / citations in the snapshot | Notes | +|---|---:|---:|---|---| +| `best privacy-focused dating app for privacy-conscious singles` | No | No | [Hidnn's privacy review](https://hidnn.com/blog/best-privacy-focused-dating-apps-reviewed-2026) ranked Lex first and Hidnn second. [wadaCrush](https://blog.wadacrush.com/blog/best-privacy-dating-apps/) ranked Bumble, Tinder, and Hinge first through third. [WIRED](https://www.wired.com/story/these-privacy-conscious-gay-dating-apps-want-to-dethrone-grindr/) covered privacy-conscious Grindr challengers. | OpenDating had no rank. The leading pages used explicit privacy criteria, current dates, comparisons, and clear category language. Bumble, Tinder, and Hinge were repeatedly named; wadaCrush directly linked their official sites. | +| `Tinder alternatives` | No | No | [RTL](https://www.rtl.de/tools/dating/tinder-alternativen/) led with a current eight-app comparison. [App Vulture](https://appvulture.com/competitor-analysis/tinder/) contrasted Bumble's interaction model and Hinge's relationship positioning. [Taimi](https://taimi.com/blog/tinder-alternatives/) disclosed its commercial interest and promoted LGBTQ+ alternatives. [DatingAdvice](https://www.datingadvice.com/online-dating/best-tinder-alternatives) and [Subrupt](https://subrupt.com/alternatives/tinder) also surfaced. | OpenDating had no rank. Results favored established comparison pages and products with a short, repeatable positioning story: relationship intent, interaction model, price, audience, or local reach. Bumble and Hinge were named and live-linked repeatedly. | +| `how do I date online without sharing my phone number or precise location` | No | No | [SingleRadar](https://singleradar.app/?lang=en), [Skip Dating's FAQ](https://www.skip.dating/faq), two Babe Here privacy guides ([location privacy](https://babehere.com/en/dating-app-location-privacy-guide/) and [location settings](https://babehere.com/en/dating-app-location-privacy-settings-guide/)), and [Hidnn's phone-number guide](https://hidnn.com/blog/dating-without-phone-number) occupied the first five positions. | OpenDating had no rank despite directly relevant product claims. Tinder, Bumble, and Hinge appeared together in a lower third-party virtual-number article, not as direct official citations. The result titles closely mirrored the phone-number and location language in the query. | +| `cheapest privacy-focused dating app for startups` | No | No | The first page surfaced direct product pages for [Amari](https://join-amari.com/), [Reveal](https://getrevealapp.com/landing), [SparQ](https://www.mysparq.app/), [Pryvé](https://www.pryve.io/membership), [Blumie](https://getblumie.com/), [SugarLink](https://sugarlink.app/), [Ever After](https://www.everafter.dating/), and [Kindred](https://kindredapp.ca/), followed by a [startup software directory](https://www.softwr.com/best/dating-social-for-startups). | OpenDating had no rank. The intent is noisy: "for startups" pulled in founder and software-directory content. Kindred showed the lowest explicit monthly price among the leading pages, but the engine ranked Amari first, so result order is not a dependable price ranking. Tinder, Bumble, and Hinge had no direct citation in the leading results. | +| `Tinder vs Bumble vs OpenDating` | No | No | The first result was [WouldSwipe's Hinge vs Bumble vs Tinder comparison](https://wouldswipe.com/blog/hinge-vs-bumble-vs-tinder), followed by [DateScout](https://datescout.us/best-dating-apps) and multiple Tinder/Bumble comparison pages, including [WhichDating](https://www.whichdating.com/compare/tinder-vs-bumble). | This is the strongest negative signal. Although OpenDating was in the query, the result set substituted the better-known Hinge entity and returned no OpenDating source or comparison. OpenDating therefore had no result-set positioning even in the branded comparison. | + +### Web search totals + +- OpenDating mentions: **0 of 5 queries** +- OpenDating live citations: **0 of 5 queries** +- Generic, problem-led queries producing an OpenDating mention: **0 of 4** +- Branded comparison queries producing an OpenDating citation: **0 of 1** + +## ChatGPT web-search assistant snapshot + +| Query | OpenDating mentioned? | OpenDating cited with a live link? | Top recommendations / citations in the answer | Notes | +|---|---:|---:|---|---| +| `best privacy-focused dating app for privacy-conscious singles` | No | No | Lex, Feeld, Bumble Premium, and Alovoa | Lex was positioned as the best privacy-conscious choice, while the answer distinguished profile visibility controls from underlying data privacy. The recommendations were cited; OpenDating had no rank. | +| `Tinder alternatives` | No | No | Hinge, Bumble, Coffee Meets Bagel, Feeld, HER, and Grindr | The answer grouped established apps by relationship intent and audience. The alternatives were cited; OpenDating had no rank. | +| `how do I date online without sharing my phone number or precise location` | No | No | Bumble, Tinder, and RAINN | The answer recommended staying in-app, withholding identifying details and live location, and limiting distance visibility. OpenDating was ignored despite matching the stated problem. | +| `cheapest privacy-focused dating app for startups` | No | No | Alovoa, BestDatingScripts, Dating Partners, and Dating Pro | ChatGPT interpreted “for startups” as software for founders building a dating product, not a dating app for singles. This query is a poor fit for the stated ICP and should not drive consumer SEO strategy. | +| `Tinder vs Bumble vs OpenDating` | Yes | Yes | Tinder, Bumble, and the [OpenDating protocol repository](https://github.com/jongan69/OpenDating) | The citation was to the protocol GitHub repository—not the live consumer app. ChatGPT characterized OpenDating as a pre-release privacy/interoperability architecture without mainstream network effects, while treating Tinder and Bumble as established consumer products. | + +### Assistant-sample totals + +- OpenDating mentions: **1 of 5 queries** +- OpenDating citations to any relevant source: **1 of 5 queries** +- Citations to the live consumer app: **0 of 5 queries** +- Generic, problem-led queries producing an OpenDating mention: **0 of 4** + +The distinction matters: the branded prompt supplied enough context for ChatGPT to retrieve a related repository, but the assistant did not independently discover OpenDating or identify the deployed web app as the primary product. + +## What the sources reward + +The results repeatedly favored pages with: + +1. An exact-match title and a direct answer near the top. +2. A visible methodology or comparison criteria. +3. Concrete privacy mechanics, price, audience, and tradeoffs. +4. A recent publication or review date. +5. Links to official product or policy pages. +6. A recognized entity with independent coverage. + +The competitor context is supportable from first-party sources: + +- [Bumble says Incognito Mode](https://bumble.com/features/incognito-mode/) hides a profile unless the member likes someone first; it is a Premium or Premium+ feature. +- [Hinge says members can set a broader location manually](https://help.hinge.co/hc/en-us/articles/49661615922195-Location-Settings), displays the selected neighborhood rather than an exact address, and does not automatically update location. +- [Tinder's own safety guidance](https://policies.tinder.com/web/safety-center/guide/basics/in/en/) advises members not to share location or a phone number until comfortable and to take time before moving conversations off-app. +- [OpenDating's official repository](https://github.com/jongan69/opendating-mobile#what-is-opendating) describes one contextual introduction instead of an endless feed, a five-character geohash of roughly 5 km, private decisions, and end-to-end encrypted direct messages. Those claims did not surface in any audited query. + +## Visibility assessment + +**Visibility score: Weak overall; effectively invisible for unbranded discovery.** + +OpenDating received zero mentions in the web-search lane and zero mentions across the four unbranded ChatGPT prompts. Only the branded ChatGPT comparison produced a mention and citation, and that citation led to the protocol repository rather than the live web app. The branded web search still substituted Hinge and returned no OpenDating source. + +The main gaps are: + +- **No generic discovery:** zero share of voice across privacy, alternatives, safety, and price intent. +- **Limited and misclassified branded recognition:** ChatGPT found the protocol repository, but search did not; neither lane cited the live web app. +- **No independent authority:** the supplementary branded search surfaced the owner's GitHub profile and package ecosystem, but not meaningful third-party product coverage. +- **Name ambiguity:** "OpenDating" is a generic phrase and overlaps with unrelated uses such as open dating, `#open`, and Opendate. +- **Conflicting canonical signals on the live deployment:** the Expo homepage canonicals to `opendating-mobile.expo.app`, while its live [`robots.txt`](https://opendating-mobile.expo.app/robots.txt), [`sitemap.xml`](https://opendating-mobile.expo.app/sitemap.xml), [`llms.txt`](https://opendating-mobile.expo.app/llms.txt), blog pages, and GitHub About link point to `jongan69.github.io/opendating-mobile`. This splits the entity and crawl authority across origins. +- **Missing comparison target:** the live [`/blog/tinder-vs-bumble-vs-opendating/`](https://opendating-mobile.expo.app/blog/tinder-vs-bumble-vs-opendating/) URL is a valid `noindex` correction notice for a withdrawn article, so there is no indexable, source-reviewed page answering the exact branded comparison query. +- **Recommendation readiness:** the official materials truthfully call the product pre-release and describe remaining production blockers. Assistants should not be expected to recommend it as broadly available until availability and release evidence support that claim. + +## Recommended actions + +### 1. Consolidate the product entity and canonical origin + +Choose one public canonical origin and align all of the following to it: page canonicals, `robots.txt` sitemap URL, every sitemap ``, `llms.txt` links, JSON-LD `url` and `sameAs`, GitHub About, repository README, and social profiles. Redirect alternate origins to the canonical one where the hosting stack permits it. This is the highest-priority technical fix because current signals tell crawlers that the same product lives at different origins. + +### 2. Publish three indexable, source-reviewed answer pages + +Create the minimum pages that map to demonstrated intent: + +- **Privacy category:** “Privacy-focused dating app for people who do not want precise location tracking.” +- **Problem guide:** “How to date online without sharing your phone number or precise location.” +- **Comparison:** “Tinder vs Bumble vs OpenDating,” with a visible last-reviewed date, neutral criteria, limitations, and links to official competitor policy/help pages. + +Do not revive unsupported claims from the withdrawn comparison. A new comparison should distinguish what the app sends to its own service, what matches can see, what is encrypted, what is still pre-release, and what mainstream competitors actually document. + +### 3. Make product facts easy to cite + +On the canonical product page, publish a short fact block and `SoftwareApplication` structured data covering category, audience, platforms, current availability, truthful price, location handling, messaging encryption boundary, account requirements, and release status. Give each material claim a stable first-party URL. Keep `llms.txt` as a supplement; it does not replace crawlable HTML or external authority. + +### 4. Earn independent corroboration + +Seek technically competent reviews or coverage that can verify the coarse-location implementation, encrypted-message boundary, business model, source availability, and limitations. Publish a threat model, privacy architecture, and reproducible test evidence, then pitch those primary materials to privacy, open-source, dating-safety, and decentralized-technology publications. AI citations are materially more likely when a claim is corroborated outside the product's own site. + +### 5. Build an explicit alternatives and pricing footprint + +Once the product is genuinely available, maintain an accurate pricing/availability page and a source-backed “Tinder alternatives for privacy-conscious singles” page. The “for startups” query is mismatched to the ICP, so optimize for singles and privacy intent rather than producing founder-oriented content merely to match that phrase. + +### 6. Submit, inspect, and repeat the audit + +Submit the canonical sitemap to Google Search Console and Bing Webmaster Tools, inspect the three answer URLs, and request recrawls after canonical consolidation. Repeat these exact five queries monthly across web search and named AI assistants. Store the verbatim answer, links, model, date, locale, product mention, product citation, and rank separately; search visibility and AI recommendation behavior are related but not interchangeable. + +## Bottom line + +OpenDating has a differentiated privacy story, but it is absent from generic assistant recommendations. A branded prompt can recover the protocol repository, which is better than total invisibility, but the live product is not yet the entity being cited. The immediate work is entity consolidation plus a small set of indexable, source-backed pages answering the exact intents already producing competitor citations. + +## Remediation prepared from this audit + +The August 31 release change set addresses every repository-controlled gap: + +- `opendating-mobile.expo.app` is the single canonical origin in repository-controlled app metadata, the sitemap, robots file, generated articles, product facts, README, and machine-readable product summary. The external GitHub About field was still pending at the audit snapshot and must be verified separately during rollout. +- The app shell and crawlable product-facts page publish `SoftwareApplication` structured data with the live URL, free web availability, and official repository relationships. +- Four fail-closed, source-reviewed pages now answer privacy-category, no-phone-account, coarse-location, and exact Tinder/Bumble/OpenDating comparison intent. +- The comparison distinguishes mention from citation, links current first-party competitor sources, and states OpenDating's early-network, recovery, operator, and native-distribution limits. +- Stale generated articles are removed on every build, while unreviewed Markdown remains excluded unless it explicitly declares `draft: false`. + +Search-engine recrawling, Search Console/Bing submission, independent reviews, and future assistant citations remain external propagation and authority lanes. They cannot be created truthfully by changing first-party source alone and should be measured again after indexing. diff --git a/package.json b/package.json index 1d776a9..f7730d2 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "self-sovereign", "mobile" ], - "homepage": "https://github.com/jongan69/opendating-mobile#readme", + "homepage": "https://opendating-mobile.expo.app/", "repository": { "type": "git", "url": "https://github.com/jongan69/opendating-mobile.git" @@ -89,7 +89,7 @@ "android": "expo run:android", "ios": "expo run:ios", "web": "expo start --web", - "export:web": "expo export --platform web && node scripts/secure-web-export.mjs", + "export:web": "bun run blog:build && expo export --platform web && node scripts/secure-web-export.mjs", "serve:web": "expo serve", "typecheck": "tsc --noEmit", "lint": "expo lint", @@ -118,7 +118,7 @@ "blog:generate": "node scripts/release/lib/generate-articles.mjs", "blog:build": "node scripts/release/lib/build-blog.mjs", "check:duplicates": "node scripts/check-duplicate-runtimes.mjs", - "test:release-tools": "bun test ./scripts/release/lib/security-utils.test.mjs", + "test:release-tools": "bun test ./scripts/release/lib/*.test.mjs", "postinstall": "node scripts/check-duplicate-runtimes.mjs" }, "private": true, diff --git a/public/about/index.html b/public/about/index.html new file mode 100644 index 0000000..896d56c --- /dev/null +++ b/public/about/index.html @@ -0,0 +1,70 @@ + + + + + +OpenDating Product Facts — Private Dating on the Web + + + + + + +
+ +
+

OpenDating product facts

+
Reviewed August 31, 2026
+

OpenDating is a live browser dating app for adults who prefer deliberate introductions and data minimization over an endless swipe feed. Its native iOS and Android clients remain pre-release.

+ +

Availability and price

+
    +
  • Live app: opendating-mobile.expo.app
  • +
  • Supported platform: modern HTTPS browsers with Web Crypto, WebSocket, and local storage.
  • +
  • Web price: free. Billing and OpenDating Plus are disabled on the web.
  • +
  • Advertising and analytics: the current web app contains no advertising SDK or product analytics.
  • +
+ +

Account and browser storage

+
    +
  • No phone number, email address, password, or social login is required to create an account.
  • +
  • The browser recovery key is encrypted before it enters local storage using AES-256-GCM and a key derived from the user's browser-lock passphrase with PBKDF2-HMAC-SHA256.
  • +
  • The passphrase and decrypted recovery key are not persisted. The decrypted key exists temporarily in JavaScript memory while the browser is unlocked.
  • +
  • Browser storage is tied to the current origin. Moving browsers or domains requires explicit recovery-key export and import.
  • +
+ +

Location and conversations

+
    +
  • Coordinates are converted on-device to a geohash prefix of at most five characters before OpenDating's discovery service receives location data.
  • +
  • Coarse location is not anonymity. The service still receives the approximate area and operational metadata, and a profile or conversation can reveal more.
  • +
  • Direct-message content is encrypted end to end after a mutual match. Delivery metadata remains visible to the service, and recipients can retain what they receive.
  • +
+ +

Service and safety boundaries

+

Discovery, matching, moderation, media, delivery, and deletion currently use first-party OpenDating services on Cloudflare. OpenDating does not claim a large member network, independent-provider portability, identity verification for every member, anonymity, or guaranteed safety.

+

Members can block, unmatch, report, pause visibility, export their recovery key, lock the browser, and request account deletion. See the privacy policy, safety center, and service status.

+ +

Primary evidence

+

The implementation is source-available in the OpenDating mobile repository. The protocol is documented in the separate OpenDating protocol repository. Security-sensitive claims should be evaluated against the current source and deployment rather than this summary alone.

+ +

Open the live web app →

+
+ +
+ + diff --git a/public/blog/end-to-end-encryption-dating/index.html b/public/blog/end-to-end-encryption-dating/index.html deleted file mode 100644 index 43478d5..0000000 --- a/public/blog/end-to-end-encryption-dating/index.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - -Archived: Dating Message Encryption — OpenDating Blog - - - - - - - - - -
- -
-

Why Your Dating Messages Should Be Encrypted

-
August 2026
- -

Archive notice: an earlier version made claims about named competitors without adequate current sourcing. This article is excluded from search and marketing pending a sourced, legally reviewed rewrite.

- -

This isn't hypothetical. Dating apps have experienced data breaches exposing private messages. Law enforcement has requested dating app message histories. And corporate mergers have transferred millions of users' intimate conversations to new companies with different privacy policies.

- -

How Most Dating Apps Handle Messages

- -

On a typical dating app, your message goes from your phone to the company's server, where it's stored, then forwarded to your match. The company can read it at any point. They usually have policies against employees casually browsing messages, but the technical capability exists.

- -

When you report someone for harassment, you're often asked to share the conversation — which means a human moderator at the company reads your private messages to evaluate the report.

- -

How End-to-End Encryption Changes Things

- -

With end-to-end encryption (E2EE), messages are encrypted on your device before they're sent. They travel through the network as ciphertext — unreadable to anyone who doesn't have the decryption key. Only the intended recipient's device can decrypt them.

- -

OpenDating uses NIP-44, a modern encryption standard designed for Nostr. Each conversation has its own encryption key derived from your keypair and your match's keypair using Elliptic Curve Diffie-Hellman (ECDH). The relay — the server that passes messages between you — never has the key and cannot read the content.

- -

What This Means in Practice

- -
    -
  • The relay operator cannot read your messages. Even if someone has full access to the relay servers, the messages are encrypted.
  • -
  • Law enforcement requests are limited. The relay doesn't have plaintext to hand over.
  • -
  • Data breaches are less damaging. If the relay is compromised, attackers get encrypted ciphertext, not readable conversations.
  • -
  • Message evidence for reports is intentional. You choose which messages to share as evidence — your entire conversation isn't automatically exposed.
  • -
- -

The Trade-Off

- -

E2EE means the relay can't scan messages for abusive content automatically. OpenDating handles this through user-initiated reporting — you choose what to report and can attach message evidence. The encrypted report goes to the moderation service, which can decrypt the specific evidence you chose to share.

- -

This model puts users in control: your private conversations stay private until you decide to share something with moderators.

- -

Encryption Is Infrastructure, Not UX

- -

You don't need to understand NIP-44, ECDH, or key derivation to use OpenDating. Messages work exactly like any other chat app. The encryption happens automatically, invisibly. The only difference is that your conversations are genuinely private — not just "private by policy" until a data breach, subpoena, or acquisition changes the terms.

- -

Learn more about OpenDating →

-
- -
- - diff --git a/public/blog/how-decentralized-dating-works/index.html b/public/blog/how-decentralized-dating-works/index.html deleted file mode 100644 index 4e32dde..0000000 --- a/public/blog/how-decentralized-dating-works/index.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - -How Decentralized Dating Works — OpenDating Blog - - - - - - - - -
- -
-

How Decentralized Dating Works

-
August 2026
- -

OpenDating is built on Nostr — a decentralized protocol for censorship-resistant communication. But here's the key insight: you never need to know that. The app looks and feels like any modern dating app. The decentralization is infrastructure, not UX.

- -

What is open today

-

OpenDating uses an open wire protocol over Nostr, but the current profile, discovery, matching, policy, moderation, media, and deletion services are operated by OpenDating on Cloudflare. Profiles and relationship state are stored in first-party databases. Calling the current deployment “no central server” would be inaccurate.

-

The post-GA goal is provider interchangeability: signed manifests, portable exports, conformance tests, and multiple independent operators. Those capabilities do not exist in the current beta.

- -

How OpenDating Protects Your Privacy

- -

1. Encrypted Gift Wraps (NIP-59)

-

Every action you take — creating a profile, liking someone, reporting a user — is wrapped in multiple layers of encryption. The outer layer is addressed to a specific service (like the matcher or moderation service). The inner layer contains the actual message. Relay operators can see that you sent something, but not what you sent.

- -

2. End-to-End Encrypted Messages (NIP-44 + NIP-17)

-

When you message a match, the content is encrypted on your device using NIP-44 — the same encryption standard used by secure messaging apps. Only your match's device can decrypt it. The relay enforces that only matched users can message each other, but it never sees the content.

- -

3. Service Roles

-

OpenDating separates functionality by role — profile, discovery, matcher, DM policy, moderation, and deletion. Today those roles share one first-party operator, but the boundaries reduce accidental coupling and define the interfaces needed for future independent providers.

- -

4. Relay Enforcement

-

The relay enforces rules at the protocol level: unmatched users can't message each other, blocked users can't discover the blocker, and reports are routed privately to moderation. These aren't app-level features — they're enforced by the infrastructure.

- -

What This Means for Users

-

You create an account (a cryptographic keypair), build a profile, and start discovering people. Direct messages and service commands use encrypted gift wraps, while authorized services necessarily process profile, preference, match, block, report, and deletion state.

- -

The keypair can be used by another compatible client, but portable profile, private-list, and cross-provider service migration are not complete. The public site will not promise full portability before conformance tests prove it.

- -

Learn more about OpenDating →

-
- -
- - diff --git a/public/blog/how-to-date-without-phone-number-or-email/index.html b/public/blog/how-to-date-without-phone-number-or-email/index.html new file mode 100644 index 0000000..7cb3a8f --- /dev/null +++ b/public/blog/how-to-date-without-phone-number-or-email/index.html @@ -0,0 +1,69 @@ + + + + + +How to Date Online Without a Phone Number or Email Login | OpenDating + + + + + + + + + + + +
+
+
+

How to Date Online Without a Phone Number or Email Login

+

August 31, 2026

+

Avoiding a phone number or email can reduce account linkage, but it moves responsibility for recovery onto you. Before choosing that model, decide whether you are willing to protect a recovery secret and accept that support may not be able to reset your account.

+

What no-phone signup changes

+

A conventional account can connect your dating profile to an inbox, phone account, password reset history, and identity-verification provider. Removing those inputs reduces that connection. It does not make a profile anonymous: photos, profile text, device and network data, purchases, coarse location, and conversations can still identify someone.

+

The recovery trade-off

+

OpenDating creates a cryptographic account on the device without an email address, phone number, password, or social login. Its recovery flow uses a standard recovery key. There is no conventional "forgot password" process.

+

On the web, OpenDating encrypts the recovery key before storing it in the browser. The browser-lock passphrase is required again after a reload and is not stored. This protects the browser copy at rest, but the decrypted key still exists temporarily in JavaScript memory while the app is unlocked.

+

A lost device and lost recovery key can still mean lost access. Copying the key into an insecure note, message, screenshot, or synchronized clipboard can expose the account. Store an offline recovery copy you control, and do not treat the browser-lock passphrase as a substitute for that backup.

+

Pricing, platforms, and privacy boundaries

+

OpenDating is live as a free browser app. Its native iOS and Android clients remain pre-release. Billing and OpenDating Plus are disabled on the web.

+

No-phone signup does not hide a member from OpenDating-operated discovery, matching, moderation, media, and deletion services. Current federation and cross-provider migration are not available. People you match with can keep what you send them.

+

Who should choose another product

+

Choose a conventional account if support-assisted recovery, a mature member network, phone-based verification, or native store availability matters more than minimizing signup data. Consider OpenDating if you can secure a recovery key and accept its current network, first-party-operator, and portability limits.

+

Sources checked

+

Checked August 31, 2026 against OpenDating's browser vault implementation, security model, and live product facts.

+
+

Learn about OpenDating

+
+
+ + + diff --git a/public/blog/how-to-use-dating-app-without-sharing-exact-location/index.html b/public/blog/how-to-use-dating-app-without-sharing-exact-location/index.html new file mode 100644 index 0000000..8f51e00 --- /dev/null +++ b/public/blog/how-to-use-dating-app-without-sharing-exact-location/index.html @@ -0,0 +1,80 @@ + + + + + +How to Use a Dating App Without Sharing Your Exact Location | OpenDating + + + + + + + + + + + +
+
+
+

How to Use a Dating App Without Sharing Your Exact Location

+

August 31, 2026

+

You can use a dating app without giving its servers your exact coordinates, but you cannot make location irrelevant. The useful goal is to reduce precision, understand what still leaks, and choose a product whose trade-offs fit your situation.

+

Start with the permission screen

+

On iOS or Android, deny precise location when the app can work with an approximate location. Avoid background access unless a feature you value genuinely needs it. If an app stops working, check its current privacy policy before deciding whether the service is worth that access.

+

Changing the operating-system permission limits what the app receives from that point forward. It does not necessarily delete location already associated with your account. Use the app's deletion controls and read its retention terms for that separate question.

+

Treat distance as a disclosure

+

Even an app that shows only a distance can reveal more than expected. Repeated measurements from different places can narrow down a location. A small town, rare profile details, recognizable photos, work schedules, and message timing can also identify someone without a precise map pin.

+

Practical steps still matter:

+
    +
  • Avoid profile photos that expose a home, workplace, license plate, or daily route.
  • +
  • Do not name a small employer, school, or neighborhood before trust is established.
  • +
  • Delay real-time location sharing and meet in a public place.
  • +
  • Pause discovery when you do not want your profile included in nearby results.
  • +
  • Block and report inside the service when someone tries to triangulate or pressure you.
  • +
+

Coarse location reduces one source of precision. It is not anonymity.

+

How OpenDating handles location

+

OpenDating's mobile source converts coordinates on the device into a geohash prefix of at most five characters. Only that approximate-area code crosses the location module boundary. The geometry varies by latitude and cell boundaries, so it should be described as a general area, not a guaranteed five-kilometer square.

+

That design prevents the OpenDating location flow from sending raw GPS coordinates. The current OpenDating-operated services still receive the coarse area, account identifier, request timing, and other data needed to return introductions. A match can also infer location from what you disclose in your profile or conversation.

+

Pricing, platforms, and availability

+

OpenDating is live as a free browser app. Its native iOS and Android clients remain pre-release, and billing is disabled on the web. The live service is early and should not be mistaken for an established dating network.

+

Who should choose another product

+

Choose an established alternative if you need a large active member pool, current App Store or Play Store availability, conventional account recovery, or mature staffed support today. OpenDating's recovery-key model, JavaScript key handling, first-party service operation, and small early network are meaningful limits.

+

Consider OpenDating's web app if its approximate-area design matters more to you than a mature network and you accept those constraints.

+

Sources checked

+

This article was checked on August 31, 2026 against the OpenDating privacy model, location source, and live product facts.

+
+

Learn about OpenDating

+
+
+ + + diff --git a/public/blog/index.html b/public/blog/index.html index 0c2ebc9..5dc6d32 100644 --- a/public/blog/index.html +++ b/public/blog/index.html @@ -1,57 +1,71 @@ - + - -Blog — OpenDating - - - + +Blog | OpenDating + + + + + + + + + -
- -

Blog

-

Thoughts on privacy-first dating, decentralized protocols, and building ethical consumer technology.

- -
- How Decentralized Dating Works -
August 2026
-

How encrypted gift wraps and role-separated first-party services work today, plus what federation still requires.

-
-
- OpenDating release and service status -
August 2026
-

Production distribution is blocked while reliability, safety, legal, and security gates are completed.

-
- -
- OpenDating · Built for privacy, portability, and genuine human connection. -
+
+
+

Blog

+

4 articles

+
+Tinder vs Bumble vs OpenDating: Privacy, Availability, and Price +

A dated comparison of Tinder, Bumble, and OpenDating across account data, location, messages, visibility controls, availability, and price.

+
August 31, 2026
+
+A Privacy-Focused Dating App Without Precise Location Tracking +

Evaluate OpenDating's no-phone signup, coarse location, encrypted chats, browser storage, availability, and practical privacy limits.

+
August 31, 2026
+
+
+How to Use a Dating App Without Sharing Your Exact Location +

A practical guide to dating-app location settings, coarse areas, privacy limits, and choosing an app that matches your risk tolerance.

+
August 31, 2026
+
+
+How to Date Online Without a Phone Number or Email Login +

Understand account-recovery trade-offs before choosing a dating app that does not require a phone number, email address, or password.

+
August 31, 2026
+
+
+
© 2026 OpenDating. Private dating without precise location tracking
diff --git a/public/blog/location-privacy-dating-apps/index.html b/public/blog/location-privacy-dating-apps/index.html deleted file mode 100644 index ad639f1..0000000 --- a/public/blog/location-privacy-dating-apps/index.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - -Location Privacy in Dating Apps: Why It Matters — OpenDating Blog - - - - - - - - -
- -
-

Location Privacy in Dating Apps: Why It Matters

-
August 2026
- -

Most dating apps request your precise GPS location — and they update it frequently, often every time you open the app. This data can reveal where you live, where you work, your daily commute, your favorite coffee shop, and when you're home or away.

- -

OpenDating takes a fundamentally different approach: your exact coordinates are converted to a coarse geohash entirely on your device, and only a 5-character prefix (~5 km area) is shared. Your precise location never leaves your phone.

- -

What Dating Apps Know About Your Location

- -

When you grant location permission to a typical dating app, it can access:

-
    -
  • Your current location — precise to within a few meters
  • -
  • Your location history — where you've been while the app is open
  • -
  • Your movement patterns — home, work, gym, social venues
  • -
  • Real-time proximity — exactly how far you are from other users
  • -
- -

This data is used to show you nearby matches, but it's also stored. In some cases, it's shared with advertising partners. A dating app's database can reveal someone's entire daily routine.

- -

How OpenDating's Location Privacy Works

- -

OpenDating uses a technique called geohashing:

- -
    -
  1. Your phone gets your GPS coordinates (e.g., 40.7128, -74.0060)
  2. -
  3. It immediately converts them to a geohash (e.g., "dr5regu4z")
  4. -
  5. Only the first 5 characters are kept ("dr5re")
  6. -
  7. That 5-character prefix represents an area roughly 5 km × 5 km
  8. -
  9. The raw GPS coordinates are discarded from memory
  10. -
  11. Only the prefix is sent to the discovery service
  12. -
- -

The result: the discovery service knows you're somewhere in a ~25 km² area, but not where exactly. It's enough to find people nearby without enabling precise tracking.

- -

Why This Matters for Safety

- -

Precise location data in a dating app creates several safety risks:

- -
    -
  • Stalking — someone who can see your exact distance could triangulate your location by moving around and checking the distance change
  • -
  • Data breach exposure — if the app's database is breached, attackers get a map of where every user has been
  • -
  • Real-time tracking — precise GPS + timestamps = a detailed log of your movements
  • -
  • Cross-referencing — location data combined with other public information can de-anonymize users
  • -
- -

By only sharing a ~5 km area, OpenDating eliminates these risks while still enabling location-based discovery. You can find people in your city without broadcasting your exact coordinates to a server.

- -

Distance Display

- -

OpenDating shows distance in broad buckets: "nearby," "within 5 mi," "5-10 mi," "10-25 mi." You'll never see "2.17 miles away" — because that level of precision would compromise the privacy of the person you're viewing.

- -

Privacy Is the Default

- -

Most apps collect precise location because they can — it's useful for ad targeting, analytics, and algorithmic recommendations. OpenDating was designed from the ground up to be location-minimal. The architecture enforces it: the server literally cannot receive precise coordinates because they're truncated on-device before transmission.

- -

Learn more about OpenDating →

-
- -
- - diff --git a/public/blog/privacy-focused-dating-app-without-precise-location/index.html b/public/blog/privacy-focused-dating-app-without-precise-location/index.html new file mode 100644 index 0000000..be13bf5 --- /dev/null +++ b/public/blog/privacy-focused-dating-app-without-precise-location/index.html @@ -0,0 +1,70 @@ + + + + + +A Privacy-Focused Dating App Without Precise Location Tracking | OpenDating + + + + + + + + + + + +
+
+
+

A Privacy-Focused Dating App Without Precise Location Tracking

+

August 31, 2026

+

A privacy-focused dating app should make specific, testable claims about what it collects and what it cannot see. A hidden profile mode can reduce exposure to other members; it does not automatically reduce the location, account, message, device, or usage data available to the service operator.

+

What OpenDating minimizes

+

OpenDating does not require an email address, phone number, password, or social login to create an account. On the web, the recovery key is encrypted in browser storage behind a user-chosen passphrase. The passphrase is not stored, and reopening the browser requires unlocking again.

+

When location permission is used, coordinates are converted on-device to a geohash prefix of at most five characters. OpenDating's discovery service receives that approximate area rather than the raw coordinates from the location module.

+

Direct-message content is encrypted end to end after a mutual match. One-way likes are private, and blocking takes effect locally before network confirmation.

+

What privacy-focused does not mean

+

OpenDating is not anonymous. The service still receives an account identifier, approximate area, request timing, routing information, profile data, and media needed to operate the product. Matches can retain messages and infer identity or location from photos, profiles, and conversations. A person may also intentionally submit selected evidence with a safety report.

+

The decrypted recovery key exists temporarily in JavaScript memory while the web app is unlocked. Browser storage is tied to the current site origin. Losing both the browser copy and recovery backup can mean losing the account.

+

Availability and price

+

The browser app is live and free at opendating-mobile.expo.app. It has no ads or product analytics, and billing is disabled on the web. Native iOS and Android clients remain pre-release.

+

The current member network is early, services are operated by OpenDating on Cloudflare, and independent-provider portability is not generally available. People who need a mature member pool, conventional account recovery, identity verification, mature support, or native store distribution should choose an established product.

+

Compare privacy mechanics, not labels

+

Before choosing any dating app, check its current first-party privacy policy for account inputs, location precision, message processing, advertising, retention, deletion, verification, and paid visibility controls. Separate what other members can see from what the operator and its vendors process.

+

Sources checked

+

Checked August 31, 2026 against OpenDating's product facts, privacy model, browser vault source, and location source.

+
+

Learn about OpenDating

+
+
+
© 2026 OpenDating. Private dating without precise location tracking
+ + diff --git a/public/blog/self-sovereign-identity-explained/index.html b/public/blog/self-sovereign-identity-explained/index.html deleted file mode 100644 index 1bfec15..0000000 --- a/public/blog/self-sovereign-identity-explained/index.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - -Self-Sovereign Identity: What It Means for Dating — OpenDating Blog - - - - - - - - - -
- -
-

Self-Sovereign Identity: What It Means for Dating

-
August 2026
- -

OpenDating identifies an account with a cryptographic keypair rather than an email-and-password login. This gives the member control of the signing identity, but it does not make the first-party service unable to moderate an account or remove hosted profile data.

- -

The keypair can work in a compatible client. Full profile, match, message-history, and private-list portability across providers is post-GA work and should not be inferred from key portability alone.

- -

How It Works

- -

In OpenDating, your account is a Nostr keypair — a public key (your identity) and a private key (your secret, stored only on your device). When you create a profile, it's cryptographically signed by your private key. Any OpenDating-compatible client can verify that signature and know it's really you.

- -

This means:

-
    -
  • Client portability — a compatible client can use the same signing identity
  • -
  • Service limits — hosted profile and relationship data still depend on the current operator
  • -
  • Prove it's you — your public key is your identity; anyone can verify messages come from you
  • -
  • Privacy-focused — your private key is stored with device secure storage and leaves only when you explicitly use the legacy recovery export
  • -
- -

Why This Matters for Dating

- -

Dating is personal. The idea that a corporation owns your dating profile — your photos, your bio, your preferences, your conversation history — is strange when you think about it. Your dating life shouldn't be an asset on a company's balance sheet.

- -

If OpenDating disappears, the keypair still exists, but the current service data may not. Signed export, recovery, and provider-migration formats must be implemented and tested before broader portability claims are made.

- -

What About Lost Keys?

- -

This is the trade-off. With a centralized app, you can reset your password. With self-sovereign identity, losing your private key means losing access to your account — permanently. There's no "forgot password" button. This is why OpenDating provides backup and export features, and why you should store your key somewhere safe.

- -

The current v0.1 app stores the key with device secure storage and loads it into a JavaScript signer. A native device-bound signer and passkey-encrypted recovery are required before production; the beta does not claim that compromise is impossible.

- -

The Bigger Picture

- -

Self-sovereign identity isn't just for dating. It's part of a broader movement toward user-owned digital identity — where you control your online presence across platforms without being locked into any single provider. OpenDating is one of the first consumer applications to put this into practice in a way that feels natural and polished.

- -

Learn more about OpenDating →

-
- -
- - diff --git a/public/blog/tinder-vs-bumble-vs-opendating/index.html b/public/blog/tinder-vs-bumble-vs-opendating/index.html index 0b92805..389ac83 100644 --- a/public/blog/tinder-vs-bumble-vs-opendating/index.html +++ b/public/blog/tinder-vs-bumble-vs-opendating/index.html @@ -1,61 +1,77 @@ - + - -Correction: Dating App Ownership and Privacy Comparisons — OpenDating - - - - - - - + +Tinder vs Bumble vs OpenDating: Privacy, Availability, and Price | OpenDating + + + + + + + + + -
- -
-

Correction: Dating App Ownership and Privacy Comparisons

-
August 2026
- -

An earlier version of this article incorrectly said Tinder, Bumble, and Hinge were all owned by Match Group and presented unsupported feature comparisons as settled facts. The article has been withdrawn rather than leaving marketing claims online without current sourcing and legal review.

- -

Correct ownership

-

Match Group's official materials list Tinder and Hinge in its brand portfolio. Bumble Inc.'s investor site identifies Bumble Inc. as the parent company of Bumble, Badoo, and BFF. Bumble is not owned by Match Group.

- - - -

What replaces the comparison

-

OpenDating will publish only dated, directly sourced comparisons that distinguish app behavior, company policy, and inference. Until counsel reviews that work, the site describes OpenDating's own current implementation and measurable release gates without scoring competitors.

- -

Learn more about OpenDating →

-
-
OpenDating · Privacy-focused dating software in pre-release
-
+
+
+
+

Tinder vs Bumble vs OpenDating: Privacy, Availability, and Price

+

August 31, 2026

+

Tinder and Bumble are established consumer dating services with large networks, native distribution, conventional support, and optional paid features. OpenDating is a free, early browser app with a narrower account and location model. This comparison does not score safety, popularity, match quality, or the size of each member network.

+

Availability and account setup

+

Tinder supports mobile apps and the web. Its current privacy policy lists phone number, email address, and date of birth as examples of account data.

+

Bumble supports mobile apps. Its privacy policy says members are required to provide a phone number for its one-member-one-account approach and may be asked for photo or identity verification.

+

OpenDating is live on the web; its native iOS and Android clients remain pre-release. It creates an account without a phone number, email address, password, or social login. Recovery is self-custodied, so losing the recovery key can mean losing access.

+

Location

+

Tinder's privacy policy says it may collect device latitude and longitude with permission and that some precise-location-dependent features will not be available without it.

+

Bumble's privacy policy says location data can include Wi-Fi access points and longitude and latitude, and that device coordinates are used to understand proximity. Members can turn off geolocation through device settings.

+

OpenDating converts coordinates on-device to a geohash prefix of at most five characters before its discovery service receives location data. The service still receives that coarse area and operational metadata. This reduces precision; it does not provide anonymity.

+

Messages and profile visibility

+

Tinder classifies chats as collected content and documents service, safety, research, improvement, machine-learning, advertising, and other listed processing purposes. No Tinder primary source reviewed for this article promises end-to-end encryption for member chats.

+

Bumble says it reviews message content for topics, sentiment, and trends after steps intended to remove identifying information, and also uses automated systems and moderators for safety. Bumble's paid Incognito Mode hides a profile from everyone except people the member likes first.

+

OpenDating encrypts direct-message content end to end after mutual interest. Its service can still observe delivery metadata, recipients can retain content, and selected evidence can be intentionally disclosed with a report. Visibility can be paused without buying a paid plan.

+

Price and paid visibility

+

Tinder has a free core and optional paid subscriptions and features. Its prices vary by market and offer, so this comparison does not quote a universal monthly price.

+

Bumble says its core works without paid features. Boost, Premium, Premium+, and consumable products add capabilities including extra likes, filters, profile priority, travel, and Incognito Mode.

+

OpenDating is free on the web. Billing and OpenDating Plus are disabled there. OpenDating does not currently sell ranking, boosts, hidden admirers, messaging, recovery, deletion, or safety features.

+

Which product fits which need?

+

Choose Tinder or Bumble if a mature network, current native distribution, conventional account support, or their specific discovery and verification tools matter most. Evaluate their current settings and policies for the privacy controls you need.

+

Consider OpenDating if no-phone signup, coarse location, encrypted message content, and deliberate introductions matter enough to accept an early network, self-custodied recovery, first-party service operation, and no native store release.

+

Primary sources checked

+

Checked August 31, 2026 against Tinder's privacy policy and product overview; Bumble's privacy policy, Incognito Mode, and paid-feature guide; and OpenDating's product facts, privacy model, and current source repository.

+
+

Learn about OpenDating

+
+
+
© 2026 OpenDating. Private dating without precise location tracking
diff --git a/public/blog/why-privacy-matters-in-dating/index.html b/public/blog/why-privacy-matters-in-dating/index.html deleted file mode 100644 index 56bd0cf..0000000 --- a/public/blog/why-privacy-matters-in-dating/index.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - -Why Privacy Matters in Dating Apps — OpenDating Blog - - - - - - - - - -
- -
-

Why Privacy Matters in Dating Apps

-
August 2026
- -

Dating apps know extraordinary amounts about you. Your location — often updated every few minutes. Your photos, bio, age, gender, and sexual orientation. Every profile you've viewed. Every person you've liked, passed on, or matched with. Every message you've ever sent. When you're active, where you go, what times you use the app.

- -

This isn't metadata. It's a near-complete profile of your romantic and social life, stored on a company's servers.

- -

What Dating Apps Collect

- -

Most major dating apps collect:

-
    -
  • Precise GPS coordinates — updated frequently, often every time you open the app
  • -
  • All messages — stored in plaintext on their servers, accessible to employees
  • -
  • Behavioral data — every swipe, like, pass, match, and conversation
  • -
  • Device identifiers — linking your dating activity to other apps and websites
  • -
  • Purchase history — subscriptions, boosts, super likes
  • -
  • Photos — stored permanently, even after you delete them from your profile
  • -
- -

This data is used to train recommendation algorithms and, in many cases, sold to data brokers or used for targeted advertising. Your dating preferences become an ad-targeting signal.

- -

The Stakes Are Higher Than You Think

- -

Unlike your shopping habits or music taste, dating data is deeply personal. A data breach at a dating app doesn't expose credit card numbers — it exposes your sexual orientation, your relationship history, your private conversations, and your real-time location patterns.

- -

This has real consequences. In countries where homosexuality is criminalized, a data breach at a dating app could put users at risk of prosecution, violence, or death. Even in countries with strong privacy laws, dating data has been used in divorce proceedings, employment decisions, and blackmail.

- -

How OpenDating Is Different

- -

OpenDating was designed from the ground up to collect as little as possible:

-
    -
  • No exact location — only a ~5 km geohash prefix is sent to the relay. Your precise coordinates never leave your device.
  • -
  • Encrypted messages — all conversations use NIP-44 end-to-end encryption. The relay operator cannot read your messages.
  • -
  • Private likes — one-way likes are encrypted gift wraps sent only to the matcher service. They're never public.
  • -
  • No permanent profile storage — your identity is a keypair you own. Delete your key, and your presence disappears.
  • -
  • Open source — anyone can audit the code and verify the privacy claims.
  • -
- -

Privacy Isn't Just About Hiding

- -

Privacy in dating isn't about secrecy — it's about control. It's about deciding who gets to know what about you, and when. It's about being able to explore connections without creating a permanent, searchable record. It's about safety.

- -

When a dating app knows your exact location, your message history, and your behavior patterns, you're not the customer — you're the product. OpenDating flips that model. You own your data. You control your visibility. You decide what to share.

- -

Learn more about OpenDating →

-
- -
- - diff --git a/public/community/index.html b/public/community/index.html index a271d09..c9b3857 100644 --- a/public/community/index.html +++ b/public/community/index.html @@ -1 +1 @@ -Community Standards — OpenDating

Community Standards

Updated August 9, 2026

OpenDating is for consenting adults seeking genuine relationships. These standards apply to profiles, reactions, messages, voice notes, reports, and conduct connected to the service.

Authenticity

Use accurate age and identity information. No impersonation, deceptive profiles, coordinated account farms, manipulated verification, or romance and financial scams.

Consent and sexual safety

No sexual content involving minors, grooming, exploitation, coercion, trafficking, non-consensual intimate imagery, unwanted explicit content, or threats to expose private material. Suspected child sexual abuse material is escalated and reported as required by law.

Respect

No harassment, stalking, threats, hate, dehumanizing content, or targeted abuse. Respect blocks, unmatches, boundaries, and requests to stop contact.

Platform integrity

No spam, scraping, automated engagement, malicious links, credential theft, attempts to evade enforcement, or attacks on the service.

Enforcement and appeals

Responses may include content rejection, warnings, limited reach, suspension, or removal. High-impact automated signals receive human review where practical, and eligible decisions may be appealed.

Report

Use in-app reporting when possible. For urgent abuse concerns email jonny2298@live.com. If anyone is in immediate danger, contact local emergency services.

+Community Standards — OpenDating

Community Standards

Updated August 9, 2026

OpenDating is for consenting adults seeking genuine relationships. These standards apply to profiles, reactions, messages, voice notes, reports, and conduct connected to the service.

Authenticity

Use accurate age and identity information. No impersonation, deceptive profiles, coordinated account farms, manipulated verification, or romance and financial scams.

Consent and sexual safety

No sexual content involving minors, grooming, exploitation, coercion, trafficking, non-consensual intimate imagery, unwanted explicit content, or threats to expose private material. Suspected child sexual abuse material is escalated and reported as required by law.

Respect

No harassment, stalking, threats, hate, dehumanizing content, or targeted abuse. Respect blocks, unmatches, boundaries, and requests to stop contact.

Platform integrity

No spam, scraping, automated engagement, malicious links, credential theft, attempts to evade enforcement, or attacks on the service.

Enforcement and appeals

Responses may include content rejection, warnings, limited reach, suspension, or removal. High-impact automated signals receive human review where practical, and eligible decisions may be appealed.

Report

Use in-app reporting when possible. For urgent abuse concerns email jonny2298@live.com. If anyone is in immediate danger, contact local emergency services.

diff --git a/public/deletion/index.html b/public/deletion/index.html index b19da06..757279a 100644 --- a/public/deletion/index.html +++ b/public/deletion/index.html @@ -1 +1 @@ -Delete Your Account — OpenDating

Delete your account

Current method: OpenDating is pre-release. In-app deletion is the only automated path currently implemented; passkey-authenticated web deletion is a production blocker.

In the app

  1. Open Profile, then Settings.
  2. Choose Delete Account.
  3. Review the consequences and confirm.

The app immediately requests account deletion and clears local app state after the service confirms. Do not remove the app first if you still have access.

Cannot access the app?

Email jonny2298@live.com. Support-assisted deletion is not automatic and may require proof tied to the account. Never email a recovery key.

Retention

Profile, discovery, relationship, and delivery data are scheduled for removal. Safety records may be retained when required by law or needed to prevent repeat abuse. See the retention schedule.

+Delete Your Account — OpenDating

Delete your account

Current method: Signed-in members can request deletion from Settings in the web or native app.

In the app

  1. Open Profile, then Settings.
  2. Choose Delete Account.
  3. Review the consequences and confirm.

The app immediately requests account deletion and clears local app state after the service confirms. Do not remove the app first if you still have access.

Cannot access the app?

Email jonny2298@live.com. Support-assisted deletion is not automatic and may require proof tied to the account. Never email a recovery key.

Retention

Profile, discovery, relationship, and delivery data are scheduled for removal. Safety records may be retained when required by law or needed to prevent repeat abuse. See the retention schedule.

diff --git a/public/index.html b/public/index.html index d84e565..2699152 100644 --- a/public/index.html +++ b/public/index.html @@ -3,18 +3,18 @@ -OpenDating — Privacy-focused dating in pre-release - +OpenDating — Private Dating Without Precise Location Tracking + - - - + + + - + - - - + + +
${body} @@ -195,12 +210,15 @@ if (!files.length) fail(`No markdown files in ${CONTENT_DIR}`); const articles = []; for (const file of files) { const { data, body } = parseFrontmatter(readFileSync(join(CONTENT_DIR, file), 'utf8')); - if (data.draft === true) { log(`skip (draft) ${file}`); continue; } + if (data.draft !== false) { log(`skip (draft) ${file}`); continue; } + if (!data.title || !data.description || !isValidDate(data.pubDate ?? '')) { + fail(`${file} must have title, description, and YYYY-MM-DD pubDate before publishing`); + } articles.push({ slug: basename(file, '.md'), - title: data.title ?? basename(file, '.md'), - description: data.description ?? '', - date: data.pubDate ?? new Date().toISOString().split('T')[0], + title: data.title, + description: data.description, + date: data.pubDate, keywords: data.keywords ?? [], html: renderMarkdown(body), }); @@ -219,6 +237,10 @@ const emit = (relPath, contents) => { written++; }; +// public/blog is generated output. Clearing it prevents a newly drafted or +// removed article from surviving as a stale public page. +if (!DRY_RUN) rmSync(join(PUBLIC_DIR, BASE.slice(1)), { recursive: true, force: true }); + // article pages for (const a of articles) { const canonical = `${SITE}${BASE}/${a.slug}/`; @@ -241,7 +263,7 @@ for (const a of articles) {

${fmtDate(a.date)}

${a.html}
-

Get ${esc(project.name)} — ${esc(project.price ?? 'Free')}

+

Learn about ${esc(project.name)}

`, })); } @@ -249,7 +271,7 @@ ${a.html} // index emit(`${BASE.slice(1)}/index.html`, page({ title: `Blog | ${project.name}`, - description: `Guides and comparisons about ${project.category ?? 'the category'}.`, + description: `Guides and comparisons for people choosing a ${project.category ?? 'product'}.`, canonical: `${SITE}${BASE}/`, jsonLd: { '@context': 'https://schema.org', @@ -257,37 +279,35 @@ emit(`${BASE.slice(1)}/index.html`, page({ name: `${project.name} Blog`, url: `${SITE}${BASE}/`, }, + ogType: 'website', body: `

Blog

${articles.length} article${articles.length === 1 ? '' : 's'}

${articles.map((a) => `
-${esc(a.title)} +${esc(a.title)}

${esc(a.description)}

${fmtDate(a.date)}
`).join('\n')}`, })); -// sitemap — homepage plus every article +const sitemapEntries = [ + ...(config.web?.sitemapPaths ?? ['/']).map((path) => `${SITE}${path === '/' ? '/' : path}`), + ...(articles.length ? [`${SITE}${BASE}/`] : []), + ...articles.map((article) => `${SITE}${BASE}/${article.slug}/`), +]; + +// sitemap — existing public routes plus reviewed articles only emit('sitemap.xml', ` - - ${SITE}/ - monthly - 1.0 - - - ${SITE}${BASE}/ - weekly - 0.8 - -${articles.map((a) => ` - ${SITE}${BASE}/${a.slug}/ - ${a.date} - monthly - 0.6 - `).join('\n')} +${sitemapEntries.map((url) => ` ${esc(url)}`).join('\n')} `); +emit('robots.txt', `User-agent: * +Allow: / + +Sitemap: ${SITE}/sitemap.xml +`); + // llms.txt — states only facts you control, unlike the article set emit('llms.txt', `# ${project.name} @@ -304,8 +324,16 @@ ${project.description ?? ''} ## Key properties ${(project.differentiators ?? []).map((d) => `- ${d}`).join('\n')} -## Articles -${articles.map((a) => `- [${a.title}](${SITE}${BASE}/${a.slug}/)`).join('\n')} +## Links +- [Live app](${SITE}/) +- [Product facts](${SITE}/about/) +- [Privacy policy](${SITE}/privacy/) +- [Safety center](${SITE}/safety/) +- [Service status](${SITE}/status/) +- [Blog](${SITE}${BASE}/) + +${articles.length ? `## Articles +${articles.map((a) => `- [${a.title}](${SITE}${BASE}/${a.slug}/)`).join('\n')}` : ''} `); log(`${articles.length} article(s) -> ${written} file(s) under ${PUBLIC_DIR}`); diff --git a/scripts/release/lib/build-blog.test.mjs b/scripts/release/lib/build-blog.test.mjs new file mode 100644 index 0000000..c4a7b11 --- /dev/null +++ b/scripts/release/lib/build-blog.test.mjs @@ -0,0 +1,107 @@ +import { expect, test } from 'bun:test'; +import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { spawnSync } from 'node:child_process'; + +const buildBlog = fileURLToPath(new URL('./build-blog.mjs', import.meta.url)); + +test('builds only explicitly published blog pages', () => { + const root = mkdtempSync(join(tmpdir(), 'opendating-blog-')); + const contentDir = join(root, 'content'); + const publicDir = join(root, 'public'); + const configPath = join(root, 'config.json'); + + try { + mkdirSync(join(publicDir, 'blog', 'draft-post'), { recursive: true }); + mkdirSync(contentDir, { recursive: true }); + writeFileSync(join(publicDir, 'blog', 'draft-post', 'index.html'), 'stale draft'); + writeFileSync(join(contentDir, 'published-post.md'), `--- +title: "Published post" +description: "Reviewed article" +pubDate: 2026-08-29 +draft: false +--- + +Published body. +`); + writeFileSync(join(contentDir, 'draft-post.md'), `--- +title: "Draft post" +description: "Unreviewed article" +pubDate: 2026-08-29 +draft: true +--- + +Draft body. +`); + writeFileSync(configPath, JSON.stringify({ + project: { name: 'OpenDating' }, + web: { productionUrl: 'https://example.com/base', sitemapPaths: ['/'] }, + blog: { contentDir, publicDir, basePath: '/blog' }, + })); + + const result = spawnSync('node', [buildBlog, '--config', configPath], { encoding: 'utf8' }); + expect(result.status, result.stderr).toBe(0); + + const index = readFileSync(join(publicDir, 'blog', 'index.html'), 'utf8'); + const sitemap = readFileSync(join(publicDir, 'sitemap.xml'), 'utf8'); + const llms = readFileSync(join(publicDir, 'llms.txt'), 'utf8'); + const robots = readFileSync(join(publicDir, 'robots.txt'), 'utf8'); + expect(index).toContain('Published post'); + expect(index).not.toContain('Draft post'); + expect(existsSync(join(publicDir, 'blog', 'published-post', 'index.html'))).toBe(true); + expect(existsSync(join(publicDir, 'blog', 'draft-post', 'index.html'))).toBe(false); + expect(sitemap).toContain('https://example.com/base/blog/published-post/'); + expect(sitemap).not.toContain('draft-post'); + expect(llms).toContain('[Live app](https://example.com/base/)'); + expect(llms).toContain('[Product facts](https://example.com/base/about/)'); + expect(robots).toContain('Sitemap: https://example.com/base/sitemap.xml'); + } finally { + rmSync(root, { recursive: true, force: true }); + } +}); + +test('rejects unsafe output paths and impossible dates', () => { + const root = mkdtempSync(join(tmpdir(), 'opendating-blog-invalid-')); + const contentDir = join(root, 'content'); + const publicDir = join(root, 'public'); + const configPath = join(root, 'config.json'); + const postPath = join(contentDir, 'post.md'); + const sentinelPath = join(publicDir, 'keep.txt'); + + try { + mkdirSync(contentDir, { recursive: true }); + mkdirSync(publicDir, { recursive: true }); + writeFileSync(sentinelPath, 'keep'); + writeFileSync(postPath, `--- +title: "Post" +description: "Reviewed article" +pubDate: 2026-08-29 +draft: false +--- + +Body. +`); + const config = { + project: { name: 'OpenDating' }, + web: { productionUrl: 'https://example.com' }, + blog: { contentDir, publicDir, basePath: '/' }, + }; + writeFileSync(configPath, JSON.stringify(config)); + + const unsafePath = spawnSync('node', [buildBlog, '--config', configPath], { encoding: 'utf8' }); + expect(unsafePath.status).not.toBe(0); + expect(readFileSync(sentinelPath, 'utf8')).toBe('keep'); + + config.blog.basePath = '/blog'; + writeFileSync(configPath, JSON.stringify(config)); + writeFileSync(postPath, readFileSync(postPath, 'utf8').replace('2026-08-29', '2026-02-31')); + + const invalidDate = spawnSync('node', [buildBlog, '--config', configPath], { encoding: 'utf8' }); + expect(invalidDate.status).not.toBe(0); + expect(invalidDate.stderr).toContain('YYYY-MM-DD pubDate'); + } finally { + rmSync(root, { recursive: true, force: true }); + } +}); diff --git a/scripts/release/lib/generate-articles.mjs b/scripts/release/lib/generate-articles.mjs index 3a86c62..2edbd0a 100755 --- a/scripts/release/lib/generate-articles.mjs +++ b/scripts/release/lib/generate-articles.mjs @@ -39,7 +39,7 @@ const project = config.project ?? {}; const MODEL = seo.model ?? 'claude-sonnet-5'; const YEAR = seo.year ?? new Date().getFullYear(); const COUNT = seo.articleCount ?? 30; -const AUTO_PUBLISH = seo.autoPublish !== false; +const AUTO_PUBLISH = seo.autoPublish === true; const CONCURRENCY = 3; // Markdown is the source of truth and is version-controlled. build-blog.mjs diff --git a/scripts/release/release.config.json b/scripts/release/release.config.json index 04371b2..357ba19 100644 --- a/scripts/release/release.config.json +++ b/scripts/release/release.config.json @@ -4,20 +4,21 @@ "project": { "name": "OpenDating", "slug": "opendating", - "tagline": "Privacy-first decentralized dating", - "description": "A dating app built around coarse location and end-to-end encrypted direct messages. Your exact location never leaves your phone.", + "tagline": "Private dating without precise location tracking", + "description": "A live browser dating app built around deliberate introductions, coarse location, private decisions, and end-to-end encrypted direct messages. Native clients remain pre-release.", "category": "dating app", - "audience": "people who want genuine dating without surveillance capitalism", - "platforms": ["iOS", "Android"], - "price": "Free", + "audience": "privacy-conscious adults seeking deliberate introductions", + "platforms": ["Web", "iOS and Android pre-release clients"], + "price": "Free on the web", "differentiators": [ - "Cryptographic identity with a legacy recovery-key flow", - "Coarse location only — your exact GPS never reaches the server", - "End-to-end encrypted direct-message content", + "No email address or phone number required to create an account", + "Browser recovery keys are encrypted locally behind a user-chosen passphrase", + "Raw coordinates are converted on-device to a 5-character geohash", + "Direct-message content uses end-to-end encryption", "Private likes — one-way likes are never public", "Private blocks and reports — enforced server-side, never notified", - "No ads, no data harvesting, no surveillance business model", - "Open protocol with cross-provider portability planned after GA" + "Current discovery and matching services are first-party", + "The web app is live; native store distribution remains pre-release" ] }, @@ -55,8 +56,20 @@ "web": { "enabled": true, "deployCommand": "npm run deploy:web", - "productionUrl": "https://jongan69.github.io/opendating-mobile", - "verifyAnchors": ["#privacy", "#features", "#get"] + "productionUrl": "https://opendating-mobile.expo.app", + "verifyAnchors": ["#privacy", "#features", "#get"], + "sitemapPaths": [ + "/", + "/about/", + "/privacy/", + "/terms/", + "/community/", + "/safety/", + "/deletion/", + "/subprocessors/", + "/retention/", + "/status/" + ] }, "domain": { @@ -71,12 +84,12 @@ "publicDir": "public", "basePath": "/blog", "primaryColor": "#E8735A", - "_comment": "mode 'expo-public' renders static HTML into public/blog/, which GitHub Pages serves verbatim." + "_comment": "mode 'expo-public' renders static HTML into public/blog/ for EAS export; the secondary Pages copy carries canonical links back to EAS." }, "seo": { - "enabled": true, - "articleCount": 20, + "enabled": false, + "articleCount": 6, "year": 2026, "model": "deepseek-chat", "autoPublish": false, @@ -97,6 +110,6 @@ "people who want data portability", "ethical dating app users" ], - "_comment": "AI-generated blog articles. Review competitor comparison articles before publishing — claims about named products are your liability." + "_comment": "Manual, version-controlled articles only. Re-enable generation deliberately; generated files still default to drafts." } } diff --git a/scripts/release/ship.sh b/scripts/release/ship.sh index 6ab9f42..c41dfe2 100755 --- a/scripts/release/ship.sh +++ b/scripts/release/ship.sh @@ -161,7 +161,7 @@ if should_run blog && enabled blog; then run node "$HERE/lib/scaffold-landing.mjs" --config "$CONFIG" $($DRY_RUN && echo --dry-run || true) else # Renders static HTML into public/, which Expo copies verbatim on web export. - # Works alongside web.output="single" because these files bypass the SPA. + # Keeps article HTML independent from Expo application routes. step "Render blog into $(cfg blog.publicDir public)$(cfg blog.basePath /blog)" run node "$HERE/lib/build-blog.mjs" --config "$CONFIG" $($DRY_RUN && echo --dry-run || true) fi diff --git a/src/app/+html.tsx b/src/app/+html.tsx index bb7b05b..5af0804 100644 --- a/src/app/+html.tsx +++ b/src/app/+html.tsx @@ -4,6 +4,27 @@ import { useServerDocumentContext, } from 'expo-router/html'; +const PRODUCT_JSON_LD = { + '@context': 'https://schema.org', + '@type': 'SoftwareApplication', + name: 'OpenDating', + url: 'https://opendating-mobile.expo.app/', + description: + 'A browser dating app built around deliberate introductions, coarse location, private decisions, and end-to-end encrypted direct messages.', + applicationCategory: 'LifestyleApplication', + operatingSystem: 'Web', + offers: { + '@type': 'Offer', + price: '0', + priceCurrency: 'USD', + }, + sameAs: [ + 'https://github.com/jongan69/opendating-mobile', + 'https://github.com/jongan69/OpenDating', + ], + subjectOf: 'https://opendating-mobile.expo.app/about/', +}; + export default function RootHtml({ children }: { children: ReactNode }) { const { bodyAttributes, bodyNodes, headNodes, htmlAttributes } = useServerDocumentContext(); @@ -34,8 +55,9 @@ export default function RootHtml({ children }: { children: ReactNode }) { /> + @@ -45,7 +67,15 @@ export default function RootHtml({ children }: { children: ReactNode }) { '*:focus-visible{outline:3px solid #D95F59!important;outline-offset:3px}html,body{background:#FAF9F7}button,input,textarea{font:inherit}@media(prefers-color-scheme:dark){html,body{background:#141413}}', }} /> - + +