ᚢ Styrkerunen · Yggdrasil Panel

Byg styrke,
én rune ad gangen.

En træningsapp til iPhone og web, bygget til at bruges med én hånd og svedige fingre. Sæt logges på under to sekunder — også når der ikke er et gram signal i kælderen under centret.

<2spr. sæt
100%offline-klar
104tests
0opsætning
Startprogram – Helkrop
Øvelse 1/7
Benpres (maskine)
Mål: 10–12 reps
Prøv 62,5 kg næste gang
kg
60
+
reps
12
+
✓ Log sæt
1.  60 kg × 12 ⚡ NY REKORD
2.  60 kg × 11
🕐 Hviletimer 1:28 Færdig
Træn
Statistik
Valhal
Mig
Hvad den kan

Tør, faktuel træningslogning — med sjæl ovenpå.

Kernen er lynhurtig registrering og ærlig statistik. Det nordiske lag er krydderi, aldrig gimmick: det kan skrues helt ned til rene tal med ét tryk.

Under to sekunder pr. sæt

Vægt og reps er forudfyldt fra sidste gang, så du som regel bare bekræfter. Hviletimeren starter selv, og rekorder fejres i samme øjeblik.

Virker uden net

Hvert sæt gemmes lokalt først og synkroniserer af sig selv, når signalet er tilbage. Ingen spinner, ingen tabte sæt, ingen undskyldninger.

Statistik der betyder noget

Fremgang pr. øvelse, tonnage, fremmøde-kalender og muskelbalance — plus sjove indsigter som holder motivationen oppe.

Mimir, coachen

Ugentlig analyse ud fra dine egne tal, en chat du kan spørge til råds — og evnen til at tilpasse træningen når noget gør ondt.

Valhal

Runer at låse op, rangorden fra Thræl til Einherjer, milepæle og en venlig kappestrid mellem jer i hallen.

🕊

Huginn & Muninn

Ravnene husker for dig: reminders på dine træningsdage, ros efter en god tur, og et blidt puf hvis du har været væk. Aldrig skam.

Kernen

Bygget til kælderen under centret

De fleste træningsapper går i stå, når signalet gør. Uruz gør ikke. Hvert sæt får et id i browseren, lægges i en kø i IndexedDB og vises med det samme — længe før serveren har hørt om det.

Når nettet er tilbage, tømmes køen af sig selv. Fordi id'et laves på forhånd, kan den samme kø afspilles to gange uden at dublere et eneste sæt eller uddele den samme rekord igen.

  • Optimistisk UI — sættet står der, før det er sendt
  • Køen overlever genstart, reload og flytilstand
  • Rækkefølgen bevares: køen stopper ved første fejl
  • Verificeret med nettet slået fra midt i en træning
⌁ Offline — gemt lokalt, synkroniseres senere
Startprogram – Helkrop
Øvelse 3/7
Siddende roning
Sidst: 40 kg × 12, 11
kg
40
+
reps
12
+
✓ Log sæt
1.  40 kg × 12i kø
2.  40 kg × 12i kø
Træn
Statistik
Valhal
Mig
Statistik
Overblik
22
Træninger
118t
Tonnage
13
Ugers stime
Konsistens-score 81%
Sjove indsigter
🚌
Du har løftet 117.625 kg
Det svarer til 9,8 × bybus
📈
På denne dag
Benpres: 47,5 → 55 kg (+16%)
😅
Mest oversprungne øvelse
Rumænsk markløft — 4×
Træn
Statistik
Valhal
Mig
Statistik

Både de tørre tal og dem der får dig af sted

Fremgangsgrafer pr. øvelse med estimeret 1RM, samlet tonnage, en fremmøde-kalender og en muskelbalance der afslører om du presser meget mere end du trækker.

Og så det andet lag: din tonnage oversat til noget man kan forestille sig, hvad du løftede på denne dag for fire uger siden, og hvilken øvelse du har det med at springe over.

  • Hvert tal på siden er dækket af en unit-test
  • Konsistens vægtes højere end at være stærk
  • Eksport til CSV og JSON — dine data er dine
ᛘ Mimir

Fortæl om en skavank. Så retter han træningen til.

Mimir er ikke en chatbot der er limet på. Han kender dine tal, dit program og dine skavanker — og han foreslår konkrete ændringer, som du godkender.

Min højre skulder gør ondt når jeg presser over hovedet
ᛘ Mimir Det er vigtigt at lytte til kroppen. Da skulderpressen gør ondt, har jeg byttet den ud for at undgå yderligere irritation. Jeg har valgt triceps pushdown, så du stadig rammer armene — bare uden belastning over hovedet.
Byt
Skulderpres (maskine) → Triceps pushdown (kabel) Undgår smertefulde bevægelser over hovedet.
Bliver det ved, så få det set af en læge eller fysioterapeut. Mimir er ikke læge.
Jeg har kun 20 minutter i dag og vil gerne prioritere ryg
ᛘ Mimir · fire dage senere Jeg har forkortet træningen, så du kan nå det på 20 minutter med fokus på ryggen. Jeg har fjernet skulderpres grundet dine smerter; hvis smerten fortsætter, bør du opsøge en læge eller fysioterapeut.
Justér
Siddende roning · Nedtræk Prioriteret, så ryggen får hovedparten af tiden.
Fjern
Skulderpres · Brystpres Skåner skulderen og holder træningen inden for 20 minutter.

