Project Info
Inspiration
As undergrad students sitting in lecture halls with 200+ students, it becomes incredibly easy to zone out, lose track of important concepts, or feel too intimidated to ask questions in real time. We wanted to change that. RecallMe was born from the idea that learning should be active, engaging, and personalized—not passive and easily forgotten. With live transcription and real-time interaction, RecallMe keeps students focused, curious, and connected to the lecture from start to finish. Instead of waiting for the professor to finish speaking or rewatching hours of recordings later, students can now engage instantly, ask questions the moment confusion strikes, and never miss a key idea again. What it Does RecallMe captures lecture audio in real time, transcribes it instantly, and generates dynamic, structured notes that students can interact with as the lecture is happening. But it doesn’t stop there—every lecture is stored as long-term memory inside our Letta agent, meaning students can return days or even months later and ask questions about previous lectures without having to dig through hours of videos. RecallMe also supports video uploads, where a user can upload a lecture recording, have it transcribed and stored in memory, and then interact with it using a larger context window. It’s like talking to an AI that truly remembers your classes—across time, topics, and video lectures. Using our dynamic database within Letta, we can easily recall information with each video_id. How We Built It We used a variety of tools and sponsors at Calhacks to build RecallMe! With the use of Letta, Reka, and LiveKit, we created RecallMe to achieve low-latency transcription, persistent memory storage, and context-aware interaction. LiveKit handles real-time audio streaming from the lecture, where audio is segmented into PCM chunks and streamed to our backend. These chunks are asynchronously processed and forwarded to two separate Letta agents via API calls. The first agent performs instant summarization and lecture note generation using its reasoning models, while the second agent is dedicated to long-term memory persistence. This memory agent stores each chunk’s transcription into structured core memory blocks, indexed by unique lecture or video IDs to emulate scalable vectorized memory retrieval. For non-live content, such as uploaded lecture videos, we use Reka’s speech-to-text API to batch-process the video stream into high-accuracy transcripts. Since Reka and Letta do not have native interoperability, we built a custom middleware pipeline to transform Reka’s output into Letta-compatible memory schemas before pushing them into the same memory graph used for live sessions. All stored memory is queryable using semantic retrieval, meaning a user can ask context-dependent questions and the system fetches the relevant lecture fragments from long-term storage. The final architecture enables seamless interaction across live lectures, stored sessions, and uploaded videos—allowing users to converse with an AI that maintains temporal continuity, lecture-specific context, and cross-session recall. Challenges None of us had ever used AI agents before, and definitely not all three platforms—Letta, Reka, and LiveKit—at once. Our first challenge was figuring out how to structure memory inside Letta so that lecture information could be stored, retrieved, and referenced over time. Next, we had to integrate Reka and Letta, despite the fact that no direct integration exists. We built a workaround that allowed us to transcribe videos with Reka and send that data into Letta’s memory. LiveKit brought its own challenges, as we had to process audio in real-time chunks and make sure the transcription was fast and accurate enough to be useful during live lectures. But the hardest part was creating one seamless system that could handle live transcription, memory storage, interactive querying, and video processing—while making it feel natural and effortless to the user.
Accomplishments we're proud of
We’re proud of our hard work in combining frameworks from three different sponsors into a unified platform, leveraging AI agents, speech-to-text models, and real-time chatbot functionality under a strict development timeline. We formed strong relationships with peers, mentors, and sponsor representatives, gaining valuable insights into agentic technology, startup ecosystems, and the growing scope for innovation in today’s AI-driven world.
What we learned
We learned how to integrate AI agents and speech-to-text models to develop a real-time, context-aware chatbot capable of processing and responding to live lecture content. Throughout the process, we gained hands-on experience working with three complex sponsor technologies—Letta, LiveKit, and Reka—and learned how to design effective pipelines that connect them seamlessly. We also strengthened our skills in asynchronous event handling, API orchestration, and real-time data streaming, while managing development under a tight hackathon timeline. Beyond the technical side, we learned how to collaborate efficiently under pressure, divide tasks strategically, and iterate quickly to transform an ambitious concept into a functional prototype.
What's next
Looking ahead, we aim to expand our platform’s intelligence, scalability, and accessibility: Multi-Modal Agent for Interactive Quizzes: We plan to integrate a multi-modal AI agent capable of generating real-time, interactive quizzes based on lecture content, helping students actively test their understanding. Vectorized Database for Efficient Querying: Implementing a vector database will enable faster and more accurate semantic search, improving how the chatbot retrieves and relates lecture information. Multilingual Transcription and Support: To make our platform accessible to a broader audience, we plan to introduce multilingual transcription and translation, allowing students worldwide to benefit from localized lecture understanding. These advancements will strengthen the platform’s educational value and push it closer to a fully intelligent, globally accessible lecture companion.
Lecture Platform
An AI-powered platform for recording, uploading, transcribing, and chatting with lecture content. Combines video upload, live audio recording, and intelligent AI chat using Reka Vision, Letta AI, and LiveKit.
🌟 Features
- 📹 Video Upload: Upload pre-recorded lecture videos via URL or file (up to 500MB)
- 🎙️ Live Recording: Record live audio lectures with real-time transcription
- 🤖 AI Chat: Chat with your lectures using persistent AI memory
- 📝 Auto Transcription: Automatic transcription of all video and audio content
- 🧠 Context Retention: AI remembers context across all your lectures
- 💬 Chatbot Widget: Floating chatbot for quick questions
🏗️ Architecture
┌─────────────────────────────────────────────────────────────┐
│ Lecture Platform │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Flask Backend │ │ Next.js Frontend │ │
│ │ (Port 8112) │◄────────┤ (Port 3000) │ │
│ └──────────────────┘ └──────────────────┘ │
│ │ │ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Reka Vision │ │ LiveKit │ │
│ │ API │ │ Server │ │
│ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Letta AI │ │
│ │ (Memory) │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
🚀 Quick Start
Prerequisites
- Python 3.11+
- Node.js 18+
- Reka API Key (Get one here)
- Letta API credentials
- LiveKit credentials
1. Clone the Repository
git clone <repository-url>
cd calhacks-2025
2. Set Up Flask Backend
# Navigate to reka directory
cd reka/src
# Install dependencies
pip install -r requirements.txt
# Create .env file with your credentials
cat > .env << EOF
API_KEY=your_reka_api_key
BASE_URL=https://api.reka.ai
LETTA_TOKEN=your_letta_token
LETTA_AGENT_ID=your_letta_agent_id
EOF
# Run the Flask server
python app.py
The Flask backend will be available at http://localhost:8112
3. Set Up LiveKit Frontend
# Navigate to agents-playground directory
cd ../../agents-playground
# Install dependencies
npm install
# Create .env.local file with your LiveKit credentials
cat > .env.local << EOF
NEXT_PUBLIC_LIVEKIT_URL=your_livekit_url
LIVEKIT_API_KEY=your_livekit_api_key
LIVEKIT_API_SECRET=your_livekit_api_secret
EOF
# Run the Next.js development server
npm run dev
The LiveKit frontend will be available at http://localhost:3000
📖 Usage Guide
Accessing the Platform
Open your browser to http://localhost:8112/form to access the Lecture Library.
Uploading Videos
- Click the "📹 Upload Video" card
- Enter a name for your lecture
- Choose your upload method:
- Video URL: Paste a direct link to a video file
- Upload File: Select a video file from your computer
- Click "Upload"
- Wait for processing and automatic transcription
- Click on the video card to view, watch, and chat with the content
Recording Live Audio
- Click the "🎙️ Record Audio" card
- You'll be redirected to the LiveKit interface
- Click "Record" to start capturing audio
- Speak your lecture content
- Click "Stop Recording" when finished
- Real-time transcription will be displayed
- Click "Library" (top-left) to return to your lecture library
Chatting with Lectures
Per-Lecture Chat:
- Open any video from your library
- Use the question input box to ask about that specific lecture
- View answers powered by Reka Vision
Cross-Lecture Chat:
- Click the chatbot widget (🤖 icon, bottom-right corner)
- Ask questions about any of your lectures
- The AI has context from all transcribed content via Letta memory
🔧 Configuration
Flask Backend (Port 8112)
Configure in reka/src/.env:
API_KEY=your_reka_api_key # Reka Vision API key
BASE_URL=https://api.reka.ai # Reka API base URL
LETTA_TOKEN=your_letta_token # Letta authentication token
LETTA_AGENT_ID=your_agent_id # Letta agent identifier
LiveKit Frontend (Port 3000)
Configure in agents-playground/.env.local:
NEXT_PUBLIC_LIVEKIT_URL=wss://your-livekit-server.livekit.cloud
LIVEKIT_API_KEY=your_api_key
LIVEKIT_API_SECRET=your_api_secret
🗂️ Project Structure
calhacks-2025/
├── reka/ # Flask backend
│ └── src/
│ ├── app.py # Main Flask application
│ ├── templates/ # HTML templates
│ │ ├── form.html # Lecture library page
│ │ ├── video.html # Individual video page
│ │ ├── index.html # Home page
│ │ └── chatbot_widget.html # Chatbot widget
│ └── static/ # CSS and static assets
│
├── agents-playground/ # Next.js frontend
│ └── src/
│ ├── pages/
│ │ ├── index.tsx # Live recording page
│ │ └── upload-video.tsx # Video upload page
│ └── components/
│ └── playground/
│ └── PlaygroundHeader.tsx # Navigation header
│
├── INTEGRATION_GUIDE.md # Detailed integration guide
└── README.md # This file
🛠️ Tech Stack
Backend
- Flask: Web framework for API and video management
- Reka Vision: AI-powered video transcription and analysis
- Letta AI: Persistent memory and intelligent chat
- Python 3.11+: Backend programming language
Frontend
- Next.js: React framework for LiveKit interface
- React 18: UI library
- TypeScript: Type-safe development
- LiveKit: Real-time audio/video communication
APIs & Services
- Reka Vision API: Video analysis and transcription
- Letta API: AI memory and chat
- LiveKit Cloud: Real-time audio streaming
🐛 Troubleshooting
Videos Not Appearing
- Verify Flask server is running on port 8112
- Check Reka API credentials in
.env - Review browser console for errors
Recording Issues
- Ensure LiveKit server is running on port 3000
- Verify LiveKit credentials in
.env.local - Grant browser microphone permissions
Transcription Failures
- Confirm Reka API key is valid and has quota
- Check video/audio quality and format
- Review Flask server logs for error details
Navigation Problems
- Run both servers simultaneously
- Clear browser cache
- Check that ports 3000 and 8112 are not blocked by firewall
📊 API Endpoints
Flask Backend (http://localhost:8112)
| Endpoint | Method | Description |
|---|---|---|
/form | GET | Lecture library page |
/video/<id> | GET | Individual video page |
/api/upload_video | POST | Upload video via URL |
/api/upload_video_file | POST | Upload video file |
/api/delete_video | DELETE | Delete a video |
/api/ask_question | POST | Ask question about video |
/api/chatbot/message | POST | Chat with Letta AI |
/api/transcription_status | GET | Get transcription status |
LiveKit Frontend (http://localhost:3000)
| Route | Description |
|---|---|
/ | Live audio recording interface |
/upload-video | Video upload interface |
🎓 Use Cases
- University Lectures: Record and transcribe lectures for later review
- Online Courses: Upload course videos and enable Q&A
- Training Sessions: Record training materials with searchable transcripts
- Study Groups: Collaborate with AI-assisted learning
- Research Interviews: Transcribe and analyze interview content
🔒 Security Notes
- API keys should never be committed to version control
- Use
.envfiles for sensitive credentials - Both services run locally by default
- Ensure proper authentication when deploying to production
📝 License
MIT License - See LICENSE file for details
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
📧 Support
For detailed setup and troubleshooting, see INTEGRATION_GUIDE.md
Built with ❤️ using Reka Vision, Letta AI, and LiveKit
Analysis
View
Metric
- 9
- 6
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
- CIn code
- CSSIn code
- FlaskIn code
- HTMLIn code
- JavaScriptIn code
- Next.jsIn code
- PythonIn code
- ReactIn code
- Tailwind CSSIn code
- TypeScriptIn code
10 of 10 appear in the indexed code.
AI coding agents
- Claude CodeConfig
- CodexConfig
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
18 MB
Source files
2,268
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
nightowl23/calhacks-2025
2,540 files · 26.7 MB · @ 137f701
Structure
Interface
525 files · 21%Screens, components and styles rendered to the user.
API & routing
8 files · 0%Request entry points: routes, handlers and controllers.
Application logic
1,826 files · 72%Domain rules, services and shared utilities.
+3 moreBackground jobs
3 files · 0%Work run outside a request: tasks, workers and schedules.
Data & schema
18 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
- Python98%
- HTML1%
- TypeScript1%
- Markdown1%
- JavaScript0%
- CSS0%
- Other (4)0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
agents-playground/package.json
npm · 28- @livekit/components-react
- @livekit/components-styles
- @radix-ui/react-dropdown-menu
- cookies-next
- framer-motion
- js-yaml
- livekit-client
- livekit-server-sdk
- lodash
- next
- next-plugin-preval
- qrcode.react
- react
- react-audio-spectrum
- react-dom
- react-markdown
- +12 more
abby/pyproject.toml
pypi · 8- flask
- flask-cors
- letta-client
- livekit-agents[silero,turn-detector]
- livekit-api
- livekit-plugins-assemblyai
- livekit-plugins-noise-cancellation
- python-dotenv
reka/requirements.txt
pypi · 7- Flask
- Flask-CORS
- letta-client
- markdown
- python-dotenv
- requests
- Werkzeug
reka/workshop/requirements.txt
pypi · 5- Flask
- markdown
- python-dotenv
- requests
- Werkzeug
requirements.txt
pypi · 5- Flask
- letta-client
- markdown
- python-dotenv
- requests
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.
Feature verification
Cross-lecture chatbot widget with persistent AI memoryVerified
Floating chatbot widget lets users ask questions about any of their lectures using Letta memory context
Claimed on readmehigh confidencereka/src/app.py:986— chatbot_message endpoint sends user messages to the shared Letta agent and returns its responsereka/src/templates/chatbot_widget.html:499— Widget UI calls /api/chatbot/message to chat with the AIreka/src/templates/form.html:1209— Lecture library page embeds the chatbot widget as a floating iframe toggled by a bottom-right button
Live in-lecture Q&A (ask questions the moment confusion strikes)Verified
Students can ask questions live during the lecture and get immediate answers
Claimed on Devposthigh confidenceabby/src/agent.py:66— on_data_received handles topic letta_chat_query and dispatches handle_chat_queryabby/src/agent.py:148— handle_chat_query sends the live question to the memory Letta agent and publishes the answer back on letta_chat_responseagents-playground/src/components/playground/Playground.tsx:148— sendChatMessage publishes user chat input on letta_chat_query and onDataReceived renders letta_chat_response
Live lecture audio capture and real-time transcriptionVerified
RecallMe captures lecture audio in real time and transcribes it instantly using LiveKit for streaming and AssemblyAI STT
Claimed on Devposthigh confidenceabby/src/agent.py:58— Transcriber agent uses assemblyai.STT() for speech-to-text over a LiveKit AgentSessionabby/src/agent.py:212— ctx.connect(auto_subscribe=AutoSubscribe.AUDIO_ONLY) subscribes to live room audio for transcription
Long-term memory of lectures via Letta agentVerified
Every lecture is stored as long-term memory inside a Letta agent so students can return later and ask about previous lectures
Claimed on Devposthigh confidenceabby/src/agent.py:87— Each live transcript chunk is sent to a dedicated memory Letta agent (LETTA_AGENT_ID)reka/src/app.py:164— store_transcription_in_letta sends video transcripts to a Letta agent with instructions to store them in archival memory for future questions
Real-time structured note generation during lectureVerified
Generates dynamic, structured notes that students can interact with as the lecture is happening
Claimed on Devposthigh confidenceabby/src/agent.py:101— Second Letta agent (LETTA_AGENT_2_ID) is called per transcript chunk to convert it into structured notesabby/src/agent.py:122— Structured notes are published to the frontend via room.local_participant.publish_data on topic letta_notesagents-playground/src/components/playground/Playground.tsx:135— Frontend listens for letta_notes data messages and appends them to displayed notes state
Video transcription via Reka Vision APIVerified
Uploaded videos are transcribed using Reka's speech-to-text/video QA API
Claimed on Devposthigh confidencereka/src/app.py:277— call_reka_vision_qa posts to the Reka video QA endpoint requesting a full transcriptreka/src/app.py:74— auto_transcribe_video automatically triggers transcription once a video thumbnail/indexing is ready
Video upload via URL or file (up to 500MB)Verified
Users can upload pre-recorded lecture videos via URL or file, up to 500MB
Claimed on readmehigh confidencereka/src/app.py:14— MAX_CONTENT_LENGTH set to 500MB and ALLOWED_EXTENSIONS enforcedreka/src/app.py:592— upload_video endpoint accepts a video_url and forwards it to the Reka Vision upload APIreka/src/app.py:701— upload_video_file endpoint accepts a multipart file upload and forwards it to Reka
Custom Reka-to-Letta memory middlewareCode-supported
A custom middleware pipeline transforms Reka's transcription output into Letta-compatible memory schemas
Claimed on Devpostmedium confidencereka/src/app.py:111— Reka's JSON 'sections' response is parsed and its section_content fields are concatenated before being sent to Lettareka/src/app.py:178— store_transcription_in_letta wraps the transcript in a templated message sent as a Letta MessageCreate, not a distinct schema object
Video upload via LiveKit/Next.js frontend pageCode-supported
agents-playground includes a working upload-video interface for uploading lecture recordings
Claimed on readmelow confidenceagents-playground/src/pages/upload-video.tsx:71— Page renders static placeholder panels ("Video transcript will appear here...") with no fetch/upload calls wired to any backend endpoint
Audio segmented into PCM chunks and forwarded directly to two Letta agentsClaimed only
LiveKit audio is segmented into PCM chunks, asynchronously processed, and forwarded to two separate Letta agents via API calls
Claimed on Devpostmedium confidencePer-video_id indexed memory / vectorized retrieval across lecturesClaimed only
Uses a dynamic database within Letta to recall information indexed by each video_id, emulating scalable vectorized memory retrieval
Claimed on Devpostmedium confidence
An AI agent derived these features from the project’s Devpost page and readme, then searched the code for each one. Verified features are backed by cited code; claimed-only features had no supporting code, which is not by itself proof a feature is missing.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.