Inspiration

Many refugees and newcomers don’t lack help, they lack a clear path to it. Which nonprofits serve their language? Which clinics take walk-ins? Where is the next food pantry or legal clinic, and is the organization even legitimate?

Today, that information is scattered across Google, PDFs, mosque bulletins, and word of mouth. Sabeel ("path" in Arabic) is inspired by the idea of one trustworthy starting place to find local, culturally-aware support, grounded in real locations, real organizations, and transparent signals like nonprofit verification.

What it does

Sabeel helps users find local support through:

  • Guided search for needs (housing, food, legal, medical, ESL) with preferences like language and urgency.
  • Map results that pull nearby organizations from Google Places using location- and service-type queries, rendered on an interactive Leaflet map and linked to organization profiles.
  • Organization profiles that combine our directory data with ProPublica Nonprofit Explorer data when an EIN exists. For map-only listings, we resolve Google Place IDs so profiles never 404. Optional Gemini-generated "what to know" summaries help users interpret place-based listings — without inventing fake contact info.
  • Events discovery via SerpAPI + Google search scoped to site:eventbrite.com. Since Eventbrite's old public search API was deprecated, we surface real Eventbrite /e/ links indirectly.
  • Auth and navigation across Home, Map, Events, Housing, and Account — wrapped in a cohesive Sabeel brand and accessible UI.

In short: search → map/list → profile → external link or phone, with verification as the backbone and AI as a careful helper, not the source of truth.

How we built it

  • Framework: Next.js (App Router) with React and TypeScript.
  • Backend / data: Supabase for auth and app data; server routes and server components keep private keys off the client.
  • Maps & places: Google Maps / Places (geocoding, text search, place details) to build organization-like records from real venues.
  • Trust / nonprofits: ProPublica Nonprofit Explorer API for EIN-based verification and filing hints on curated orgs.
  • AI: Google Gemini for short, cautious "overview" copy on place-sourced org profiles — never for addresses or hours.
  • Events: SerpAPI driving Google queries (site:eventbrite.com + user keywords + location), parsed into event cards.
  • Maps UI: Leaflet + react-leaflet for markers and popups.
  • Styling: Custom palette and layout (warm browns and cream) consistent across login, map, events, and profiles.

Challenges we ran into

  • Eventbrite's official search endpoint was removed years ago, so direct API calls returned 404. Rather than fake it, we pivoted to indexed search (Google + SerpAPI) to surface real Eventbrite listings.
  • Gemini + "Google Search" grounding hit quota / billing limits on free tiers. The app had to fail clearly instead of pretending it had live AI search when quotas blocked grounded calls.
  • Map listings without EINs originally linked to /organizations/ with empty IDs. Profiles now key off stable IDs (EIN or Google place_id) and fetch or explain missing nonprofit data.
  • Hydration warnings in dev from browser extensions (e.g. injected attributes like bis_skin_checked) had to be distinguished from real app bugs; the logo's Next/Image sizing needed careful handling to clear aspect-ratio warnings.

Accomplishments that we're proud of

  • A complete journey: search → map → working profile pages for both curated nonprofits and Places-derived venues.
  • Honest architecture: ProPublica and official APIs where they add trust; SerpAPI as a pragmatic substitute when a vendor deprecated search.
  • UX polish: designed a clean, easy-to-navigate interface with simple flows, clear hierarchy, and intuitive interactions so users can quickly find what they need without confusion.
  • Resilience: structured errors, env-based configuration, and no fake events when APIs fail — users see actionable messages instead of silent wrong data.

What we learned

  • APIs change. Depending on a single third-party search endpoint is fragile; layering (Places + our own seeds + web discovery) is more durable.
  • Using AI effectively.We learned how to better structure prompts, validate outputs, and utilize AI as a tool to enhance results rather than relying on
  • Maps and nonprofit data are powerful together, but identity (EIN vs. place_id) has to be modeled explicitly or trust layers break.
  • Identifying relevant data. Filtering, validating, and surfacing the right information matters more than just having access to large amounts of data. -Things do not go as planned. Learning to find workarounds, adapt quickly, and push through challenges is what keeps the product moving forward.

What's next for Sabeel

  • Deeper events: richer date/snippet parsing or curated feeds from partners, not just Google snippets.
  • More verification: expanded nonprofit coverage with "last-updated" and source labels on every field.
  • Personalization: saved searches, SMS/email nudges for recurring clinics, and offline-first hints for low-connectivity users.
  • Community input: lightly-moderated listing claims so orgs can correct hours and contact info safely.
  • Performance & cost: caching Places/SerpAPI results, tuning Gemini usage, and monitoring quotas in production.

Built with

DEMO LOGIN Email: admin@demo.com Password: demo1234

next.js react typescript supabase google-maps google-places leaflet react-leaflet propublica-api serpapi google-gemini tailwindcss

Built With

Share this project:

Updates