Skip to content
autohunt
Reference

launch.json spec

Modeled on the Product Hunt submission form, with the Jocohunt fields in the same file.

Location

Put launch.json at .well-known/launch.json on your site. The folder that holds it is the base URL, and one base URL is one listing. Autohunt looks in the pinged path's folder first, then each parent, and stops at the domain root.

launch.json location examples
CaseRoot sitePinged URL → base URLPinghttps://example.com/Basehttps://example.com/
CaseGitHub project pagePinged URL → base URLPinghttps://dunzkoi.github.io/loupecast/en/Basehttps://dunzkoi.github.io/loupecast/

Ownership is proven by links.website, which must start with the base URL. Relative image paths resolve against the base URL; a website or images on another origin are refused.

URLs are normalized before comparing: lowercase and punycode host, no default port, no trailing dot, no query or fragment. www and the bare domain are different origins.

Fields

The base language is English, as on PH; Korean text goes in i18n.ko.

launch.json v1 fields
Main info
FieldnameTypestringLimit1–40RequiredRequiredProduct HuntName of the launchJocohunt제품 이름
FieldtaglineTypestringLimit1–60RequiredRequiredProduct HuntTaglineJocohunt한 줄 소개
FielddescriptionTypestringLimit1–500 (≤260 recommended)RequiredRequiredProduct HuntDescriptionJocohunt설명
Fieldlinks.websiteTypeHTTPS URLLimit200 + <title>, starts with base URLRequiredRequiredProduct HuntLinks (first)Jocohunt웹사이트
Fieldlinks.githubTypeURL | nullLimit—RequiredOptionalProduct HuntLinksJocohuntGitHub
Fieldlinks.otherTypeURL[]Limit—RequiredOptionalProduct HuntLinksJocohunt—
FieldopenSourceTypebooleanLimit—RequiredOptionalProduct HuntIs this an open source project?Jocohunt—
FieldxTypestring | nullLimithandle after x.com/RequiredOptionalProduct HuntX account of the launchJocohunt—
FieldphTagsTypestring[]Limit0–3RequiredRecommendedProduct HuntLaunch tagsJocohunt—
FieldfirstCommentTypestring | nullLimit—RequiredRecommendedProduct HuntFirst commentJocohunt—
Images and media
Fieldmedia.thumbnailTypepath | URLLimitsquare ≥240px, PNG/JPEG/GIF/WebP, ≤2,097,152 BRequiredRequiredProduct HuntThumbnailJocohunt로고
Fieldmedia.galleryType(path | URL)[]Limit1–8, 1270:760 ±2%RequiredRequiredProduct HuntGalleryJocohunt스크린샷
Fieldmedia.videoTypeYouTube/Loom URL | nullLimit—RequiredRecommendedProduct HuntVideo / LoomJocohunt데모 영상
Fieldmedia.interactiveDemoTypeURL | nullLimit—RequiredOptionalProduct HuntInteractive demoJocohunt—
Makers
Fieldmakers[]Type{ name, x?, github?, producthunt?, email?, role? }[]Limitname requiredRequiredRecommendedProduct HuntMakersJocohunt메이커
FieldsubmitterIsMakerTypebooleanLimit—RequiredOptionalProduct HuntDid you work on this product?Jocohunt—
Extras
FieldpricingType"free" | "paid" | "freemium"Limit—RequiredRecommendedProduct HuntPricingJocohunt가격 모델
FieldpromoType{ offer, code, expires } | nullLimitall three or nullRequiredOptionalProduct HuntPromo codeJocohunt—
FieldlaunchDateTypeYYYY-MM-DD | nullLimitfuture date shows from that day (KST)RequiredOptionalProduct HuntLaunch dateJocohunt—
Autohunt and Jocohunt only
FieldcategoriesTypeenum[]Limit1+ of 14, no duplicatesRequiredRequiredProduct Hunt—Jocohunt카테고리
FieldstageType"idea" | "development" | "beta" | "launched"Limit—RequiredOptionalProduct Hunt—Jocohunt단계
FieldfeedbackWantedTypeenum[]LimitUX, 가격, 아이디어 검증, 네이밍, 마케팅, GTMRequiredOptionalProduct Hunt—Jocohunt받고 싶은 피드백
FielddraftTypebooleanLimittrue is never collectedRequiredOptionalProduct Hunt—Jocohunt—
Fieldi18n.koType{ tagline?, description?, firstComment? }Limitsame limitsRequiredRecommendedProduct Hunt—Jocohunt한국어 문구

