å telle lesere uten å følge dem

10. september 2026 meta analyticsprivacysvelte

Jeg ville vite om noen faktisk leser denne bloggen. Ikke hvem de er, bare om innleggene jeg bruker kveldene mine på faktisk blir sett, hvilke sider folk lander på, og om de blir eller spretter videre. Det normale svaret er å lime inn et script fra et analyseselskap og la dem finne det ut, men hele poenget med dette prosjektet er at ingenting forlater serveren min. Så jeg bygde det selv.

Reglene jeg satte før jeg skrev en eneste linje kode: ingen tredjeparter, ingenting samles inn før den besøkende sier ja, og ingenting lagres som kan identifisere en person. Det som lagres er en tilfeldig besøks-id (en UUID nettleseren finner opp selv, ingenting utledet fra deg), stien du besøkte med spørrestrenger fjernet, og henvisningsadressen bare hvis du kom fra en annen side. Ingen IP-adresser i analysetabellen, ingen user agents, ingen fingerprinting.

Samtykke er et lite banner med et ekte valg, og valget huskes. Si nei (eller si ingenting) og analysekoden starter rett og slett aldri. Si ja og nettleseren lager sin egen id og begynner å rapportere sidevisninger. Det finnes også en bryter i bunnteksten for å ombestemme seg senere, som sletter informasjonskapselen.

The analytics tab in admin, pageviews and visitors over the last days

Delen jeg liker best er hvordan "tid på siden" fungerer. I stedet for å spore når du forlater siden (noe nettlesere uansett gjør upålitelig), sender siden en liten heartbeat hvert 15. sekund, men bare mens fanen faktisk er synlig:

function startHeartbeat() {
    stopHeartbeat();
    heartbeatTimer = setInterval(() => {
        if (document.visibilityState === 'visible') sendEvent('heartbeat');
    }, HEARTBEAT_INTERVAL_MS);
}

Så et innlegg som ligger åpent i en bakgrunnsfane hele dagen teller for ingenting, og fire heartbeats betyr at noen faktisk så på siden i et minutt. Lesetid målt på en måte som ikke kan lyve mye i noen av retningene.

Innsamlingsendepunktet på blogg-tjenesten svarer 204 uansett hva. Feil nyttelast, rate limited, database nede, det sier 204. Det er ingenting nyttig en angriper kan lære av å prøve seg på det, og en ødelagt analysepipeline skal aldri ødelegge selve siden for en leser. Hendelser eldre enn 90 dager feies automatisk ut, fordi analyse fra forrige sesong er trivia, ikke informasjon.

Feilen som er verdt å innrømme: den første versjonen av samtykkebanneret ba om samtykke uten å lenke til personvernerklæringen, så det ba deg godta noe det aldri forklarte. Kodegjennomgangen fanget det opp. Banneret lenker nå til erklæringen, og erklæringen fikk en seksjon som forklarer nøyaktig hva som samles inn (listen over) og hva som ikke gjør det. Det manglet også et Secure-flagg på besøkskapselen, som ble fikset i samme slengen.

Adminpanelet fikk en analysefane der jeg endelig kan se tallene: sidevisninger, unike besøkende, mest populære sider, henvisninger, og hvor lenge folk blir. Det viser seg at noen av dere faktisk leser de lange innleggene. Det var genuint hyggelig å lære, og jeg lærte det uten å vite en eneste ting om hvem dere er.

0 kommentarer

Logg inn for å kommentere.

Logg inn

Glemt passord?

Ingen konto?