Inspiration

I’m an international student in Kitchener-Waterloo. When I first arrived, I didn’t know where to get help with basic things. Where do you donate a sofa when you move out? Is there a food bank I can go to without an appointment? Which clinic will see me without a family doctor? The answers exist, but they’re spread across a dozen of different websites, and each one has its own rules. A lot of newcomers also search in a second language, which makes it harder. I wanted one place where you can type what you need in plain words and get a short list of options you can actually go to.

What it does

CommunityOS is a search tool for community resources in Waterloo Region in Canada. Type what you need in English or Mandarin, then it returns a list of places that fit.

  • Understands short requests like "where can I donate a sofa" or "free dental clinic".
  • Filters by category, what the place actually offers, and constraints such as free, open now, no ID, or no appointment. If nothing matches, it relaxes the constraints step by step and tells you what it dropped.
  • Shows why each result was picked. The explanation is built from the database, not generated freely, so hours and addresses aren't made up.

How we built it

The backend is plain Python with SQLite. A rule-based parser with a small English/Chinese keyword list turns a query into a structured request. Then hard filters narrow the list, a TF-IDF index scores how close each listing is to the query, and a weighted score ranks the rest by match, eligibility, distance, open-now, freshness and barriers.

Challenges we ran into

  • Messy source data. Every organization writes its hours and requirements differently, and some listings are by appointment only. I had to decide what to do when hours are unknown. The app treats them as unknown instead of guessing “closed”.
  • API limits. My first version used Gemini for every search. That would eat the free-tier quota fast, and a search shouldn’t fail because a quota ran out. I moved search to local rules and kept Gemini for ingestion only.
  • Empty results. Relaxing filters helps, but not for every category. For donations I don’t drop the “accepted items” filter, because sending someone across town with a sofa to a place that doesn’t take sofas is worse than showing nothing. In that case the app says so and points to 211.

Accomplishments that we're proud of

  • Every ranking has a visible reason, and the weights are in one config file, so it’s easy to see why something came first.
  • English and Mandarin both work.
  • It works with no API key and no extra packages. The search and the default server don’t depend on any outside service.

What we learned

  • The hard part of a project like this is the data, not the search. Keeping listings accurate takes more work than ranking them.
  • Use an LLM where its mistakes can be caught, like extraction with human review, and use plain rules where you need predictable results, like search.
  • A stdlib-only server is a nice way to make a demo easy to run anywhere.

What's next for CommunityOS

  • Add more sources and more cities, and refresh the existing listings on a schedule.
  • Show results on a map with walking and transit times.

Built With

Share this project:

Updates

Submission history