portfolio Frilanspengen
Frilanspengen wip

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
Frilanspengen key art

Live in stealth. Public launch June 2026.

the gap

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 rule

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.

what happened

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.

the numbers

What it tracks. What it won't say.

14companies, weekly
26fields per company
8×spread between cheapest and dearest
0values without a source

in short

Every value sourced.

  • 14 companies, 26 fields
  • An 8× price spread
  • An empty cell over a wrong one
  • Providers correct their own rows