Show HN Launch Predictor
Betathink-reason-learn/show-hn-launch-predictorPredicts whether a Show HN post will reach 100+ points on Hacker News, and explains what pulled the score up or down.
Scores a draft Show HN post (title, optional text, optional link) for its chance of reaching 100+ points on Hacker News.
Returns an outlook (weak / average / strong / front-page contender), the hit rate of recent posts with that outlook next to the base rate, and the checks that pulled the score up or down, written as feedback. Use it in a loop: draft, score, rewrite what pulled the score down, score again.
It reads only what HN readers see before clicking (the title, the text and the site the link points to) and never opens the link.
Built with ThinkReasonLearn: plain-language checks answered by a language model and combined by a trained, auditable scorer. Trained on 4,885 Show HN posts from 2024 to May 2026 and tested on posts from June to October 2026, it ranks recent launches at 0.82 AUC, against 0.78 for a word-matching baseline. Posts it calls "front-page contender" reached 100+ points 9% of the time, about 6x the 1.6% base rate.
Send the post as the user message: the first line is the title, the rest is the text. Or send a JSON object with title, text, url. The reply is a JSON object.
Quality
- Hit AUC, later posts
- 0.82
- word-matching baseline 0.78
- Hit rate at front-page contender
- 9.2%
- vs 1.6% base rate
Limits
Where the model was trained, and where to trust it less.
- It judges the post, not the product, and never opens the link.
- Hacker News is noisy: even front-page contenders miss about 91% of the time.
- hit_probability runs high at the top and very low at the bottom; quote level_hit_rate for the odds.
- Trained on posts from 2024 to May 2026. Tastes drift, and very new kinds of projects are less reliable.
- Posting time and the author's history are not used.
- Pulled up / pulled down are what the model noticed, not a guarantee.
Input
| Field | Type | Description |
|---|---|---|
| titlerequired | text | Title. Up to 80 characters. |
| url | url | Link. Never opened; only the site HN shows is read. |
| text | text | Text. Up to 20,000 characters. |
Output
The output object of POST /v1/predict. Over chat completions, the same JSON is the reply content.
| Field | Type | Description |
|---|---|---|
| outlook | string | weak | average | strong | front-page contender |
| level_hit_rate | number | How often recent held-out posts with this outlook reached 100+ points. The number to quote. |
| hit_probability | number | Calibrated probability of 100+ points. Good for ranking drafts; runs high at the top end. |
| base_rate | number | Share of recent Show HN posts that reach 100+ points (0.016). |
| pulled_up, pulled_down | array | Up to 5 checks each: {check, answer, effect}, written as feedback. |
| title_as_scored, site_as_shown | string | The title and site label as HN would show them. |
| warnings | string[] | E.g. the title is over 80 characters, or the text was cut. |
Call it
POST /v1/predict with your API key, any OpenAI SDK pointed at our base URL, or OpenRouter under the same id.
curl https://api.thinkreasonlearn.com/v1/predict \
-H "Authorization: Bearer $TRL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "think-reason-learn/show-hn-launch-predictor",
"input": {
"title": "Show HN: Pgline – a single-binary Postgres change-data-capture tool in Rust",
"url": "https://github.com/danadev/pgline",
"text": "Hi HN, I'\''m Dana. I kept running Debezium + Kafka just to stream row changes from Postgres into a few services, which felt like a lot of moving parts for a small…"
}
}'