Trafikkstatus og prediksjoner for hele Moss-korridoren. Kanalbrua, Rv19, E6/Mosseporten.
Er det smart å kjøre nå, eller lønner det seg å vente?
Et samarbeidsprosjekt mellom Synaro og Krescado.
Bak prosjektet står Jørgen Simensen i Synaro og Kenneth Madsø i Krescado. Vi er to tidligere kollegaer med felles interesse for teknologi, data og produktutvikling, og begge har en nær relasjon til Moss og Jeløya.
Jørgen er oppvokst på Jeløya, har familie der og bor i dag på Ekholt. Kenneth bor på Verket og har venner og turområder på øya. Vi pendler begge til Oslo og kjenner godt på spørsmålet mange i Moss stiller seg: er det smart å kjøre nå, eller lønner det seg å vente litt?
Moss Trafikk er bygget med åpne data, åpne API-er og prediksjonsmodeller for å gi et smart anslag på trafikken akkurat nå og de neste timene.
Avviksbasert trengselsanalyse og prediksjoner for 10 tellepunkter langs korridoren fra Våler/E6 til Kanalbrua/Jeløya. To-lags prediksjonsmodell med 2 års historikk (89 000 timer), fergekontekst fra Entur, og estimert korridorstatus når Vegvesen-data er forsinket.
Median per (stasjon, ukedag, time) justert med sesong- og helligdagsfaktorer. Robust og enkel. Treffer typisk 5-10% MAPE på hverdager.
Quantile regression (p10/p50/p90) trent på residualer fra baseline. 26 features inkludert sanntidsvolum, korridorsignaler fra 6 eksterne stasjoner, og temporale features. Custom tree-walker i TypeScript for edge-inference (0 avhengigheter, ~200 KB modell).
V2 forbedrer kveld/natt, men har en kjent positiv bias i dagtimer (mars 2026). Gating-policy styrer når residualen brukes:
| Policy | Beskrivelse |
|---|---|
off |
Kun baseline |
time_window |
Baseline 07-17, v2 18-06 (aktiv i prod) |
full |
V2 residual alltid på |
Modellen evalueres fortløpende mot faktiske målinger fra Statens vegvesen.
| Metode | MAPE | Bias | Merknad |
|---|---|---|---|
| Baseline (v1) | ~10% | -7% | Underpredikerer litt |
| V2 full | ~16% | +13% | Overpredikerer dagtimer |
| V2 time_window | Evalueres | - | Deployet 2026-03-24 |
Eval-data samles automatisk via GitHub Actions (snapshot + backfill, hver time).
src/
lib/
prediction-engine.ts # V1: multiplikativ dekomponering
prediction-engine-v2.ts # V2: baseline + LightGBM residual + gating policy
tree-walker.ts # LightGBM JSON tree inference (0 avhengigheter)
feature-builder.ts # 26 features for residualmodell
decision-engine.ts # "Kjøre nå eller vente?" beslutningslogikk
ferry-signal.ts # Ferjesignal fra Entur (avgangstider Moss-Horten)
traffic-logic.ts # Congestion-klassifisering og beste-tid
data-fetcher.ts # Orkestrerer Vegvesen + prediksjon + ferje
norwegian-calendar.ts # Helligdager, skoleferie, 17. mai
vegvesen-client.ts # Statens vegvesen Trafikkdata (GraphQL)
entur-client.ts # Entur Journey Planner (fergeavganger)
stations.ts # Stasjonskonfig, vulnerability-thresholds
data/
model-weights.json # Baseline-profiler (generert av scripts/)
residual-model.json # LightGBM quantile modell (eksportert fra Python)
averages.json # Legacy fallback
scripts/
fetch-history.ts # Hent 2 år rådata fra Vegvesen (104 uker)
compute-model.ts # Beregn baseline-profiler fra rådata
validate-model.ts # Segmentert MAPE-validering
golden-test.ts # Snapshot-tester for kjente scenarier
training/ # V2 treningspipeline (Python/LightGBM)
train.py # Tren 3 quantile-modeller (p10/p50/p90)
features.py # Feature engineering + datasett
config.py # Hyperparams, stasjoner, feature-lister
export_model.py # Eksporter til JSON for tree-walker
ablation.py # Feature ablation-tester
Prediksjoner evalueres automatisk mot Vegvesen-actuals:
- Snapshot (hver time): lagrer predicted, baseline, residual og policy-valg
- Backfill (hver time): matcher snapshots med faktisk trafikk fra Vegvesen
- Dashboard (
/admin/eval): WAPE, MAPE, bias per periode, MAE per stasjon
GitHub Actions (eval-collect.yml) kjører begge steg automatisk.
- Statens vegvesen Trafikkdata API (åpent GraphQL API, ingen auth)
- Entur Journey Planner API (fergeavganger Moss-Horten)
- Plausible Analytics (personvernvennlig web analytics)
- Next.js 15 (App Router, ISR 5 min)
- TypeScript
- Tailwind CSS + shadcn/ui + Recharts
- Supabase (eval-data og kalibrering)
- Vercel (hosting, auto-deploy fra main)
- Plausible Analytics
- Python + LightGBM (treningspipeline, offline)
npm install
cp .env.example .env.local # Valgfritt: Supabase for eval
npm run devGenerer baseline-profiler fra historikk (tar ca 15 min første gang):
npx tsx scripts/fetch-history.ts
npx tsx scripts/compute-model.ts
npx tsx scripts/validate-model.ts
npx tsx scripts/golden-test.tsTren V2 residualmodell (krever Python 3.11+):
cd scripts/training
pip install -r requirements.txt
python train.pySe .env.example. Alle er valgfrie - appen fungerer uten Supabase og Plausible.
| Variabel | Beskrivelse |
|---|---|
SUPABASE_URL |
Supabase-prosjekt URL |
SUPABASE_SERVICE_ROLE_KEY |
Service role key for eval |
ADMIN_API_KEY |
Bearer token for /api/admin/eval/* |
PREDICTION_MODEL |
v2 for å aktivere residualmodell |
PREDICTION_RESIDUAL_POLICY |
off / time_window / full |
NEXT_PUBLIC_PLAUSIBLE_DOMAIN |
Plausible-domene |
Kode: MIT
Datakilder følger egne vilkår: