This file records the original v0.1 implementation snapshot and is not a statement of current release state. Current status and remaining work are tracked in Release Status and the 1.0 Roadmap.
| Metric | Value |
|---|---|
| Expo SDK | 57 |
| React Native | 0.86.2 |
| TypeScript | 6.0 (strict mode) |
| TypeScript errors | 0 |
| Source files | 67 (.ts/.tsx) |
| App screens | 30 |
| Components | 13 |
| Feature modules | 11 |
| Tests | Written (geohash, errors) |
| Protocol | opendating-protocol@^0.1.0 (registry resolves 0.1.0; 0.1.1 pending) |
| Relay | wss://opendating-relay.jonathang132298.workers.dev |
Expo UI (@expo/ui)
│
30 App Screens
│
11 Feature Hooks
│
OpenDatingClient
/ \
opendating-protocol@^0.1.0 NDK core
\ /
Nostr
│
OpenDating Relay v0.1
index.tsx— App bootstrap state machine (loading → identity check → connect → capabilities → profile → ready)
welcome.tsx— Brand + "Create Account" / "Import Account"create-account.tsx— Identity creation viagenerateKeypair()import-account.tsx— nsec/hex private key import with bech32 validationprivacy.tsx— Privacy explanationbasics.tsx— Display name, age, genderpreferences.tsx— Gender preferences, age rangeintent.tsx— Relationship intent selectionabout.tsx— Bio, interests, promptsphotos.tsx— Multi-photo picker (2–6 photos)location.tsx— Coarse location permission + privacy inforeview.tsx— Profile review → realcreateProfile()callfinish.tsx— Success + haptic → discover
discover.tsx— Card deck with swipe gestures (Reanimated + Gesture Handler)matches.tsx— Match list with new matches + conversationsprofile.tsx— User profile with pause discovery, verification, settingsfilters.tsx— Discovery filters (age, distance, gender, intent)
candidate/[pubkey].tsx— Full candidate profile view with photoschat/[pubkey].tsx— NIP-17 messaging with safety menu (unmatch/block/report)edit-profile.tsx— Profile editor (name, age, gender, bio, interests, photos)report.tsx— Report flow with type selection + optional evidence
settings/index.tsx— Main settings menusettings/privacy.tsx— Privacy info + npub technical sectionsettings/account.tsx— Delete account flowsettings/advanced.tsx— Nostr technical details (npub, relay, services)verification.tsx— Verification claims display
swipe-deck.tsx— Tinder-style card deck (Pan gesture, Reanimated, spring physics, LIKE/PASS stamps, skeleton loading, ReduceMotion support)candidate-card.tsx— Photo-first card (expo-image, gradient overlay, photo paging, interest chips, verification badge)
message-bubble.tsx— Sent/received bubbles with accent/surface colorsmessage-list.tsx— FlatList with date separators, auto-scrollchat-composer.tsx— Auto-growing input with send button
safety-menu.tsx— iOS ActionSheet / Android Alert for unmatch/block/reportblock-confirmation.tsx— Modal with block consequences
empty-state.tsx— Icon + title + subtitle + optional actionloading-overlay.tsx— Translucent overlay with spinnerprofile-photo.tsx— Circular/rounded photo with placeholderback-header.tsx— Navigation back button headeronboarding-screen.tsx— Shared onboarding chrome (progress, back, footer CTA)
use-bootstrap.ts— App startup state machineuse-auth.ts— Identity management (create, import, delete)use-discovery.ts— Candidate stack, cursor pagination, prefetch, location syncuse-matches.ts— Match list, push notifications, new match detectionuse-messaging.ts— NIP-17 send/receive, deduplication, optimistic senduse-safety.ts— Block/unblock (optimistic local-first), unmatch, reportuse-profile.ts— Profile CRUD, pause/resume, cachingonboarding-draft.tsx— In-memory draft context for multi-step onboarding
| Module | Description |
|---|---|
lib/opendating/open-dating-client.ts |
Domain facade — screens never construct Nostr events |
lib/opendating/errors.ts |
Wire error → user-facing message mapping |
lib/location/geohash.ts |
Geohash encoding, max 5-char truncation |
lib/location/index.ts |
Location permission, coarse geohash export (raw GPS never leaves) |
lib/storage/index.ts |
SecureStore wrapper for identity, services cache |
lib/format.ts |
npub encoding, pubkey shortening, timestamps |
state/theme-context.tsx |
Light/dark theme provider |
theme/ |
Colors (light+dark), spacing, radius, typography |
- nsec stored only in OS secure storage (expo-secure-store)
- Raw GPS never leaves location module
- Geohash precision never exceeds 5 characters (~5 km)
- Likes are private (encrypted gift wraps to matcher service)
- Blocks applied locally before network response
- Reports encrypted to moderation service
- Messages end-to-end encrypted (NIP-44/NIP-59/NIP-17)
- No public Nostr feed or social features
- Service pubkeys discovered from NIP-11, never hardcoded
All backend communication goes through OpenDatingClient:
- NIP-11 service discovery → cached service pubkeys
- NIP-42 AUTH → relay challenge-response
- NIP-59 gift wraps → private request/response
- NIP-44 encryption → message content protection
- NIP-17 DMs → match-only messaging
- Request correlation via
crypto.randomUUID() - All 20+ protocol operations wired to real backend methods
Per the specification, the following are explicitly excluded:
- AI matchmaking/messages
- Subscriptions/premium features
- Super likes/boosts
- Photo DMs, voice, video
- Read receipts, typing indicators, online status
- Contact uploading
- Bitcoin/zaps wallet
- Public social feed
- Media upload — Profile photo upload/retrieval is implemented via Blossom (BUD-02) with kind-24242 signed authorization in
src/lib/opendating/media.ts. - Expo Go compatibility — Some dependencies (@expo/ui native components, expo-sqlite for NDK cache) require a development build rather than Expo Go.
- Real device testing — Needs testing on physical iOS/Android devices for gesture feel, keyboard behavior, and camera integration.
- Alice/Bob/Carol E2E — Requires three real accounts on the deployed relay; test infrastructure is in place.
npm run typecheck # TypeScript strict check — passes with 0 errors
npm run lint # ESLint
npm test # 9 Jest suites / 105 tests at the Phase 0 verification
npm start # Expo dev server
npm run ios # iOS simulator
npm run android # Android emulatorAll installed and compatible:
@expo/ui@~57.0.9— Native UI components@nostr-dev-kit/ndk-mobile@^0.8.43— Nostr client (legacy peer deps)opendating-protocol@^0.1.0— Protocol + cryptoreact-native-reanimated@^4.5.1— UI thread animationsreact-native-gesture-handler@~2.32.0— Gesture systemexpo-image@~57.0.2— Image loading/cachingexpo-secure-store@^57.0.1— Secure key storageexpo-location@^57.0.8— GPS → coarse geohashexpo-image-picker@^57.0.8— Photo selectionexpo-haptics@^57.0.1— Tactile feedback
Historical milestone only: the v0.1 feature skeleton reached a type-safe device-testing checkpoint. It is not complete, production-grade, or approved for distribution; the current release status and roadmap are authoritative.