Every comparison was owned by a seller.
A comparison site I built for the 14 Swedish umbrella employment companies — 26 fields each, and a scraper that only records a value when it finds that exact string on the provider's own page.
- built with
- TypeScript
- span-matched scraper
- llms-full.txt
- weekly re-read

Live in stealth. Public launch June 2026.
Fourteen providers. Nobody neutral.
whyclose
Every “comparison” on the first page of Google was run by one of the fourteen. Almost right is never right when it is your tax ID on the invoice.
The model refuses to guess.
readIt fetches the provider's own page.
Primary source only. Never a summary, never a secondary write-up, never another comparison site.
matchIt looks for the exact string.
A value is only stored if the characters appear verbatim in the source HTML, and the span is recorded with it.
no matchIf it is not there, the cell stays empty.
This is the whole design. A plausible number is worse than a blank one, because a blank one makes you go and look.
dateEvery value carries when it was read.
Prices change. A figure without a date is a rumour with formatting.
Then they turned on each other.
whyclose
Some were glad. Some were not, at all. I learned more about the category from what they said about their competitors than from any of their own sites. Several have since reached out — not with threats, but to update their rows.
What it tracks. What it won't say.
The whole thing, in four lines.
- the gapFourteen Swedish umbrella companies, an 8× price spread, and every comparison on Google owned by one of them.
- the ruleNo value is stored unless the exact string exists in the provider's own page, with the span and the date recorded.
- the designAn empty cell over a wrong one. A plausible number is worse than a blank one, because a blank one makes you look.
- the resultI told all fourteen I was launching, and they started telling me about each other. Several now write in to correct their own rows.