← Back to Reviews | Productivity

course2md Review 2026 — Turn YouTube, Bilibili or Lecture Recordings Into Slide-Illustrated Markdown Notes

James Park · · Rated 7.8/10 · Free, MIT-licensed, open source (Rust); install via Homebrew tap / AUR / winget / cargo. Local ASR backends are free; cloud STT via OpenRouter costs ~$0.000035/second of audio with qwen/qwen3-asr-flash-2026-02-10; optional LLM polishing uses any OpenAI-compatible endpoint (DeepSeek, GLM, OpenAI, Ollama, vLLM)
7.8 / 10
Ease of Use 7.5
Features 8
Value for Money 8
Performance 8
Support & Ecosystem 6.5

✅ Pros

  • • The full pipeline in one command: `course2md <url-or-file>` downloads/reads the video, detects slide changes with SSIM, transcribes with local or cloud ASR, and writes slide-illustrated course.md / course.html plus structured.json, keyframe images, timeline.jsonl and provenance metadata
  • • Five ASR backends with a sensible default per platform: CoreML on Apple Silicon (ANE-powered, ~375 J per 3-min clip, zero external dependencies), llama.cpp GPU/CPU, cloud API mode, and Intel NPU — with automatic fallback from CoreML to the GPU pipeline
  • • Qwen3-ASR is genuinely well-suited to technical content: the README's benchmark shows 1.7B handling NeoVim/Altair 8800/ICQ/Codex flawlessly where Whisper large-v3-turbo mishears (NeoWim, 'PCG RTIR 8800') and Whisper Tiny hallucinates ('cow smell' for NeoVim)
  • • Slide detection done properly: SSIM frame similarity threshold, configurable sample interval, cooldown between captures, ROI support, and keyframe extraction — so the notes interleave the actual slide images with the transcript at the right points
  • • Optional LLM polish and summary: proofreads filler words and homophone typos (batch of 20 segments, temperature 0, auto-fallback on failure) and can generate a TL;DR with timestamped outline via map-reduce for long videos
  • • Cross-platform and packaged: Homebrew tap on macOS, AUR package, Windows exe via winget/Scoop, cargo install from source — plus a `course2md doctor` environment checker

⚠️ Cons

  • • First run downloads models (1-2 GB on macOS CoreML cache, ~2.4 GB GGUF on Linux/Windows) — not instant gratification, and restricted networks need HF_ENDPOINT mirror handling
  • • Linux/Windows install is developer-grade: you need ffmpeg, yt-dlp, and llama-server from llama.cpp built from source for local ASR — the README's Debian/Ubuntu path literally walks you through cmake-building llama.cpp
  • • Cloud STT mode uploads audio chunks to the provider (OpenRouter by default) — privacy is explicitly opt-in aware, frames/OCR/VAD stay local but audio leaves the machine
  • • ASR accuracy is model-dependent: Whisper large-v3-turbo has sparse punctuation and occasional dropped clauses; Whisper Tiny/Base hallucinate on technical jargon and are only recommended for pipeline testing
  • • Two-day-old project (created 2026-08-31): 187 stars, 7 forks, no release history yet despite a 1.0-era feature surface — the README references pre-1.0 checkpoint issues already fixed, so it's moving fast but young
  • • Output is notes, not a polished product: LLM summarization is an extra setup step (course2md llm setup), and vision-assisted polish needs a multimodal model
Best For

Students, self-learners, and teams who watch lots of course/meeting recordings and want timestamped, slide-illustrated markdown notes they can search, quote and remix — especially Chinese/English technical content where Qwen3-ASR excels, on Apple Silicon or with an Intel NPU laptop, without paying for a transcription subscription

Pricing

Free, MIT-licensed, open source (Rust); install via Homebrew tap / AUR / winget / cargo. Local ASR backends are free; cloud STT via OpenRouter costs ~$0.000035/second of audio with qwen/qwen3-asr-flash-2026-02-10; optional LLM polishing uses any OpenAI-compatible endpoint (DeepSeek, GLM, OpenAI, Ollama, vLLM)

The Pitch: One Command From Video to Illustrated Notes

On August 31, 2026, mizorewww/course2md landed on GitHub with a workflow that sounds simple and turns out to be surprisingly hard: “Turn YouTube, Bilibili, or local course/meeting recordings into slide-illustrated Markdown and HTML lecture notes.”

In two days it drew 187 stars and 7 forks — modest next to model-launch hype, but the star curve tells the real story: this solves an actual workflow problem. Anyone who has watched a 90-minute technical lecture knows the pain: the transcript alone loses the slides, the slides alone lose the context, and taking notes by hand means pausing every 30 seconds. course2md’s bet is that the pipeline — download → detect slide changes → transcribe → interleave into timestamped notes — can be fully automated, locally, with one command.

The Pipeline

# Process a Bilibili video
course2md https://www.bilibili.com/video/BV1pb8o6yE8f

