In an emergency, finding blood in Bangladesh still runs on Facebook groups and phone trees. A family learns at 9 pm that a parent needs O− by morning, then starts calling strangers from a screenshot three months old. Lists go stale, donors sit 40 km away when a match lives on the next street, and phone numbers are posted in public — which is exactly why many willing donors quietly stop listing themselves at all.
I built it the way a security engineer builds anything: store the minimum, verify what you show, and let the rules — not the interface — enforce the boundary. Anonymous Firebase sessions mean a donor never hands over an email or a password. Every listing is bound to its own UID, and Firestore rules allow writes only to your own record, over an allowlisted field set. Phone numbers are never rendered in the directory markup: they are fetched on demand, one tap at a time, and every browser is capped at 25 reveals an hour. Matching is distance-first, with the district centroid as an honest fallback when GPS is denied.
A live, installable PWA that the whole network can use with zero onboarding: search without signing up, alert volunteers within seconds, and a moderation workspace where moderators can approve, verify and publish — but never delete or edit a record. That limit lives in the security rules, not in a hidden button. Seventy automated checks run against a local server with every Google host blocked, so the offline path, the demo dataset and the privacy guarantees are proven on each change — and nothing in the test suite ever touches the live project.
changedOnly() field restrictions and an audit trail — a moderator account physically cannot delete a donor.