MetaHistoryBook
One graph for creators, works, sources, and cited interpretation.
A browsable, AI-assisted history of creators and their works, built on Wikidata. Every author and artist is anchored to a stable QID, layered with live Wikidata facts, enriched with museum data and encyclopedic prose, and made endlessly explorable with no dead ends. Browse an art-history timeline, open standards-grade detail pages, read evidence-cited AI dossiers, or pull the same JSON the site runs on from a free, versioned public API. Its Linked Art change feed is harvested in production by Meta Museum, a separate system in this portfolio built against the same published spec, and a signed inbound callback closes the loop the other way.
Wikidata is vast, but it doesn't read like history
The world's open knowledge graph holds millions of creators and works, yet there is no way to browse it as a narrative of culture. MetaHistoryBook turns that structured graph into a living, navigable history, every attractive view backed by stable IDs, source links, and testable data contracts.
The bet is that open knowledge graphs, standards-grade cultural metadata, and guarded generation can make the history of art and letters feel navigable without ever losing provenance. A curated corpus gives fast local browse and search, live Wikidata, Wikipedia, and Wikisource calls keep deep pages rich, and AI dossiers stay evidence-cited rather than free-floating. From any creator you reach works, influences, museum records, and related entities, no dead ends.
Curated speed, live depth, one full-stack app
A single Next.js 16 App Router application: server components read a curated Postgres cache for instant browse, then stream in live data and generated prose independently, fast where it can be, rich where it matters.
Next.js 16 · React 19
App Router with React Server Component streaming and classic ISR. Detail pages render the DB shell instantly, then every live section fills in through independent <Suspense> boundaries, first byte around 0.15s instead of one slow top-level await.
Drizzle ORM · Neon / PGlite
28,223 creators and 27,973 works live in Postgres via Drizzle, refreshed by a weekly full harvest that runs in about half an hour with a backup-before-update and rollback discipline. Production runs on Neon with pgvector, while development and tests fall back to an embedded PGlite database, so the app boots with zero config and no running DB.
Wikidata, Wikipedia, Wikisource
A normalized client layer calls Wikidata over SPARQL and REST, plus Wikimedia and museum APIs, pulling every statement, encyclopedic lead extracts, original-language texts, and image metadata, all rate-limited and cached.
Linked Art · IIIF · cited dossiers
Shared builders emit conformant Linked Art API 1.0 records, embedded as JSON-LD and served at /api/linked-art/{qid} with HAL links, a paged works-by-creator search, and an IIIF Change Discovery activity stream. IIIF deep zoom shows museum masterpieces, and AI dossiers run on Claude generation plus OpenAI embeddings over pgvector.
Browse, explore, and read the evidence
Four experiences sit on the same graph: a period timeline, streaming detail pages, a standards-grade data layer, and citation-aware generation.
🕰️ Period timeline
An art-history band from antiquity to today, Gothic, Renaissance, Baroque, Modernism, Contemporary, with creators as portrait chips and works as masterpiece thumbnails. Pan through time and facet by occupation, movement, citizenship, gender, and place.
🔍 Detail pages
Streaming creator and work pages render identity instantly, then fill in live facts, influence graphs, and reverse-traversal connections. Every statement links onward to another entity, endless navigation, no dead ends.
📖 About & the text
Wikipedia lead extracts are rendered as prose and auto-linkified back into the corpus, and works show their original-language text with inline translations, Bashō's Frog Poem in Japanese, kana, and English via Wikisource.
🏛️ Standards & museums
Conformant Linked Art API 1.0 records with AAT vocabularies and equivalence links, FAIR-aligned data, IIIF deep-zoom of museum masterpieces, and Rijksmuseum enrichment for curator-grade medium, dimensions, and credit lines.
🤖 AI dossiers
Evidence-cited, RAG-grounded profiles built from facts plus the Wikipedia lead, streamed live with provenance on every claim, Claude generation, OpenAI embeddings, and pgvector retrieval, behind cost guards.
🌐 Public API v1
Free, CORS-open, versioned read access to the curated corpus, the same JSON the site runs on. Every response carries X-API-Version: 1, changes within v1 are additive-only, and derived metadata ships CC0 with a machine-readable license link header.
📚 Long-form studio
An eight-stage cited-book pipeline: topic, discovery, statement evidence, hybrid RAG retrieval, planned SPARQL, a strict pre-write verification gate, then chapter synthesis under cite-only-registered- sources discipline, graded sentence by sentence before publication.
🗓️ Plus
Today / on-this-day, full-text and faceted search, dark mode, bilingual i18n (en/cy), accounts with bookmarks and saved views via Auth.js, and SEO with chunked sitemaps and dynamic OG images.
Spec-first, test-first, verified against reality
- Typed data layer, end to end. Drizzle ORM over Postgres with a TypeScript-strict codebase. The same curated schema migrates into in-memory PGlite for development and tests, so the app runs with zero config.
- Citation discipline, then verification. AI dossiers are RAG-grounded over a real evidence corpus where every chunk carries its source links, and a citation-coverage gate grades the result before it is served. Uncited or miscited prose gets flagged rather than silently trusted, and generation is locked to editors so there is no public model spend and no prompt-abuse surface.
- Standards as code. Linked Art records are built from shared, tested modules and machine-validated against the official JSON Schemas on every test run, so the embedded JSON-LD and the public /api/linked-art endpoint never diverge. HAL links, a works-by-creator search relation, and an IIIF Change Discovery stream make inverse navigation and harvesting standards-native.
- Interoperability proved both directions. Meta Museum harvests the activity stream in production, and a signed inbound change callback, HMAC-verified and fail-closed, closes the loop the other way. Meta Museum is another system in this portfolio, so this is conformance to a published standard rather than third-party adoption. The value is that neither side could reach into the other: both had to satisfy a spec written before either implementation. A cross-provider reconciliation run against OpenLibrary was recorded as an honest negative result rather than quietly dropped.
- Streaming-first performance. Detail pages await only the fast DB shell, then stream every live section through independent Suspense boundaries, first byte around 0.15s instead of a single blocking await.
- Accessible and discoverable. A launch-polish pass added focus rings, reduced-motion handling, a skip link, and landmark structure, alongside schema.org structured data and canonical URLs on every detail page.
- Four quality gates, every change. Built AIDD + TDD + SDD: tsc --noEmit, ESLint, 330 Vitest tests on in-memory PGlite including AI evals, and a production build all pass before anything is "done," with a live Wikidata drift probe guarding the data.
A notability threshold is a decision about who gets included
The obvious way to pick a corpus is one quality bar applied to everyone. Measuring what that produced made it clear it was the wrong instrument.
Creators are selected by how many language Wikipedias carry an article about them, which is a reasonable proxy for notability and a badly skewed one across domains. Writers accumulate sitelinks faster than painters do. A single flat threshold would have produced a corpus roughly four to one literary, and that ratio would have described Wikipedia’s editing habits rather than the history of art and letters.
So the dial is per-domain: literary creators at ten sitelinks or more, visual creators at seven, measured live at 34,821 and 16,866. Choosing the lower bar for visual artists is a deliberate correction, not a relaxation of standards, and every threshold is a config value revalidated against live Wikidata in CI so the decision stays visible instead of hardening into an accident.
The same refusal to force a number showed up in a cross-provider reconciliation against OpenLibrary. The rehearsal produced ten candidates and twenty-five decisions, every one of them a drop. The root cause was verified rather than guessed at: our labels are English and Welsh with no original-language forms, while the counterpart uses original script, edition-level identifiers that do not match ours, and no creator ids. A genuine data-shape mismatch, not a missing field. The public Linked Art contract was deliberately left alone rather than reshaped to manufacture matches, and the run was written up as a negative result.
Both decisions cost a better-looking number. A corpus that flatters its source data and an integration that reports a match rate it engineered are the same mistake wearing different clothes.
Live, standards-grade, and provenance-backed
MetaHistoryBook runs in production at metahistorybook.com, with an "Artwork of the Day" experience on its daily. subdomain. It showcases linked-open-data engineering, a typed curated-plus-live data architecture, conformant Linked Art and IIIF standards work, verified two-way interop with an outside aggregator, and citation-disciplined AI generation. Every attractive view is backed by stable IDs and sources, and the same data is free to read through a versioned public API.