Inspiration

The idea came from a simple observation: when people are in a hard place, they often turn to the internet first, not because it's the best resource, but because it's the least scary one. You don't have to explain yourself to anyone. You don't have to feel judged. You just type what's happening and hope something useful comes back. But what actually comes back is usually a mess. Generic search results, outdated hotline numbers, Reddit threads from five years ago, and no sense of whether anyone else has been through the same thing. I wanted to build the thing that should exist in that moment, somewhere you can tell your story, get pointed toward real help, and find out that someone else understands.

What it does

Reach is a peer support platform where people share what they're going through like housing insecurity, mental health struggles, grief, financial crisis and domestic situations, and receive a structured, compassionate first response powered by AI. When someone submits a story, the app does three things at once:

Triages the post — categorising it, assessing urgency, and flagging high-risk situations with a crisis UI that surfaces 911 and 988 prominently Finds verified resources — merging a curated database of national helplines with location-aware results from 211.org and Google Places, so the resources shown are real, nearby, and human-reviewed rather than invented by the model Connects people — using Postgres trigram similarity to match users with others who have written about similar situations, and routing them into public thread replies, a private support inbox, or direct 1:1 messages

Posts can be anonymous. Profiles can include a mutual aid / tip link so even anonymous authors can receive community support.

How we built it

The frontend is React 18 with TypeScript, Vite, Tailwind v4, and React Router 7. The backend is entirely Supabase — Postgres with Row Level Security, Auth, Realtime for live DMs, Storage for post images, and Edge Functions for the AI and resource enrichment layer. The AI runs through a Supabase Edge Function (reach-first-responder) that proxies requests to the Featherless API, keeping the key server-side

Challenges we ran into

The hardest problem was resource integrity. AI models will confidently invent phone numbers and organisation names that don't exist, and in a mental health or crisis context that's unhelpful and dangerous. I solved this with a strict two-layer architecture: the model is forbidden from producing any directory data and instead returns abstract search hints, while all actual resources flow through a curated database and verified third-party APIs. Every card on the platform has a source chip and a disclaimer. Getting that pipeline reliable, and making sure it degrades gracefully when the AI call fails or the key isn't set took a lot of time. Anonymity was also more nuanced than expected. Hiding identity on the feed while preserving enough context for community matching, and keeping the mutual aid tip link visible even on fully anonymous posts, required careful thought about which fields get masked where and why.

Accomplishments that i'm proud of

The anti-hallucination resource design is the thing im most proud of. It's not the flashiest feature but it's the most considered one, and we think it's the right way to build AI into a context where the stakes are real. The trigram similarity engine is also something we're happy with — the fact that "people like you" suggestions are based on what you actually wrote, not your demographic profile or a category tag, feels meaningfully different from how most platforms approach this. And the post lifecycle — from first submission through AI triage, community replies, follow-up nudge at 24 hours, and eventual resolution — is a full arc that most peer support tools don't attempt.

What i learned

Building for vulnerable users rewires how you think about failure. In most apps, a crashed API call is a minor inconvenience — in Reach, a blank screen after someone has just shared something painful is its own kind of harm. A wrong phone number on a resource card isn't a data quality issue, it's a person in crisis reaching a disconnected line. Those stakes made us treat every edge case as a human moment rather than a technical one, and that shift in thinking ended up shaping the architecture more than any framework decision did.

What's next for Reach

i'm still thinking of more features, but i think one thing i might add before fully deploying it is a weekly digest — a Supabase cron Edge Function that sends users a summary of activity in their categories, keeping people connected between visits

Built With

Share this project:

Updates