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
4d91 36c6 c8e0 db6c
A real listing photo from the index, and the fingerprint we compare.photo → 64 bits
0101 · 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.
Two titles for the same object in our index. They share 2 of 11 words; shared words are lit.
0202 · 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.
0303 · 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…
Greyscale. Colour is thrown away; brightness is what survives recompression.
Y = 0.299·R + 0.587·G + 0.114·B
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.
Shrink to 32×32 by averaging the pixels in each cell. Deliberately the simplest resampler, because every platform must reproduce it exactly.
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.
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.
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
0404 · 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.
0505 · 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.
Threshold
Recall
False matches
≤ 6 bits
97%
0
≤ 10 bits (used)
98%
0
≤ 14 bits
99%
0
≤ 16 bits
99%
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:
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.
0606 · 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 say
It becomes
Applied as
a phone tripod
item = tripod
Must match the product, not one seller’s title
under $15
price ≤ $15
Hard rule: nothing above it qualifies
ships from the US
origin = US
Hard rule, declared per listing
arrives this week
arrival
Not measured. No source gives delivery dates, so nothing is eliminated on it
that won’t look cheap
a preference
Shown struck through: heard, not applied
0707 · 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.
0808 · 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.
0909 · 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.