Active-lifestyle dating platform
A mobile dating experience built around shared sports and lifestyle preferences, with location-aware discovery, mutual matching, and private conversations.
Overview
I am building a mobile dating experience around active lifestyles. People create profiles, describe their sports and activity habits, set relationship preferences, discover compatible people, and start a conversation after a mutual match. The product also includes subscription entitlements, reporting, blocking, and moderation workflows.
Technologies
TypeScript, React Native, Expo, Fastify, PostgreSQL, PostGIS, Redis, and WebSockets.
Architecture
The React Native and Expo application connects to a TypeScript modular monolith built with Fastify. PostgreSQL is the durable source of truth; Redis holds temporary discovery feed manifests. Zod validation and generated OpenAPI documentation define the HTTP boundary.
System design
Matching commands use transactions and idempotency identifiers to handle concurrent actions and retries. Chat messages receive an ordered conversation sequence and are saved with an outbox event in the same transaction. Background workers deliver downstream events with leases and retries. Cursor-based synchronization lets clients recover conversation history after reconnecting, keeping message storage independent of realtime delivery.
Database design
The relational model separates identity and sessions from public profiles, sports, discovery preferences, and relationship state. Mutual matches connect two members to a conversation; uniqueness constraints prevent duplicate matches and repeated client messages. Conversation sequence indexes support efficient synchronization.
PostGIS queries approximate launch-zone locations. The location flow stores a coarse zone center instead of exact device coordinates. Separate tables track moderation reports, media processing, subscription entitlements, and durable command receipts.
Security
Server-side checks combine authentication, account capabilities, conversation membership, and blocking status. Session credentials are stored as hashes; selected identity fields and message text use application-level encryption. Browser sessions use HttpOnly cookies and CSRF validation. Media access depends on ownership and processing state, and development fixtures are blocked outside their permitted local environment.
Development status
In development. The mobile application and API are integrated locally. Production billing, storage, and push integrations still require acceptance work. Realtime delivery currently runs within one process; a shared broadcast layer is needed before deploying multiple realtime replicas.