A Chrome extension I built that puts a product’s price history on the product card itself, as five small scores, so you can see whether today’s price is actually good. A personal research prototype on Swedish price-comparison sites.
Price history already exists on sites like Prisjakt and PriceRunner, but it sits behind a graph that most people never open, and a price one krona below a long flat history can look like a record low. I built Deal Radar for my own shopping research, to bring that history to the moment of choosing. It adds a score strip to each product card, with a score for the last 30 days, 90 days, six months and year, plus an overall score, and an evidence panel that opens the history, confidence and sources behind them. It is a personal research prototype, and it runs on the real storefronts.
Same product · same browser session · Prisjakt · 7 September 2026
01 / On the real storefront
Context beside the thumbnail, never on top of it.
This is a real Prisjakt card, captured with the extension off and then on, in the same session on 7 September 2026. The score strip sits in its own shelf between the image and the product text instead of covering the thumbnail: annotating a card should never hide what the retailer put there.
The price and the scores describe that moment only. They show the interface, not a recommendation to buy.
Without extensionWith Deal Radar
Same product · same browser session · Prisjakt · 7 September 2026
Capture provenance+
The browser ran the real extension in personal research mode, and its price-history requests succeeded. I kept a record of the settings and the panel text. No demo products or synthetic history are used in this comparison.
Source: Real Prisjakt capture, radar-live-evidence.json and original card screenshots.
02 / Open the reasoning
A small score you can open up.
I did not want a verdict like “great deal”. The evidence panel shows how today’s price compares with the last 30 days, 90 days, six months and year, and the daily prices, medians, credible lows and confidence behind each number.
The overall score weights recent history most: 40 %, 30 %, 20 % and 10 % for the four periods, rescaled over the periods that have enough data. It needs at least two of them, and a period without enough data shows a dash instead of borrowing a neighbour’s score.
The real extension evidence panel from the same browser session.
Why the same price can tell different stories+
In this captured case, the one-year comparison is less unfavourable than the recent-history comparisons. Showing the horizons separately stops the annual median from flattening that distinction. The panel also keeps basis and variant warnings visible instead of treating a score as proof of a fully comparable offer.
Source: docs/scoring.md; backend/scoring.mjs; real evidence-panel capture.
03 / Avoid false certainty
One vote per day, and no outlier deleted.
Every observation is reduced to one comparable price per calendar day, so that repeated snapshots in one day do not outvote the rest of the history, and a single implausible low cannot decide what a good price is. A period needs at least ten observed days before it counts.
I weight each day by how credible its price is and use robust percentiles, so a suspicious value loses influence without being silently deleted. A band of 8 % of the median keeps a tiny cut after a long flat history from scoring as a perfect deal.
COMPARE
Product identity and price basis
NORMALISE
One comparable vote per day
ASSESS
Robust horizons and credibility
EXPLAIN
Numbers, confidence and provenance
A concrete scoring example+
My deterministic fixtures give a neutral 50 for a flat 30-day history and 56 for a 1% reduction after that flat history. These are explicit synthetic test cases for the scorer, not data from the storefront demonstration.
Source: docs/scoring.md and backend/scoring.test.mjs.
04 / Fit the host page
An extension should belong where it appears.
The strip is mounted inside the card’s own layout, so it scrolls and moves with the card instead of chasing it around the screen. Layouts it cannot annotate safely are left alone.
The extension asks the matching site for the product’s history and scores it locally, in the browser. If a source refuses, for example with “too many requests”, or fails three times in a row, the extension pauses it for 60 seconds and shows a Retry button, so that an outage never looks like an absence of good deals. A separate, opt-in Prisjakt mode can filter a whole result page by score; the demonstration here uses the ordinary card view.
Original browser recording on Prisjakt, 7 September 2026. Personal research mode.
Product status+
In September 2026 the extension is at version 0.1.1, with scoring model v0.3. That release passed 183 automated tests and 11 browser checks against synthetic storefronts. The two sites’ history data is undocumented, so I use it for personal research only. A production data source has not been chosen or licensed, and this is not a commercial service.
Source: README; docs/CURRENT.md; Manifest V3 implementation; research adapters; original browser recording.
Guided scroll · scroll or press Escape to take over