The mobile app is React Native in TypeScript, with Redux and React Query for state (plus some Context API) and Firebase Auth for phone number, Apple, and Google sign-in. The backend is NestJS on PostgreSQL, deployed on AWS Elastic Beanstalk and built by the backend engineer on the team. That split let the mobile side own the identity and encryption work while the services layer stayed lean.
The identity model is the load-bearing piece. Anonymous-by-default usernames with progressive, user-controlled disclosure meant the app had to let people selectively share real information with a coach, or reveal themselves to others, without ever breaking the privacy guarantee for everyone else. The mapping from a pseudonymous handle to a real identity stays encrypted and is only unlocked under the disclosure rules the user sets.
The encrypted community feed is where the two hardest requirements meet. Posts are encrypted client-side with the Virgil Security SDK before they reach the Stream (GetStream) SDK that powers the feed, and decrypted on each reader’s device, so content stays encrypted in transit and at rest while Stream still delivers new posts in real time. Comments, replies, and reactions attach to a post’s anonymous handle, so Stream threads them correctly without exposing the author.