joel taylor pedrós
blog

linkedin or interpol (profile or wanted): the photo gave it away

a grey 200 by 200 square next to a blue 1,583 by 1,583 one, to scale, under the title sharp meant wanted.

4 in 10 players mistake a linkedin profile with a passport photo for an interpol fugitive. the number comes from profile or wanted, the game where you see a face and have to say whether it's from a linkedin profile or a wanted notice.

in march, every game was 30 rounds, some n8n scripts pulled interpol notices and linkedin profiles every day through google's api, and there were over 3,000 profiles. since then i've rebuilt it from scratch, and now there are games of 5 to 50 rounds, an endless one and a daily challenge. this post is about the photos, and about why for months the game measured something other than what it said it did.

the game gave the answer away

in july i took 60 random photos of each kind and measured them. nearly all the linkedin ones were 200 pixels a side and about 5 kb, because they were google's thumbnail of the profile photo. the interpol ones varied a lot, and some were very detailed. blown up to the size of the board, the linkedin ones always looked equally soft, and a sharp photo could only be from a notice. anyone who noticed learned that sharp meant wanted, and got it right.

in october 2025 i had already patched it. i told the image component to serve them all at 100 pixels instead of 500, to even them out. it didn't fix it.

before changing anything i made a copy of the data to compare against. the length of the short side alone was enough to sort 99.0% of the photos i could measure into linkedin or interpol. the Content-Type header on its own, image/jpeg from google and image/JPG from interpol, got 96.2% right. players got 77.7% right. a program that never looked at a face beat every one of them.

downloading the interpol photos

until september, the game stored a link to each face's photo, not the photo itself. to process them before serving them, i had to download them. each notice's photo comes from /notices/v1/red/{id}/images on the interpol api. the ones i got from it had a median of 265 pixels on the short side, and the largest 10% were over 1,500.

downloading them wasn't simple. the interpol api answers 403 to anything that isn't a browser, and 429 if you send it requests in parallel. now the script serves a small page on 127.0.0.1 that stays open in chrome. the page makes each request the script hands it and passes back the response, and the script decides everything else.

the new photos went in on 20 september, as version 2 of each face. hit counters are per photo version and not per person, so the answers to the old photos stayed as the record of the old photo.

levelling down

an interpol photo can be 1,583 pixels on its short side. a linkedin one is a 200-pixel google images thumbnail, a jpeg at a quality of about 72. both get blown up to the same 768-pixel board, and then the interpol one comes out sharp and the linkedin one soft. sharp still meant wanted.

improving the linkedin ones wasn't possible. for the 1,518 linkedin entries i only had the link to the google thumbnail, and the google search api i'd used to find them no longer accepts new customers. on 25 july, a new project got a 403, and the service shuts down for good on 1 january 2027. on top of that, of the 1,516 thumbnails that still responded, 191 weren't a photo of a person: company banners, certificates, a stop sign, the linkedin logo and 57 copies of three default images.

so 200 pixels is the ceiling, and the interpol ones had to come down to it without touching what's in them. the rule i set myself is to normalise the medium and not the photo. resolution, compression and format, yes. lighting, framing, background and expression, no, because they're what the game asks you to read. no converting to black and white and no histogram equalisation.

the 200-pixel funnel

first you need to know how much detail a photo really has, and that isn't its size in pixels. a 150-pixel thumbnail blown up to 600 still holds 150 pixels of information. the measure i use is the smallest side i can shrink the square crop to and scale it back up from without dropping below 38 db of psnr against the original, with lanczos for both steps. on 4 october it gave this, in pixels:

medianp95maxover 200
profiles, 1,3171522002171
notices, 3211624821,271126

a crop with more than 200 pixels of real detail goes through the same thing google did to every profile:

def thumbnail_pass(square: Image.Image) -> Image.Image:
    small = square.resize((THUMB_SIZE, THUMB_SIZE), Image.LANCZOS)
    buf = io.BytesIO()
    small.save(buf, "JPEG", quality=THUMB_QUALITY)
    with Image.open(io.BytesIO(buf.getvalue())) as decoded:
        return decoded.convert("RGB")

