Deliberate private introductions on an open protocol.
An Expo React Native reference client for the OpenDating protocol.
Release status: 0.1.1 is a proposed launch candidate; approval is not effective until
release/manifest.jsonrecords the reviewed source SHA, artifact IDs, and checksums. See Release Status for verified capabilities, and the 1.0 Execution Roadmap for the path through GA.
OpenDating is an intentional-introduction client built around user-owned identity, data minimization, coarse location, private decisions, and end-to-end encrypted direct messages. Instead of an endless swipe feed, it presents one person with an explanation and privacy receipt. It currently connects to services operated by OpenDating on Cloudflare; federation and independent providers are post-GA work.
Under the hood, OpenDating uses Nostr as a protocol building block. The current discovery, matching, moderation, media, and delivery services are first-party OpenDating services; interchangeable independent providers are post-GA work.
OpenDating Mobile is the first reference client for the OpenDating protocol (v0.1).
| Traditional Dating Apps | OpenDating |
|---|---|
| Your data lives on their servers | Your identity is a key you own |
| They track your exact location | Only ~5 km coarse area shared |
| They can read your messages | End-to-end encrypted (NIP-44) |
| Profile portability varies by provider | An open profile format and export are planned for post-GA federation; they are not available in this release |
| Advertising and data monetization may be part of the model | No advertising or tracking-based monetization in the current build |
| Account portability varies | Portable identity is a protocol design goal; interoperable provider transfer is planned post-GA and is not available today |
|
|
┌──────────────────────────────────────────────┐
│ Expo UI │ ← Native components
├──────────────────────────────────────────────┤
│ App Screens │ ← Expo Router
├──────────────────────────────────────────────┤
│ Feature Hooks │ ← Domain logic
├──────────────────────────────────────────────┤
│ OpenDatingClient │ ← Protocol facade
├──────────────────┬───────────────────────────┤
│ opendating-proto │ NDK core │ ← Infrastructure
│ (crypto, types) │ (relay, events, auth) │
├──────────────────┴───────────────────────────┤
│ Nostr │
├──────────────────────────────────────────────┤
│ OpenDating Relay v0.1 (Cloudflare) │
└──────────────────────────────────────────────┘
The mobile app does not depend on backend implementation code. Integration uses the published opendating-protocol@0.1.0 registry artifact (installed through the ^0.1.0 range), advertised service capabilities, and the OpenDating protocol specification. Protocol 0.1 is experimental; package 0.1.1 is pending registry publication and verification.
# Clone
git clone https://github.com/jongan69/opendating-mobile.git
cd opendating-mobile
# Install
cp .env.example .env
npm ci
# Run
npm start # Expo dev server
npm run ios # iOS simulator
npm run android # Android emulatornpm run typecheck # TypeScript strict — must pass with 0 errors
npm run lint # ESLint — must pass with 0 errors
npm test # Jest test suite| Document | Description |
|---|---|
| ARCHITECTURE | Layer diagram, data flow, design decisions |
| DESIGN | Visual principles, color system, typography, motion |
| SECURITY | Key storage, encryption, auth, trust model |
| PRIVACY | What's shared, what's not, limitations, controls |
| HANDOFF | Repository boundary, access inventory, quality gates, and continuation order |
| RELEASE-STATUS | Verified release behavior and current production blockers |
| ROADMAP-1.0 | Gated path from release containment through GA and federation |
| PROTOCOL-INTEGRATION | All 20+ protocol operations, request lifecycle, error handling |
| MOBILE-V0.1-COMPLETE | Release report with full feature inventory |
| CONTRIBUTING | Development workflow, code style, privacy rules |
| CHANGELOG | Version history |
| Category | Technology | Version |
|---|---|---|
| Framework | Expo | SDK 57 |
| Runtime | React Native | 0.86 |
| Language | TypeScript (strict) | 6.0 |
| Navigation | Expo Router | ~57 |
| UI Components | @expo/ui | ~57 |
| Nostr Client | @nostr-dev-kit/ndk | ^2.15 |
| Protocol | opendating-protocol | ^0.1.0 (registry: 0.1.0; 0.1.1 pending) |
| Gestures | react-native-gesture-handler | ~2.32 |
| Animation | react-native-reanimated | ^4.5 |
| Images | expo-image | ~57 |
| Secure Storage | expo-secure-store | ^57 |
| Location | expo-location | ^57 |
| Photos | expo-image-picker | ^57 |
| Haptics | expo-haptics | ^57 |
| SVG | react-native-svg | latest |
OpenDating Mobile is open source and welcomes contributions. See CONTRIBUTING.md for the development workflow, code style guide, and privacy rules.
Before submitting a PR:
npm run typecheckmust pass (0 errors)npm run lintmust pass (0 errors)- No backend implementation imports
- No hardcoded service pubkeys
- No raw GPS, nsec, or decrypted message plaintext in new code
- OpenDating — The protocol specification, backend relay, and
opendating-protocolnpm package - Nostr — The decentralized protocol OpenDating is built on
MIT © OpenDating
Built with ❤️ for privacy, portability, and genuine human connection.