Price tracking and forum deal alerts, with summaries you can trust
Deal Radar watches the prices of products I care about and the deal forum where good prices surface first. When something is worth acting on it sends one Telegram message: the product, the price, and two or three sentences on what the people in the thread actually think of it.
It is self-hosted and runs on a Raspberry Pi 5 at home. I built it because the deals that matter are short-lived: a store reprices just after midnight, a forum thread fills with replies within minutes, and the stock is gone within the hour.
Edifier M60 desktop speakers, black, 6,668 TL on Amazon. The thread is positive: normally around 12,000 TL and shared earlier at 9,000 and 7,000, and several members bought it. One member reports the price went back up to about 7,800 TL shortly after; Amazon is the seller, so returns are not expected to be a problem.
An example summary, translated from Turkish. The notifications themselves are in Turkish.
-- 01
Every store is scraped with plain HTTP and Cheerio first. Playwright is started only for stores that need JavaScript, or when the cheap pass cannot confirm a promotion. Per-store behaviour lives in one config file: structured-data parsers where the store publishes them, CSS selectors where it does not.
-- 02
Each scan records how fast a thread is collecting replies. A thread notifies when its velocity or a sudden burst crosses a threshold. For brand-new threads that are unusually fast, a small LLM check reads the first comments and can veto the alert when the community is openly dismissing the deal, which is how this forum usually says “too expensive”.
-- 03
A summary is generated at the moment a notification fires, never per scan, and is cached on the deal. That keeps the volume at about a dozen summaries a day and the model bill at a couple of dollars a month. The model sees the opening post and the latest comments, and has to report the community’s verdict, not its own.
-- 04
A TypeScript monorepo: a worker with a scheduler, a retrying job queue and a circuit breaker for the forum, a Next.js dashboard, and PostgreSQL through Drizzle. Everything ships as Docker containers, deploys go through a GitHub Actions runner on the Pi, and a deploy is refused for any commit that has not passed CI.
A summary that leaves out a detail is a small failure. A summary that says the community likes a deal when it does not is a notification that costs money. So the model behind the summaries is chosen by a benchmark, not by reputation.
| Model, production prompt | Misleading | Must-have points |
|---|---|---|
| Production model | 3% | 0.90 |
| Claude Opus 5.5 | 6% | 1.00 |
| Claude Sonnet 5.5 | 19% | 0.93 |
| Claude Haiku 5.5 | 39% | 0.86 |
90 summaries per model. The gap between the production model and Opus 5.5 is inside the benchmark’s noise; the gaps to Sonnet and Haiku are not.
The open question is whether Opus keeps that quality inside the production latency and token budget. That is the next benchmark run, and it is the one that decides whether the summarizer moves to Claude.