OPEN SOURCE · 2026 · MIT LICENSE
virtualtreasury-tools/
Command-line tools that mirror the Virtual Record Treasury of Ireland into a resumable local archive, index it for offline search, use an LLM to list the people on every page, and browse it all from the terminal.
- commands
- vtextract · vtindex · vtbrowse · vtnamebench
- python
- 3.12+ · httpx · Textual · LiteLLM
- index
- SQLite FTS5
- archive
- 174,494 page transcriptions · 100% names extracted
- tests
- 685
- license
- MIT
## why
Much of my family is Scotch-Irish, and the records that would trace them back to Ireland mostly burned with the Public Record Office at the Four Courts in 1922. The Virtual Record Treasury of Ireland is rebuilding that archive from surviving copies and publishes images, metadata, and full transcriptions online.
I wanted to search and cross-reference those records offline, and to find people rather than pages: spelling was not standardized, so the same person appears as "Jno. Houston," "John Huston," and "Houstoun."
## design
- A resumable, deduplicated archive.
vtextract searchandgetstore each physical page once underpages/, with resources underitems/pointing at them. Re-running a search skips what is already archived. Images are optional because they dwarf everything else on disk. - People as data.
vtextract namesruns any LiteLLM model over each transcription and writes a sidecar listing each person as a canonical name followed by the surface forms seen on the page.vtindex peoplesearches by either. A.notes.mdfile beside a page lets me correct the model for that page. - Guardrails against runaway output. Dense registry pages push models into repetition loops, so every call has an output-token cap, a truncated response is retried once at a higher temperature, long pages are split into smaller chunks, and pages that fail deterministically are parked instead of retried on every run.
- A keyboard-driven browser.
vtbrowsewalks volumes and pages, toggles between the transcription and the scan, edits page notes, re-extracts names, asks an LLM questions about a page, and exports a curated bundle of pages.
## how it was built
I built it with Claude Code, starting from a written design spec. Before running extraction over the whole archive I wrote vtnamebench and compared thirty models: gemini-2.5-flash-lite did the bulk of the work, and claude-sonnet-4-6 cleared the 215 pages it could not. The blog post covers the benchmark, the cost projection that came in too low, and the fixes that halved the cost per page.