ON PRISJAKT / RESEARCH CAPTUREThe same Prisjakt product card with Deal Radar in personal research mode.

03 / Browser extension · Product engineering / 2026

The price is visible.
Its history should be too.

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.

Explore the project ↓Deal Radar

THE PROJECT / 03

The same product,
with its history.

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.

WORK
Manifest V3 · adapters · scoring · storefront integration
SOURCES
Prisjakt and PriceRunner research adapters
OUTCOME
Personal research prototype
The same Prisjakt product card with Deal Radar in personal research mode.
With Deal Radar

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.

The same Prisjakt product card with Deal Radar in personal research mode.
With 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.

  1. COMPARE

    Product identity and price basis

  2. NORMALISE

    One comparable vote per day

  3. ASSESS

    Robust horizons and credibility

  4. 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.