Discover product-submission directories from public alternatives pages such as SaaSHub.
submission-site-discovery is a lightweight discovery tool for finding sites similar to Product Hunt, BetaList, Uneed, and other launch / directory platforms. It is designed to start from known seed products, crawl public alternatives pages, extract real external destination URLs, and merge those findings into a shortlist of candidate submission sites.
This repository is intentionally scoped as a lightweight public-page discovery implementation, not a full universal graph crawler.
Product marketing teams often know a few obvious launch sites, but the long tail of smaller directories is fragmented and hard to discover systematically. This repo exists to make that first discovery layer reproducible:
- start from known seed products or launch platforms
- follow public alternatives relations
- extract real outbound websites
- merge repeated discoveries into a stronger shortlist
The current implementation is meant to support the discovery stage only. It does not yet validate submission flows or automate actual submissions.
Today, the implemented path is centered on SaaSHub-style public alternatives pages.
The crawler currently:
- starts from
/<slug>-alternativespages such as/product-hunt-alternatives - finds external website links from product cards (
title="Visit Website") - increments
?page=Nto continue discovery page by page - normalizes URLs and merges repeated discoveries across seeds
- writes structured outputs such as
candidates.jsonl,shortlist.csv, andreview_notes.md
This repository should not be read as a claim that general topology crawling is solved.
More complex sources such as AlternativeTo often require more advanced tooling or capabilities, for example:
- browser automation / JS execution
- more complex pagination and state handling
- stronger anti-bot handling
- richer relation extraction and graph traversal
So the current implementation is best understood as:
a practical discovery tool built around SaaSHub and similar public alternatives pages, not a general-purpose submission-site graph engine.
Direct dependencies are intentionally light:
- Python stdlib:
urllib,ssl,re,csv,json - optional
certififor SSL compatibility on some macOS setups
Install the optional dependency with:
pip install certifiThere is also an implicit runtime dependency on the current behavior of SaaSHub's public pages.
SaaSHub is behind Cloudflare, but the public alternatives pages currently appear to be on a relatively basic protection mode:
- bare requests may return
403 Forbidden - standard HTTP requests with a Chrome-like
User-Agentmay still return200 OK
That means the current script works because the public alternatives HTML is still directly obtainable under that protection level.
It does not mean Cloudflare is generally bypassed.
If SaaSHub upgrades those pages to stronger defenses such as:
- JS challenge
- Turnstile
- CAPTCHA
then this implementation will stop working and require a more advanced fallback strategy.
The current repo does not rely on:
- Playwright
- Selenium
- proxy pools
- third-party unlocking services
submission-site-discovery/
├─ README.md
├─ LICENSE
├─ .gitignore
├─ config/
│ └─ seeds.json
├─ demo/
│ └─ demo-products.txt
└─ scripts/
└─ discover_submission_sites.py
python3 scripts/discover_submission_sites.py discover \
--config config/seeds.json \
--product "Product Hunt" \
--output-root outputspython3 scripts/discover_submission_sites.py discover \
--config config/seeds.json \
--products-file demo/demo-products.txt \
--output-root outputs# validate config
python3 scripts/discover_submission_sites.py validate --config config/seeds.json
# print execution plan
python3 scripts/discover_submission_sites.py plan --config config/seeds.json --product "BetaList"
# initialize run scaffold only
python3 scripts/discover_submission_sites.py init-run --config config/seeds.json --product "BetaList"Each run writes artifacts under outputs/runs/<timestamp>/.
| File | Purpose |
|---|---|
manifest.json |
run metadata and overall status |
seed_inputs.jsonl |
normalized seed inputs |
frontier.jsonl |
source-task execution records |
candidates.jsonl |
full candidate rows with evidence |
shortlist.csv |
simplified ranked shortlist |
review_notes.md |
run summary, caveats, and crawl notes |
The default config lives at config/seeds.json.
Key fields:
graph_sources: declared source sites (currently includes SaaSHub and scaffold entries such as AlternativeTo)anchor_sites: known seed platforms / canonical examplesquery_seeds: descriptive phrases used to orient the discovery projectlimits: crawl-related guardrails
The optional saashub_slug field can be added when the seed name's normal slug does not match SaaSHub's real path.
Example:
{
"name": "Uneed",
"saashub_slug": "uneed-best"
}- The current implementation is optimized for public SaaSHub alternatives pages.
AlternativeTois still listed as a graph source scaffold, not a fully implemented adapter.- Live requests may still be blocked depending on Cloudflare behavior.
- This repo only finds candidate sites; it does not verify actual submission forms or automate submissions.
Short-term:
- improve fail-fast diagnostics when SaaSHub protection tightens
- expand parser coverage for edge-case card layouts
- improve scoring and evidence aggregation
Medium-term:
- add more source adapters where static HTML access is realistic
- separate source reliability scoring from candidate scoring
- add better output summaries for manual review
Long-term:
- support richer topology discovery with browser-assisted or hybrid crawling
- validate submission paths as a separate downstream workflow
- turn discovery outputs into reusable submission operations
This repository is published by SeeleAI as part of its open-source product growth tooling.
Seele is building Seele01 Game Model, with current product capabilities centered on generating Three.js and Unity games from natural language. Related API and workflow capabilities are being opened up over time.
- Website: https://www.seeles.ai
- Organization: https://github.com/SeeleAI
MIT.