{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"schemaVersion":{"type":"number","const":2},"id":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"title":{"type":"object","properties":{"hu":{"type":"string","minLength":1},"en":{"type":"string","minLength":1}},"required":["hu","en"],"additionalProperties":false},"description":{"type":"object","properties":{"hu":{"type":"string","minLength":1},"en":{"type":"string","minLength":1}},"required":["hu","en"],"additionalProperties":false},"category":{"type":"string","enum":["mechanical","electronics","firmware","mixed"]},"stage":{"type":"string","enum":["concept","prototype","built","field-tested"]},"version":{"type":"string","minLength":1},"topics":{"minItems":1,"type":"array","items":{"type":"string","enum":["poultry","livestock","water","fencing","soil","tools","sensors","energy","storage"]}},"requires":{"minItems":1,"type":"array","items":{"type":"string","enum":["3d-printer","soldering","welding","woodworking","microcontroller-flashing","none"]}},"maintainers":{"minItems":1,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["name"],"additionalProperties":false}},"contributors":{"minItems":1,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"},"role":{"type":"string","minLength":1}},"required":["name"],"additionalProperties":false}},"licenses":{"minItems":1,"type":"array","items":{"type":"object","properties":{"path":{"type":"string","pattern":"^(?!\\/)(?!.*(?:^|\\/)\\.\\.(?:\\/|$))[a-zA-Z0-9_.\\/-]+$"},"identifier":{"type":"string","minLength":1}},"required":["identifier"],"additionalProperties":false}},"files":{"minItems":1,"type":"array","items":{"type":"object","properties":{"path":{"type":"string","pattern":"^(?!\\/)(?!.*(?:^|\\/)\\.\\.(?:\\/|$))[a-zA-Z0-9_.\\/-]+$"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"role":{"type":"string","enum":["source","export","documentation","bom","evidence"]}},"required":["path","sha256","role"],"additionalProperties":false}},"links":{"minItems":1,"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["printables","repository","discussion","mirror","video"]},"url":{"type":"string","format":"uri"}},"required":["kind","url"],"additionalProperties":false}},"photo":{"type":"object","properties":{"src":{"type":"string","pattern":"^(?!\\/)(?!.*(?:^|\\/)\\.\\.(?:\\/|$))[a-zA-Z0-9_.\\/-]+$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"alt":{"type":"object","properties":{"hu":{"type":"string","minLength":1},"en":{"type":"string","minLength":1}},"required":["hu","en"],"additionalProperties":false}},"required":["src","width","height","alt"],"additionalProperties":false},"gallery":{"minItems":1,"type":"array","items":{"type":"object","properties":{"src":{"type":"string","pattern":"^(?!\\/)(?!.*(?:^|\\/)\\.\\.(?:\\/|$))[a-zA-Z0-9_.\\/-]+$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"alt":{"type":"object","properties":{"hu":{"type":"string","minLength":1},"en":{"type":"string","minLength":1}},"required":["hu","en"],"additionalProperties":false}},"required":["src","width","height","alt"],"additionalProperties":false}},"derivedFrom":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"url":{"type":"string","format":"uri"},"note":{"type":"object","properties":{"hu":{"type":"string","minLength":1},"en":{"type":"string","minLength":1}},"required":["hu","en"],"additionalProperties":false}},"additionalProperties":false}},"limitations":{"type":"object","properties":{"hu":{"type":"string","minLength":1},"en":{"type":"string","minLength":1}},"required":["hu","en"],"additionalProperties":false}},"required":["schemaVersion","id","title","description","category","stage","version","topics","requires","maintainers","licenses","limitations"],"additionalProperties":false}