Inspiration
Philadelphia's Community Behavioral Health (CBH) directory lists hundreds of Medicaid mental health providers — but anyone who's actually tried calling down that list knows the reality: disconnected numbers, providers who stopped taking new patients months ago, and duplicate listings that make the directory look bigger than it is. For someone reaching out during a mental health crisis, every dead-end call is a real cost. We wanted to know: how much of this directory is actually real?
What it does
Unghosted verifies CBH provider listings against reality by making actual phone calls — not just scraping the directory. Each provider gets a trust score (0–100) based on real call outcomes: confirmed accepting patients, reached voicemail, no answer, wrong number, or the wait time we were actually quoted versus what's listed. Users can search by zip code, specialty, and language, see which listings are duplicates, and compare a provider's claimed wait time to the real one we verified. After calling a provider themselves, users can report their own outcome, which feeds back into the score — crowdsourced verification that keeps the data current.
How we built it
A Python/FastAPI backend with a SQLite database stores provider records and call logs. A rule-based scoring engine (scoring.py) computes each provider's trust score from verified call outcomes and user reports, with duplicate-listing detection built in. The main interface is a lightweight vanilla JS/HTML/CSS web app that walks users through a crisis check, search, results with wait-time comparisons, and an in-app call script plus outcome reporting flow. We also built a secondary Tkinter desktop interface pulling from the same live database, so the verification data is usable outside the browser too. We seeded and scored the system with real CBH directory listings and real outcomes from calls we made ourselves this weekend.
Challenges we ran into
Reconciling two developers' independent codebases into one coherent product without losing either person's work was harder than expected — we had to rebuild a teammate's desktop interface to pull from live verification data instead of a static insurance CSV, since CBH is Medicaid-only and insurance isn't a meaningful filter here. We also spent real time debugging environment issues getting everything running consistently across machines — duplicate/stale copies of files being edited in the wrong place, port conflicts, and CSV-loading edge cases silently dropping call log rows.
Accomplishments that we're proud of
We didn't fake the data. Every score in this app reflects a real phone call we made to a real CBH-listed provider this weekend, which meant confronting the same broken directory experience a real patient would. We're proud of catching real problems in the process — a wrong number, duplicate listings inflating the provider count, and multi-day gaps between claimed and actual wait times — proving the tool works on data that matters, not a synthetic demo.
What we learned
How fragile a "directory" can be when nobody checks it against reality, and how much friction that adds for people who are already in a vulnerable moment. We also learned the value of designing a scoring system that degrades gracefully with sparse data — most listings start as "unverified" rather than falsely confident, and the score only strengthens as real signals come in.
What's next for Unghosted
Scaling call verification with an automated calling assistant so more of the directory can be checked without relying solely on manual volunteer calls, adding a lightweight ML layer once we have enough labeled outcomes to move beyond rule-based scoring, and deploying it publicly so caseworkers and patients across Philadelphia can use real-time verified data instead of the static CBH PDF.
Log in or sign up for Devpost to join the conversation.