Inspiration
During our research, we uncovered a troubling statistic: 30% of Montreal seniors experience chronic social isolation, which increases their mortality risk by 26% according to a study by Julianne Holt-Lunstad. At the same time, 68% of graduate programs require or prefer volunteer hours, leaving McGill's 40,000+ students scrambling for meaningful opportunities.
The data revealed an even deeper problem: in Milton-Parc, 25% of the 8,000 residents are over 65, living just blocks from campus. Yet there's no structured system connecting these two groups. Students move through the neighborhood like temporary residents, creating "town-gown tension" documented by local community organizations.
We realized we weren't looking at two separate problems, we were looking at one perfect match waiting to happen.
What It Does
MarletMeets is a smart-matching platform that bridges generations through volunteer help sessions.
For Students:
- Browse nearby seniors sorted by a compatibility algorithm that weighs proximity (50%), skill match (30%), and language compatibility (20%)
- See distance to each senior (e.g., "0.4 km away") to make informed decisions
- View senior profiles with tasks they need help with
- Offer to help, upon selection, a map appears showing both locations (student's pinpoint and senior's pinpoint)
- Get full contact details to coordinate directly
- Track verified service hours while building real relationships
For Seniors:
- Simple signup (family can help) no tasks required during registration
- Add tasks after login with a "+ Add Task" button whenever help is needed
- Get notified when students offer to help with a simple notification showing:
- Student's name
- Student's contact information (phone/email)
- Which task they're helping with
- No complex map interface, just clear contact info to reach out
- Build trust through repeat volunteers
How We Built It
The Stack:
- Frontend: React with role-based routing (student/senior/admin dashboards)
- Backend: Python Flask REST API with Token authentication
- Database: PostgreSQL with normalized schema (students, seniors, tasks, sessions, users)
- Maps: Google Maps API for location visualization (student view only)
- Matching: Custom algorithm using Haversine distance formula
The Architecture:
Matching Algorithm:
Our custom compatibility engine scores each student-senior pairing on three weighted factors:
1. Proximity Score (50% weight):
Using the Haversine formula to calculate great-circle distance between two points on Earth, we start with a perfect score of 100 and deduct 10 points per kilometer. Students beyond 10km receive a proximity score of 0, effectively prioritizing hyperlocal connections.
proximity_score = max(0, 100 - (distance_km * 10))
2. Skills Score (30% weight):
We calculate what percentage of a senior's needs can be met by the student's listed skills using set intersection. If a senior needs help with "tech support" and "groceries," and a student offers both, the skills score is 100. If only one matches, it's 50.
skills_score = (matching_skills / total_needs) * 100
3. Language Score (20% weight):
Binary match, students and seniors who share at least one common language score 100, otherwise 0. This ensures communication barriers don't prevent effective help sessions.
language_score = 100 if common_languages else 0
Final weighted score:
$$ \text{compatibility} = 0.5 \cdot S_{\text{proximity}} + 0.3 \cdot S_{\text{skills}} + 0.2 \cdot S_{\text{language}} $$
Students see seniors ranked by this total compatibility score, ensuring matches feel intentional—not random.
Token-Based Authentication System:
We implemented secure token-based authentication where users log in once and receive a unique auth token stored in our database. Every subsequent API request includes this token in the Authorization: Bearer <token> header, allowing the server to verify identity. Tokens can be revoked on logout (deleted from the database), providing better security control than traditional session cookies.
Three User Roles:
- Students: Browse seniors, view map after selection, manage sessions
- Seniors: Add tasks, view notifications with student contact info
- Admins: Dashboard with aggregate stats and network visualization
Challenges We Ran Into
One of the biggest challenges was designing for three completely different user types (students, seniors, and admins) while maintaining a single authentication system. Balancing the need for role-based routing with clean code architecture required careful database design, ultimately leading us to create a users table that links to students or seniors via foreign keys. Building an asymmetric user experience presented another unique challenge: students needed engaging features like interactive maps showing both locations after selection, while seniors required maximum simplicity, just text notifications with phone numbers. Finding the right balance between "powerful enough" and "accessible enough" took significant iteration and user flow testing. The matching algorithm added technical complexity, as we couldn't just show "closest seniors", we needed a scoring system that felt intuitive. Implementing the Haversine formula for great-circle distance was straightforward, but designing the proximity penalty (losing 10 points per kilometer, capping at 10km) required testing to ensure it didn't overly penalize slightly-farther matches with better skill alignment. Balancing three weighted factors, proximity at 50%, skills at 30%, language at 20%, involved multiple rounds of experimentation to prevent edge cases like pairing a French-speaking student with an English-only senior just because they lived closer. Senior onboarding posed another significant UX hurdle, as we had to design for users who don't use complex apps. We experimented with different approaches before realizing that removing the "needs" field entirely from registration and adding a simple "+ Add Task" button post-login dramatically reduced cognitive load, making the signup process accessible for both seniors themselves and family members helping them register.
What We Learned
Throughout the hackathon, we learned how to rapidly implement token-based authentication while maintaining development momentum, gaining hands-on experience with database-backed auth tokens, password hashing with bcrypt, and secure session management. We strengthened our skills in frontend-backend integration, ensuring smooth communication between React components, Flask API endpoints, and PostgreSQL queries, particularly when implementing the matching algorithm that required real-time distance calculations using the Haversine formula. Working with Google Maps API taught us how to handle asynchronous geocoding requests and display dynamic map markers based on user selections. We also developed our debugging skills under pressure, learning to trace issues across the full stack—from SQL query errors to React state management bugs—and resolve them quickly without breaking existing functionality. Database schema design became a critical learning area, as we had to architect relationships between users, students, seniors, tasks, and sessions while maintaining referential integrity. Above all, we learned the importance of clear communication and task delegation when building a multi-role platform: coordinating frontend route protection, backend endpoint development, and database migrations simultaneously required constant sync-ups and adaptability when requirements evolved mid-build.
What's Next for MarletMeets
- Partner with Montreal community centers (Maison de la Culture, CLSC) to onboard real seniors
- Integrate with McGill Service Learning for official transcript credit
- Expand to UdeM, Concordia (40,000 more students, same problem)
- Session verification: Photo check-ins or mutual confirmation to verify help happened (fraud prevention for service hours)
- Analytics dashboard: Track which tasks are most needed, identify underserved neighborhoods, optimize matching weights
- Mobile app: While seniors don't need it, students would benefit from push notifications when new tasks appear nearby
- "Reverse mentorship": Seniors teach students cooking, French, life wisdom, make it truly reciprocal
Built With
- css3
- flask
- geocoding
- google-maps
- html5
- javascript
- postgresql
- python
- react
- reactrouter
- werkzeug
Log in or sign up for Devpost to join the conversation.