Entry Schema

Field-level reference for the two wire-format JSON shapes that carry package data: the package root and the OCI image index. This page is a summary table derived from the JSON Schemas below — the schemas are the source of truth for exact types, patterns, and constraints; consult them directly for anything this table simplifies.

See Wire Format for URL shapes and freshness semantics, and Namespace Policy for the name/repository charset.

config.json

FieldTypeRequiredNotes
format_versioninteger, ≥1yesMonotonically increasing wire-format generation counter

Enumeration Index — /c/index.json

FieldTypeRequiredNotes
format_versioninteger, ≥1yessame counter as config.json
packagesmap: bare <namespace>/<package>sha256:<hex>yessorted by key; value is the digest of the exact bytes served at that package's root (/p/<key>.json) — not a canonical-JSON CAS digest; empty map is a valid state

See Wire Format for the sync protocol built on top of this shape.

Package Root — /p/<namespace>/<package>.json

FieldTypeRequiredGoverned byNotes
namestringyeshuman (PR)ocx.sh/<namespace>/<package>, ≤147 chars
repositorystringyeshuman (PR)oci://<host>/<repo path>; host checked at CI time against this index's registry-host policy (ghcr.io here)
ownersarray of Owneryes, ≥1 itemhuman (PR)
statusenumyeshuman (PR)active | deprecated | yanked
deprecated_messagestring | nullyeshuman (PR)
superseded_bystring | nullnohuman (PR)bare <namespace>/<package> naming a successor package, ≤140 chars; omitted or null when unset; self-reference invalid, no coupling to status
createdstring, YYYY-MM-DDyeshuman (PR), set oncedate first claimed
upstreamUpstream objectnohuman (PR)mandatory by governance for third-party vendor namespaces; omitted for OCX first-party entries
sourcestring, https://…nobot-regeneratedrepository whose CI produced the published builds, from the org.opencontainers.image.source annotation on the latest version's manifest; omitted (or null) when that annotation is absent. Not upstream.repository_url — see below
variantsarray of stringnobot-regeneratedvariant names observed across tags — sorted, deduplicated, ≥1 item. Omitted (never []) when the package ships only the default variant. See Variants
descDesc object | nullyes (nullable)bot-regeneratednull if __ocx.desc never published
tagsmap: tag name → TagEntryyesbot-regenerated, except yankedevery observed tag, no filtering

Variants

A variant is a build of the same version with different software-level characteristics — an optimisation profile, a feature set, a libc. It is spelled as a tag prefix: slim-3.13.1 is the slim variant of 3.13.1, and an unprefixed 3.13.1 is the default variant.

variants is a projection of tags, not an independent declaration, and the PR gate enforces exactly that: check_variants_match_tags re-derives the set from the root's own tags and rejects a present field that disagrees. Omitting it is always allowed — an absent field claims nothing, and the catalog derives the set from tags regardless of what the root stores. Recompute it and you get the same answer: take every tag that parses as a version, keep the ones carrying a prefix, sort and deduplicate the prefixes. It is recorded so that reading "does this package ship variants" does not require re-implementing the version grammar. latest is reserved and is never a variant name.

Two consequences worth knowing:

  • The default variant has no name. It is the absence of a prefix, so it never appears in this array — variants: ["slim"] on a package that also publishes 3.13.1 means two variants ship, the default and slim.
  • A bare rolling tag (slim, no version) is not a version, so it contributes nothing on its own. It is legible as a variant pointer only alongside a versioned slim-* sibling — an inference the package page makes when it renders, and one this field does not make.

Owner

FieldTypeRequiredNotes
githubstringyesGitHub login — display only
github_idinteger, ≥1yesnumeric GitHub user id — the actual ownership key, survives username rename/recycling

Upstream

FieldTypeRequiredNotes
orgstringyesthe real vendor/project name
repository_urlstring (URI)noupstream source repository
disclaimerstring | nullnoe.g. a not-affiliated note

Source versus upstream

Two different questions, deliberately two fields:

  • upstream.repository_urlwho wrote the software. Human-governed attribution of the third-party vendor the namespace names, set once in the claim PR.
  • sourcewho built these artifacts. Bot-read from the published image's org.opencontainers.image.source annotation, so it names the repository whose CI ran the build.

For a mirror they are different repositories on purpose: kitware/cmake may attribute https://github.com/Kitware/CMake upstream while its source is the mirroring repository that produced the OCI artifacts.

Desc

FieldTypeRequiredNotes
digestsha256:<hex>yesdigest of the currently-copied __ocx.desc tag
titlestringyes
descriptionstringyes
keywordsstring[]yesfrom the sh.ocx.keywords annotation; [] if never published
readmesha256:<hex>noCAS pointer, o/sha256/<hex>.md
logosha256:<hex>noCAS pointer, o/sha256/<hex>.svg or .png

TagEntry

FieldTypeRequiredNotes
contentsha256:<hex>yesdigest of the OCI image index this tag resolved to, stored verbatim at o/sha256/<hex>.json
observeddate-timeyes
yankedYanked objectnopresence marks the row yanked; human-set only, bot never writes it

Yanked

FieldTypeRequiredNotes
reasonstringyes
atdate-timeyes

OCI Image Index — /p/<namespace>/<package>/o/sha256/<hex>.json

The bytes at this path are an OCI image index, stored verbatim as the physical registry served them — this index defines no shape of its own here. The table below is a reading aid for the fields this site and ocx actually consume; the OCI image-index schema is deliberately not additionalProperties: false — a real index may carry subject, artifactType, annotations, or future spec fields this index does not author and must not reject.

FieldTypeRequiredNotes
schemaVersionintegeryesOCI image-index field, 2
mediaTypestringyesapplication/vnd.oci.image.index.v1+json
manifestsarray of ManifestDescriptoryesone entry per platform build, plus zero or more non-platform artifacts (attestations, SBOMs, signatures) riding in the same index

ManifestDescriptor

FieldTypeRequiredNotes
mediaTypestringyes
digestsha256:<hex>yesOCI manifest digest on the physical registry
sizeintegeryes
platformPlatform objectnoabsent, or present with os/architecture both "unknown", on a non-platform descriptor (attestation, SBOM, signature). Consumers that enumerate platforms for display MUST exclude both cases

Platform

Inline subset of the OCI image-spec Platform object. Field names with a literal dot (os.version, os.features) match the OCI spec's own property names verbatim — not a nested os object.

FieldTypeRequiredNotes
architecturestringyes
osstringyes
os.versionstringno
os.featuresstring[]no
variantstringno
featuresstring[]no

Field Provenance

Two disjoint sets, never cross-contaminated (see Governance Contracts G-09):

  • Human-governed (only changed by a merged PR): name, repository, owners, status, deprecated_message, superseded_by, created, upstream, and tags[*].yanked.
  • Bot-regenerated (rewritten from registry truth on every announce/reconcile): desc, source, and the rest of every tags[*] row.