A Family Book, Rescued in a Weekend
2026-10-11
A printed family history book — one family’s copy, the life story of a great-grandmother born in 1900 plus decades of genealogy registers — sat as 129 iPhone photos of pages. A weekend later it was a cleaned digital edition, a letter-size PDF, restored portraits, and a validated family tree file. Total human time: roughly four to six hours. Compute: free LLM tiers, free OCR tiers, and about $10 of image-upscaling API.
The pipeline, in order:
- Photograph. 129 phone photos of every page, covers and photo pages included. Originals untouched from here on.
- OCR in bulk. A small Python pipeline (
ocr_family_book.py): HEIC to JPG with auto-orientation, then Azure Document Intelligenceprebuilt-readon the free tier (500 pages/month free; the book needed 129), with local Tesseract 5 as the zero-setup fallback. Output: one Markdown file per page, a concatenated transcript, and a manifest with per-page dimensions, rotation, and character counts. The run took about 40 minutes, retries included. - Clean into an edition. The raw transcript became a navigable digital book: punctuation and hyphenation fixed, paragraphs rejoined across page breaks, headings standardized, photo pages recomposed as figures. Nothing reworded. The result exports to a 12 MB letter-size PDF.
- Portraits, restored in bulk. Photo pages were cropped into individual portraits, uprighted, and run through a commercial upscaling/restoration API — 57 enhanced images for about $10 total. Black-and-white kept black-and-white; captions kept as printed.
- Handwritten charts, transcribed. Nine scans of hand-drawn pedigree charts became structured records — the key that unlocked an entire maternal line no search engine had found. Transcription was the slow human part; everything after it was mechanical.
- A real tree file. All of it compiled into a GEDCOM
.ged(around 190 individuals, 65 families), validated mechanically — parses clean, no duplicate IDs, no dangling pointers, bidirectional links, real calendar dates — plus a one-command local tree viewer and SVG/PDF exports. A repair script fixes a known upstream SVG-encoding bug.
What I’d tell anyone starting: the phone photos are the hard part, and they’re just patience. Everything downstream — OCR, cleanup, validation, export — is scriptable, retryable, and nearly free. The book went from “exists in one house” to “readable by the whole family, searchable, and archived” in less time than the drive to go pick it up would take some relatives.