Adds .gitea/workflows/ci.yml (python-ci with tesseract + libgl for the OCR/opencv tests, plus gitleaks secret-scan) and ruff.toml (E4/E7/E9/F/I, line-length 120). Cleans up the remaining unused-variable findings so the lint gate is green.
- ocr/: Tesseract-based vendor/date/total extraction. PSM 6 (single
uniform text block) instead of the default fixes receipts where
item-name/price columns were otherwise split into separate blocks and
dropped. Vendor line picked by median (not max) word height within the
top fraction of the crop, breaking ties by topmost line - max() was
fooled by single descender/ascender glyphs (commas, parens) inflating
one word's bounding box.
- naming/: merge OCR metadata into YYYY-MM-DD_vendor.pdf filenames,
degrading gracefully to UNSORTED_<timestamp>.pdf; per-run dedup.
- pdf/: img2pdf-based multi-page-capable assembly (images_to_pdf).
- pipeline.run_export(): OCR + name + PDF each detected crop from a
detect() report, writes pdf/ and export_summary.csv.
- New `paperpod export <video>` CLI command.
- Verified against synthetic Home Depot/Metro/Petro-Canada receipts:
3/3 correct vendor, date, and total after tuning.
Known limitation (documented in README): no page-flip/multi-page
grouping yet (that's events/, still unbuilt) - every detected document
becomes its own single-page PDF.