Raw schema
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string"
},
"pitch": {
"type": "string",
"description": "One paragraph in the maker's own words."
},
"facts": {
"type": "object",
"properties": {
"stage": {
"type": "string",
"enum": [
"idea",
"prelaunch",
"live",
"revenue"
]
},
"pricingModel": {
"type": "string",
"enum": [
"free",
"freemium",
"paid",
"lifetime"
]
},
"categories": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ai",
"b2b",
"content",
"design",
"dev",
"directory",
"extension",
"free",
"hardware",
"indie",
"local",
"marketing",
"marketplace",
"mobile",
"no-code",
"open-source",
"prelaunch",
"productivity",
"saas",
"web"
]
},
"description": "Every audience and form factor this product belongs to, not just the main one. A product is often several at once, and one missing tag is one directory it never hears about: a repository holding a browser extension and a web app is `extension` and `web`, and an open-source AI dev tool is `open-source`, `ai` and `dev`. Look at what the product actually ships before you answer: a manifest.json means `extension`, an ios or android target means `mobile`, a public repository means `open-source`, a workspace with several of those means all of them. Tags: ai, b2b, content, design, dev, directory, extension, free, hardware, indie, local, marketing, marketplace, mobile, no-code, open-source, prelaunch, productivity, saas, web."
}
},
"description": "Same shape qualify_project takes: stage, pricingModel, categories, and the booleans."
},
"pack": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Exactly as it should appear in a listing."
},
"url": {
"type": "string",
"description": "The page a visitor lands on, not a waitlist."
},
"tagline": {
"type": "string",
"description": "One line, no product name, no full stop. Max 60 characters."
},
"oneLiner": {
"type": "string",
"description": "A sentence that works as a meta description. Max 140 characters."
},
"shortDescription": {
"type": "string",
"description": "The paragraph most directory forms ask for. Max 260 characters."
},
"longDescription": {
"type": "array",
"items": {
"type": "string"
},
"description": "Two or three paragraphs, for the forms with room."
},
"categories": {
"type": "array",
"items": {
"type": "string"
},
"description": "Three at most, in the platform's own vocabulary where it has one."
},
"pricing": {
"type": "string",
"description": "What it costs, in a sentence a form can take."
},
"makerBio": {
"type": "string",
"description": "Asked for by launch platforms, not by plain directories. Max 160 characters."
},
"firstComment": {
"type": "array",
"items": {
"type": "string"
},
"description": "Product Hunt and Show HN only, and it matters there."
},
"logoUrl": {
"type": "string",
"description": "Square, transparent, 512px or better. A URL, or the path to the file on the machine your agent runs on."
},
"coverUrl": {
"type": "string",
"description": "1270x760, the size every gallery accepts. A URL or a local path."
},
"galleryUrls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Three to five, first one a poster slide. URLs or local paths."
},
"demoVideoUrl": {
"type": "string",
"description": "Optional almost everywhere, decisive on a few. A URL or a local path."
}
}
}
},
"required": [
"name"
]
}