the jpeg is there on purpose. the blocks and halos of quality-72 compression are part of how a profile looks, as much as the resolution. a crop of 200 or less is left alone.

diagram of the thumbnail step: the notice photo is cropped to a square anchored on the face, its real detail is measured and, if it's over 200 pixels, it's shrunk to 200, saved as a jpeg at quality 72 and decoded before being scaled up to 768 pixels as webp.
a crop with 200 pixels of detail or less goes straight to the board, as before.

measured on the crop the board uses, 124 of the 321 notices are over 200. after the step, at board size, they have a median of 144 and a p95 of 204, the same as a sample of 300 profile boards. i also tried shrinking each photo to a size drawn from the profiles' distribution, and the median dropped to 108. that's why it's a fixed 200.

i redid the notices already in the game in place, without a new version, because it's the same photo with one clue fewer. the script only overwrites a face if the stored original photo produces, byte for byte, the board currently being served, and then it purges cloudflare's cache and checks the result by its hash.

what happened to accuracy

with the old photos, from 25 july to 20 september, players got 5,143 of the 6,408 answers on the 252 notices right, 80.3%. with the new photos, since 20 september, they've got 10,151 of 13,133 right, 77.3%. they're the same notices, and i count every mode and repeat answers too. the 77% includes two weeks when the new photos were still sharper than the linkedin ones, because the funnel only arrived on 4 october.

which photo makes players get it wrong

with the photos evened out, it was finally possible to look at what kind of photo fools people. on 29 september, claude sonnet scored all 500 faces in the game blind, 248 profiles and 252 notices. each photo was a numbered file, with no id or name, and they were mixed half and half, as in the game. for each one it gave the probability that it came from interpol and up to 6 tags from a closed list of 31, such as passport photo, professional portrait, smiling, serious or low resolution. the instructions banned it from using apparent ethnicity, nationality, skin colour, age or the person's looks. two blind passes agreed with a spearman correlation of 0.91.

then i crossed the tags with the answers. i only count each player's first answer to each face, in normal games from 22 september to 6 october:

  • with a linkedin profile with a passport photo, 42% get it wrong, 186 of 444
  • with a profile with a professional portrait, 21%
  • with a notice where the fugitive is smiling, 37%
  • with a notice with a serious face, 18%
  • with a low-resolution profile, 43%
bar chart of the percentage of players who get it wrong depending on the photo. for linkedin profiles, blurry photo 43%, passport photo 42%, all profiles 29% and professional portrait 21%. for interpol notices, smiling 37%, in a suit jacket 35%, all notices 26% and serious face 18%.
each player's first answer to each face, in normal games, from 22 september to 6 october 2026.

taken together, the clue works. sonnet tagged 164 of the 252 notices as passport photos and only 23 of the 248 profiles, and 74 profiles and 2 notices as professional portraits. the game gets hard on the exceptions, the profile with a passport photo or the notice with a smile. and a blurry photo makes people think of a criminal, even when it's a profile.

these scores now decide which faces get into the game. the interpol half was too easy. the median notice was guessed right by 81% of players, and 221 of the 252 were men. now the notices that sonnet finds least obvious go in, women first, and no issuing country can make up more than 40% of the accepted ones. that cap came from a batch in which 24 of the 40 were from russia. every new face goes in on trial, and stays or is retired depending on how many players get it right.

how people find it

most players arrive from bing, which sent 428 clicks in 14 days, against 11 from google. and on bing nobody searches for the game's name. of the 85 searches that lead to it, none is "profile or wanted". the one with the most clicks is "linkedin or interpol", with 100, and the second is "linkedin o interpol", with 76.

98% of those clicks come from a computer, and there are 40 a day on weekdays and 7 at weekends. one of the 85 searches is "interpol or linkedin unblocked". it all points to people playing on a school or work computer.