# I built an AI examiner that reads my friend's notes — without the notes ever leaving their laptop

> Source: <https://dev.to/priyanshujha2009/i-built-an-ai-examiner-that-reads-my-friends-notes-without-the-notes-ever-leaving-their-laptop-4gkp>
> Published: 2026-10-05 04:05:12+00:00

**[Notes vs. Me](https://github.com/Priyanshujha1320/notes-vs-me)** is a study app with one job: take the PDFs a

student already has — syllabus, lecture slides, past papers — and turn them

into an examiner that grills them, question after question, then shows exactly

which topics they keep failing.

I built it for a friend doing their undergrad who does the thing every student

does: reads the notes three times, feels prepared, walks into the exam, and

discovers that *reading* and *being asked* are completely different skills.

They had notes. They had questions at the back of the textbook. What they

didn't have was something that looked at *their* notes and asked *them* the

awkward follow-up.

And here's the constraint that shaped the whole build: their laptop is

where the notes live, where the revision happens, and — crucially — where the

notes should stay. No student wants their past papers uploaded to somebody's

cloud to "personalise their learning". So the default mode runs the entire AI

loop on their machine, and it all works offline.

`ollama pull gemma3:1b`, `pip install -r requirements.txt`, run — ten minutes
[github.com/Priyanshujha1320/notes-vs-me](https://github.com/Priyanshujha1320/notes-vs-me) — MIT licensed. FastAPI + SQLite + a single-file

vanilla-JS frontend — no build step, nothing to trust. Six commits, one

weekend.

The pipeline is deliberately boring — boring is what survives exam week:

The fun part was the sampling loop. A static quiz generator gets boring in

about a day; a griller that remembers you failed "Calvin cycle" twice and

quietly schedules it for next round behaves like something that *wants* you to

pass. That loop is about ten lines around a weighted shuffle.

The not-fun part was coaxing a 1B-parameter model into reliable JSON. Small

open models copy your prompt's placeholder literally — mine happily returned

`"options": ["A", "B", "C", "D"]`, letter options and all. The fix was a

worked example in the prompt (show, don't describe) plus a coercion layer

that trusts the model's actual answer type instead of fighting it. That's a

trade you make with small local models, and it's worth it: the whole AI stack

fits in about 1GB of RAM, so it runs on the kind of laptop students actually

own. If a machine can't run a model at all, there's a fallback to the same

open weights served by Groq — the app tells you, in plain words, which mode

you're in.

I'm handing the app to my friend this week with their own syllabus loaded —

watching a real student take the first grill is the whole point of this

build, and I'll update this section with what actually happens. My money is

on it finding the one section they skipped.

Try it on your own notes: [github.com/Priyanshujha1320/notes-vs-me](https://github.com/Priyanshujha1320/notes-vs-me). If it exposes a topic you were sure you

knew, that's the app working.

*Built for the [DEV Hacktoberfest Weekend Challenge](https://dev.to/devteam/join-the-hacktoberfest-weekend-challenge-build-for-a-friend-2450-in-prizes-across-17-winners-1aj5): open
source AI that solves a real problem for someone you love.*
