Skip to content

About

The stuff Hacker News actually recommends: physical products ranked by the commenters who own them.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

HackerBuys logo: orange, grey and blue verdict bars

HackerBuys

The stuff Hacker News actually recommends.

Physical products ranked by the Hacker News commenters who own them, with every opinion linked to its comment.

Visit the site · Keyboards · Buy it for life · How it works

Site Code license: MIT Data: ODC-BY

HackerBuys home page: products ranked by owner verdicts, with orange, grey and blue bars

Why

Hacker News is full of people describing gear they've used for years, like the keyboard they've typed on for a decade or the laptop they regret. Those opinions are buried across millions of threads.

HackerBuys reads those comments and asks three questions: which product is this, did this person actually use it, and what do they think of it? It then ranks products by distinct owners, so one loud commenter counts once.

Features

  • Rankings four ways: most loved, most owned, recommended lately and long-haul.
  • Verdicts adjusted for sample size: 93% from 170 owners can beat 100% from 19.
  • Sources for everything: each opinion links to the original comment.
  • Ownership details: years owned, whether it's still going, and which products people moved to or from.
  • Tags from the data: Buy it for life, People switch to this, Divisive and Skip some generations.
  • Instant search and navigation: a static site with no server, and nothing you type leaves your browser.
Kinesis Advantage page: 180 owners, 93% of verdicts positive, 32 years longest happy owner
Product pages: verdicts, ownership length and where people moved.
Keyboards category sorted by most owned
Categories: with sortable columns.
Search results for standing desk, including products without those words in their names
Search: matches product types, so "standing desk" also finds Fully Jarvis and Uplift.

Status

Extraction runs newest first, and the site updates as it progresses.

As of November 6, 2026
Comments scanned 828,493 of about 41 million
Complete years 2022 to 2026 (through November 4), among comments that match the product filter
Second pass 18,783 comments from 2023 to 2026 that the filter rejected but that name a known product and carry an opinion signal
Earlier years A sample chosen to favor likely product opinions
Product mentions 177,261
Ranked products 2,886 with 3 or more owners, plus 1,534 model pages
Models gpt-6-luna for 2023 to November 3, 2026; Claude Haiku 5.5 for 2022 and the daily updates
Updates Daily, through a GitHub Actions job

How it works

flowchart LR
    A["Hacker News archive<br/>plus recent days"] --> B["Keyword filter<br/>about 4-5% of comments"]
    B --> C["LLM extraction<br/>product, verdict, ownership"]
    C --> D["Results by comment id<br/>resumable by any model"]
    D --> E["Build<br/>rank, tag, render"]
    E --> F["Static pages<br/>on Cloudflare"]
Loading
  1. Collect: the open-index/hacker-news archive through August 2026, then later days from the ClickHouse public demo.
  2. Filter: regular expressions keep comments that mention a product category or brand. This keeps the cost manageable, but it misses opinions that use none of those words.
  3. Extract: a model reads comments in batches and returns validated JSON: brand, line, model, type, verdict, first-hand use, years owned, pros, cons and a verbatim quote.
  4. Rank: the Wilson lower bound over first-hand verdicts, counting each owner once, with neutral verdicts left out.
  5. Publish: each product and category becomes a real HTML page, with JavaScript adding sorting, search and instant navigation.

Accuracy

Extraction is automated and makes mistakes, so treat the site as a starting point. Every comment links to its source.

On 400 labeled comments, scored against labels from Claude Sonnet, the current settings reached about 88% precision and 82% recall, with a margin of about ±7 points. About 97% of extracted quotes appear word for word in their comments.

  • Comments that pass the filter but aren't clearly reviews are the noisiest, so rankings rely on first-hand verdicts.
  • A blind audit of 150 random kept mentions per model, judged by Claude Sonnet, found the first-hand verdicts that drive rankings correct about 84% of the time for Haiku (2022) and 80% for gpt-6-luna (2023), within ±8 points. Mentions by non-owners are right only about a third of the time for both, and Haiku keeps more of them.
  • Rising and Fading tags stay hidden until 2019–2026 are all fully scanned, because comparing years with different coverage would mislead.

Run it yourself

Requires uv and Python 3.12+. Raw data is about 15 GB and isn't in this repo. See scripts/01_funnel.py and scripts/02_enrich.py for the filter stage.

uv sync

# Fetch missing days, newest first (the ClickHouse demo allows 60,000 rows an hour)
.venv/bin/python scripts/21_backfill.py 2026-08-22 2026-11-03

# Queue candidates, newest year first
.venv/bin/python scripts/22_build_queue.py data/extract/queue.parquet

# Extract: stop any time, and rerunning continues where it left off
.venv/bin/python scripts/23_extract.py --adapter codex --model gpt-6-luna --workers 8 --max-credits 50
.venv/bin/python scripts/23_extract.py --adapter claude --model claude-haiku-5-5 --effort low --workers 16 --min-year 2022 --max-year 2022
.venv/bin/python scripts/26_progress.py

# Build the site (this also refreshes corpus/archive from the local queue), then preview it
.venv/bin/python scripts/14_build_site.py
npx wrangler dev

# Test
.venv/bin/python -m unittest tests.test_extract_lib tests.test_site_render tests.test_corpus
node --test tests/site_sort.test.cjs

The Codex adapter re-reads your balance before each batch. It stops below --floor, at --max-credits, if the balance rises, or on a spending limit.

The claude adapter runs Haiku through the Claude Code CLI on a logged-in subscription, with no tools, settings or MCP servers. Thinking can't be turned off there, so a batch takes about 75 seconds; use more workers. On the 400 labeled comments it reached 79% precision and 97% recall, against 88% and 80% for gpt-6-luna, so it keeps more borderline comments. Three failed batches in a row, for example at a usage limit, stop the run.

Pushes to main deploy to Cloudflare Workers automatically.

Daily updates

.github/workflows/daily.yml runs scripts/31_daily.py every morning. It fetches each finished day after the last one covered, queues it with scripts/30_daily_queue.py, extracts it with Haiku, rebuilds the site and pushes, which deploys. It works from a plain checkout because everything the site needs is in corpus/:

  • corpus/archive/<month>.parquet: text and details of the comments already processed from the full local queue
  • corpus/totals.json: candidates per year in the full queue, and its last day
  • corpus/daily/<day>.parquet: the queue for each day after that

The workflow needs a CLAUDE_CODE_OAUTH_TOKEN repository secret, made with claude setup-token. Leftover comments, for example after a usage limit, are picked up the next day.

The 15 GB archive and data/extract/queue.parquet stay local and are only needed to process older years. After a local extraction run, build the site to refresh corpus/archive, then commit it.

Project layout

scripts/    filter, queue, extraction and site build
site/       the published site: generated pages plus app.js, sort.js and style.css
extract/    extraction results, one JSON file per batch
corpus/     comment text for the site build and the daily queues
analysis/   feasibility report, evaluation sets and labels
tests/      Python and JavaScript tests

Early findings are in analysis/REPORT.md.

Credits

License

Code is MIT. Hacker News data keeps its own license and belongs to its authors.

Made by shellbear.

About

The stuff Hacker News actually recommends: physical products ranked by the commenters who own them.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages