Inspiration

As the final exams approach, we noticed a common struggle among UTSC students — everyone is studying alone, scattered across different platforms. You practice coding on one site, watch lecture recordings on another, message friends on a third, and somehow still feel disconnected from your classmates.

We asked ourselves: what if there was one place where students could study together, test each other, and actually feel like a community — even when they're miles apart?
UTSC Connect is a multiplayer learning platform that brings together everything a UTSC student needs in one place:

What it does

Practice — AI-graded coding challenges for CSCA48 (Linked Lists, BSTs, Recursion in C) and calculus problems for MATA37 (Integration with $\LaTeX$ input). Every answer is checked by Google Gemini in real-time. Quiz — Offline solo quizzes with a 10-minute timer, or Online 1v1 battles where two students race to solve problems. Uconnect — A full 3D multiplayer world built with Three.js. Walk around a virtual campus with buildings, a park, roads, and trees. See other players, talk to them with proximity voice chat (volume fades with distance), or enter the park for a video meeting room for students to study together (Study with me ) Games — Multiplayer chess with a 5-minute timer per player. Leaderboard — Practice points tracked across all courses, ranking the top students on the home page. Contributor System — Selected users can create new topics and questions, so the platform grows with the community.

How we built it

Everything runs on a Flask backend with Flask-SocketIO handling all the real-time communication. The 3D world uses Three.js, voice and video chat use WebRTC peer-to-peer connections, and answer grading goes through the Google Gemini API. User data, quiz scores, and leaderboard points are stored in SQLite. Math expressions render with KaTeX, and the whole thing is deployed on Render.

Challenges we ran into

Multiplayer sync was brutal. Getting three players to all see each other — when each person's 3D scene loads at a different time — broke in every way imaginable. Players would be invisible, floating, or only visible to some people. We ended up building a sync_players system where the client asks the server "who's actually in the game right now?" after the scene finishes loading.

Accomplishments that we're proud of

The proximity voice chat actually works — walk up to someone in the 3D world and you hear them. Walk away and they fade out. No buttons, no calls, it just happens. The 1v1 quiz battles feel genuinely fun and competitive. Watching the score update in real-time as your opponent solves a problem before you creates real tension. AI grading in a quiz setting — solutions are pre-fetched in the background while the student works, so grading feels nearly instant when they submit.

What we learned

Real-time multiplayer is way harder than tutorials make it look. Timing, state synchronization, disconnect handling, and race conditions are everywhere. WebRTC is incredibly powerful but incredibly fragile. The gap between works on localhost and works across two different networks is enormous.

What's next for UTSC Connect

More courses :expand beyond CSCA48 and MATA37 to cover the full UTSC CS and Math curriculum

Built With

  • c-frameworks:-flask
  • css
  • database:
  • flask-socketio
  • gltfloader
  • html
  • javascript
  • katex
  • languages:-python
  • sqlite
  • three.js-apis:-google-gemini-api
  • webrtc-libraries:-socket.io
Share this project:

Updates