Basilisk
Architecture

Data flow

How package identities, versions, and advisories become match results.

The worker ingests package identities, versions, advisories, and attributed applicability enrichment, then reconciles them into package/advisory matches.

Inputs

SourceUsed forTransportCadence
purl-associatorPURL and CPE package identitiesPublished JSON payloadsDaily
conda-forge repodataArtifact metadata and distinct package/version universeSharded repodata via rattlerDaily
OSVPURL-based advisories and affected rangesPer-ecosystem bulk dumpsDaily
NVDCVE metadata and CPE configurationsNVD API 2.0Daily incremental sync
Anchore NVD overridesAttributed replacements for NVD CPE configurationsImmutable Git archive at a resolved commitDaily, after NVD

Pipeline

The worker runs ingestion and matching jobs through a Postgres-backed queue. The API reads the resulting projections and matches; it does not fetch upstream data during a request.

Matching

The matcher uses two main paths:

  • PURLs connect package identities to OSV affected entries.
  • CPE vendor/product prefixes connect package identities to effective NVD configurations. An active Anchore replacement supersedes the original configurations without changing NVD metadata.

It then evaluates the reported ranges against the versions known from conda-forge repodata. A reconcile writes the current result to package_advisory_matches and removes stale matches.

A match also records range applicability and identity confidence. This is what separates a version-range match from one with missing bounds or an unverified identity. How matching works covers the range rules and comparators in detail.

Outputs

The API exposes:

  • OSV-compatible query responses,
  • package and advisory endpoints for the explorer,
  • provenance, confidence, and freshness data,
  • status and job information for operators.

The API reference in this site is generated from the API's OpenAPI document.

On this page