Hopp til hovedinnhold

Dokumentasjon

Hvordan dashbordet ble utviklet: tidslinje, oppbygging, beslutninger, funn, kontroll og ressursbruk.

Sist oppdatert 23. september 2026.

Sammendrag

Dashbordet analyserer en Matomo-eksport for politiet.no (1. jan. 2023 – 24. juni 2026). Det kjører lokalt, leser alle data fra en lokal SQLite-database og sender ingenting til eksterne tjenester. Grensesnittet finnes på bokmål og engelsk.

Datagrunnlag
26 694 CSV-filer (UTF-16), 437 MB; daglige totaler for hele perioden, detaljerte rapporter fra 1. des. 2025
Sider
Vanlige spørsmål, Oversikt, Innhold, Trafikkilder, Publikum, Atferd, Datakvalitet, Dokumentasjon
Eksport
PDF, PowerPoint (redigerbare diagrammer) og Excel
Kodebase
≈ 5 100 linjer TypeScript i 67 filer, 24 commits
Utviklingstid
Om lag 2 timer og 15 minutter i én økt med Claude (Cowork)

Tidslinje

Arbeidet ble gjort i fire faser. Hver fase ble planlagt, godkjent av deg og så bygget i små, kontrollerte steg med én commit per steg.

Faser
FaseInnhold
1 – GrunnmurNext.js-prosjekt, import av eksporten til SQLite, spørringslag, fem sider, kontrollskript
2 – Datakvalitet og eksportDatakvalitetsside med styring, sikker ny import, eksport til PDF/PowerPoint/Excel, lokal avviksdeteksjon
3 – AtferdBokmål/engelsk, måloppnåelse, felles definisjoner av atferdsmål, sporingsendringer, 13 vanlige spørsmål, ny Atferd-side
4 – Tilgjengelighet og dokumentasjonWCAG 2.2 AA, mobilvisning, denne siden
Commits
FaseCommitBeskrivelse
1de447c7chore: scaffold Next.js 16 app
17c946bdfeat(data): import the Matomo CSV export into SQLite
11bd3880feat(data): add typed server-side query layer
111e3cb9feat(ui): dashboard shell and chart components
1df3d931feat(ui): overview, content, acquisition, audience and behaviour pages
191538d0feat(data): add data verification script
1c93be54docs: phase 1 README and plan with data findings
2bf0ee12refactor(data): share CSV helpers and make the import atomic
2f486a63feat(health): shared data-health checks
2bb34331feat(health): data health page with import controls
22285c69feat(insights): local anomaly detection and share changes
210d2838feat(export): PDF, PowerPoint and Excel exports
2bbe3dfbdocs: phase 2 notes, README and changelog
3309b70afeat(i18n): Norwegian (bokmål) and English interface
325f0c53fix(i18n): make the language switch visible on every page
39237c44fix(i18n): move the language toggle back to the sidebar
3fba0b34feat(behaviour): goal conversions, metric definitions and tracking-change detection
3f5d7ca4feat(questions): common questions page, batch 1
3f244801feat(behaviour): reorganise the Behaviour page into sections
313bbe15feat(questions): batch 2 questions and behaviour sections
36938abbfeat(export): common questions in exports and behaviour checks
49670e73feat(a11y): WCAG 2.2 AA and responsive pass
4a375387docs: documentation page (/docs) and consistent ?lang= links
4–docs: sustainability (cost, energy, CO₂, water) on the documentation page

Oppbygging

Dataflyt: Matomo-eksport (CSV) → pnpm ingest → data/analytics.db (SQLite) → spørringer på serveren → sider og eksporter. Rådata og databasen ligger bare lokalt og er holdt utenfor git.

Viktige filer
StedRolle
scripts/ingest.tsLeser UTF-16-filene og bygger databasen; bytter inn ny fil først når den er ferdig
scripts/verify.tsKontrollerer databasen mot Matomos totaler og tilfeldige råfiler
src/lib/analytics.tsTilkobling, perioder, nøkkeltall, topplister, kanaler, avvik
src/lib/behaviour/Definisjoner av atferdsmål, spørringer, sporingsendringer og svarene på vanlige spørsmål
src/lib/health.tsDatakvalitetskontroller (brukes av siden og av verify-data)
src/lib/report.ts, src/lib/export/Én rapportmodell som gjengis som PDF, PowerPoint og Excel
src/lib/i18n/Ordbøker (bokmål er fasit, engelsk må ha samme nøkler) og formatering
src/components/Diagrammer, tabeller, kort, filterrad, meny
  • Next.js 16 (App Router) med TypeScript og Tailwind CSS 4, pnpm som pakkehåndterer.
  • Database: SQLite via Node sin innebygde node:sqlite – ingen databaseserver og ingen innebygde tillegg.
  • Diagrammer: egne SVG-komponenter etter dataviz-retningslinjene, alltid med tabellvisning.
  • Eksport: pdfkit, pptxgenjs og exceljs.

Hva som er laget

  • Import og kontroll: 786 000 rader på ca. 11 sekunder på Mac-en; 19 kontroller av totaler, dekning, avstemminger og mål.
  • Oversikt: nøkkeltall mot forrige periode, trender, ukedager, kanaler, uvanlige perioder (med norske helligdager som forklaring) og største endringer.
  • Vanlige spørsmål: 13 spørsmål med beregnet svar, nøkkeltall, diagram og lenke til detaljer.
  • Atferd: digital anmeldelse, skjemakvalitet, tjenester, søk, navigasjon, samtykke, feil og hastighet, Politiloggen, enheter og kanaler.
  • Datakvalitet: kontroller, dekning per måned, sporingsendringer, importstatistikk og knapper for ny import (bare localhost).
  • Eksport: samme tall som på skjermen, på valgt språk og for valgt periode.
  • Tilgjengelighet: kontrast ≥ 4,5:1, synlig fokus, hopp-til-innhold, sidetitler, riktig overskriftsstruktur, tabellsemantikk, 24 px trykkflater, mobilmeny.

Beslutninger

Beslutninger og begrunnelser
BeslutningBegrunnelseAlternativ
SQLite via node:sqlitenpm-registeret var blokkert i utviklingsmiljøet; ingen innebygde tillegg å installere; raskt nok for 786 000 raderDuckDB
Egne SVG-diagrammerIngen nye avhengigheter, full kontroll over tilgjengelighet og tabellvisningRecharts/ECharts
Ingen AI/LLMDin beslutning; unngår å sende data til eksterne tjenesterClaude API via Bedrock (EU) eller lokal modell
Søkeord vises bare ved ≥ 20 besøkPublikum kan skrive personopplysninger i søketVise alle søkeord
«Direkte» beregnesEksporten mangler direkte besøk; total minus andre kanalerUtelate kanalen
Relative perioder slutter på siste dag med dataEksporten slutter 24. juni 2026Slutte på dagens dato (tomme grafer)
Ny import bygges i egen fil og byttes innDashbordet ser aldri en halvferdig databaseSkrive rett i databasen
Styringsknapper bare på localhostKnappene kjører skript på maskinenInnlogging (senere, ved deling)
Atferdsmål definert ett stedEndrede hendelsesnavn rettes på ett stedHendelsesnavn i hver side
Mål tolket og kontrollertMålnavn manglet; mål 10 og 12 stemmer eksakt med hendelserVente på navn fra Matomo
Egen tall- og datoformateringServer og nettleser må gi identisk tekstIntl/toLocaleString (ga feil)
Bokmål som standard, typede ordbøkerManglende oversettelse gir kompileringsfeilBare engelsk
Commit-historikk per stegSporbarhet; hvert steg kompilerer for segÉn stor commit
WCAG 2.2 AAKrav for offentlig sektor–

Funn i dataene

  • 44 % av besøkene som trykker «Logg inn og anmeld», ender med innsendt anmeldelse; største frafall er før anmeldelsen opprettes.
  • Krasj i anmeldelsesskjemaet øker: fra ca. 20 til 25 per 100 innsendte anmeldelser.
  • 75 % av besøkene er fra mobil, men PC gir 3,4 ganger så mange anmeldelser per 1 000 besøk.
  • Timebestilling for pass er den største oppgaven (ca. 1,2 mill. klikk per 90 dager).
  • 78 % av dem som tar et valg, godtar informasjonskapsler.
  • Politiloggen er ca. 25 % av sidevisningene; appen får forespørselsfeil i ca. 96 av 100 besøk som henter meldinger.
  • Sporingsendring 26. feb. 2026 (Finn, klikk på timebestilling); søkeordrapporten stoppet 27. apr. 2026 (kjent).
  • Trafikktopp 25. juni – 22. juli 2024 (+353 %) og i okt.–nov. 2024, ikke forklart av helligdager.
  • Mål 10 = anmeldelse sendt inn og mål 12 = klikk til timebestilling pass; mål 1, 8 og 13 mangler navn.

Kontroll

  • Daglige totaler avviker 0,003 % fra Matomos periodetotaler; besøk per enhet summerer eksakt til daglige besøk på alle 206 dager.
  • Tilfeldige råfiler leses på nytt og sammenlignes ved hver kontroll.
  • Alle commits kompilerer (TypeScript) hver for seg; ESLint uten feil.
  • Alle sider testet på begge språk, for flere perioder, i lys og mørk modus og på 375 px bredde.
  • Alle eksportformater åpnet og kontrollert visuelt.
  • Egen tilgjengelighetsrevisjon: kontrast mot faktisk bakgrunn, overskriftsrekkefølge, etiketter, dupliserte id-er, tabellsemantikk og trykkflater.

Ressursbruk og bærekraft

Tallene gjelder hele utviklingsøkten fram til 23. sep. 2026 kl. 17.50 UTC, inkludert denne dokumentasjonen. Oppdateringen av dette avsnittet kommer i tillegg.

Modellkall
284
Verktøykall
367
Varighet
ca. 2 t 15 min
Nye input-tokens
568
Lest fra hurtigbuffer
119,4 mill.
Skrevet til hurtigbuffer
0,83 mill.
Output-tokens
0,45 mill.
Effektivt forbruk
≈ 15,9 mill. input-token-ekvivalenter

Effektivt forbruk vekter tokens etter kostnad: lesing fra hurtigbuffer ≈ 0,1×, skriving til hurtigbuffer ≈ 2× og output ≈ 5× et vanlig input-token. Fordelingen under er et anslag.

Effektivt forbruk per område (mill.)
OmrådeMill.
Filer og kommandoer på din maskin
8,73
Claudes instruksjoner (lest hver gang)
3,14
Svar og planlegging
1,66
Innebygd nettleser (testing)
1,44
Skyarbeidsområde (filer og kommandoer)
0,89
Nettsøk
0,08

Økonomi

Beregnet med Anthropics listepriser for Claude Opus 5.5 (API): input 4 USD, skriving til hurtigbuffer 8 USD (1 time), lesing fra hurtigbuffer 0,20 USD og output 20 USD per million tokens. Omregnet med 1 USD = 9,42 NOK (22. sep. 2026). Brukes dashbordet gjennom et Claude-abonnement (Team/Enterprise), betaler Politiet for plassene og ikke per token; tallene er da en referanse for hva arbeidet koster i ressurser.