# Process a YouTube video
course2md https://youtu.be/dQw4w9WgXcQ

# Process a local lecture or meeting recording
course2md ./lecture.mp4

Output lands in out/<platform>/<title>/<id>/: course.md and course.html (default formats), plus structured.json when requested, frames/ with extracted slide keyframes (slide_0001.jpg…), audio.wav (16kHz mono), timeline.jsonl (timestamp-aligned event stream), meta.json, run.json (provenance: version, transcript source, provider/model, stats), and media.mp4 (cleaned up by default).

The slide detection is the quietly impressive part. course2md samples frames at a configurable interval (default 1s), compares consecutive frames with SSIM against a similarity threshold (default 0.85), respects a cooldown between captures (10s) so it doesn’t fire on every animation frame, and supports a region-of-interest so you can restrict comparison to the actual slide area (e.g. 40%,0%-100%,100%). The result: the notes interleave the real slide images with the transcript at the right moments, not a screenshot every frame.

The ASR Backend Story: Five Ways to Transcribe

course2md’s real architecture is its ASR backend matrix — five providers, with a sensible default per platform:

BackendTargetModelHighlights
coremlmacOS Apple Silicon (default)Silero VAD + Qwen3-ASR 0.6B or Whisper large-v3-turboZero external dependencies, ANE-powered, lowest power (~375 J / 3 min), auto-fallback to GPU on failure
gpuLinux/Windows/Intel MacQwen3-ASR 1.7B GGUF Q8 via llama-serverFastest (13s for 3-min lecture on Metal), high precision
cpuUniversal fallbackSame, -ngl 0Maximum compatibility, higher power
apiAny platformOpenAI-compatible endpoint (OpenRouter default)Zero local deps, ~$0.000035/s of audio, audio chunks uploaded
npuIntel Core UltraOpenVINO Whisper Large-v3 Turbo>6x faster than CPU, 550MB memory footprint

The benchmark data in the README is unusually concrete — measured with powermetrics on a 3-minute 1080p lecture: CoreML at 47s wall / ~6.7W average with the Neural Engine doing the heavy lifting, GPU at 13s / 16W GPU burst, NPU at 16s. The accuracy table is the more interesting read: on the same CS lecture, Qwen3-ASR 1.7B transcribed NeoVim, Altair 8800, ICQ, OICQ, and Codex flawlessly, while Whisper large-v3-turbo produced NeoWim and “PCG RTIR 8800”, and Whisper Tiny hallucinated NeoVim as “cow smell” / “pinching tail” in Chinese. For technical content — especially Chinese/English mixed lectures — the model choice is the difference between usable and garbage.

The LLM Layer: Polish and Summarize

After transcription, course2md can optionally call any OpenAI-compatible chat endpoint (DeepSeek, GLM, OpenAI, Ollama, vLLM) to proofread the transcript — correcting filler words, stutters, homophone typos and technical-term spelling while preserving meaning (no summarizing, adding or translating). It batches in 20-segment chunks at temperature 0, and if a batch fails or returns invalid JSON it falls back to raw ASR text and logs a warning instead of halting. A separate course2md summarize step generates a TL;DR / key points / timestamped outline with hallucination guards (timestamped-subtitles-only input, temperature 0, structured JSON output, map-reduce for long videos).

Honest Limitations

The Linux/Windows story is the weakest part: local ASR needs llama-server from llama.cpp, and the README’s Debian/Ubuntu path walks you through a cmake build. On macOS the Homebrew tap handles everything including the Developer-ID-signed binary and CoreML mlx.metallib — but that path needs macOS 15+ on Apple Silicon. First run downloads ~1-2GB of models (or ~2.4GB GGUF), and restricted networks need the HF_ENDPOINT mirror. Cloud STT mode uploads audio chunks to the provider — the privacy note is explicit that frames, OCR/SSIM and VAD stay local, but audio leaves the machine. And it’s a two-day-old project: 187 stars, 7 forks, no release history, moving fast but young.

Verdict and Who It’s For

course2md is the most complete local-first video-to-notes pipeline we’ve seen this quarter: SSIM-based slide capture, five ASR backends with honest benchmarks, LLM polish and summarization, and real cross-platform packaging. The Qwen3-ASR focus is a genuine differentiator for technical and mixed-language content — the model quality gap it documents is exactly what makes or breaks lecture notes. It’s not turnkey on Linux/Windows yet, and the first-run model download plus cloud-privacy tradeoff need a decision, but for Apple Silicon users and NPU laptops it’s a Silver-tier pick that makes course watching dramatically more productive.

Review based on public repo contents, README, and repository metadata as of 2026-09-02. Star/fork counts and features may change quickly for a two-day-old project.

course2md ASR Speech-Recognition Qwen3-ASR Whisper Lecture-Notes YouTube Bilibili Rust Local-First Open-Source CoreML NPU