Lab

Blue Book

Running at home

Reading quizzes generated from my kid’s actual books by a local model on a GPU at home.

Blue Book

Chapter 1: Down the Rabbit-Hole Question 3 of 10

Why did Alice run across the field after the White Rabbit?

  • AShe wanted to give back the watch he had dropped.
  • BShe was curious: she had never seen a rabbit with a watch.
  • CHer sister had told her to follow him.
  • DShe was afraid he would be late for tea.

From the text

…when the Rabbit actually took a watch out of its waistcoat-pocket, and looked at it, and then hurried on, Alice started to her feet, for it flashed across her mind that she had never before seen a rabbit with either a waistcoat-pocket, or a watch to take out of it, and burning with curiosity, she ran across the field after it…

The review screen for one question: four shuffled choices, the right one marked, and the quote from the page that supports it. Mockup with sample data.

Bake-off

10 GB RTX 3080
qwen3:8b @ 16kgemma3:12b @ 8k
VRAM resident7.85 GB, 100% GPU10.23 GB, 100% GPU
Spare headroom~2.7 GiB~0.5 GiB
Speed~100 tok/s~63 tok/s
Per quiz15 to 18 s26 to 30 s
A full chapter (~5,700 tokens)comfortablefits, barely
Two chaptersfitsdoes not fit

Also tested: mistral-nemo:12b, llama3.1:8b and llama3. Every model held the JSON schema; the choice came down to capacity.

The model bake-off: how much of a 10 GB card each model needs and how fast it answers, the measurements that picked the default model. Measured on my hardware.

Title only, no pages

Harry Potter and the Philosopher’s Stone, chapters 1 to 3
ModelDefensible questions
qwen3:8b1 of 10
gemma3:12b3 of 10

Both passed every automated check.

What a model wrote when given a book title and no text. Fluent, and mostly not defensible against the page. Measured on my hardware.

How it works

PDF or textpasted pages PhotosOCR in browser Serverqueue per chapter Local modelOllama, GPU Shuffle choicessnap quotes to source SQLitequiz + share link
  1. I capture a chapter. The input is a PDF, pasted text, or photos of the pages. Photos are read by tesseract.js in the browser, so the images never leave the device.
  2. The server refuses to guess. Without the source text it will not write a quiz, because a model asked for questions from a title alone invents them.
  3. Generation is queued per chapter. One job at a time goes to the local model through a provider interface, Ollama by default with Anthropic available behind the same shape.
  4. The output is checked in code. Choices are shuffled server side, and every answer is snapped to a supporting quote matched back against the captured text.
  5. The quiz is saved and shared. It lands in SQLite and I send a link to a phone, where the answers can be taken and reviewed.

Built with

Decisions