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.
Top comments (0)