BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
En selvstendig løpelogg i én enkelt fil — logg en økt på sekunder og følg utviklingen gjennom rekorder, innsikter og trendgrafer. Ingen installasjon, ingen byggesteg, ingen backend. Norsk grensesnitt hele veien.README 전문 보기 ↗
Norsk · English
En selvstendig løpelogg i én enkelt fil — logg en økt på sekunder og følg utviklingen gjennom rekorder, innsikter og trendgrafer. Ingen installasjon, ingen byggesteg, ingen backend. Norsk grensesnitt hele veien.
Fungerer helt på egen hånd med en lokal JSON-fil — Strava-import, Google Drive-synk og import av Runna-planer er valgfrie tillegg du kan slå på om du vil, aldri noe du må sette opp. Alt virker uten at en eneste av dem er konfigurert. Der en funksjon faktisk trenger et av dem, sier appen fra i stedet for å feile når du klikker: en kontroll som ikke kan kjøre ennå er deaktivert med begrunnelsen i tekst ved siden av, og hele seksjoner som ikke gjelder skjules i stedet for å ligge døde i et skjema.
0 betyr at du ikke tok noe), løpetype (utendørs / tredemølle), øktbeskrivelse (vises bare når Treningsplan = Runna — lim inn Runna-programmer eller intervallstrukturer; står over notatene i skjemaet og som [Øktbeskrivelse] i AI-eksporten), og notater (fritekst med kontekst etter økten, til AI-analyse)7,5 og 7.5 betyr det samme i alle tallfelt, både når du taster og når du limer inn. Det er ikke kosmetikk: på iPhone — der alle nettlesere er WebKit, ikke bare Safari — kastet nettleseren kommaet stille bort, så 7,5 ble lagret som 75 og 1,5 som 15. Begge er lovlige distanser, så verken området, den røde rammen eller noen øvre grense kunne fange det: feilen lå i tastingen, aldri i verdien. Og siden det norske talltastaturet tilbyr komma, var det tasten det var naturlig å trykke[Avvik]-tagg i AI-eksporten) — ekskludering skal alltid være synlig, aldri stille; skriv grunnen i Notater(Alle skjermbilder er laget fra syntetiske data.)
Ved en helt fersk installasjon (ingen økter ennå) viser dashbordet en kort «logg ditt første løp»-hilsen i stedet for en tom filterrad — likt de andre fanene; grafene og filterraden dukker opp så snart du har logget en økt
Denne uken — en tynn stripe øverst på dashbordet som svarer på «hvordan går denne uken» uten at du må scrolle. Klikk på den for å åpne hele uken. Den leser alle løp uavhengig av dashbordfiltrene (som årsmålkortet), så «denne uken» betyr alltid denne uken.
.ics-fila, vist med ~ fordi kilden selv er rundet opp til nærmeste fem minutter, og den forsvinner så snart økten er gjort — det den faktisk tok står på den loggede økten, og et estimat ved siden av ville bare invitert til feil sammenlikning. Skjules under registrert Sykdom/Ferie, og står tom når ingenting er planlagt — aldri «hviledag», siden bare løp importeres fra planen, så fravær er ikke bevisHendelsesmarkører (Hendelser) — treningshendelser (plan / race / sykdom / ferie / deload / taper / annet) vises på ukesgrafene som en kompakt ikonrekke langs toppen (📋 🏁 🤒 🏖️ 🪫 📉 📌); avvikende perioder (sykdom/ferie/deload/taper) skygger i tillegg et mykt felt, mens planer blir stående som en grunnlinjemarkør. Hold over et ikon for hendelsens tittel, type og datoperiode; markører som klumper seg sammen slås sammen til et antallsmerke (hold over for å se dem alle). En tilhørende tegnforklaring ligger ved Hendelser-bryteren når det er ≥2 hendelsestyper. Slå alle markører av og på med Hendelser-avkrysningen (av som standard på små skjermer).
Dashbordfiltre: økttype, treningsplan, løpetype (utendørs/tredemølle), tempoenhet (min/km ↔ km/t), årsknapper — alle grafer oppdateres fortløpende. På mobil er filterlinjen én linje — «Filter» med de aktive filtrene som piller, eller «Alle økter, alle år» — som åpner hele linjen ved et trykk. Tempoenhet-bryteren veksler «Tempo per uke» mellom tempo og fart. Nullstill tilbakestiller alle filtre, inkludert typeknappene inne i grafene (også bryterne for målestokk i Run/walk ratio og HR-drift & kadens), Mål km-avkrysningen på Ukentlig distanse, tempoenhet-bryteren og hver eneste Uke/Måned-bryter (Ukentlig distanse, Tempo, Pulssoner, Ute vs inne, Høydemeter, Run/walk ratio, HR-drift & kadens-grafene pluss Ukentlig oversikt-tabellen).
Mobil: alle grafer tilpasser seg skjermbredden — ingen vannrett scrolling av siden.
En motiverende reiseseksjon (vokste ut av «Land løpt i») som bor i sin egen fane, alltid fullt utslått. Alt er utledet fra løpene og hendelsene dine — det eneste du noen gang taster inn her er et notat per land. Løp med tomt land teller som Norge, så bare turer i utlandet trenger at Land-feltet er satt.
30+ reiseprestasjoner utledet automatisk i seks grupper, med framdriftslinjer på de låste. Trinnvise stiger viser bare ditt neste mål — ingen overflødig stabling av 3/5 og 3/10 — og hver opplåst utmerkelse navngir flagget og landet der du tok den overalt der ett enkelt sted gjelder.
To detaljvisninger som er speilvendte av hverandre. Klikk en utmerkelse for statusen, hele stigen (hvert nivå med ✓ eller sin telling, ditt nåværende uthevet) og landene/verdensdelene som teller mot den, som klikkbare brikker. Klikk en flaggbrikke for det landet: et statistikkrutenett (løp, distanse, og rekorder for landet — lengste løp, raskeste tempo der flaggede avvik hoppes over, mest høydemeter), en metablokk med datoperioden 📅 og fordelingen ute/inne 🏃/⚙️ (alltid vist — «Alt utendørs» når landet ikke er blandet), en «Teller mot»-liste over utmerkelsene det teller mot (gull ✓ = låst opp her · grønn ✓ = låst opp et annet sted, men dette landet teller · grå telling = underveis), og et fritekst minnenotat 📝.
Et filter på Alle · Fullførte · Gjenstår veksler mellom alle utmerkelser, de du har tatt, og det som gjenstår som en gjøremålsliste med framdriftslinjer.
Full sorterbar tabell — klikk en kolonneoverskrift for å sortere
Høyde-kolonnen viser høydemeter for utendørsløp; tredemølleløp viser en dempet ⚙️ («Tredemølle — ingen høydemeter»), så en tom celle betyr at tallet mangler
RPE-kolonnen viser innsats 1–10 i farge (grønn ≤3 · gul ≤6 · oransje ≤8 · rød over); logges i 0,5-steg, så 6.5 ligger mellom Tungt og Veldig tungt — og lander i det oransje båndet
📋-ikon vises i øktnavn-kolonnen når det finnes en øktbeskrivelse — hold over for en forhåndsvisning; 📝-ikon vises når det finnes et notat — hold over for en forhåndsvisning
🏆-ikon vises på en økt som akkurat nå holder en distanserekord — hold over for hvilke: «Gjeldende rekord: 5 km · 10 km». Samme betydning som 🏆 på en splitt inne i et tredemølleløp: «dette er rekorden nå», ikke «dette var best den dagen», så merket forsvinner i samme øyeblikk et senere løp slår det. 🏃 Ute og ⚙️ Inne regnes hver for seg, så en dag med både et uteløp og en mølleøkt gir hver rad sin egen rekord. Rekordene leses fra hele loggen, aldri fra det filteret du står i — filtrerer du bort en rekordholder, arver ingen pokalen
Responsive kolonner: over 1600px vises alt; ved ≤ 1600px skjules bare Uke og Sko (beholder Mål km, Varighet, ♥ Topp, Høyde, RPE — testet på en 14" HiDPI-laptop med 150 % skalering = 1536px CSS-visningsbredde); ved ≤ 900px skjules i tillegg Varighet og ♥ Topp; ved ≤ 600px skjules dessuten Navn og Plan — alle skjulte felter er fortsatt tilgjengelige via raddetaljvisningen under
Filtrer på datoperiode, økttype, løpetype (utendørs/tredemølle) og sko
Klikk en hvilken som helst rad for å åpne en fullstendig detaljvisning som bare kan leses — distanse, tid og tempo øverst, ukedag, dato, økttype, plan og utendørs/tredemølle på én linje under navnet, og under det hvert felt, også de tabellen ikke viser (kalorier, snitt km/t, land, pulssoner) og hele øktbeskrivelsen pluss notatene — uten å gå inn i redigeringsmodus. Særlig nyttig på mobil, der de fleste kolonnene er skjult
✏️ for å redigere eller 🗑️ for å slette en rad
Eksport til AI-chat — avkrysningskolonne for å velge én eller flere økter; Kopier valgte kopierer valgte rader, Kopier alle filtrerte kopierer hele det filtrerte utvalget, Last ned TSV laster ned som fil, og Uten notater utelater dine egne notater fra alle tre (Øktbeskrivelse fra planen blir med — den er programmets forskrift, ikke din kommentar; valget huskes med vilje ikke, så en eksport senere aldri stille dropper notater); én overskriftsrad øverst, så én blokk per økt: som overskrift — med og på samme linje når de gjelder — en valgfri -blokk (øktplan/struktur), en valgfri -blokk (dine egne notater), og dataraden, og til slutt en valgfri -blokk — alt du har skrevet står over raden, og alt som er målt fra Strava står under; blokkene skilles med blanke linjer. , så ingenting kan leses som en fortsettelse av delen over. Dato står som også i dataraden (samme som overskriften — kunne leses både som 8. oktober og 10. august), og — en null er en påstand om at noe ble målt. — (lengste sammenhengende løp, overganger til gange, gange i motbakke, datakvalitet) og . Run/walk er , siden den leser GPS-fart sekund for sekund, mens HR-drift og kadens kommer fra pulssensoren og akselerometeret og dukker opp for tredemølleløp også; en økt utelater rett og slett det som ikke gjelder. Den bruker de samme reglene for foreldede data som detaljpanelet, så en eksport inneholder aldri analyser appen selv har holdt tilbake, og advarsler skrives bare ut når datakvaliteten ikke er høy — det er da grunnen er verdt å ha
521.0 km av 500 km — 104.2%, ikke 100 %. Stolpen stopper ved enden sin, for en stolpe kan ikke renne over, men tallet ved siden av er et tall og skal ikke klippes: at du er forbi målet er nettopp nyheten. Samme regel gjelder Distanse mot mål på treningsblokk-kortet og prognosemarkøren i Årsmål25:00 eller 2:00:00. Hvert av dem får en rad i en 🎯 Mål-seksjon under Distanse-PR og Prognose på dashbordet, slik at det du vil ha står ved siden av det du har gjort og det du er på vei mot. Bare distanser du har satt et mål for vises. Tilgjengelig fra 1 km og oppover, den samme nedre grensen som Prognose bruker. Et mål dekker begge steder (en ambisjon er ikke en tredemølleinnstilling), men raden beholder de to kolonnene 🏃 Ute / ⚙️ Inne — hver med det raskeste det stedet har, merket PR eller prognose, og – når det ikke finnes noe ennå. Skriv 25:00 eller 2:00:00 — eller bare 45, som betyr 45 minutter, på samme måte som en naken 6 i et tempofelt alltid har betydd 6:00. Alt vises utfylt som 0:25:00, siden 3:45 alene kunne vært 3 min 45 s eller 3 t 45 min. Ingenting regnes ut fra et mål — ingen nedtelling, ingen «X igjen»; det er et notat som tilfeldigvis står på riktig sted. ✏️/🗑️ redigerer og fjerner, som for Årsmål.ics-filen for den planenKalkulatorer uten tilstand. Ingen av dem leser dataene dine — det er den definerende regelen for fanen, ikke en implementasjonsdetalj: de må kunne svare for tempoer du aldri har løpt (et mål i planen, noen andres løp, et mål du ennå ikke er i form til). Ingenting her lagres, så ingenting her kan bli utdatert.
45 i tidsfeltet betyr 45 minutter), for økten du planlegger etter klokken i stedet for etter distansen. Det tallet modusen regner ut, slutter å være et felt, så du skriver aldri inn noe kortet ser bort fra. De to modiene som tar distanse, deler en velger (fri km-inntasting pluss forhåndsvalg fra 400 m til maraton, i takt med Distanse-PR-tabellen slik at merkelappene betyr det samme), og alle tre deler en splittabell — hver kilometer opp til 10, deretter hver femte, alltid avsluttet på den virkelige distansen, så et maraton er 17 rader i stedet for 42. Bytter du modus, beholdes distansen du allerede valgte, og en distanse kortet har regnet ut for deg skrives aldri tilbake i det feltetTall godtar komma eller punktum ved inntasting; utdata bruker alltid punktum. Der stopper velviljen: alt som ikke er et brukbart tall eller klokkeslett får en rød ramme og intet svar, i stedet for å bli stille omtolket. 10:84 er ikke 11:24, 10abc er ikke 10, og et tomt felt er ikke en feil — det er der du startet.
Åpne puls.html i nettleseren — ingen installasjon nødvendig. Eller bruk den hostede versjonen på psvadev.github.io/running/puls.html (går du til roten, blir du sendt videre automatisk). En liten bunntekst nederst på siden viser hvilken commit som er ute nå (hentet direkte fra GitHub, med den sist kjente versjonen bufret lokalt så den overlever hikke i API-et), slik at du kan bekrefte at du er på nyeste versjon.
Førstegangsbrukere møter en kort velkomstmelding i loggskjemaet (en sentrert hilsen som matcher de tomme tilstandene i de andre fanene, med en lenke rett til ⚙️ Innstillinger) som forklarer hvordan lagring fungerer — den forsvinner av seg selv når den første økten er logget.
En diskré lenke «Om Puls — dokumentasjon på GitHub» ligger nederst i ⚙️ Innstillinger-fanen (under Datafil-kortet) og åpner dette repoet i en ny fane.
puls.json)(⚙️ Innstillinger → ✨ Ny fil virker også hvis du heller vil opprette datafilen før du logger noe.)
puls.json-filen din — dataene lastes umiddelbart i alle fanerpuls.json-fil opprettes i Drive-en din (eller den eksisterende lastes inn)☁ Drive-indikatoren i topplinjen blir grønn når du er tilkoblet. Data bufres lokalt, så appen laster umiddelbart ved omlasting uten å vente på Drive. Ved hver sidelasting henter appen stille på nytt fra Drive i bakgrunnen, så endringer fra andre enheter dukker opp av seg selv.
Når Drive er aktiv, skjules statusen for den lokale filen og synk-indikatoren — Drive-indikatoren er den eneste statusen som vises. Åpner du en lokal fil manuelt via Innstillinger, dukker begge opp igjen ved siden av Drive-synken.
Trygg synk. Hvis Drive-kopien har færre økter enn denne enheten, eller denne enheten har redigert sist, spør tilkoblingen først i stedet for å overskrive — på samme måte som opplasting allerede spør. Når en Drive-lagring feiler (frakoblet, utløpt token), husker appen at det finnes lokale endringer som ikke er sendt på tvers av omlastinger, slik at neste sidelasting ikke stille kan erstatte dem med Drives eldre kopi; du får konfliktspørsmålet i stedet. En lagring som ikke når fram til filen eller Drive viser en rød synk-indikator som blir stående pluss en melding — den melder aldri «Lagret» for en skriving som ikke skjedde.
Åpner du appen på en ny enhet, gjentar du steg 1–3 én gang; den samme Drive-filen brukes.
Krav:
python -m http.server 8080 lokalt eller en hostet URL (GitHub Pages eller lignende). Å åpne puls.html direkte som en file://-URL vil ikke virke for Drive-synk (OAuth krever en HTTP-redirect-URI).http://localhost:8080/puls.htmlhttps://<ditt-brukernavn>.github.io/<repo>/puls.htmlÅ åpne puls.html direkte som en lokal fil virker fortsatt fullt ut for offline bruk — det er bare Drive-synken som krever HTTP.
connect-src i Content-Security-Policy-taggen øverst i puls.html — ellers blokkerer nettleseren kalletStravas Client Secret forlater aldri Workeren — bare Client ID og Workerens URL lagres i localStorage. Merk at dette skiller seg fra Google Drive, der flyten kjører helt i nettleseren: der lagres Client Secret i localStorage sammen med refresh-tokenet (flyten sikres egentlig av PKCE; hemmeligheten ligger der bare fordi Google-klienten er registrert som typen «Web application»). Drive-tilgangen er avgrenset til drive.file, så den når aldri annet enn filer denne appen selv har opprettet.
Firefox og Safari støtter ikke File System Access API, så automatisk lagring til lokal fil er utilgjengelig. Google Drive-synk er det anbefalte alternativet — den virker fullt ut i begge, siden den bruker vanlige fetch()-kall og ikke File System Access API. Server appen over HTTP og følg oppsettet for Google Drive-synk over.
Uten Drive-synk:
Én enkelt .html-fil — ingen byggesteg, ingen rammeverk, ingen installasjon.
Fanelinjen er responsiv, men det er én linje — ikke to navigasjoner: på skjermer under 600 px flytter den seg ned som en fast bunnlinje med seks felter (Legg til · Oversikt · Logg · Plan · Verktøy · Mer), der Løpeatlas og Innstillinger ligger bak Mer. Mellom 601 og 1000 px — et laptopvindu på halv skjerm, for eksempel — viser den vanlige linjen bunnlinjens korte navn, så ingen fane havner utenfor høyre kant. Den gamle sidelengs rullende stripen er borte; faner utenfor høyre kant var mulige å nå, men umulige å oppdage. En egen mobilmeny ville vært en andre kilde til sannhet for hvilken fane som er aktiv, så den samme .tabs-en blir stylet om.
chart.umd.js, den ekte pakkede filen som serveres byte-identisk med den uforanderlige npm-tarballen — ikke jsDelivrs genererte .min.js, som de uttrykkelig advarer mot å hashe)<meta>-tagg øverst i puls.html) — begrenser hvor siden kan sende data: connect-src navngir nøyaktig Google Drive og innlogging, Strava, GitHub (versjonsfoten) og Strava-Workeren, så Drive- og Strava-tokenene i localStorage ikke kan sendes andre steder med fetch, bilde eller skjema (en sidenavigering kunne fortsatt det — det dekker ikke en CSP). Den må tillate 'unsafe-inline', siden hovedskriptet og on…=-handlerne er inline, så den stopper ikke et injisert inline-skript. Workeren står med nøyaktig vertsnavn: en annen Worker-URL i Innstillinger blokkeres til policyen navngir den ogsåworker/)Datasemantikk (hva feltene betyr, forbehold ved måling, hva som kan og ikke kan sammenliknes) er dokumentert i DATA.md — på engelsk — og er en nyttig følgesvenn når du mater TSV-eksporten inn i en AI-chat for analyse.
Årsmålkortet — framdriftslinje med km gjort, km igjen, prognose for året og hvor mange km i uken som trengs for å holde ruta; en stiplet prognosemarkør på linjen viser hvor årsprognosen lander i forhold til målet (grønn hvis du er i rute, rød hvis du ligger an til å komme til kort), så avstanden til målet er synlig med ett blikk
Rekorder — fem underseksjoner. Alt her er utledet fra løpene dine; ingenting skrives inn for hånd.
–. Ingenting utledes fra et mål — ingen nedtelling, intet gap, ingen dom; seksjonen er helt skjult til du setter ettInnsikter — først i rutenettet, rett under Denne uken, fordi det er det eneste kortet som bærer frister: en nedtelling til et løp, en streak som er i ferd med å ryke, et «⚠️ Belastning ×1,6 — ro ned». Slikt er verdt noe i dag og ingenting neste uke, mens alt under er oppslagsverk (rekorder, prognoser, mål) du går til med vilje. Forskjellen merkes mest på mobil, der alt stables og Rekorder-kortet er høyt nok til å dytte en advarsel langt under skjermkanten. En pott med kandidater rangert etter prioritet og hvor ferske de er, opptil 6 vises — færre når færre er verdt å vise. Hvert kort må være en faktisk hendelse, aldri fyllstoff, så en tynn rad betyr at ingenting bemerkelsesverdig skjedde, ikke at noe ble trengt ut. Belastnings- og volumkortene sier fra når en periode med redusert løping (deload, taper, sykdom, ferie) ligger inne i det de sammenligner — og navngir hvilken av de to periodene den ligger i, siden en rolig uke i grunnlaget løfter tallet mens en i den ferske perioden demper det. Retningen oppgis bare når én av periodene er berørt; ligger det redusert løping i begge, drar de hver sin vei og kortet sier hva som ligger hvor i stedet for å gjette. Belastningskortet sier «stor belastningsøkning», ikke «høy skaderisiko» — det er lastforholdet som måles, ikke en skade som varsles. En fersk PR gir et eget kort først fra 5 km og oppover. 400 m og 1 km er strekninger analysen finner inne i et lengre løp, ikke innsatser du la opp til: én 5K-test satte tre PR-er på én gang og tok halve kortet, slik at alt med lavere prioritet ble trengt ut uten at kortet viste at det skjedde. Begge blir liggende i Distanse-PR-tabellen under Rekorder, som er der en varig rekord hører hjemme — Innsikter er for det som er nyheter. De første sju dagene i januar oppsummeres året som nettopp ble ferdig mot året før — «2026: 781 km · +142 km mot 2025 · 121 mot 60 økter», og ikke noe mer enn det: en snittfart over et helt år avgjøres mest av hvilke økter året inneholdt, og høydemeter av hvor du løp. Årsmål-kortet nullstilles 1. januar og vet ingenting om i fjor, så dette er den ene sammenligningen det ikke kan gjøre; hele tabellen ligger i Årssammenligning. Startet loggen midt i sammenligningsåret, sier kortet fra, så tallet ikke leses som framgang. En treningsblokk som snart starter teller ned de siste 14 dagene, i samme form som nedtellingen til et løp, og forsvinner av seg selv når blokken er i gang: da er den den aktive blokken, og framdriftskortet overtar plassen.
shoeWear-tersklene som linjen og markeringene i Sko oversikt bruker, så én sko blir aldri beskrevet på tre måter samtidig. En sko uten grense sier ingenting i det hele tatt; den ble tidligere målt mot en skjult 400 km som ikke sto noe sted) · tid siden langtur · dager siden forrige løp · maks puls ser for lav ut — flagges når logget topppuls har passert makspulsen du har satt, siden hver sonegrense utledes fra det tallet, og et utdatert tall gir stille feil score på hver eneste økt. Krever to overskridelser gjennom hele historikken (én måling er en sensorglipp, to er bevis) med minst 3 slag klaring, og én av dem innenfor 12 uker, så den eldes ut i stedet for å mase; løp merket Avvik kan ikke drive den, som er nettopp det det merket er til forTreningsrytme — en score fra 0–100 over de siste 12 ukene (andel aktive uker, uker over volumgrensen, streak-bonus); oppdelingslinjer viser hva hver del bidrar med (maks 50/30/20 poeng); grensene for km og antall løp settes i Innstillinger; egen trendgraf for aktive uker per måned; justert for tilgjengelighet: uker uten løp som dekkes av en Sykdom/Ferie-hendelse teller ikke mot scoren («10 av 10 tilgjengelige uker»), og streaken bygger bro over dem — løper du i en Ferie-uke, teller det fortsatt
Treningsblokker — treningsblokk-kort som genereres automatisk fra Plan-hendelser; den aktive blokken er et hovedkort i full bredde med framdriftslinje for treningsrytme og en minigraf over km per uke; tidligere blokker vises som kompakte kort under. En blokk som ennå ikke har startet ligger øverst med merket Kommende og hvor mange dager det er igjen — og kan klikkes som alle de andre, så planen er lesbar før første økt. Klikk et kort for en fyldig detaljvisning: ukesvise framdriftslinjer (hver rad kan klikkes → ukedetaljer; merker for Toppuke / Lengste økt / Raskest), automatisk genererte høydepunkter (beste uke, lengste økt, streak, tempotrend), oppdeling av treningsrytmen, fordeling av pulssoner (stablet linje med oppsummering av lav/høy intensitet), sammenlikning mot forrige blokk, og hele løpslisten. For en blokk som pågår måles km/uke, økter/uke og treningsrytme over ukene som har gått så langt — ikke over hele den planlagte perioden — slik at en blokk som nettopp har startet ikke leses som lavt volum eller «ujevn» for uker som ennå ikke har skjedd (linjen for totale km mot mål holder seg ærlig på sin reelle prosent). Sammenlikningen mot forrige blokk vises først når blokken er fullført — en blokk som fortsatt pågår har bare deler av volumet sitt, og blokker kan ha ulike mål (en 5K-plan mot en 10K-plan), så en tidlig sammenlikning ville vært misvisende hard. De to volumtallene — distanse og km/uke — står uten farge, og det er med vilje: volum er hva planen var, ikke hvor godt du gjorde det. En 5K-blokk er kort og tett, en halvmaratonblokk lang og rolig, en restitusjonsblokk liten med hensikt, så «færre km enn forrige blokk» er en beskrivelse og ikke en fiasko — de to kan til og med peke hver sin vei (−60 km totalt, +7,7 km/uke). Samme regel som Lav/Middels/Høy i belastningsforklaringen: størrelse, ikke bra/dårlig. Easy-tempo og konsistens beholder grønt/rødt, fordi begge kan sammenliknes uansett hva blokken trente mot. Tempolinjen bruker bare Easy-løp — snittfart over en hel blokk beskriver økt-miksen like mye som formen din, og utslaget går ikke engang samme vei hver gang: en intervalløkt logges som tregere enn en rolig tur selv om den inneholder den raskeste løpingen du gjør, fordi pausejoggen og opp-/nedvarmingen ligger inne i samme økt — mens tempo- og testøkter drar motsatt vei. Et Easy-løp er derimot et Easy-løp uansett hva blokken trener mot. Krever minst 3 Easy-løp i begge blokkene; under det forsvinner linjen, ikke hele sammenlikningen. Avvik-merkede løp teller ikke med
Treningsbelastning per uke — ukentlig treningsbelastning scoret etter soneintensitet (S1=1 … S5=5 poeng/min), fargekodede søyler med rullerende 4-ukers snitt
Treningsstatus (PMC) — Performance Management Chart: Fitness (CTL, 42 dager), Fatigue (ATL, 7 dager) og Form (TSB = CTL−ATL) over de siste 365 dagene
Ukentlig distanse — km per uke eller måned (Uke/Måned-bryter); ukesmodus viser siste 26 uker, månedsmodus siste 12 måneder; klikk en søyle for å gå inn i den uken. En Mål km-avkrysning legger en stiplet mållinje over søylene — summen av Mål distanse på løpene den uken (som Runna-planen forhåndsfyller), så du kan se om ukens distansemål ble nådd uten at det krever en egen graf. Uker uten mål tegnes som et hull, ikke som null. Punktene på linjen farges etter hvordan uken landet — blå over målet, grønn nådd, gul nær, rød under — mens søylene beholder sin ene farge, så en uke uten mål aldri kan forveksles med en som slo målet. Avkrysningen står alltid av når siden lastes — den huskes ikke mellom økter, på samme måte som de andre bryterne i grafene. Den dukker bare opp når det finnes mål, og bare i ukesmodus: en måned der bare noen av ukene var planlagt ville summert til et for lavt mål og lest som «langt over plan» når det egentlig er manglende data
Tempo per uke — vektet snittempo per uke eller måned (Uke/Måned-bryter; uke = siste 26 uker, måned = siste 12 måneder); tittelen bytter til «Tempo per måned» i månedsmodus
Aerob effektivitet (rolige økter) — trend for aerob effektivitet (fart ÷ puls) for løp i samtaletempo, med rullerende snitt og en referanselinje for ditt eget snitt. En stigende trend betyr lavere puls på samme fart, eller høyere fart på samme puls — bedre aerob form. Bryter for løpetype (Begge / Easy / Long) dekker både rolige og lange løp; Steady/Tempo/Intervaller og andre hardere økter er utelatt med vilje (de er ikke sone 2-mål). Bryter for sted (Alle / Utendørs / Tredemølle) deler etter løpetype; Sone 2-filteret isolerer bare løp der snittpulsen (eller ≥70 % av sonetiden) faller innenfor konfigurert sone 2 — et renere aerobt signal som luker vekk løp som drev for hardt
Interaktive grafer — hold over en hvilken som helst ukesgraf for et fullt ukessammendrag (km, løp, tid, tempo, puls); klikk en søyle eller et punkt for å åpne en detaljvisning for den uken; klikk en skosøyle for skodetaljer. Ukepanelet vet hvilken graf du kom fra: kommer du fra Run/walk ratio, HR-drift & kadens, Høydemeter eller Belastning, legges den målestokkens eget sammendrag for uken til — og hvert løp i listen viser sin egen verdi, så du ser hvilket løp som flyttet uken, ikke bare snittet. Tallene regnes ut av den samme oppsummeringen som grafen selv tegner, så panelet kan aldri motsi punktet du klikket på (den ukentlige løpsandelen er for eksempel vektet etter tid, ikke et snitt av hvert løps prosent). En målestokk som ikke gjelder for et løp — run/walk på en tredemølleøkt — viser en strek i stedet for en null
Ute vs inne — stablet søyle som deler km mellom utendørs (🏃) og tredemølle (⚙️); Uke/Måned-bryter (uke = siste 26 uker, måned = siste 12 måneder); skjult til den første tredemølleøkten er logget
Høydemeter per uke — totalt antall høydemeter utendørs per uke eller måned (Uke/Måned-bryter; uke = siste 26 uker, måned = siste 12 måneder); summerer feltet hoydeMeter (autofylt fra Strava) for utendørsløp bare — tredemølleløp har ingen høydemeter; klikk en ukesøyle for å åpne den uken; sesongbetont av natur, så kortet er helt skjult til det finnes høydedata utendørs
Run/walk ratio (valgfritt, utendørsløp med Strava) — anslår hvor mye av et utendørsløp som faktisk var løping mot gange, utledet fra Stravas fartsdata per sekund (aldri manuell inntasting). Detaljvisningen for hvert løp viser en stablet Løping / Gange / Uklart-linje pluss ruter (lengste sammenhengende løp, overganger til gange, datakvalitet), en eksperimentell linje for gange i motbakke, og en sammenslått «ⓘ Hvordan beregnes dette?»-forklaring. Dashbordkortet viser trenden over tid med en bryter for målestokk (Løping % ↔ Lengste sammenhengende løp) og en Uke/Måned-bryter (uke = siste 26 uker, måned = siste 12 måneder), skjult til minst ett analysert utendørsløp finnes; klikk et ukespunkt for å gå inn i den uken. Gange og rolig jogg overlapper i fart, så tallene er et trendsignal, ikke eksakt sannhet. Tid brukt i ro telles som stoppet i stedet for løping — å stå ved et fotgjengerfelt er ikke en gangpause, og et opphold i opptaket ble tidligere kreditert farten du løp i på hver side av det. Nye utendørsløp fra Strava analyseres automatisk ved lagring (én henting per løp — en vanlig redigering henter ingenting på nytt); en engangs Analyser alle Strava-økter i Innstillinger fyller inn historikken i porsjoner som holder seg innenfor Stravas grenser. Fartsgrensene for gange og løping settes i Innstillinger (standard gange < 7,0 · løping > 7,5 km/t — mellom de to = uklart)
HR-drift & kadens (valgfritt, alle Strava-løp — inne og ute) — to anslag til fra de samme Strava-dataene, vist i detaljvisningen for et løp: HR-drift (aerob frakobling — kryper pulsen oppover mens tempoet holder? regnet ut som fart÷puls i første mot andre halvdel; lavere eller negativt = mer aerobt utholdende, mest meningsfullt på rolige og lange løp) og kadens (snitt antall steg per minutt). Fordi de leser pulssensoren og akselerometeret i stedet for GPS, dekker de alle Strava-koblede løp — også tredemølle, i motsetning til run/walk — og analyseres automatisk ved lagring (eller via den samme etterfyllingen). Tid brukt i ro holdes helt utenfor HR-driften — pulsen din holder seg oppe mens du står stille, så å telle de sekundene ville vist en drift du aldri hadde. Gange teller fortsatt, siden en gangpause er en del av løpet. Dette er anslag; HR-drift er mer støyete på løp med gangpauser eller bakker, så les den på jevne, rolige løp og sammenlikn inne mot inne / ute mot ute. Dashbordet viser også trenden over tid — en bryter for målestokk (HR-drift ↔ Kadens) og en Uke/Måned-bryter (uke = siste 26 uker, måned = siste 12 måneder), med to atskilte linjer per sted (🏃 Utendørs / ⚙️ Tredemølle) i stedet for ett blandet snitt, siden jevn, nesten null drift på tredemølle blandet med kupert utendørsdrift ville fått en uke til å se verre ut bare fordi du trente mer ute; HR-drift-visningen markerer nullinjen, og klikk på et ukespunkt går inn i den uken. Skjult til minst ett Strava-løp er analysert
Pulsgraf (alle Strava-løp, når du er koblet til) — detaljvisningen for et løp tegner pulsen gjennom hele økta rett under pulssonene, med sonene dine som bakgrunnsfarger, slik at sonetidene over blir stripene linja går gjennom. Den viser det sonetider ikke kan: når pulsen steg — oppvarmingen, en bakke, sakte drift på en lang tur, og på intervaller hvor langt pulsen faller mellom dragene. Linja er glattet nok til at drift leser som drift, men kontrollert mot en intervalløkt så toppene og bunnene overlever. Tempo slås på med paret Kun puls | Med tempo over grafen, og vises da som en egen stripe under, på samme tidsakse — ikke i samme graf, for der ville tempolinja sett ut som puls i sone 4, og der linjene krysser betyr ingenting. Av som standard, og valget huskes. På tredemølle tilbys det ikke, fordi klokkas innendørstempo er det minst pålitelige tallet i strømmen. En stopp vises som et hull i tempolinja, ikke som en rett strek gjennom den. Det er farten som avgjør hva som er stopp, ikke Stravas egen «i bevegelse»-markering — den kan kalle korte strekk i gange- eller joggefart «stoppet», og da ble det hull i linja der du faktisk beveget deg. Hver graf har sin egen lille overskrift, så du slipper å bære enhetene med deg ned i panelet. Høyden tegnes som en dempet silhuett bak tempolinja i samme stripe — bakken er det som forklarer at tempoet gir etter og pulsen stiger på samme innsats, og den hører hjemme ved siden av det den forklarer. Bare utendørs, og bare når økta har ekte terreng i seg: under 20 høydemeter er silhuetten GPS-støy tegnet som en bakke. En stiplet gangelinje i tempostripa viser grensa run/walk-analysen regner som gange (8:34 /km som standard, følger innstillingen din), og stripa når alltid ned til den — så du ser hvor langt over gange en jevn tur holdt seg, og hvor overgangene til gange skjer. Tempolinja er glattet over omtrent ett minutt, så en kort gåpause dupper mot linja uten alltid å krysse den. Pek på grafen (eller trykk på telefonen) for å lese tid, puls, tempo og høyde i det øyeblikket; en loddrett strek markerer det samme øyeblikket i begge grafene. Hentes fra Strava når du åpner økta, og lagres aldri — ingenting legges til i dataene dine; innenfor samme besøk gjenbrukes det som alt er hentet. Uten tilkobling, uten nett, uten pulsdata eller ved for mange forespørsler sier den hvilken av dem det er, på én linje. Løp uten Strava-kobling beholder bare sonetidene
Beste splits (valgfritt, tredemølleløp med Strava) — Strava regner ut din raskeste 5 km, 10 km og så videre inne i et hvilket som helst utendørsløp, men gjør det aldri for tredemølleløp. Puls tetter det hullet med data den allerede laster ned: den skanner hvert mulige vindu gjennom løpet og beholder det raskeste, slik at en rask strekning midt inne i en lengre økt teller som den personlige rekorden den er. Analyseres automatisk ved lagring; Analyser alle Strava-økter fyller inn historikken.
Koble gamle økter til Strava (engangsjobb, Innstillinger) — økter som ble logget før Strava-id-feltet fantes (eldre, manuelt inntastede løp) har ingen kobling til en aktivitet, så de kan ikke analyseres. Denne engangsjobben blar gjennom Strava-historikken din og foreslår treff basert på dato + sted + distanse/varighet, og krever en entydig bekreftende aktivitet, så den gjetter aldri. Du ser over og godkjenner hvert treff — de der begge signalene stemmer (dist+tid ✓✓) er huket av på forhånd; treff på ett signal (kun tid / kun dist) og bare dato (kun dato) er flagget og lagt igjen til deg, siden en feil kobling stille ville festet et annet løps data. Varighet dekker intervaller (der den loggede distansen ofte utelater joggen mellom dragene, som Stravas GPS likevel tar opp), og dato-nivået fanger det vanlige tilfellet med ett løp om dagen der en håndskrevet distanse har glidd. Godkjente økter kobles og sendes til analysen, så de blir med i detaljvisningene og trendene for run/walk og HR-drift & kadens. Flere aktiviteter på én dag (en oppdeling i oppvarming/hovedøkt/nedjogg) blir stående ukoblet i stedet for gjettet på. Vises bare når du er logget inn på Strava og en økt fortsatt er ukoblet
Pulssoner — stablede minutter per sone per uke eller måned (bryter)
Årssammenligning — kumulative km etter ukenummer, én linje per år; sammendragstabellen under grafen viser totale km, antall løp og snitt km per aktive uke for hvert år (fargekodet i takt med linjene i grafen)
Sko oversikt — km per skopar med den samme slitasjestolpen som Sko-kortet i Planlegging (km mot skoens grense, som vises når du holder over stolpen): grønn under 75 %, gul 75–89 %, rød fra 90 %. Pluss statistikk per sko: antall økter, snittempo, snittpuls, sist brukt. Uten grense vises bare km, ingen stolpe
Ukentlig oversikt — en scrollbar sammendragstabell (økter, distanse, tid, snittempo) med en Uke/Måned-bryter for å sammenlikne hver målestokk per uke eller per måned. Inneværende uke (eller måned) er markert og merket, slik at raden du faktisk lever i er til å finne i en tabell av ellers like rader; den følger bryteren, og er rett og slett borte hvis ingenting som passer filtrene dine er logget i den ennå. Kolonneoverskriften blir stående mens du scroller, og en fast bunnrad holder to sammendragsrader synlige hele tiden: en Snitt-rad (snitt per aktive periode — en typisk uke/måned — pluss samlet snittempo) over Totalt-raden
=== ÅÅÅÅ-MM-DD | Øktnavn | dist km ===| Avvik| Uten pulsdata[Øktbeskrivelse][Notater][Data][Analyse]ÅÅÅÅ-MM-DD8/10/20260:00:00, når økten ikke har sonedata i det hele tatt[Analyse]-blokken bærer de to tingene ingen kolonne kunne.ics) for å følge planlagt mot faktisk. I Runna: Profile → Connected Apps & Devices → Connected Calendar → Other calendar → Copy URL, åpne den lenken i en nettleser for å laste ned .ics-filen, og velg den her. Å velge filen viser deg bare hva den ville gjort — hvor mange økter den fant, datoperioden, hvor mange som faller utenfor den aktive blokken og hoppes over sammen med datoene de dekker, og hvor mange lagrede økter som ville blitt erstattet eller beholdt — og ingenting skrives før du bekrefter. Én import per treningsblokk dekker hele blokken, og en fil som bærer flere blokker importerer dem alle — hver blokk erstattes bare innenfor sin egen datoperiode, så en blokk filen ikke dekker blir stående urørt. Økter som faller utenfor alle registrerte blokker hoppes over, siden det ikke ville vært noe å knytte dem til. Importer ved eller like før en blokk starter — det er det eneste øyeblikket Runna-strømmen har hele planen som kommende. Så snart en blokk er i gang, forsvinner en økt du hopper over helt ut av strømmen, så en plan importert for sent mangler nøyaktig de dagene du mistet. Å importere på nytt senere er trygt: den erstatter bare datoene den bærer og beholder resten, så økter du allerede har registrert som mistet blir ikke slettet. Og en plan bygd opp igjen bare fra fullførte økter rapporterer et antall i stedet for en gjennomføringsprosent — når bommene mangler i dataene, ville enhver prosent vært 100 % av ren konstruksjon. Importer er additive på tvers av blokker — en ny blokks import erstatter bare sin egen datoperiode, så hver ferdige blokk beholder planen sin og viser fortsatt planlagt mot faktisk i sin egen detaljvisning. Selve kortet lister én blokk om gangen — den du løper nå, eller den siste når du er mellom blokker — med hver av de andre blokkene slått sammen til én rad under Andre blokker, som viser den blokkens egen gjennomføring og åpner detaljvisningen når du klikker. Slik holder det samme størrelse enten du har importert én plan eller ti, og det finnes ikke noe «når er det trygt å importere på nytt». Hvert planlagte løp får en status: gjort ✓ / påbegynt ◐ (Avbrutt) / mistet ✗ / kommende ○ — matchet mot de loggede løpene dine på uke + nærmeste dato + type — pluss en gjennomføringstelling for blokken; styrke og løp utenom planen hoppes over. To regler hindrer at et løp fullfører en økt det ikke har noe med å gjøre: et løp logget før den planlagte dagen teller bare når typen stemmer (onsdagens Long løpt på tirsdag teller; tirsdagens intervaller er ikke onsdagens Long gjort tidlig) — og mer enn en dag tidlig først når den planlagte dagen er passert: en økt du flyttet fram i uka blir godskrevet, men en ekstra rolig tur på mandag krysser aldri av torsdagens planlagte rolige før du har løpt den, og en økt logget som Egentrening fullfører aldri en økt fra et program i det hele tatt — det er det feltet betyr. Å bytte intensitet på dagen er fortsatt en fullført økt, ikke en bom. Når flere løp og økter konkurrerer i samme uke, avgjøres de klareste parene først i stedet for at den tidligste planlagte økten tar det som er å få — så det å miste én økt midt i uken flytter ikke lenger æren over på hver senere økt og rapporterer ukens siste økt som bommen. Et løp planlagt for i dag blir stående som kommende (○), ikke mistet — det blir først ✗ når dagen er helt over, og holdes utenfor gjennomføringstellingen inntil da, slik at en uferdig økt i dag aldri drar prosenten ned. Økter som faller inne i en registrert Sykdom- eller Ferie-periode merkes som gyldig fravær (–) og holdes også utenfor gjennomføringstellingen — du var ikke tilgjengelig, så de teller ikke som mistet (et løp du faktisk gjorde mens du var borte teller fortsatt som gjort). Dette speiler måten Treningsrytme allerede gir fritak for de ukene. Hent navn fra planen gir eldre økter navnet på selve økten fra planen — «Runna Intervaller» blir «Drop Set», «Pyramid Intervals» eller «Broken Miles», så intervalløktene kan skilles fra hverandre. Den tar bare økter som matches mot en navngitt økt i planen (Runnas «Easy Run» og «Long Run» er ikke navn) og som er samme økt — samme type, eller Runnas registrering av en økt fullført samme dag — og bare navn som ikke sier noe eget: tomme, eller bare plan og type som «Runna Intervaller» eller en eldre «Runna intervaller». Andre navn du har skrevet selv, og et løps navn, røres ikke. Den viser hver endring før noe skjer, tar en kopi først (Innstillinger → Lokale sikkerhetskopier), og knappen vises bare når det er noe å gi navn. Den importerte planen mater også kortet for den aktive treningsblokken på dashbordet (en gjennomføringslinje + de neste øktene dine), blokkens detaljpanel (hele den planlagte listen), og forhåndsutfyllingen i loggskjemaet (Økt-type + Mål distanse for den dagen — se Logging). En kommende økt som Runna anslår til 75 minutter eller mer får en ⛽-knapp i listen, som åpner Drivstoff med distansen, varigheten og innsatsen allerede utfylt — økttypen avgjør skalaen (Easy/Steady/Long → rolig, resten → hard), og kan overstyres i kortet, og en linje over listen teller hvor mange slike økter uken din inneholder. Grensen leses bare av Runnas eget varighetsanslag — planen oppgir ikke noe måltempo, og en 17 km-rad uten anslag er en økt av ukjent varighet, så knappen uteblir i stedet for at appen dikter opp et tempo for å svare6 × 400 m @ 5:305 × 3 min @ 10.5 km/t5:40/km10.6kph5 reps of:Repeat the following 3x:Laps8km at a conversational pace