From YAML to JSON, without silent loss
JSON Schema validates JSON values, so YAML must be projected first. ValidateYAML makes every lossy step explicit: non-string keys (200: OK) are either converted to strings with a recorded mapping or the layer stops; .nan/.inf, cyclic aliases, complex keys and colliding keys stop the schema layer for that document instead of validating altered data.
Merge keys (<<) are applied only when your profile enables them. Findings reached through an alias point at the alias and link to the anchor that defines the value.
Honest capability report
The engine (@cfworker/json-schema, an interpreter with no eval) evaluates the standard assertion vocabularies. $dynamicRef/$dynamicAnchor are not evaluated, so any schema using them yields “incomplete”. Unknown keywords (often typos such as “requried”) are listed with suggestions and, by default, also make the result incomplete.
Questions
Can I validate a docker-compose or GitHub Actions file?
Yes, with the bundled packs. They are small, self-authored subsets (version 0.1.0, dated 30 Oct 2026) — not the official schemas — and their coverage and exclusions are listed on the Offline packs page. Passing a pack does not mean Docker or GitHub will accept the file.
What happens with $ref to a URL?
Nothing is fetched. The schema layer shows “not run: reference unresolved” with the exact URIs, and you can map each one to a schema you paste or open locally.
Is format (email, date-time, uri) checked?
The engine asserts the formats it implements (date, time, date-time, duration, email, hostname, ipv4, ipv6, uri, uri-reference, uri-template, url, uuid, regex, json-pointer, relative-json-pointer). Other format values are listed as not asserted.