{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"version":{"type":"string","const":"v1"},"license":{"type":"string","const":"CC BY 4.0"},"id":{"type":"string"},"name":{"type":"string"},"repo":{"type":"string","description":"owner/name on GitHub"},"github":{"type":"string","format":"uri"},"page":{"type":"string","format":"uri"},"list":{"type":"string"},"category":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"}},"required":["id","title","url"],"additionalProperties":false},"place":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"of":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Projects in the category"},"score":{"type":"number","minimum":0,"maximum":100},"score_parts":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"word":{"type":"string"},"value":{"type":"number"}},"required":["key","label","word","value"],"additionalProperties":false}},"penalties":{"type":"array","items":{"type":"string"}},"facts":{"type":"object","properties":{"stars":{"type":"integer","minimum":0,"maximum":9007199254740991},"license":{"description":"SPDX id as GitHub reports it","type":["string","null"]},"license_words":{"type":"string"},"last_commit":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"last_release":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"language":{"type":["string","null"]},"docker":{"type":"boolean"},"arm64":{"type":"boolean"},"gpu":{"type":"string","enum":["none","optional","required","unknown"]},"ram_min_gb":{"type":["number","null"]},"external_deps":{"type":"array","items":{"type":"string"}},"web_port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["stars","license","license_words","last_commit","last_release","language","docker","arm64","gpu","ram_min_gb","external_deps","web_port"],"additionalProperties":false},"links":{"type":"object","properties":{"demo":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"docs":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"website":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["demo","docs","website"],"additionalProperties":false},"review":{"type":"object","properties":{"tagline":{"type":"string"},"summary":{"type":"string"},"audience":{"type":"string"},"strengths":{"type":"array","items":{"type":"string"}},"weaknesses":{"type":"array","items":{"type":"string"}},"needs":{"type":"array","items":{"type":"string"}}},"required":["tagline","summary","audience","strengths","weaknesses","needs"],"additionalProperties":false},"alternative_to":{"type":"array","items":{"type":"string"},"description":"Products the project's own README says it replaces"},"checked":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Date of the GitHub data behind these facts"},"source_url":{"type":"string","format":"uri","description":"Canonical page to cite and link"},"checked_at":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"Date of the GitHub check behind the facts; null when the latest check missed the repo"},"health":{"type":"object","properties":{"releases_12m":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"GitHub releases, pre-releases left out, in the 365 days before `checked`; 100 means 100 or more"},"days_since_release":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Days from the latest GitHub release to `checked`"},"top_contributor":{"anyOf":[{"type":"object","properties":{"share":{"type":"number","minimum":0,"maximum":1},"commits":{"type":"integer","minimum":0,"maximum":9007199254740991},"of":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["share","commits","of"],"additionalProperties":false},{"type":"null"}],"description":"Commits on the default branch in the last 52 weeks: the top author's, and all of them, by people's GitHub accounts (bots and coding-agent accounts left out)"},"advisories":{"anyOf":[{"type":"object","properties":{"published_12m":{"type":"integer","minimum":0,"maximum":9007199254740991},"critical_high":{"type":"integer","minimum":0,"maximum":9007199254740991},"url":{"type":"string","format":"uri"}},"required":["published_12m","critical_high","url"],"additionalProperties":false},{"type":"null"}],"description":"The repo's own published GitHub security advisories in the last 365 days"},"package":{"anyOf":[{"type":"object","properties":{"registry":{"type":"string","enum":["npm","pypi","cargo","go"]},"name":{"type":"string"},"version":{"type":"string","description":"The latest version on the registry"},"advisories":{"type":"array","items":{"type":"string"},"description":"Advisory ids deps.dev lists for that version (OSV)"},"url":{"type":"string","format":"uri"}},"required":["registry","name","version","advisories","url"],"additionalProperties":false},{"type":"null"}],"description":"Its package, from the root manifest, when deps.dev names this repo as its source"},"scorecard":{"anyOf":[{"type":"object","properties":{"score":{"type":"number","minimum":0,"maximum":10},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"url":{"type":"string","format":"uri"}},"required":["score","date","url"],"additionalProperties":false},{"type":"null"}],"description":"OpenSSF Scorecard result from api.securityscorecards.dev"},"sources_checked":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"Date top_contributor, advisories, package and scorecard were read"},"not_checked":{"type":"array","items":{"type":"string","enum":["releases","top_contributor","advisories","package","scorecard"]}}},"required":["releases_12m","days_since_release","top_contributor","advisories","package","scorecard","sources_checked","not_checked"],"additionalProperties":false,"description":"Upkeep and security facts (added 2026-10-12). Not part of the score. Null means not checked (listed in not_checked), except package (null also when the repo has no package) and days_since_release (no GitHub release)."},"safety":{"anyOf":[{"type":"object","properties":{"checked":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Run date"},"commit":{"type":"string","description":"Commit of the default branch whose files were read"},"content_hash":{"description":"sha256 over \"<path>\\0<sha256 of file>\\n\" for the files of `git archive <commit>`, paths sorted (symlinks and .git, node_modules, .venv, venv, __pycache__ folders left out); null for results read before 2026-10-14","type":["string","null"]},"packages":{"type":"array","items":{"type":"object","properties":{"registry":{"type":"string","enum":["npm","pypi"]},"name":{"type":"string"},"version":{"type":"string","description":"The latest version, which checks 1, 3, 4 and 5 read"},"integrity":{"description":"npm dist.integrity, or sha256 of the PyPI file read (a wheel when there is one)","type":["string","null"]}},"required":["registry","name","version","integrity"],"additionalProperties":false},"description":"Packages the README installs that this repo publishes"},"passed":{"type":"integer","minimum":0,"maximum":9007199254740991},"applicable":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Checks that were not N/A"},"all_pass":{"type":"boolean"},"failed":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Ids of the checks that failed"},"checks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"title":{"type":"string"},"status":{"type":"string","enum":["pass","fail","na"]},"note":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"},"description":"File permalinks at `commit`, or the API URLs read"},"override":{"description":"Reason of a correction after a person reviewed it","type":["string","null"]}},"required":["id","title","status","note","evidence","override"],"additionalProperties":false}},"last_change":{"anyOf":[{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"previous":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"The earlier result it was compared with"},"now_fail":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"now_pass":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"text":{"type":"string"}},"required":["date","previous","now_fail","now_pass","text"],"additionalProperties":false},{"type":"null"}],"description":"The most recent run whose fails differed from the result before it"}},"required":["checked","commit","content_hash","packages","passed","applicable","all_pass","failed","checks","last_change"],"additionalProperties":false},{"type":"null"}],"description":"Safety checks (added 2026-10-14): MCP servers and skills, rules and plugins only, null for the rest. Not part of the score."}},"required":["version","license","id","name","repo","github","page","list","category","place","of","score","score_parts","penalties","facts","links","review","alternative_to","checked","source_url","checked_at","health","safety"],"additionalProperties":false}