I built a product-rankings site that writes itself on a local LLM — the stack
Most "best X tools" sites are a content treadmill: someone has to keep researching, writing and refreshing dozens of roundups. I wanted to see how much of that could run itself, on hardware I already own, with zero cloud
Most "best X tools" sites are a content treadmill: someone has to keep researching, writing and refreshing dozens of roundups. I wanted to see how much of that could run itself, on hardware I already own, with zero cloud-AI cost. The result is live at topratingshub.com — independent, data-driven rankings of software, apps, AI tools, devices and finance products. Here's the architecture and the lessons.
The stack
- Astro (SSG) — every page is static HTML, 0 KB of JS shipped. Fast, cheap to host, great Core Web Vitals.
-
A local LLM as the writer, served with vLLM on an ARM64 box. The pipeline is
ground → extract facts → write → quality-gate → revise. The quality gate is another local model call that scores the draft; anything under threshold gets one revision pass or is dropped. - Real grounding: before writing, it fetches and extracts current pricing/specs from primary sources and feeds the top sources (big context budget) to the writer, so the output has actual numbers instead of vibes.
- systemd timers, not a babysitter: one nightly content run, a monthly topic-discovery job, health checks every 15 minutes, daily backups, a weekly digest.
- IndexNow + JSON-LD (Article, ItemList, Breadcrumb, FAQ) so search engines pick up changes fast.
Topic discovery for free
Instead of guessing what to write, a monthly job pulls Google Autocomplete suggestions for seed terms per category. Those are real, popularity-ordered queries ("best crm for small business", "notion vs airtable"), so the content targets things people actually search — no paid keyword tool required.
The lesson that mattered most: never let a transient outage mutate durable state
The shared LLM crashed under load a few times. The first version of the nightly job kept running anyway and marked ~200 topics as permanently error (they hit the retry cap while the model was down). A transient infra blip had quietly burned real work.
The fix was two lines of principle:
- Gate on the dependency. The nightly job now checks the model's health first; if it's down, it skips the whole run and burns nothing.
- Self-heal + alert. A watcher restarts the model container after sustained downtime and pings me, instead of failing silently for days.
# nightly content job, simplified
if ! curl -sf http://localhost:8000/v1/models >/dev/null; then
echo "writer down — skipping run, no topics burned"; exit 0
fi
run_batch && build && indexnow_ping
If you're building anything autonomous: monitor your linchpin dependency, not just your own web endpoints, and make outages harmless rather than destructive.
Takeaways
- You can run a genuinely useful, self-updating content site on local hardware for the cost of electricity + a domain.
- Grounding + a quality gate is the difference between "AI slop" and something worth reading.
- The hard part isn't generation — it's the operational safety net around it.
The live result is topratingshub.com. If you run a product in one of those categories and want a clearly-labeled placement, that's on the advertise page — the editorial ranking itself is never for sale, which is the whole point of it being trustworthy.
Happy to answer stack questions in the comments.
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.