Inspiration

Studying in university can feel isolating, especially during midterms and finals when everyone is grinding alone in their rooms or scattered across campus. We noticed that McGill students constantly ask in group chats "anyone wanna study?" but rarely follow through because coordinating people, places, and times is a hassle. We wanted to make finding a study partner as easy as opening an app ! Matched by course, location, and availability.

What it does

StudyBuddy lets McGill students create or join study sessions in under a minute. You pick your course, choose to meet in person at a nearby café or campus building with friends or on-campus students, or hop online via Google Meet. The app finds study spots near you sorted by distance, and scans your study vibes to suggest you the best study groups. For online sessions, it auto-generates a Google Meet link through the Calendar API. You can set group size, gender, schedule sessions, or start one right now.

How we built it

We built StudyBuddy as a React app deployed on Vercel. The frontend uses Tailwind CSS for styling and a multi-step session creation wizard. We integrated the Google Maps JavaScript API and Places API for real-time nearby café discovery with ratings, hours, and distance sorting. For online sessions, we used Google Identity Services (OAuth 2.0) and the Google Calendar API to programmatically create calendar events with Google Meet conference links. The browser Geolocation API handles location permissions with a custom fallback flow. User and session datas are stored using MangoDB and recommended to you based on the platform's vector search. Textual fields are embedded using Gemini's embedding models to offer a more personal student profile.

Challenges we ran into

Getting the Google OAuth flow to work in production was tricky - we kept hitting redirect_uri_mismatch errors until we properly configured authorized origins in Google Cloud Console (trailing slashes matter). The Google Maps Places API doesn't load reliably in every environment, so we had to build a fallback system with pre-populated Montreal cafés that loads instantly while the API attempts to connect. ESLint treating warnings as errors in Vercel's CI pipeline also blocked our first few deployments. Handling location permissions was also tricky. The main issue was in managing the data models between different team members. Everyone had a different way in interpreting how user and sessions should match, with different match characteristics.

Accomplishments that we're proud of

We're proud that the app actually generates real Google Meet links through the API - it's not mocked. The nearby spots feature pulls live data when available and falls back seamlessly so users never see a loading spinner. The session creation flow feels polished with a 6-step wizard, progress bar, and smart validation (you can't proceed without filling required fields). We also built a location permission system that explains why access is needed instead of failing.

What we learned

We learned how to work with multiple Google APIs simultaneously (Maps, Places, Calendar, OAuth) and how much configuration goes into making them work together in production. We gained experience handling graceful degradation, building for the happy path while making sure everything still works when APIs fail or permissions are denied. We also learned that small UX details, like sorting cafés by distance or showing today's hours highlighted, make a huge difference in how usable an app feels.

What's next for StudyBuddy

We want to add messaging within sessions so study partners can coordinate before meeting. A matching algorithm that suggests study partners based on shared courses and schedules is next. We plan to expand beyond McGill to other universities, integrate with university course registration APIs to auto-detect enrolled courses, and add a rating system so students can find reliable study partners. Push notifications for nearby live sessions and a "study streak" gamification feature are also on the roadmap.

Built With

Share this project:

Updates