Læg mærke til den anden besked: den nævner ikke skulderen med ét ord. Mimir husker den selv — og bliver ved med at tage hensyn, indtil du siger at den er god igen.

🔒

Foreslår — bestemmer ikke

Intet ændres af sig selv. Du ser hver ændring med begrundelse og godkender. Resultatet gemmes som en kopi, så dit oprindelige program overlever.

🎯

Kan ikke opfinde øvelser

Modellen vælger fra en liste af rigtige øvelses-id'er, og hvert id valideres mod biblioteket bagefter. Ukendte kasseres — de gættes ikke.

Kender sin plads

Ingen kostråd, ingen kommentarer om krop eller vægt, ingen løfter om helbredelse. Ved smerte henvises der altid til læge eller fysioterapeut.

Din model, dit valg

Ikke bundet til én leverandør

Mimir taler med Anthropic, OpenAI, Google, Ollama — eller hvad som helst der taler OpenAI-protokollen, inklusive en model der kører på din egen server derhjemme. Helt uden API-nøgle, hvis den ikke kræver en.

At skifte udbyder er tre linjer i en konfigurationsfil. Ingen kodeændringer.

  • Reasoning-modeller håndteres — og gøres hurtige
  • Kun anonymiserede tal forlader serveren
  • Uden model coacher appen videre på regler
.env.local
# Egen model på eget net — ingen nøgle
AI_PROVIDER=custom
AI_BASE_URL=http://din-server.lan:8080/v1
AI_MODEL=gemma-4-26b-qat

# …eller en skytjeneste
AI_PROVIDER=anthropic
AI_MODEL=claude-sonnet-5
AI_API_KEY=sk-ant-…
Valhal
Rangliste
🏆
Ugens rejsende
Kristian — 2 træninger
1 K
Kristian (dig)
Jarl
🔥 13 22
2 I
Ib
Karl
🔥 9 18
Runer & mærker · 4 af 8
Træn
Statistik
Valhal
Mig
Valhal

Venlig kappestrid — ikke en konkurrence

Runer låses op efterhånden som du møder op. Rangen går fra Thræl til Einherjer, og fremmøde vejer tungest: det er at dukke op, appen belønner, ikke at være stærkest.

Ranglisten deler kun totaler — aldrig nogens rå træningslog. En privat profil er stadig med i kappestriden.

  • Badges genberegnes fra historikken, aldrig af hændelser
  • Milepæle i ting man kan forestille sig — en bil, et skib
  • Stimen brydes ikke af en uge der ikke er forbi endnu
Under motorhjelmen

Domænet ved ikke at der findes en database.

Alt der kan regnes ud, er rene funktioner uden I/O. Derfor er hvert tal i appen unit-testet, og derfor kan Uruz coache fornuftigt helt uden AI.

UI React Server + Client Components

Sider og komponenter. Indeholder ingen domænelogik — kalder kun ind i /lib.

Domæne rene funktioner · 104 tests

1RM og progression · statistik · badges og rang · coach-indsigter og tilpasning. Ingen fetch, ingen database, ingen React.

Data én flade, to backends

node:sqlite lokalt (nul opsætning) · Supabase/Postgres med Row Level Security i drift. UI ser aldrig en databasedriver.

Tjenester udskiftelige

AI-udbydere bag én chat() · passkeys og magic-link bag én auth-flade · web-push med e-mail som fallback · offline-kø i IndexedDB.

LagValgHvorfor
FrameworkNext.js 15 · TypeScript · React 19Én kodebase til web og PWA; kan mountes under et større panel
Databasenode:sqlite → Supabase/PostgresNul opsætning lokalt, RLS i produktion
PrivatlivRow Level SecurityAdgang håndhæves i databasen, ikke kun i UI'et
LoginPasskeys · magic-linkFace ID på iPhone; ingen adgangskoder at glemme
OfflineIndexedDB-kø + service workeriOS mangler Background Sync — køen styres af appen
AIEgen provider-fladeEnhver udbyder, også en nøglefri model på eget net
SprogDansk · engelskOgså øvelsesindholdet, ikke bare knapperne
Kom i gang

Tre kommandoer. Ingen konti, ingen nøgler.

Uruz kører lokalt på en indbygget database. Du skal ikke installere Postgres, oprette en Supabase-konto eller skaffe en API-nøgle for at se appen køre.

terminal
# 1 — hent afhængigheder
npm install

# 2 — klargør database og indhold
npm run setup

# 3 — start appen
npm run dev
valgfrit
# Se appen med 12 ugers data i
npm run db:seed:demo
npm run db:seed:history

# Nøgler til notifikationer
npm run gen:vapid

# Kør testene
npm test

Åbn så localhost:3000. Første gang bliver du bedt om at oprette administrator-kontoen — resten inviterer du selv ind.

📱

På din iPhone

Åbn i Safari → Del-ikonet → “Føj til hjemmeskærm”. Så ligger Uruz på hjemmeskærmen og åbner i fuld skærm uden browserlinje.

I skyen

Kør de to migrationer i supabase/migrations/, sæt nøglerne som miljøvariabler og deploy til Vercel. RLS følger med.

📖

Dokumentation

README til opsætning, ARCHITECTURE til hvordan det hænger sammen, og DECISIONS til hvorfor hvert valg blev truffet.