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.
| Fase | Innhold |
|---|---|
| 1 – Grunnmur | Next.js-prosjekt, import av eksporten til SQLite, spørringslag, fem sider, kontrollskript |
| 2 – Datakvalitet og eksport | Datakvalitetsside med styring, sikker ny import, eksport til PDF/PowerPoint/Excel, lokal avviksdeteksjon |
| 3 – Atferd | Bokmål/engelsk, måloppnåelse, felles definisjoner av atferdsmål, sporingsendringer, 13 vanlige spørsmål, ny Atferd-side |
| 4 – Tilgjengelighet og dokumentasjon | WCAG 2.2 AA, mobilvisning, denne siden |
| Fase | Commit | Beskrivelse |
|---|---|---|
| 1 | de447c7 | chore: scaffold Next.js 16 app |
| 1 | 7c946bd | feat(data): import the Matomo CSV export into SQLite |
| 1 | 1bd3880 | feat(data): add typed server-side query layer |
| 1 | 11e3cb9 | feat(ui): dashboard shell and chart components |
| 1 | df3d931 | feat(ui): overview, content, acquisition, audience and behaviour pages |
| 1 | 91538d0 | feat(data): add data verification script |
| 1 | c93be54 | docs: phase 1 README and plan with data findings |
| 2 | bf0ee12 | refactor(data): share CSV helpers and make the import atomic |
| 2 | f486a63 | feat(health): shared data-health checks |
| 2 | bb34331 | feat(health): data health page with import controls |
| 2 | 2285c69 | feat(insights): local anomaly detection and share changes |
| 2 | 10d2838 | feat(export): PDF, PowerPoint and Excel exports |
| 2 | bbe3dfb | docs: phase 2 notes, README and changelog |
| 3 | 309b70a | feat(i18n): Norwegian (bokmål) and English interface |
| 3 | 25f0c53 | fix(i18n): make the language switch visible on every page |
| 3 | 9237c44 | fix(i18n): move the language toggle back to the sidebar |
| 3 | fba0b34 | feat(behaviour): goal conversions, metric definitions and tracking-change detection |
| 3 | f5d7ca4 | feat(questions): common questions page, batch 1 |
| 3 | f244801 | feat(behaviour): reorganise the Behaviour page into sections |
| 3 | 13bbe15 | feat(questions): batch 2 questions and behaviour sections |
| 3 | 6938abb | feat(export): common questions in exports and behaviour checks |
| 4 | 9670e73 | feat(a11y): WCAG 2.2 AA and responsive pass |
| 4 | a375387 | docs: 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.
| Sted | Rolle |
|---|---|
| scripts/ingest.ts | Leser UTF-16-filene og bygger databasen; bytter inn ny fil først når den er ferdig |
| scripts/verify.ts | Kontrollerer databasen mot Matomos totaler og tilfeldige råfiler |
| src/lib/analytics.ts | Tilkobling, 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.ts | Datakvalitetskontroller (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
| Beslutning | Begrunnelse | Alternativ |
|---|---|---|
| SQLite via node:sqlite | npm-registeret var blokkert i utviklingsmiljøet; ingen innebygde tillegg å installere; raskt nok for 786 000 rader | DuckDB |
| Egne SVG-diagrammer | Ingen nye avhengigheter, full kontroll over tilgjengelighet og tabellvisning | Recharts/ECharts |
| Ingen AI/LLM | Din beslutning; unngår å sende data til eksterne tjenester | Claude API via Bedrock (EU) eller lokal modell |
| Søkeord vises bare ved ≥ 20 besøk | Publikum kan skrive personopplysninger i søket | Vise alle søkeord |
| «Direkte» beregnes | Eksporten mangler direkte besøk; total minus andre kanaler | Utelate kanalen |
| Relative perioder slutter på siste dag med data | Eksporten slutter 24. juni 2026 | Slutte på dagens dato (tomme grafer) |
| Ny import bygges i egen fil og byttes inn | Dashbordet ser aldri en halvferdig database | Skrive rett i databasen |
| Styringsknapper bare på localhost | Knappene kjører skript på maskinen | Innlogging (senere, ved deling) |
| Atferdsmål definert ett sted | Endrede hendelsesnavn rettes på ett sted | Hendelsesnavn i hver side |
| Mål tolket og kontrollert | Målnavn manglet; mål 10 og 12 stemmer eksakt med hendelser | Vente på navn fra Matomo |
| Egen tall- og datoformatering | Server og nettleser må gi identisk tekst | Intl/toLocaleString (ga feil) |
| Bokmål som standard, typede ordbøker | Manglende oversettelse gir kompileringsfeil | Bare engelsk |
| Commit-historikk per steg | Sporbarhet; hvert steg kompilerer for seg | Én stor commit |
| WCAG 2.2 AA | Krav 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.
| Område | Mill. |
|---|---|
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.
| Post | Tokens | Pris per mill. | Kostnad |
|---|---|---|---|
| Lest fra hurtigbuffer | 119,4 mill. | 0,20 USD | 23,87 USD |
| Output | 0,45 mill. | 20 USD | 8,99 USD |
| Skrevet til hurtigbuffer | 0,83 mill. | 8 USD | 6,65 USD |
| Nye input-tokens | 568 | 4 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.
| Mål | Lavt | Sentralt | Høyt |
|---|---|---|---|
| Energi | 0,09 kWh | 1,1 kWh | 2,0 kWh |
| CO₂e (datasenterstrøm) | 0,03 kg | 0,5 kg | 1,2 kg |
| Vann (kjøling i datasenteret) | 0,02 l | 0,8 l | 2,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
- Anthropic – priser for Claude-modeller(platform.claude.com)
- Joule (2026): Energy use of AI inference, efficiency pathways, and test-time scaling(www.sciencedirect.com)
- How Hungry is AI? Energi, vann og karbon for LLM-inferens (arXiv 2025)(arxiv.org)
- SSB – gjennomsnittlig strømforbruk i husholdningene(www.ssb.no)
- EEA – CO₂-utslipp fra nye biler 2025(www.eea.europa.eu)
- Nowtricity – CO₂ per kWh i Norge(www.nowtricity.com)
- Valutakurs USD/NOK(www.valuta-kurser.no)
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
| Kommando | Hva den gjør |
|---|---|
| pnpm install | Installerer avhengigheter (Node 22.13 eller nyere) |
| pnpm ingest | Bygger databasen fra eksportmappen (--verify kontrollerer sjekksummer først) |
| pnpm verify-data | Kjører datakontrollene i terminalen |
| pnpm dev | Starter dashbordet på http://localhost:3000 |
| pnpm build && pnpm start | Produksjonsbygg |