Two communities, kept apart inside the product
A person joins one of two communities. Patients and survivors, or family and friends. The two do not appear to one another in discovery, in connections or in chat. That rule runs through the whole product rather than sitting on the screens.
Matching, and the wave
People are matched on cancer type, diagnosis stage, age, gender and distance. Distance searches use a geospatial index rather than reading every profile. You wave at someone. Nothing happens until they wave back. When they do, the connection forms and a private chat channel opens on its own. Discovery also keeps anyone you have already passed over out of view for a cooling-off period.
The engine
The backend runs as one service on AWS Fargate, on PostgreSQL. Socket.io carries the real-time chat, with Redis routing messages between instances so it runs across more than one. Endpoints that return personal data require authentication. Input is validated before it is used. Secrets sit in a secrets manager rather than in the code. Logging is structured and built to exclude profile data, diagnoses and message content.
The admin portal
The web tool the platform is run from. Multi-factor login and role-based access. User management, moderation, a report workflow, and content management for the podcasts, the support service listings and the reference data behind the profiles.
The screens, with the founder
The founder worked in the design tools she already knew and handed over screens and brand assets. Our own UX designer worked beside her, and we built the screens across the whole app. You do not make a good designer learn your tooling.
The product and the moderation policy are the client's. We built the software around them, and the systems it runs on.