How it works

One photograph, sixty-four bits.

Sellers write different titles for the same thing, and most products have no barcode. So we match the photograph. Here is every step, with the working shown.
Fingerprint
64 bits
Same product if
≤ 10 bits differ
Pairs compared
74,691
Recall, false matches
98% · 0
Supplier photo: Custom Pattern Ceramic Mug Heat Resistant Coffee Cup
4d91 36c6 c8e0 db6c
A real listing photo from the index, and the fingerprint we compare.photo → 64 bits
01 · The problem

Nobody writes the same words for the same thing.

Comparison sites match products by barcode, brand or title. Most things sold online are unbranded and carry no barcode, and every seller writes their own title. Two listings of one object can share almost no words.

  • Seller AMountaineering Leisure And Tactical High-Capacity Backpack For Men And Women
  • Seller BLarge-capacity Commuter Outdoor Travel Backpack
Two titles for the same object in our index. They share 2 of 11 words; shared words are lit.
02 · The insight

Resellers never reshoot anything.

A reseller uploads the supplier’s media pack unchanged, so the same image file turns up on every listing of the same object. The titles lie; the photograph does not. Matching it is closer to comparing checksums than to judging similarity.

$6.61
$7.77
Two listings in the index: different files on the seller's CDN, different titles, identical fingerprints. Hover either photo to see its fingerprint.
03 · The method

From a photograph to 64 bits.

Five steps, in plain arithmetic, so the browser, the extension and the index builder all produce identical bits. Drag through them below on a real listing. It runs in your browser with the same code that built the index.

Stage 01 of 05

The photograph

As the seller uploaded it — the supplier's own shot, unchanged.

Fingerprint
4d91 36c6 c8e0 db6c
Status
reading the photograph…
  1. Greyscale. Colour is thrown away; brightness is what survives recompression.
    Y = 0.299·R + 0.587·G + 0.114·B
  2. Trim. Marketplaces pad photos onto white squares by different amounts. A border is cropped only if it is genuinely uniform, so two encodings of one photo get the same crop.
  3. Shrink to 32×32 by averaging the pixels in each cell. Deliberately the simplest resampler, because every platform must reproduce it exactly.
  4. Transform. A 2-D discrete cosine transform turns the 32×32 picture into frequencies. The top-left 8×8 block is the coarse shape of the image; that is what we keep.
    F(u,v) = Σx Σy f(x,y) · cos(π(2x+1)u / 64) · cos(π(2y+1)v / 64) keep 0 ≤ u,v < 8, skip (0,0) → 63 coefficients

    Computed as two 1-D passes. The [0,0] coefficient is the average brightness, which says nothing about content, so it is skipped, leaving 63.

  5. Threshold at the median. Each coefficient above the median becomes a 1, the rest 0. Half the bits are set by construction, which is why every distance in the index is even.
    bit(i) = 1 if F(i) > median(F), else 0
04 · Comparing

How far apart are two photographs?

Count the bits that differ. That count, the Hamming distance, is the whole comparison. Two unrelated photographs differ by about 32 bits, because each bit is a coin flip against the other. The same photograph after a CDN resizes and recompresses it differs by a handful.

d(a, b) = popcount(a XOR b) 0 ≤ d ≤ 64
0 bits
The pair above, bit for bit. 0 bits differ; red marks any that do.
05 · The line

Why 10 bits is the line.

We measured it. Sixty real product photos were put through the resizing, recompression and padding a marketplace applies; those must match. Different products from the same search, the hardest fair test, must not.

ThresholdRecallFalse matches
≤ 6 bits97%0
≤ 10 bits (used)98%0
≤ 14 bits99%0
≤ 16 bits99%2

Ten leaves six bits of room before the first false match. In the live index, every one of the 74,691 pairs lands like this:

8 pairs at 0 bits — same object1 pairs at 2 bits — same object2 pairs at 8 bits — same object3 pairs at 10 bits — same object2 pairs at 12 bits — different objects5 pairs at 14 bits — different objects35 pairs at 16 bits — different objects126 pairs at 18 bits — different objects450 pairs at 20 bits — different objects1410 pairs at 22 bits — different objects3470 pairs at 24 bits — different objects6855 pairs at 26 bits — different objects10834 pairs at 28 bits — different objects13771 pairs at 30 bits — different objects13846 pairs at 32 bits — different objects11105 pairs at 34 bits — different objects7065 pairs at 36 bits — different objects3633 pairs at 38 bits — different objects1480 pairs at 40 bits — different objectsTHRESHOLD 10NEAREST NON-MATCH 12same objectdifferent objects0481216202428323640BITS OF HAMMING DISTANCE
Every pair in the index by distance. The two populations are scaled separately: 14 matching pairs against 74,670 is a ratio no shared axis can draw.

The honest number: in the live index the closest two different products get is 12 bits, a narrower margin than the calibration set.

The case that decides the threshold: two listings close to the line. Red bits are the ones that differ.

Both listings are in the index, 14 bits apart with the threshold at 10. They were not merged.
06 · Your words

Reading what you asked for.

You describe what you want the way you would to a person. We pull out what can be checked, show it back to you as chips, and say plainly what we could not turn into a rule. No model and no API key: the parser is deterministic.

You sayIt becomesApplied as
a phone tripoditem = tripodMust match the product, not one seller’s title
under $15price ≤ $15Hard rule: nothing above it qualifies
ships from the USorigin = USHard rule, declared per listing
arrives this weekarrivalNot measured. No source gives delivery dates, so nothing is eliminated on it
that won’t look cheapa preferenceShown struck through: heard, not applied
07 · The gate

Cheapest that fits, not cheapest anywhere.

Every candidate is checked against every rule. One that fails is out, with the reason kept, rather than ranked lower. The answer is the cheapest that passes, and if none pass, the answer is none.

A real run over the index for “resistance bands under $60 that ship from the US”: 8 candidates, each dot one product. Every one failed a rule, so the answer is none. We would rather say that than hand back a near miss.
08 · Order

What decides the order.

What passes the gate is ordered on price, then how well it matches what you named, then whether the listing is complete.

What is not on that list: anything we are paid for. Some outbound links earn a commission; it is added after the order is decided and cannot change it. What we don’t do is the full list.

09 · Limits

What this does not do well, yet.

  • Breadth. One catalogue is connected today, so most products have one seller and the spreads are small. Adapters for more stores are written and waiting on accounts.
  • Delivery dates. No source returns them, so we report them as not measured rather than guess.
  • Pack size and revision. The same photo is strong evidence of the same product, not proof of the same quantity or version. Both photos are always shown.
  • Price history. It cannot be backfilled, so it starts the day daily snapshots do.
  • Heavy edits. A tiny thumbnail or a heavily padded photo can move a fingerprint past the line. Those are missed, not mismatched, which is the safe direction.
Try it yourself

Watch a photo become 64 bits.

The five steps above, running in your browser on a real listing. Scroll through them, then drop in a photo of your own: it never leaves this tab.

01 / 05The photoAs the seller uploaded it. Usually the supplier's own shot, unchanged.
02 / 05GreyscaleColour is the first thing a reseller changes. Shape is not.
03 / 05Border trimmedShops pad photos onto white by different amounts, so a uniform border is cropped.
04 / 0532 × 32Shrunk to a tiny square, so only the overall structure is left.
05 / 0564 bitsEach low-frequency detail becomes a 1 or a 0. This is the fingerprint we compare.
It runs in your browser. Your photo never leaves this tab.
Start

Now try it on anything.

Describe it. We'll show every price, which one fits, and tell you when nothing does.