← All projects
Project / In development

Active-lifestyle dating platform

A mobile dating experience built around shared sports and lifestyle preferences, with location-aware discovery, mutual matching, and private conversations.

TypeScriptReact NativeExpoFastifyPostgreSQLPostGISRedisWebSockets

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.