Skip to content

Why Mosaic?

Mosaic is a runtime for LinkML schemas. Point it at a schema and you get a typed Python SDK, a REST API, a relational database with append-only provenance, and CEL-based dynamic validation — without writing any of that infrastructure. The schema is the application; Mosaic runs it.

This framing matters because it places Mosaic in the correct comparison space. Mosaic is not a metadata tracking service competing with OpenSpecimen or Gen3 — it is an engine that runs whatever schema you give it. Metadata tracking is one application; a bibliography, a software inventory, or a clinical registry are equally valid ones. The engine doesn't know which it is running.

Three Things That Set Mosaic Apart

Schema evolution with provenance preservation

Because ProvenanceRecord is a typed, DDL-generated table — not an event log retrofitted onto an existing schema — a Mosaic deployment can evolve its schema across years without losing the ability to answer "what did this entity look like in 2022?" Migrations run forward; the history stays intact. This is structurally impossible to retrofit into systems whose schemas are hardcoded in application code or bound to a consortium's controlled vocabulary.

PROV-O-native, not PROV-O-adjacent

Most systems emit PROV serializations as an export format applied after the fact. Mosaic's provenance graph is a PROV graph: ProvenanceRecord carries class_uri: prov:Activity and its fields map directly to PROV-O predicates. A Mosaic deployment can publish its full provenance as RDF or JSON-LD with no transformation step — directly consumable by W3C PROV reasoners, lineage tools, and RO-Crate packagers. "PROV-compatible" means you can export to PROV. Mosaic means you can't avoid it.

SDK-first, transport-agnostic

The REST API wraps an embedded Python app object; it is not the primary interface. This means Mosaic runs in three modes that application platforms structurally can't match: as a Python library imported directly into a Nextflow or Snakemake process, as a REST service, or embedded in-process inside a Jupyter notebook. The same code path runs in all three — the code that works in your notebook works unchanged in production.


Not sure whether Mosaic fits your use case? See How Mosaic Compares — including honest pointers to when another tool is the right choice.