Inspiration
We met at Jane Street’s Academy of Math and Programming (AMP), where we loved learning together. Beyond math and programming, we learned how to learn: how to sit with a difficult problem, test an approach, question our assumptions, and build on each other’s ideas.
When we got to college, we missed that experience while working on problem sets. We wanted enough guidance to keep moving and enough space to figure things out ourselves. Reuniting at this hackathon, we decided to build the tutor we wished we had—one that could bring AMP’s curiosity, collaboration, and joy in tackling hard problems into everyday learning.
What it does
We designed our tutor around a shared whiteboard, where it could ask targeted questions, give immediate feedback, and draw explanations when words weren’t enough, while leaving students room to explore their own approaches.
What we learned
Personalization needs to distinguish lasting knowledge from temporary circumstances. Saying “I’m tired” today shouldn’t make a tutor assume I’ll struggle tomorrow. We explored representing concepts, attempted approaches, misconceptions, and supporting evidence in a knowledge graph that can change as the student learns.
We also realized that good tutoring sometimes means waiting. Following a wrong approach and discovering why it fails can be valuable. That inspired adjustable guidance, allowing students to choose how actively the tutor intervenes.
How we built it
We built Rubberducky with an Expo/React Native frontend that runs on the web and in Expo Go on an iPad, connected to a Python FastAPI backend. The shared whiteboard preserves student and tutor drawings separately, while guided, balanced, and hands-off modes let learners control how much help they receive.
The tutoring loop combines a deterministic teaching policy with optional language-model support. For the built-in algebra unit, a restricted parser and SymPy check submitted steps, while the policy selects diagnostic questions, progressively smaller hints, and fresh transfer problems. Claude can support questions students bring themselves. Responses are validated before being committed, and interrupted or outdated replies are discarded.
We used SQLAlchemy and SQLite to store learning evidence, preferences, and session history. NetworkX represents concept prerequisites, while a NumPy implementation of Bayesian Knowledge Tracing updates estimates from independent, verified assessments. Assisted answers remain part of the history without being counted as independent mastery. Students can inspect, correct, or delete remembered information.
We also implemented optional integrations: xAI speech-to-text and text-to-speech for hold-to-talk interaction and Chalk for evaluating scripted tutoring scenarios.
Challenges
Our biggest challenge was turning an ambitious vision into a focused prototype under a hackathon deadline. We prioritized a complete learning interaction in a simple math problem over additional models, characters, learning domains, and features.
We also had to decide when and how much the tutor should help. Too much guidance could take away the opportunity to experiment and learn from mistakes; too little could leave students frustrated. Silence doesn’t necessarily mean confusion, and a correct answer doesn’t always demonstrate understanding. These tradeoffs led us to adjustable guidance and learner-controlled requests for help.
Another open question was whether students would choose a tool that asks them to think when getting an immediate answer is easier. We focused on making that effort feel worthwhile through targeted feedback, an encouraging tutor, and a simple interface.
Technically, connecting the API services required substantial debugging. Coordinating tutor responses, whiteboard updates, and generated content—and preventing interrupted or outdated responses from appearing—was essential to making the app feel like one smooth learning experience.
What we learned
We learned to consider the entire learning experience, not just individual features. Adding another capability doesn’t always make the app more useful—it can introduce distractions or make a simple interaction harder. Putting ourselves in the student’s position helped us decide what to build, what to simplify, and when the tutor should step back.
What's next for Rubber Ducky
We want to expand beyond math into more subjects and concepts, while giving students more control over their tutor’s personality, guidance, and explanations. As we grow, we want to preserve the clean, simple experience that keeps students focused on their own thinking.
Built With
- fastapi
- numpy
- python
- pytorch
- react-native
- sqlite
- sympy
- transformers
- typescript
Log in or sign up for Devpost to join the conversation.