Skip to content

Latest commit

 

History

58 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OpenDating

Deliberate private introductions on an open protocol.
An Expo React Native reference client for the OpenDating protocol.

License MIT Expo SDK 57 TypeScript strict React Native 0.86 CI status Platforms 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 for verified capabilities, and the 1.0 Execution Roadmap for the path through GA.

What is OpenDating?

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).


Why OpenDating?

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

Features

Introductions

  • One person with context — Each introduction explains the visible compatibility facts that led to it
  • Privacy receipt — The app says what is shared now, withheld, and unlocked only after mutual interest
  • Explicit private choices — Skip or express interest without public engagement counts or gesture ambiguity
  • Privacy-first location — Only a 5-character geohash (~5 km) ever leaves your device
  • Customizable filters — Age range, distance, gender, relationship intent
  • Daily quotas — Prevents profile scraping and enumeration

Messaging

  • End-to-end encrypted — NIP-17 direct messages via NIP-44 encryption
  • Match-only — The relay enforces that only matched users can message each other
  • No read receipts — No typing indicators, no online status

Safety

  • Block — Takes effect locally immediately, enforced server-side, never notified
  • Unmatch — Removes the match without explanation
  • Report — Encrypted to moderation service, with optional message evidence
  • Private by default — Likes, blocks, and reports are never public

Privacy Passport

  • Live account boundary — Shows the member-owned account identifier and backup path
  • Visibility control — Pause or resume introductions from the passport
  • Plain-language boundaries — Explains location, decision, and conversation privacy in one place

Platform

  • iOS — Feels like a native SwiftUI app (SF Symbols, native sheets, continuous corners)
  • Android — Feels like a native Material 3 app (Material Symbols, tonal surfaces)
  • Dark mode — Full light/dark/system theme support
  • Accessibility — VoiceOver, TalkBack, Dynamic Type, Reduce Motion

Architecture

┌──────────────────────────────────────────────┐
│                  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.


Quick Start

# 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 emulator

Quality Commands

npm run typecheck        # TypeScript strict — must pass with 0 errors
npm run lint             # ESLint — must pass with 0 errors
npm test                 # Jest test suite

Documentation

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

Tech Stack

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

Contributing

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 typecheck must pass (0 errors)
  • npm run lint must pass (0 errors)
  • No backend implementation imports
  • No hardcoded service pubkeys
  • No raw GPS, nsec, or decrypted message plaintext in new code

Related Projects

  • OpenDating — The protocol specification, backend relay, and opendating-protocol npm package
  • Nostr — The decentralized protocol OpenDating is built on

License

MIT © OpenDating


Built with ❤️ for privacy, portability, and genuine human connection.

About

Privacy-first decentralized dating app — Expo React Native reference client for the OpenDating protocol on Nostr. Tinder-quality UX with end-to-end encrypted messaging, coarse location privacy, and self-sovereign identity.

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages