This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend.
What I Built
My two little sisters are studying for their Bachelor of Science degrees. Preparing for exams means juggling YouTube videos, handwritten notes, and references from their teachers. Before they can even start revising, they have to bring all those materials together.
I wanted to make that part easier for them. So I built Noteesta, a study pal that turns different learning materials into a Study Pill 💊: organized notes with optional tools for revision and practice.
Students can add PDFs, Word documents, presentations, images of handwritten notes, recorded lectures, or YouTube links with accessible captions. They can then choose flashcards, multiple-choice questions, true/false questions, and a study roadmap alongside their notes.
Each Pill can be tailored to their exam date, available study hours, preferred level of detail, and learning level. Collections and tags help organize subjects, while reading preferences and Focus mode make longer notes easier to read.
There is also a “Got a doubt? 🤔” chat for questions about the selected Pill. Answers use retrieved source material, and the system is instructed to acknowledge when the evidence is insufficient. Notes carry source references, can include supporting visuals, and can be exported with their assets.
Processing happens in the background, so students can leave the page and return later. While they wait, a rotating Wikipedia fact card gives them something new to explore—mostly science and basic mathematics.
The first test: my sisters' own materials
I asked my sisters to send me some references they were already using. They sent a Word document and photos of handwritten notes, which I processed locally with Noteesta.
Then I sent them the resulting notes and asked whether they could follow them. Their response was: “This is perfect. This is much better.”
That was the most rewarding part of the weekend. They have seen the notes, but I haven't told them yet that I built an app for them! 😁 They also haven't discovered the flashcards, MCQs, roadmap, or true/false questions. That part is still a surprise.
Demo
[Add a video demo or deployed app link here before publishing.]
Code
The repository includes setup instructions, separate frontend and backend environment examples, the system architecture, and Promptfoo evaluation suites.
How I Built It
Noteesta has a Next.js frontend and a FastAPI backend. Celery workers handle the longer processing jobs, with Redis as the task broker. The frontend polls for progress so the student can see which stage their Pill has reached.
The AI workflow is built around open-weight models and open-source tools:
- Docling with RapidOCR extracts structured content from documents and images. I configured Docling to use the CPU for this version. LangChain splits the extracted text into chunks for indexing and retrieval.
- faster-whisper with Whisper small transcribes audio from recordings. It provides a relatively lightweight transcription option without sending recordings to a paid speech API.
- yt-dlp retrieves accessible YouTube captions and preserves timestamps. Caption availability is a limitation: a link alone does not guarantee that a video can be processed.
- Qwen3-VL-8B-Instruct through Ollama runs locally to synthesize notes, create the selected practice materials, and answer source-grounded questions.
- nomic-embed-text through Ollama generates embeddings. MongoDB Atlas Vector Search, accessed through LangChain, retrieves relevant chunks for chat. Retrieval is filtered by the user and selected Pill.
- SeaweedFS provides S3-compatible storage for original files and generated artifacts in the local setup.
One design choice matters here: generating the notes processes the extracted source sections; it does not depend only on the handful of chunks retrieved for a chat question. Retrieval serves focused questions, while the note-generation workflow aims for broader source coverage.
I also added Promptfoo evaluations for section extraction, note synthesis, practice materials, visual specifications, and grounded chat. These use the same prompt files as the backend. For example, the materials suite checks for at least two MCQs from concise notes and five distinct questions from fuller notes, with evidence supporting the answers.
Building this reminded me that a model response still needs validation. Structured output can be incomplete, and a successful generation call does not necessarily mean the study material is ready to use.
Why Does Open Innovation Matter?
Study materials can add up quickly: a lecture recording, several documents, photos of handwritten notes, and follow-up questions. With local inference, each new source or question does not create another usage charge from a hosted LLM API. Processing still costs time, electricity, and hardware resources, but I can experiment without a per-token bill growing alongside the reading list.
It also gives me more control over where the model runs. Text generation, embeddings, OCR, and transcription happen locally in this setup. Noteesta is not entirely offline or entirely local, though: MongoDB Atlas stores metadata and searchable source chunks remotely, and YouTube captions and Wikipedia facts require network access.
Open models and frameworks also let me change the system as my sisters' needs become clearer. I can adjust prompts, test different models, inspect the retrieval workflow, and rerun evaluations. Their feedback can guide those changes without tying the app to one hosted model provider.
For me, that is the practical value of open innovation: the ability to build a useful tool, understand how it works, and keep improving it for the people I built it for.
My Agent Session
This writeup was edited with AI assistance from my own notes.
Prize Categories
- Best Use of MongoDB Atlas: Noteesta uses Atlas for application data and Atlas Vector Search for retrieving source chunks through LangChain. Those retrieved chunks provide the evidence for questions about a selected Study Pill.
Top comments (0)