Length is counted in code points; one Hangul syllable or one emoji is 1. Promo all-or-none and the same-origin rule cannot be expressed in JSON Schema, so only the server checks them.

Full example

The example from the policy, the same value as examplePayload in the MCP's autohunt_get_guide.

launch.json example
{  "$schema": "https://autohunt.flowoodz.com/schema/launch.v1.json",  "version": 1,  "name": "Loupecast",  "tagline": "Free, open-source Screen Studio alternative for macOS",  "description": "A free, open-source Screen Studio alternative for macOS. It records your screen and zooms toward each click.",  "links": {    "website": "https://dunzkoi.github.io/loupecast/en/",    "github": "https://github.com/dunzkoi/loupecast",    "other": []  },  "openSource": true,  "x": "flowoodzx",  "phTags": [    "Open Source",    "Design Tools",    "GIFs"  ],  "categories": [    "크리에이터 도구"  ],  "pricing": "free",  "stage": "launched",  "promo": null,  "firstComment": "I wanted click-zoom screen recordings on macOS for free, so I built Loupecast in the open.",  "media": {    "thumbnail": "/launch/thumbnail.png",    "gallery": [      "/launch/gallery-1.png",      "/launch/gallery-2.png",      "/launch/gallery-3.png"    ],    "video": null,    "interactiveDemo": null  },  "makers": [    {      "name": "Dun Z",      "x": "flowoodzx",      "producthunt": null,      "github": "dunzkoi",      "role": "maker"    }  ],  "submitterIsMaker": true,  "feedbackWanted": [    "UX",    "아이디어 검증"  ],  "launchDate": null,  "i18n": {    "ko": {      "tagline": "macOS용 무료 오픈소스 Screen Studio 대안",      "description": "macOS용 무료 오픈소스 Screen Studio 대안입니다. 화면을 녹화하면서 클릭한 곳으로 확대합니다.",      "firstComment": "macOS에서 클릭 확대 녹화를 무료로 쓰고 싶어서 Loupecast를 공개로 만들었습니다."    }  }}

Checks

Any error blocks the listing; warnings never do. Each message comes with its fix.

Errors

  • required

    A required value is missing: version, name, tagline, description, links.website, categories, media.thumbnail, media.gallery, makers[].name.

  • invalid_typeinvalid_value

    Wrong type, or a value not in the allowed list (version is 1; pricing, stage, feedbackWanted).

  • too_long

    Over 40 for name, 60 for tagline, or 500 for description. The same goes for i18n.ko; length is counted in code points.

  • too_many_tags

    More than 3 phTags.

  • categories_emptycategory_unknowncategory_duplicate

    categories is empty, has a value outside the 14, or repeats one.

  • promo_partial

    Only some of promo's offer, code, and expires are filled.

  • date_format

    promo.expires or launchDate is not a real date in YYYY-MM-DD.

  • website_not_https

    links.website is not an https:// URL.

  • website_not_owned

    links.website does not start with the base URL.

  • website_statuswebsite_no_title

    The website does not return 200, or not HTML with a <title> (when a deployed site is checked).

  • video_unrecognized

    media.video is not a YouTube (watch, youtu.be, shorts, embed) or Loom (share, embed) URL.

  • thumbnail_not_squarethumbnail_too_small

    The thumbnail is not square or is under 240 px.

  • gallery_emptygallery_too_many

    The gallery is empty or has more than 8 images.

  • gallery_ratio

    A gallery image is more than 2% off 1270:760.

  • image_typeimage_too_largeimage_no_sizeimage_fetch_failed

    By its bytes the image is not PNG, JPEG, GIF, or WebP; is over 2,097,152 bytes; has no size within the first 256 KB; or could not be fetched.

  • asset_other_originasset_invalid

    An image is an absolute URL on another origin, or not a valid URL.

  • draft

    "draft": true. It is not collected.

Warnings

  • description_long

    The description is over 260.

  • gallery_few

    Fewer than 3 gallery images.

  • gallery_narrow

    A gallery image is narrower than 1270 px.

  • video_missing

    No demo video.

  • first_comment_missing

    No firstComment.

  • i18n_ko_missing

    An i18n.ko tagline, description, or firstComment is empty. Korean pages show the English value.

  • makers_alone

    No maker besides the submitter.

  • ph_tag_unknown

    A phTags value is not in the embedded PH tag list.

  • promo_expired

    promo.expires is in the past.

  • pricing_missing

    No pricing.

Image checks (type, size, dimensions) run only against a deployed site. A draft alone gets the field rules.

Esc

↑↓ move · Enter open · Esc close