Project Info
Inspiration
We went up to our professors and our TAs and asked for pain points in the process. The first few conversations we had, we were just talking about grading and doing unnecessary work and optimizing things from the teacher's standpoint. But then we decided to talk to our CS 109 professor, Juliette Woodrow, who actually does research on AI and learning. Some of her papers feature AI feedback on problem sets and more one-on-one personalized learning. So we wanted to make a platform that would make online learning more accessible for both the student and the teacher. One of our teammates, Luke, had this brilliant scenario: in lecture, you're confused — what do you do? You ask the guy next to you. But when you're listening to a Zoom lecture or watching a YouTube video to learn something, you don't have that person next to you. So we made Juliette, in the spirit of Valentine's Day — you're Romeo, and you have your Juliette next to you to answer your questions.
What it does
Juliette can ingest YouTube videos or be a live Zoom companion to: Explain topics with simple, digestible answers and comprehension-check questions Generate animations in beautiful Manim to visualize concepts Give you personalized practice problems to get you interested in the work — like if you were learning probability and you were interested in sports, it would give you a sports statistics question The teacher has a dashboard where she or he can see what questions the students are asking, and therefore get feedback on what areas need the most improvement. Through this, we hope we can make online learning more enjoyable for both the student and the teacher.
How we built it
We built Juliette on Next.js 15 with TypeScript and Tailwind CSS, backed by Supabase for our database, auth, and storage. The AI pipeline uses OpenAI Whisper for transcription, GPT for answering questions across all three modes, and embeddings for retrieving the right transcript chunks. Animations are rendered through a Docker-based Manim worker using predefined templates filled in by the LLM. For the live classroom experience, we integrated the Zoom Apps SDK** to embed Juliette as an in-meeting Q&A panel.
Challenges we ran into
Chunking transcripts into meaningful 45–90 second segments with accurate timestamps so the AI retrieves the right context for each question Constraining Manim animation generation to predefined templates rather than arbitrary code — balancing creative flexibility with reliability Building a real-time teacher dashboard that surfaces actionable question trends without overwhelming instructors Making the Zoom panel feel native and responsive inside a meeting environment
Accomplishments we're proud of
The personalized practice problem generation — seeing it tailor a probability question around sports or music based on a student's interests feels genuinely engaging Getting the full pipeline working end-to-end: video upload → transcription → chunked retrieval → three distinct AI response modes The teacher dashboard providing real, useful insight into where students are struggling Shipping a working Zoom integration as an in-meeting panel
What we learned
Talking to Professor Woodrow taught us that the best AI learning tools don't replace teachers — they create feedback loops. Juliette helps students get unstuck in the moment, and simultaneously gives instructors visibility into where their class is struggling. We learned to design for both sides of the classroom, not just one.
What's next
Adding vector embeddings for smarter, semantic transcript retrieval beyond keyword matching Expanding the Manim template library so Juliette can visualize a wider range of concepts Supporting live multi-student sessions where the teacher can see questions aggregated in real time during a Zoom lecture Integrating with Canvas and other LMS platforms so Juliette fits naturally into existing course workflows And so goes the story of our project, Juliette.
Juliette - AI Educational Video Assistant
An AI agent that ingests educational videos, answers student questions with Manim-style animations, personalized practice problems, or simple explanations, and integrates with Zoom for live Q&A.
Features
- Video Upload & Transcription: Upload educational videos or provide URLs for automatic transcription with timestamps
- AI-Powered Q&A: Three response modes:
- Simple explanations with check questions
- Personalized practice problems based on student interests
- Animated visualizations using Manim templates
- Zoom Integration: Live Q&A panel in Zoom meetings for classroom use
- Teacher Feedback: Alternative explanations and resource suggestions
Tech Stack
- Frontend: Next.js (App Router) + TypeScript + Tailwind CSS
- Backend: Supabase (Auth, Postgres, Storage, Vector Search)
- AI: OpenAI (Transcription, Q&A, Embeddings)
- Animations: Manim (Docker-based render worker)
- Real-time: Zoom Apps SDK
Getting Started
Prerequisites
- Node.js 18+ and npm
- Supabase account
- OpenAI API key
- (Optional) Zoom Developer account for Zoom integration
Installation
- Clone the repository:
git clone <repository-url>
cd juliette
- Install dependencies:
npm install
- Set up environment variables:
cp .env.local.example .env.local
Edit .env.local and add your credentials:
- Supabase URL and keys
- OpenAI API key
- Zoom credentials (if using Zoom integration)
- Set up Supabase database:
Run the SQL migrations in supabase/migrations/ to create the necessary tables:
videos- stores uploaded video metadatatranscript_chunks- timestamped transcript segmentsquestions- student questions and AI responsesjobs- background task queue
- Run the development server:
npm run dev
Open http://localhost:3000 in your browser.
Development
Available Scripts
npm run dev- Start development server with Turbopacknpm run build- Build for productionnpm start- Start production servernpm run lint- Run ESLint
Project Structure
juliette/
├── app/ # Next.js App Router pages
├── components/ # React components
├── lib/ # Utilities and configurations
│ ├── supabase.ts # Supabase client
│ └── openai.ts # OpenAI client
├── utils/ # Helper functions
├── public/ # Static assets
└── supabase/ # Database migrations and schemas
Architecture
See Project.md for detailed MVP architecture and implementation plan.
License
MIT
Analysis
View
Metric
- 43
- 37
- 15
- 14
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- AnthropicIn code
- CSSIn code
- ExpressIn code
- Next.jsIn code
- OpenAIIn code
- PythonIn code
- ReactIn code
- SQLIn code
- SupabaseIn code
- Tailwind CSSIn code
- TypeScriptIn code
- DockerClaimed
- PostgreSQLClaimed
- VercelClaimed
11 of 14 appear in the indexed code. 3 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
- Claude CodeConfig · Commits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
782 KB
Source files
155
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
enbaocao/juliette
1,371 files · 36.3 MB · @ 60cb1c3
Structure
Interface
49 files · 4%Screens, components and styles rendered to the user.
+14 moreAPI & routing
19 files · 1%Request entry points: routes, handlers and controllers.
Application logic
154 files · 11%Domain rules, services and shared utilities.
+4 moreBackground jobs
3 files · 0%Work run outside a request: tasks, workers and schedules.
Data & schema
9 files · 1%Schema definitions, migrations and data access.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript51%
- Markdown24%
- Python23%
- SQL1%
- Shell1%
- CSS0%
- Other (1)0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
package.json
npm · 35- @anthropic-ai/sdk
- @supabase/ssr
- @supabase/supabase-js
- @zoom/appssdk
- clsx
- cors
- dotenv
- express
- framer-motion
- geist
- katex
- lucide-react
- next
- openai
- react
- react-dom
- react-katex
- react-markdown
- +17 more
manim-sandbox/requirements.txt
pypi · 2- numpy
- scipy
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.