A static web app for browsing the structured data extracted from 15 scanned books by Bernard (and Mary) Berenson, 1894–1903 — the Lists, the catalogue raisonné of Florentine drawings, prose mentions and citations, plus Wikidata reconciliation of the artists, places and collections.
Everything links back to its source: every extracted row has a view link showing the original page scan next to what was extracted from it.
- The app is a single-page static site (no server). The entire SQLite database (~10 MB gzipped) is fetched once and queried in the browser via sql.js (SQLite compiled to WebAssembly) — which is why the read-only SQL console can run arbitrary SELECTs client-side.
- Page-scan JPEGs (~1600 px wide, all 3,937 pages) and the database are hosted in a Cloudflare R2 bucket (public, CORS-enabled); the app itself is served by GitHub Pages.
- The scans are HathiTrust digitizations of public-domain volumes.
| file | role |
|---|---|
index.html / styles.css |
shell + look (ported from the local Flask UI) |
config.js |
R2 base URL |
data.js |
table/column documentation, canned research queries |
app.js |
hash-router, views (dashboard, tables, entity, page, search, SQL) |
vendor/sql-wasm.{js,wasm} |
sql.js 1.13.0, vendored |
- Push to
main. - One-time: repo Settings → Pages → Source: GitHub Actions.
- The
pages.ymlworkflow publishes the site tohttps://semanticlab.github.io/berenson-discovery/.
The extraction pipeline lives in the private berenson working directory
(stages 00–40: page classification, LLM extraction with OCR verification,
database assembly, Wikidata reconciliation). To refresh this site's assets:
# in the berenson pipeline directory
uv run --with boto3 python scripts/50_deploy_static.py # full: db + render + upload
uv run --with boto3 python scripts/50_deploy_static.py --db-only # just the databaseR2 credentials are read from the shell environment (R2_S3_API,
R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY).