producthunt-launches — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited producthunt-launches (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Input: date/period parameters → Output: structured product launch data with maker profiles and website contact info
All process output to user (progress updates, process notifications) follows the user's language.
Extract complete product launch data from Product Hunt leaderboard pages, enriched with maker profile information and product website contact details.
solve-captcha or wait for auto-passIf browser-act has been confirmed available in the current session → skip this step.
Invoke browser-act via Skill tool to load usage. If installation or configuration issues arise, follow its guidance to resolve then retry.
Product Hunt uses Cloudflare protection. On first navigation:
wait stable --timeout 15000 then check title againsolve-captchaThis Skill's operational boundary = what the user can manually do in their browser. It only reads data already displayed to the user on the page, never bypassing authentication or access controls. JS code is encapsulated in Python files under thescripts/directory, invoked viaeval "$(python scripts/xxx.py)".$(...)is bash syntax; use the bash tool for execution.
Navigate to the target leaderboard URL first, then extract:
eval "$(python scripts/extract-leaderboard.py)"
URL patterns (navigate to the appropriate one before extraction):
https://www.producthunt.com/leaderboard/daily/{YYYY}/{M}/{DD}/allhttps://www.producthunt.com/leaderboard/weekly/{YYYY}/{week-number}/allhttps://www.producthunt.com/leaderboard/monthly/{YYYY}/{M}/allhttps://www.producthunt.com/leaderboard/yearly/{YYYY}/allReplace all with featured for featured-only products.
Output example:
[
{
"rank": 1,
"name": "Product Name",
"tagline": "Short product description",
"categories": ["Productivity", "AI"],
"thumbnail": "https://ph-files.imgix.net/...",
"upvotes": 135,
"comments": 42,
"url": "https://www.producthunt.com/products/product-slug",
"slug": "product-slug"
}
]Navigate to the launch page URL first (https://www.producthunt.com/products/{slug}/launches/{launch-slug}), then extract:
eval "$(python scripts/extract-launch-detail.py)"
To find the launch URL from a product page: navigate to https://www.producthunt.com/products/{slug} and look for links matching /products/{slug}/launches/{launch-slug}.
Output example:
{
"name": "Product Name",
"tagline": "Short product tagline",
"description": "Full product description from OG meta",
"categories": ["Productivity", "Social Media"],
"images": ["https://ph-files.imgix.net/gallery1.png", "https://ph-files.imgix.net/gallery2.png"],
"websiteUrl": "https://product-website.com/?ref=producthunt",
"upvotes": 135,
"launchDate": "2025-05-27T07:26:33-07:00",
"makers": [{"href": "/@username", "name": "Maker Name"}],
"ogImage": "https://ph-files.imgix.net/og-image.png"
}Navigate to maker profile URL (https://www.producthunt.com/@{username}), then extract:
eval "$(python scripts/extract-maker-profile.py)"
Output example:
{
"name": "Maker Name",
"slug": "@username",
"headline": "Creating SaaS Products",
"aboutText": "Bio text about the maker",
"links": ["https://twitter.com/username", "https://linkedin.com/in/username"],
"followers": 22,
"url": "https://www.producthunt.com/@username"
}Navigate to the product website URL, wait for load, then extract:
eval "$(python scripts/extract-website-content.py)"
Alternatively, use stealth-extract for faster extraction without a browser session: stealth-extract {website-url} --content-type markdown then parse the markdown for email patterns.
Output example:
{
"title": "Product Website Title",
"url": "https://product-website.com",
"email": "[email protected]",
"allEmails": ["[email protected]", "[email protected]"],
"websiteRawText": "Full visible text content of the website..."
}Complete pipeline replicating the full Product Hunt scraper workflow:
wait stable → eval "$(python scripts/extract-leaderboard.py)"a. Navigate to https://www.producthunt.com/products/{slug} → find launch link → navigate to launch page b. wait stable → eval "$(python scripts/extract-launch-detail.py)" → get full details + maker links + website URL
scrapeMakers is enabled) For each unique maker from step 2:a. Navigate to https://www.producthunt.com/{maker.href} → wait stable → eval "$(python scripts/extract-maker-profile.py)"
scrapeWebsite is enabled) For each product website URL from step 2:a. Navigate to website URL → wait stable → eval "$(python scripts/extract-website-content.py)"
Final output example per product:
{
"date": "2026-06-10T00:00:00Z",
"launchDate": "2026-06-10T07:01:04Z",
"url": "https://www.producthunt.com/products/product-slug",
"name": "Product Name",
"shortDescription": "Short tagline",
"description": "Full description text",
"categories": ["Productivity", "AI"],
"maker": {
"makerHref": "https://www.producthunt.com/@username",
"name": "Maker Name",
"slug": "@username",
"url": "https://www.producthunt.com/@username",
"links": ["https://twitter.com/maker", "https://linkedin.com/in/maker"],
"aboutText": "Maker bio text"
},
"websiteUrl": "https://product-website.com",
"images": ["https://ph-files.imgix.net/image1.png"],
"upvotes": 135,
"website": {
"title": "Product Website",
"url": "https://product-website.com",
"email": "[email protected]",
"websiteRawText": "Full page text content..."
}
}No pagination required for daily/weekly leaderboard: All products for a given day load on a single page (typically 15-50 products per day). No infinite scroll or "load more" button exists.
Yearly leaderboard: May contain many products. Apply topNProducts filter to limit. All visible products are rendered on the single page.
result count >= 1 (at least one product extracted from leaderboard)name, tagline, upvotes, url present for every productwebsiteUrl or maker present for enriched itemssolve-captcha on first visit/all URL path (used by older scrapers) now returns 404; use /leaderboard/daily/ path insteadPath: browser-act-skill-forge-memories/producthunt-scraper-producthunt-launches.memory.md (working directory is determined by the Agent running the Skill)
Before execution: If the file exists, read it first — it records unexpected situations encountered during past executions (e.g., a strategy has become ineffective); adjust strategy order accordingly.
After execution: If an unexpected situation is encountered (strategy became ineffective, page redesigned, anti-scraping upgraded, better path discovered), append a line: {YYYY-MM-DD}: {what happened} → {conclusion}
Normal execution does not write to the file.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.