Turn an engineering training document into a video you can defend.
NotebookLM will turn a document into a narrated video in three clicks, and it will look great. What it won't tell you is whether it kept the numbers right. NOLAN reads your document first, then checks NotebookLM's output against it — every set-point, every equipment tag, every safety warning, verified or flagged.
NotebookLM builds. NOLAN checks its work.
No API key, no NotebookLM account — just a document that's already committed to this repo, and one deliberately wrong number for the gate to catch.
python -m venv .venv && .venv/Scripts/python -m pip install -e ".[dev,web]"
.venv/Scripts/nolan new demo --docx corpus/generic/water_treatment.docx
.venv/Scripts/nolan parse demo --generic
.venv/Scripts/nolan intake demo --mode overview --sensitivity public
mkdir -p projects/demo/generated
cp corpus/generic/demo_study_guide.md projects/demo/generated/study_guide.md
.venv/Scripts/nolan verify demoFAIL study_guide.md
fail accuracy '45 lpm' appears in the output but nowhere in the source
fail precision '40 LPM' from the source does not appear in the output [S01-02]
CHLORINATION-SYSTEM-OPERATION: FAILED (1 deliverable(s), text gate)
That's the whole product: a document said 40 LPM, the "generated" file said 45, and NOLAN caught it — arithmetic, not a model's opinion.
flowchart TD
A[Your document] --> B[NOLAN reads it]
B --> C[NOLAN prepares a pack for NotebookLM]
C --> D[You: upload, paste, click Generate]
D --> E[NOLAN checks the result against the document]
E -->|looks right| F[Ship it]
E -->|something's off| G[NOLAN tells you exactly what, and why]
The middle step is yours by design — NotebookLM has no public API, so those three clicks stay manual. Everything before and after them is automatic.
Two checks run on what comes back: a text check on the written study guide (exact values must appear, word for word), and an audio check on the video's narration (Whisper transcribes it, NOLAN listens for the numbers — spoken words drop units but keep the digits, so that's what it anchors on).
Every document gets a sensitivity level — restricted (the default), internal, or public — and that alone decides where it's allowed to go: your own machine only, or also a bring-your-own-key model, or also NotebookLM. This is enforced in code, not policy: a restricted document cannot reach NotebookLM even by mistake, because the code that would send it there refuses to run. Every document that does go out gets logged — as a hash, never the content, so the log itself never becomes a second copy of what left.
Requires Python 3.11+.
python -m venv .venv
.venv/Scripts/python -m pip install -e ".[dev,web]" # Windows
# .venv/bin/python -m pip install -e ".[dev,web]" # macOS/Linux
.venv/Scripts/python -m pip install -e ".[asr]" # optional: audio checkingBuild the dashboard once, then run it:
cd frontend && npm install && npm run build
.venv/Scripts/nolan serve # http://127.0.0.1:8000It only listens on your own machine, and has no login — it's a tool you run, not a service you host.
nolan new mycourse --docx your-document.docx
nolan parse mycourse # reads your house style, or falls back generically
nolan intake mycourse # asks what kind of course this is, and how sensitive
nolan notebooklm mycourse # writes the pack for NotebookLM
# ... generate a Video Overview + Study Guide in NotebookLM, download both ...
# ... drop the study guide into projects/mycourse/generated/ ...
nolan verify mycourse # checks the study guide
nolan verify mycourse --asr video.mp4 # checks the narrationOr skip the terminal — nolan serve runs the same flow from the dashboard above.
This is real, running software, not a finished product. What works today:
- Reading any
.docx— a recognised house style, or a generic structural read for anything else - Classifying a document and routing it (exact-wording courses vs. "close enough")
- The text check and the audio check, both run against real NotebookLM output
- The confidentiality boundary, tested against a real restricted document
- Bring-your-own-key model support (OpenAI, Anthropic, Gemini) alongside a free local model — the local path is verified, the hosted ones aren't yet
- The dashboard shown above, end to end
What's still ahead: broader real-world testing of the checks, LLM-assisted reading of documents in unfamiliar formats, and — if this moves beyond one person's laptop — proper login and a shared database.
Deeper technical notes live in CLAUDE.md.