Kostnad etter listepris
PostTokensPris per mill.Kostnad
Lest fra hurtigbuffer119,4 mill.0,20 USD23,87 USD
Output0,45 mill.20 USD8,99 USD
Skrevet til hurtigbuffer0,83 mill.8 USD6,65 USD
Nye input-tokens5684 USD< 0,01 USD
Sum≈ 39,50 USD ≈ 372 NOK
  • Per commit: ≈ 16 NOK (24 commits). Per time utvikling: ≈ 165 NOK.
  • Hurtigbufferen gjorde arbeidet om lag 12 ganger billigere: uten den ville de samme tokenene kostet ≈ 490 USD (≈ 4 600 NOK).
  • Selv om lesing fra hurtigbuffer er billig per token, står den for 60 % av kostnaden, fordi hele samtalen leses på nytt ved hvert steg.

Miljø

Anthropic publiserer ikke energi- eller vannbruk per token, så tallene bygger på uavhengig forskning og er anslag med stor usikkerhet (størrelsesorden). Hvert kall i denne økten hadde flere hundre tusen tokens med kontekst, og regnes derfor som «langt kall»: 3,9 Wh (spenn 0,31–7,1 Wh per kall). Datasenterstrøm er satt til 0,35–0,60 kg CO₂e per kWh og vannbruk i datasenteret til 0,18–1,2 liter per kWh.

Anslått miljøavtrykk for hele økten
MålLavtSentraltHøyt
Energi0,09 kWh1,1 kWh2,0 kWh
CO₂e (datasenterstrøm)0,03 kg0,5 kg1,2 kg
Vann (kjøling i datasenteret)0,02 l0,8 l2,4 l

Det tilsvarer omtrent (sentralt anslag)

  • Energi: 40 minutter av strømforbruket i en gjennomsnittlig norsk husholdning (14 700 kWh per år), 11 liter vann kokt i vannkoker, eller om lag 75 fulle mobilladinger.
  • CO₂: 5 km kjøring med en gjennomsnittlig ny personbil (96,7 g CO₂ per km i 2025); spennet tilsvarer 0,3–12 km.
  • Vann: omtrent tre kopper vann.
  • Hadde strømmen vært norsk (17 g CO₂e per kWh), ville utslippet vært ≈ 19 gram – om lag 25 ganger lavere.
  • Mac-en som kjørte dashbordet og kommandoene brukte i tillegg anslagsvis 0,05–0,1 kWh på norsk strøm (1–2 g CO₂e).

Hva som reduserer forbruket

  • Hurtigbuffer (allerede brukt): den største enkeltbesparelsen, både i kroner og beregning.
  • Mindre utskrift fra kommandoer og filer: store resultater blir liggende i samtalen og leses på nytt ved hvert steg.
  • Kortere økter eller en ny økt per fase, slik at konteksten ikke vokser seg stor.
  • En mindre modell for enkle, mekaniske steg.
  • Selve dashbordet bruker ingen AI og nesten ingen ressurser i drift: det leser en lokal database.

Kilder

Begrensninger og videre arbeid

  • Detaljerte rapporter finnes bare fra 1. des. 2025; eldre data må eventuelt eksporteres på nytt fra Matomo.
  • Store rapporter er begrenset til 500 rader per dag (resten i «Others»).
  • Stegene i anmeldelsen telles per dag, ikke per besøk gjennom hele løpet.
  • Navn på mål 1, 8 og 13: lagre Goals.getGoals som goals.json i eksportmappen og importer på nytt.
  • Koden er ikke publisert ennå: git push krever at GitHub-innlogging (SSH eller gh) er satt opp på Mac-en.
  • Deling med flere brukere krever innlogging og tilgangsstyring.

Kjøre dashbordet

Kommandoer
KommandoHva den gjør
pnpm installInstallerer avhengigheter (Node 22.13 eller nyere)
pnpm ingestBygger databasen fra eksportmappen (--verify kontrollerer sjekksummer først)
pnpm verify-dataKjører datakontrollene i terminalen
pnpm devStarter dashbordet på http://localhost:3000
pnpm build && pnpm startProduksjonsbygg