Inspiration

We used to volunteer at Hope House. We saw the lineups, the overwhelmed staff, donations piling up faster than they could be sorted, and people in need who just couldn't show up because getting there took energy they didn't have, or because walking into a crowded shelter and interacting with strangers felt like too much.

The problem wasn't a lack of generosity. It wasn't a lack of need. It was the gap in between.

85,000 people are homeless in Ontario alone, up 7.8% in a single year. 1 in 4 Canadian households are food insecure, including 2.5 million children. Meanwhile, up to 60% of food produced in North America never gets eaten. The resources exist. They're just in the wrong place.

We built Bridge to close that gap.

What it does

Bridge is a peer-to-peer platform connecting people who have surplus food or clothing with people nearby who need it, with volunteer drivers handling the last mile. Three roles keep it simple.

Helpers post donations. People in need browse and claim what they actually need. While drivers accept nearby deliveries on demand.

Once a match is made, everyone gets a shared in-app chat with no phone numbers shared, no shelter lines, and no overhead.

How we built it

The frontend is built with React 18, TypeScript, Vite, Tailwind CSS, and shadcn/ui. The backend runs FastAPI on Google Cloud Run with Python 3.11. We use Firestore as our real-time database, Firebase Auth for Google sign-in, Firebase Storage for images, and Firebase Hosting to serve the app. Maps are powered by Leaflet and OSRM, geocoding by Nominatim, and the AI layer uses Gemini Vision via gemini-2.5-flash.

When a helper uploads a photo, it gets sent to our FastAPI backend on Cloud Run, which calls the Gemini API with a structured prompt and gets back a JSON list of items including names, quantities, and sizes. That populates the form automatically with no manual entry and no API keys exposed on the client side. Firestore's real-time listeners power the live delivery flow so the moment a match is created, it appears on the driver's screen instantly.

Challenges we faced

Keeping the helper, recipient, and driver in sync simultaneously required careful Firestore data modeling and listener management. Getting consistent, parseable JSON from a vision model across wildly different photo types took significant prompt iteration. Handling partial deliveries where only some items get claimed and the rest stay listed and claimable required extra state management throughout the entire flow.

What we learned

The hardest part of helping people isn't motivation. It's friction. Every extra step, every inconvenience, every moment of discomfort is a reason for someone to give up. Building Bridge taught us that good design for social impact means relentlessly removing barriers on both sides: for the person giving, and for the person receiving.

Built With

Share this project:

Updates