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."

fig. 1 — download once, then search, extract, and browse locally
virtualtreasury.ieimages · transcriptions vtextractresumable download archivepages · items · sidecars vtextract namesLLM → .names.json vtindexSQLite FTS5 vtbrowseTextual TUI

## design

  • A resumable, deduplicated archive. vtextract search and get store each physical page once under pages/, with resources under items/ 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 names runs 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 people searches by either. A .notes.md file 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. vtbrowse walks 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.
fig. 2 — vtbrowse demo

## 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.

← cd ../projects