Content management for Matchids: book metadata, artwork metadata, categories, age groups, languages, and authors — the structured data that describes what's in the library, kept separate from the code that serves it.
books/
<book-id>/
metadata.json Validated against schemas/book.schema.json
schemas/
book.schema.json
artwork.schema.json
categories.json Real category list — starts empty on purpose
languages.json
artwork/
<artwork-id>/
metadata.json Validated against schemas/artwork.schema.json
docs/
STORAGE.md Why PDFs/images don't live in this repo, and the intended pipeline
Every folder currently contains one _sample- entry — a worked example
of the expected shape, clearly not real content. See each sample's
README.md for how to add a real entry the same way.
The database stores whatever's live in production. This repo is where
the content team works — draft, in-review, and published entries all
live here with a status field, and only published ones with a real
storage reference are meant to flow into the database (see
docs/STORAGE.md for the intended pipeline).
Book PDFs and images are never committed here — see docs/STORAGE.md.
Cover images and Kids Art assets live in matchids-images; PDFs go to
object storage, referenced by key.
npm install
npm run validateRuns automatically in CI on every PR (.github/workflows/validate.yml) —
a malformed metadata.json fails the build rather than reaching
production.
Every real entry must be something Matchids actually has permission to
publish — no invented authors, no placeholder statistics, no content
copied without rights. The _sample- entries are clearly marked and
should never be treated as real.