Inspiration

This is my last summer vacation before things get busier, and I wanted to actually build something instead of just relaxing through it. I already had a multi-model AI backend (VORREX) from an earlier personal project, and when I saw the Prometheus AI Challenge asking for something educational, it clicked — most AI tutoring tools trust a single model's answer blindly. I wanted to try something different: what if an explanation had to survive being checked by a second model before a student ever saw it?

What it does

MindMesh turns any topic — typed in, or pulled from a PDF (even scanned textbook pages) — into a personalized, fact-checked explanation. You pick a difficulty level from "5-year-old" to "PhD researcher," and it genuinely changes the depth and vocabulary, not just the wording. You can also compare two levels side by side to see how differently the same topic gets explained. Once you've read it, it generates a 10-question quiz straight from that explanation, and for visual topics it can build an interactive diagram on the spot.

How we built it

The core idea is a three-model pipeline instead of one model answering directly: a draft model writes the first explanation, a second model independently fact-checks it against the source material, and a third model reconciles both into the final version — and the app actually shows you what each model contributed, instead of hiding it. It's built with Streamlit for the frontend and Groq for fast inference across several models (GPT-OSS-120B, GPT-OSS-20B, Llama 3.3 70B, Qwen3.6-27B). PDF text comes from PyPDF, and for scanned PDFs with no real text layer, I added an OCR fallback that rasterizes pages with PyMuPDF and reads them using a vision-capable model instead of requiring any external OCR software. It's deployed on Streamlit Community Cloud, with the API key handled through Streamlit's secrets manager so nothing sensitive lives in the public repo.

Challenges we ran into

Way more debugging than I expected. Getting math to actually render (instead of showing up as raw LaTeX text) took a few rounds of tightening prompts and cleanup logic. At one point a model tried generating circuit diagrams in TikZ, which just can't render in a browser at all — had to explicitly rule that out and catch it as a fallback. I also hit a sneaky Streamlit bug where re-reading an uploaded PDF file returned zero characters, because the file's read position wasn't getting reset between reruns. The biggest constraint, though, was Groq's free-tier rate limits — the models can technically handle huge amounts of text, but the per-minute token limit on the free tier is much lower, so I had to actually understand that distinction and design around it rather than just cranking up input size.

Accomplishments that we're proud of

Getting the multi-model pipeline to be genuinely visible and useful, not just a backend detail — you can actually see the draft, the fact-check notes, and the final answer side by side. I'm also proud of the OCR fallback, since it means a scanned textbook photo works without asking the user to install anything extra, and the side-by-side level comparison, which is the clearest proof that this isn't just one generic explanation dressed up differently.

What we learned

A lot about the gap between "the model can technically handle this much text" and "the API will actually let you send this much text right now" — rate limits and context windows are two completely different constraints. I also learned how much reliability work goes into anything that touches LLM output directly in a UI — formatting, malformed JSON, models ignoring instructions occasionally — none of that shows up until you actually build the thing end to end.

What's next for MindMesh

I'd like to let the diagram generation build on itself with actual parameter-driven interactivity rather than one-shot generation, expand OCR to handle full-length scanned chapters instead of just the first few pages, and let students save and revisit explanations they've already generated instead of starting fresh each time.

Built With

Share this project:

Updates

Submission history