Extract document data from screen-share videos — 100% locally. ffmpeg pulls
the unique frames out of the recording, a local vision model (via
@qvac/sdk) transcribes each frame to markdown,
and a final LLM pass merges the transcripts into deduplicated, structured
documents. Nothing ever leaves your machine.
npm install && npm link
docparse run screen-recording.mp4
open output/documents.mdFirst run downloads the vision model (~18.5 GB for the default
qwen-27b; use--model qwen-4bon machines with less than 24 GB RAM) into the QVAC cache — a progress bar keeps you company. Every run after that starts instantly. Requires Node >= 22.17.
docparse run <video> # all three stages in sequence
docparse extract <video> # 1. video -> output/frames/NNN.jpg
docparse transcribe output/frames # 2. frames -> output/transcripts/NNN.md
docparse organize output/transcripts # 3. transcripts -> output/documents.md
- extract — ffmpeg (bundled via
ffmpeg-static) samples the video at--fpsand drops near-duplicate frames withmpdecimate, so a 10-minute call becomes a few dozen unique screenshots. - transcribe — a local vision model transcribes each frame to markdown (text, tables, brief chart descriptions), one file per frame, written as it goes. A failed frame is logged and skipped, never fatal.
- organize — a text-only LLM pass merges scroll fragments, dedupes repeats, and groups everything into distinct documents with source frame numbers. Oversized inputs are organized in batches, then merged.
Each stage skips itself if its output is already up to date — rerun
cheaply while tuning, use --force to redo. Failed frames leave no
transcript, so a plain rerun retries exactly those, and documents.md is
rebuilt whenever transcripts are newer than it. A fresh extraction (first run
or --force) invalidates downstream transcripts and documents — they would
describe frames that no longer exist.
Exit codes: 0 success, 1 fatal error, 2 pipeline completed but some
frames failed to transcribe (rerun to retry them).
| flag | default | meaning |
|---|---|---|
--out |
./output |
output directory (frames/, transcripts/, documents.md) |
--fps |
1 |
frames sampled per second before dedup |
--hi |
768 |
mpdecimate hi threshold (higher = more frames dropped) |
--lo |
320 |
mpdecimate lo threshold |
--frac |
0.5 |
mpdecimate fraction of blocks that must be still |
--model |
qwen-4b |
model preset, see below |
--force |
off | redo stages even if output exists |
| preset | model | download | notes |
|---|---|---|---|
qwen-27b |
Qwen3.6-27B multimodal Q4_K_XL | ~18.5 GB | default — highest quality; needs ~24 GB+ RAM |
qwen-4b |
Qwen3.5-4B multimodal Q4_K_M | ~3.1 GB | best quality/speed balance for smaller machines |
qwen-2b |
Qwen3.5-2B multimodal Q4_K_M | ~1.6 GB | good quality, ~2× faster |
qwen-0.8b |
Qwen3.5-0.8B multimodal Q4_K_M | ~0.6 GB | fast smoke tests |
smolvlm-500m |
SmolVLM2-500M Q8_0 | ~0.5 GB | smallest footprint |
If model loading fails with an out-of-memory error, docparse suggests the next smaller preset. The organize stage reuses the same model in text-only mode — only one download per preset, ever.