The committed corpus lives under data/{macos,xcode} and is licensed under CC-BY-4.0. JSON is the stable interchange format for the CLI, website, and /api/v1/ endpoints.
data/{product}/releases.json is an array sorted newest first. Every entry contains:
productType:macOSorXcodeosVersion:major.minorormajor.minor.patchbuildNumber: the Apple build identifierreleaseNameand ISOreleaseDate- boolean
isBetaandisRC dataFile: the canonical detail pointer
macOS entries also contain isDeviceSpecific. Prereleases may contain betaNumber, betaRevision, or rcNumber when applicable.
The pointer must be exactly releases/{major}/{macOS|Xcode}-{osVersion}-{buildNumber}.json. It must resolve to a regular file inside the same product directory, and that file must carry the same product, version, and build. Aliases, traversal, escaping symlinks, pointer swaps, and duplicate builds are invalid.
Every detail object repeats the index identity and flags and contains a non-empty components array. Each component has non-empty name, version, path, and source fields. The path is absolute, and each tracked component always comes from its configured source: macOS sources are filesystem or dyldCache; Xcode sources are filesystem or sdk. No string in an index or detail file contains a control character.
macOS details also require:
isDeviceSpecificipswFileand an Apple HTTPSipswURL- a non-empty
kernelsarray withfile,arch,chip,darwinVersion,xnuVersion, anddevices - optional
deviceChipson a kernel: an array of objects with non-emptydeviceandchipstrings, preserving per-device chip identities
Xcode details also require:
xipFileand an Apple HTTPSxipURLminimumOSVersion- a non-empty
sdksarray whose entries containsdkVersionandbuildVersion
The authoritative field and completeness checks are implemented in scripts/lint-json.rb; Astro applies an additional Zod schema when building the site.
Adding an optional field is backward-compatible. Removing or renaming a field, changing its type, changing component names, or making an optional field required changes the public contract and requires coordinated CLI, linter, website, API documentation, and corpus updates. Such a breaking API change belongs in a new API version rather than silently changing /api/v1/.
Generated files are not edited by hand. See Contributing and Operations for the publication flow.