OCR and transcription

Read notebook pages with a local Ollama vision model, then correct the text beside the scan.

First-time path: user guide. Model caveats: known limitations. Choosing a tag: model matrix.

This notebook

UI: Workflow → Transcribe → Target This notebook → pick a vision model → optional Clean OCR with a text model → Start.

Open Model information under the picker for family, size, and OCR-fit notes. Vision pickers list OCR-appropriate models only (thinking tags, text-only tags, and broken loaders are hidden). Prefer OCR-oriented tags over general VLMs.

Matching pages are skipped when the same model already succeeded. Settings saved mid-job apply to the next job. Cleanup failures keep the raw OCR and do not fail the page. Whitespace-only output is failed and does not overwrite a prior reading.

After 3 consecutive timeouts or 1 fatal model-load error, remaining pages for that model are skipped so a bad tag does not burn the notebook.

CLI:

./transcribe.sh cli models
./transcribe.sh cli run "$TRANSCRIBE_PROJECTS_DIR/my-notebook" --model glm-ocr
# force re-OCR: add --force

Review after OCR

Review is the work queue (unreviewed, empty text, failures, date approval). Scan on the left; one lane at a time on the right: Transcription, Date, Tags, OCR, Cleanup, Other.

  • OCR → Re-run OCR — this page, all pages, or pages not marked reviewed

  • Rank and merge — build a merged draft from existing readings

  • Cleanup — re-apply visual declutter without re-running OCR

Reading is the same pages chronologically, read-only. On Reading or Library, Compare in Review opens the workbench when several OCR attempts exist.

Layout notes: ocr review workbench.

Compare models

UI: Compare models (multi-select) → Start (runs in the background). Vision-phase cleanup defaults off. Rank and an optional merged draft use the text model.

If two or more models already have text on disk, Rank and merge existing OCR on Transcribe or Review builds a draft without re-running vision.

CLI:

./transcribe.sh cli multipass "$TRANSCRIBE_PROJECTS_DIR/my-notebook" \
  --model glm-ocr --model granite3.2-vision --text-model qwen2.5:7b

Some tags (DeepSeek-OCR) use a short frozen prompt — model recipes.

Notebook OCR settings

Per-notebook overrides live under Review → OCR and Transcribe → Advanced. Workspace defaults seed new notebooks. Changes apply to the next job.

When setting a notebook default

What happens when you Prefer an OCR attempt (or when a merged draft auto-activates).

UI label (Review)

Behaviour

Notebook default = current text (default)

Prefer updates both the notebook default and the text you see

Notebook default only (stats / fine-tune)

Records a favourite model without changing current text

Notebook default + current, with edit gate

Like the default, but asks before replacing a human edit

Seed transcription from merged draft after multipass

On (default): the merged draft becomes current text and seeds Review when there is no edit. Off: rank and draft still run, but you activate the draft yourself.

CLI: omit --no-auto-composite (default on) or pass --no-auto-composite.

Batch OCR

UI: Workflow → Transcribe → Batch (also after Import → Batch via Transcribe imported notebooks). Single-model or compare across notebooks; live progress.

./transcribe.sh cli bulk-run pending --model glm-ocr
./transcribe.sh cli bulk-run import-run <import_run_id> --model glm-ocr
./transcribe.sh cli bulk-run pending --model vision-a --model vision-b --text-model qwen2.5
./transcribe.sh cli bulk-run status|resume <ocr_run_id>