product.slug | must be lowercase letters, digits and hyphens, 3 to 40 characters, starting and ending with a letter or digit | pattern |
|---|
product.categories | 1 to 3 entries · the same entry may not appear twice | minItems · maxItems · uniqueItems |
|---|
product.categories[] | one of AI tools · Productivity · Design tools · Developer tools · Analytics · No-code · Marketing · Finance · Education · Health | enum |
|---|
product.platforms | at least 1 entry · the same entry may not appear twice | minItems · uniqueItems |
|---|
product.platforms[] | one of web · ios · android · desktop · cli · mcp · api · extension | enum |
|---|
product.links | at least one of website, repo or app_store must be present | anyOf |
|---|
product.logo | requires file | required |
|---|
product.current_features | 3 to 10 entries · the same entry may not appear twice | minItems · maxItems · uniqueItems |
|---|
product.pricing | one of free · freemium · paid · open-source | enum |
|---|
product.team | 1 to 8 entries · the same entry may not appear twice | minItems · maxItems · uniqueItems |
|---|
product.team[] | requires name | required |
|---|
product.agent | requires client | required |
|---|
product.visibility | one of draft · published | enum |
|---|
product | 8 fields must be present: slug, name, tagline, categories, platforms, links, logo, current_features | required |
|---|
product | an unknown field is rejected, not ignored — on the root object and on all 4 nested objects | additionalProperties: false |
|---|
product | links.website, links.repo, links.app_store, links.docs and team[].url must be absolute URLs · agent.connected_at must be an ISO 8601 timestamp | format |
|---|
release.product_slug | must be lowercase letters, digits and hyphens, 3 to 40 characters, starting and ending with a letter or digit | pattern |
|---|
release.kind | one of launch · feature · improvement · fix | enum |
|---|
release.version | must be a version number, with or without a leading “v” and an optional pre-release suffix | pattern |
|---|
release.title | must not be a conventional-commit subject, like “feat:” or “fix(scope)!:” | not.pattern |
|---|
release.changes | 1 to 5 entries | minItems · maxItems |
|---|
release.changes[] | must not contain a source-file extension, like .tsx or .py · must not contain a symbol written like code() · must not contain a source directory, like src/ or components/ | not.anyOf[3] |
|---|
release.screens | 1 to 5 entries | minItems · maxItems |
|---|
release.screens[] | requires file and caption | required |
|---|
release.screens[].sha256 | must be a 64-character lowercase hex hash | pattern |
|---|
release.source | requires type and ref | required |
|---|
release.source.type | one of commit_range · pull_request · tag · changelog | enum |
|---|
release.format | one of carousel · clip · text | enum |
|---|
release.approval | requires approved_by_maker | required |
|---|
release.visibility | one of draft · published | enum |
|---|
release | 6 fields must be present: product_slug, kind, title, summary, changes, source | required |
|---|
release | an unknown field is rejected, not ignored — on the root object and on all 4 nested objects | additionalProperties: false |
|---|
release | approval.approved_at must be an ISO 8601 timestamp | format |
|---|
release.allOf[0] | when kind is launch or feature, screens is required and needs at least 3 entries | if · then |
|---|
release.allOf[1] | when visibility is published, approval is required and approval.approved_by_maker must be true | if · then |
|---|
release.allOf[2] | when format is text, kind must be improvement or fix | if · then |
|---|