SYNTHESIS.md is rebuilt from all lectures so far — so exam prep is a file you open, not a term's worth of reading you have to redo.--vad). Measured: 36 fabrications → 0 Language lock Whisper commits to one language and silently drops sustained speech in the other. No error, no gap marker check-coverage.py compares speech regions against the transcript timeline and flags what was never transcribed Confident wrong notes The model writes a plausible figure or quote the professor never said verify-notes.py checks every figure, quote and proper noun in the finished note against the transcript Notes that pile up 40 lecture files, no study material SYNTHESIS.md is rebuilt from scratch every run, never appended Missed classes You don't notice a lecture was never recorded until the exam term-coverage.py reports which scheduled sessions have no transcriptLESSONS.md is the part that compounds. Each run writes back what it learned about this specific professor — which words the ASR reliably mangles, which phrases signal an exam question, which factual slips he has made. The next run reads it first, so notes get better across a term instead of repeating the same mistakes./classnotes:$CLASSNOTES_ROOT tree, so installing one does not commit you to it -- you can run either on any given lecture.scripts/make-multiout.py builds it for you — no Audio MIDI Setup required.$CLASSNOTES_ROOT and run /classnotes. It reads LESSONS.md, transcribes if needed, checks coverage, writes the lecture note, verifies it against the transcript, and rebuilds SYNTHESIS.md./classnotes skill in skill/, and does the judgement work -- ranking exam signals, handling code-switched Hindi/English, deciding what a note can lose without losing an idea.classnotes/: one command, no agent session, the same transcription and safety checks, with Groq's free tier standing in for the language work. Pick whichever suits you; they read and write the same course tree, so you can move between them lecture by lecture.skill/SKILL.md into your agent's skills dir pip install -e . Invoke /classnotes in Claude Code python3 -m classnotes run <course> Needs a Claude Code session Python 3.10+, a free Groq key Judgement full approximated by Groq --dry-run. On run, note and synthesis it prints what would be written without touching disk or calling Groq; on verify and status, which never write anything anyway, it simply reports what would run. The flag is accepted everywhere so a wrapper script can pass it through without special-casing.raw/<date>-live/ with the language forced and compares word counts -- the same check that caught the 08-30 lecture's ~25% word loss and confirmed 09-06's low pace was cadence, not loss), the ## ⚡ Exam signals section (assembled from extract-signals.py + LESSONS.md's phrase vocabulary, never from the digest), the verify-notes.py gate, and SYNTHESIS.md's rebuild-from-scratch and 500-line split.digest.py, unchanged), the note's prose sections (In one line, Key concepts, Formulas, Worked examples, Open questions, Admin), and the synthesis's cross-lecture judgement (How it fits together, ranked exam questions, Revised or contradicted).extract-signals.py's output is mostly noise on a given professor's session (a documented failure mode for walkthrough-style lectures). Treat its output as a strong first draft, not a replacement for the agent workflow on notes that matter.docs/PYTHON-PIPELINE.md for setup, a worked walkthrough and troubleshooting.--out-root <dir> to note/synthesis/run to redirect writes (SYNTHESIS.md included) to a scratch directory instead of the real course tree -- reads (transcripts, LESSONS.md, courses.yaml) still come from the real $CLASSNOTES_ROOT.transcribe.sh mp4/m4a → transcript, with VAD and a coverage check live-notes.sh live capture in 5-min chunks, transcribed as it goes; stops itself on sustained silence class-start.sh wrapper running audio + slide capture together, tearing both down cleanly class-watch.sh optional launchd watcher that starts captures from your timetable check-audio.sh 4-second probe: is audio actually reaching the recorder right now? check-coverage.py flags speech the transcript has nothing for verify-notes.py checks every figure, quote and name in a note against the transcript extract-signals.py greps for assessment language and repetition — deterministic, never invents digest.py optional Groq pass to summarise very long transcripts term-coverage.py which scheduled sessions have no transcript capture-slides.sh / dedup-frames.py screen frames, deduplicated to distinct board states fetch-slides.sh opens Moodle in your existing Chrome session; files what you download gen-calendar.py generates an .ics from courses.yaml make-multiout.py creates the Multi-Output audio device via CoreAudio md2pdf.py / publish-notes.sh notes → PDFs in a readable folder treedocs/GOTCHAS.md.-bs 1 to whisper-cli. It exits 0 in under a second and writes no transcript at all. Looks like a 400× speedup; is total silent failure.live-notes.sh now detects this and warns instead of concluding the class ended.PATH that excludes Homebrew, so a scheduled capture dies on "whisper-cli missing" while the log says it started.digest.py), which sends transcript text to Groq's API..gitignore is deny-by-default at the repository root, so your notes, recordings, transcripts, timetable and .env cannot be committed by accident.Posted Sep 18, 2026
Developed a Mac-based lecture note-taking tool using Whisper and Claude Code.
0
0