- Info-knappen (ℹ) åpner nå sivilforsvarsdialog med alle 5 steg,
med «Om»-lenke i bunnen (som Android-appen)
- Laste-overleggets knapper («Lagre kart» / «Hopp over») får
tekst fra i18n i stedet for å være tomme
- Kompassvisningen resizes canvas når den blir synlig, fikser
0×0-canvas når den initialiseres mens containeren er skjult
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Appen kan nå serveres både på / og under en understi som
/tilfluktsrom uten endringer.
- Sett base: './' i vite.config.ts
- Endre alle absolutte stier i index.html til relative
- Oppdater manifest.webmanifest med start_url: "." og scope: "."
- navigateFallback uten ledende skråstrek
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Legger til Release Process-seksjon i CLAUDE.md med:
- Steg-for-steg for å lage ny utgivelse
- Bygging av Android APK-er og PWA-tarball
- fj release create og fj release asset create syntaks
- Oppdatert Distribution-seksjon med PWA-tarball
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Leaflet vendora:
- Fjerna CDN <link> for Leaflet CSS (allereie bundla via npm-import)
- Kartmarkør-ikon brukar bundla bilete i staden for unpkg URL-ar
- CSP stramma: unpkg ikkje lenger naudsynt i style-src/img-src
Slett buffer:
- «Slett lagra data»-knapp i om-dialogen
- Slettar localStorage, IndexedDB og tenestararbeidar-bufferar
- Lokalisert til en/nb/nn
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Legg til Screenshots-seksjon i CLAUDE.md med:
- Emulatoroppsett (AVD, headless start, fake GPS)
- Maestro v2.3.0 for repeterbare skjermbiletesekvensar
- Fastlane-mappestiar for alle tre språk
- Liste over gjeldande skjermbilete
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Nye skjermbilete frå emulator (Bergen sentrum):
- Kartvisning, valt tilfluktsrom, kompass med nordindikator,
sivilforsvarsinfo, og ny om-side med personvernerklæring
README oppdatert:
- Femte skjermbilete (om-side) lagt til
- Nordindikator og tilgjengelegheit nemnde i funksjonslista
- Datakjelde retta: DSB, distribuert via Geonorge
- Sikkerheitsavsnittet utfylt med CSP, 24t GPS-utløp, User-Agent
- Personvernavsnittet utvida
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Geonorge er distribusjonsplattforma, men dataeigar er DSB
(Direktoratet for samfunnstryggleik og beredskap). Oppdatert
om-side og personverntekst i alle tre språk (en/nb/nn) for
både Android og PWA.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Om-side (Android + PWA):
- Ny AboutDialog med personvernerklæring, datakjelder og opphavsrett
- Opphavsrett flytta frå sivilforsvardialogen til om-sida
- Tilgjengeleg via «Om denne appen»-lenke i sivilforsvarsdialogen (Android)
og ny om-knapp i statuslinja (PWA)
- Lokalisert til en/nb/nn
Personvern og sikkerheit:
- Lagra GPS-posisjon utløper etter 24 timar (widget_prefs)
- Widget viser «Trykk for å oppdatere» når posisjon manglar eller er utløpt
- Eigendefinert User-Agent (Tilfluktsrom/1.6.1) i OkHttp
- Content Security Policy (CSP) meta-tag i PWA
- Tenararbeidar bufrar berre HTTP 200-svar (ikkje opake)
- Kartbuffer-metadata runda til ~11km presisjon i localStorage
- crossorigin="anonymous" på Leaflet CSS
i18n-opprydding:
- Unicode-escapes erstatta med UTF-8-teikn i nb.ts og nn.ts
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tilgjengelegheit (Android + PWA):
- Semantiske landemerke (header, main, aside, role=dialog)
- aria-live-regionar for statusoppdateringar og lasteoverlegg
- Fokusindikatorar (:focus-visible) og prefers-reduced-motion
- Auka trykkmål til 48dp (infoknapp, oppdater, del, widget)
- contentDescription på kart, kompass og framdriftsindikator
- aria-current og role=listitem på tilfluktsromliste
- Fokusfangst og fokusgjenoppretting i lasteoverlegg
- Ikkje-farge-indikator (▶) for valt tilfluktsrom
- Dynamisk lang-attributt basert på oppdaga språk
- Lokaliserte aria-label (en/nb/nn)
Nordindikator:
- DirectionArrowView teiknar diskret «N»-markør på omkrinsen
- Roterer uavhengig av hovudpila for kompasskalibrering
- Berre på stor kompassvisning, ikkje minipila
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fjern dependency metadata frå APK-signeringsblokka (dependenciesInfo)
for F-Droid-kompatibilitet
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fdroidserver parser build.gradle.kts med regex for å finne versionCode
og versionName. Den dynamiske Properties-lastingen fra version.properties
ga "Couldn't find any version information". Erstatt med literale verdier
som fdroidserver kan lese.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
F-Droid krever at short_description.txt ikke slutter med punktum.
Erstatt to setninger med én sammenhengende frase med tankestrek.
Legg til 512x512 icon.png generert fra appens adaptive ikon-vektorer.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Passord og keystoresti var hardkodet i build.gradle.kts og synlig i
det offentlige repoet. Flyttet til keystore.properties som er
gitignorert. Bygget hopper over signering om filen mangler, slik at
F-Droid kan bygge og signere med sin egen nøkkel.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Splitt LocationProvider, ShelterWidgetProvider og WidgetUpdateWorker i
to varianter: standard (med Play Services for bedre GPS) og fdroid
(kun AOSP LocationManager). Play Services-avhengigheten er nå begrenset
til standardImplementation.
Begge varianter bygger og har identisk funksjonalitet — fdroid-varianten
mangler bare FusedLocationProviderClient som en ekstra lokasjonskilde.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Erstatt grove estimater med reelle bidragstall fra GitHub, OpenHub og
prosjektsider. Legg til kildelenker for ~20 prosjekter, Mermaid-diagram,
og seksjon med interessante detaljer (SQLite med ~4 utviklere, Leaflet
fra Ukraina). Legg til Forgejo/Gitea og GitHub som manglende lag.
Oppdatert totalestimat: ~119 000 mennesker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
README-en hadde ein del nynorskformer (eit, dei, sjå, peikar, lagrast,
osv.) blanda inn i det som elles var bokmål. Retta til konsekvent
bokmål gjennom heile dokumentet.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Legg til skjermbilete frå appen i toppen av README, ei «Slik fungerer
appen»-seksjon som forklarar kart, kompass og sivilforsvarsinfo, og
lenkjer til personvernerklæring og Standing on Shoulders-dokument.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Estimerer at ~116 000 personar har bidrege til verktøya, biblioteka,
datakjeldene og infrastrukturen som gjer det mogleg å byggje denne appen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Automatiserte skjermbilete for alle tre språk (en-US, nb-NO, nn-NO)
med Maestro-flyt. Fire bilete per språk: kartvisning, valt tilfluktsrom,
kompassvisning og sivilforsvarsinfo. GPS-posisjon er sett til Bergen
sentrum (Torgallmenningen).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Når tilfluktsromdata er lasta men GPS-posisjon manglar, viser
botnaka no «Ventar på GPS…» i staden for å vera tom. Posisjonsfiks
erstattar ventestatusen automatisk når han kjem.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Legg til fastlane/metadata/android/ med tittel, skildringar og
endringsloggar for en-US, nb-NO og nn-NO (versionCode 3–6).
Dokumenter Play Services-avhengigheit og anti-feature-vurdering.
Skjermbilete må framleis leggjast til i images/-mappene.
Closes#8
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Android: HapticFeedbackConstants.VIRTUAL_KEY på alle knappar og
listeelement. PWA: navigator.vibrate(10ms) på same interaksjonar.
Closes#11
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Endrar «når alarmen går» til «hvis/om alarmen går» for å unngå
å implisere at ein nødsituasjon faktisk skjer.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Endrar widget-tidsstempel frå berre «14:32» til «Oppdatert 14:32»
slik at det er tydeleg at dette er siste oppdateringstidspunkt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Legg til role=img og aria-label på retningspil-canvas
- Oppdater aria-label dynamisk med avstand ved val av tilfluktsrom
- Legg til direction_arrow_description-streng i alle tre språk
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Endrar status_text frå #B0BEC5 (~4.5:1) til #CFD8DC (~6.5:1) mot
#16213E-bakgrunnen, i både Android-appen og PWA-en.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Legg til contentDescription på tilfluktsrom-listeelement for TalkBack
- Erstatt emoji-kompassåtvaring med tilgjengeleg tekstresurs
- Vis «Ventar på GPS…» i staden for «—» ved ukjend avstand
- Legg til content_desc_shelter_item og compass_accuracy_warning-strengar (en/nb/nn)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Samlar all attribusjon og lisensinformasjon for eksterne datakjelder
(Geonorge, OpenStreetMap, DSB) i éi fil. Førebur for issue #9
(internasjonale datakjelder).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ny info-knapp (ℹ) i statuslinja opnar ein dialog med sivilforsvars-
instruksjonar: viktig melding-signal, flyalarm, søk dekning, lytt til
NRK P1 på DAB-radio, og faren over-signal. Alt innhald er verifisert
mot offisielle DSB-retningslinjer og fungerer utan nett. Støttar alle
tre språk (en, nb, nn).
Fixes#4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Widgeten kunne ikkje hente posisjonsdata i bakgrunnen fordi Android
avgrenser GPS-tilgang for bakgrunnsprosessar (BroadcastReceiver) frå
og med Android 8+. Både FusedLocationProviderClient og LocationManager
returnerte null umiddelbart ved aktiv førespurnad frå bakgrunnen.
Løysinga er å lagre siste GPS-posisjon til SharedPreferences kvar gong
MainActivity får ei ny posisjonsfiks. Widgeten og WidgetUpdateWorker
les denne som siste utveg etter at system-API-ar har feila.
Endringane i detalj:
Widget (ShelterWidgetProvider):
- Brukar goAsync() + bakgrunnstråd for asynkron oppdatering
- Prøver FusedLocationProvider (Play Services), så LocationManager
(AOSP), og til slutt SharedPreferences som fallback
- Ny metode requestUpdateWithLocation() for å sende posisjon via
intent extras (unngår separate posisjonsbuffertar)
- Viser tidsstempel (HH:mm) for å sjå når widgeten sist vart oppdatert
WidgetUpdateWorker:
- Aktivt ber om ny posisjonsfiks (getCurrentLocation) i staden for
berre å lese passiv buffer
- Sender oppnådd posisjon direkte til widgeten via broadcast
- Fallback til SharedPreferences viss aktiv førespurnad feilar
- Ny runOnce()-metode for eingongsoppdatering
MainActivity:
- Lagrar GPS-posisjon til SharedPreferences ved kvar oppdatering
(saveLastLocation) så widgeten kan bruke den i bakgrunnen
Relatert: #3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Widget oppdaterer seg sjølv via WorkManager kvar 15. min i bakgrunnen,
og i sanntid når appen er open og mottek GPS-oppdateringar.
Oppdaterer CLAUDE.md med de-Google-kompatibilitetsprinsipp.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Del tilfluktsrom via SMS/meldingsapper med adresse, kapasitet,
koordinatar og geo:-URI. Støttar tilfluktsrom://shelter/{id}
deep link for direkte navigering til eit tilfluktsrom.
Closes#3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Hybrid LocationProvider: prøver Play Services først, faller tilbake
til LocationManager for degooglede einingar (F-Droid-kompatibel)
- Dataferskheitsindikator i statuslinja med tre nivå (fersk/veke/gammal)
- Heimeskjerm-widget som viser næraste tilfluktsrom med avstand
- Personvernerklæring (PRIVACY.md) på engelsk og norsk
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Konfigurerer release-signering med keystore i ~/.android/ slik at
release-APK kan bygges og distribueres direkte.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Mozilla Public License 2.0 gir kopyleft på filnivå, men er
kompatibel med app-butikker og proprietære avhengigheter som
Google Play Services.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PWA-koden kompilerer og enhetstester passerer, men den er ikke
manuelt verifisert i nettleser ennå.
Refs #1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add scripts/fetch-shelters.sh: downloads Geonorge data, converts
UTM33N→WGS84 via PWA script, copies to both Android assets and
PWA public dirs
- Bundle pre-processed shelters.json (556 shelters) in APK assets
so the app works immediately on first launch with no network
- ShelterRepository.seedFromAsset(): seeds Room DB from bundled
JSON on first launch, marks as stale so network refresh is
attempted in the background
- MainActivity.loadData(): seeds from asset before trying network,
always attempts background refresh when data is stale
- Add version.properties (1.1.0, versionCode=2) as single source
of truth for versioning
- build.gradle.kts reads version from properties file and exposes
via BuildConfig
- Bump PWA version to 1.1.0 to match
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- LocationProvider: close Flow with SecurityException when permission
is missing (instead of silently completing), log trySend failures,
handle lastLocation failure callback
- loadData(): wrap in top-level try-catch so database errors don't
leave the app in a broken loading state
- Cache retry button: show "Waiting for GPS" toast when location is
null instead of silently doing nothing
- selectShelterByData: use NaN for distance/bearing when no GPS fix
yet, so UI shows "—" instead of misleading "0 m"
- DistanceUtils.formatDistance: handle NaN gracefully
- GeoJSON parser: require valid lokalId (primary key) — reject
shelters with missing ID to prevent DB collisions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use repeatOnLifecycle(STARTED) for location updates so GPS stops
when Activity is paused (battery conservation)
- Pair enableMyLocation/disableMyLocation with onResume/onPause
- Add low-pass filter for accelerometer+magnetometer compass fallback
to reduce arrow jitter
- Detect missing compass sensors and show warning instead of frozen
arrow
- Monitor compass accuracy via onAccuracyChanged and indicate
degraded readings
- Show permission rationale dialog using existing i18n strings
- Guide user to Settings when location permission is permanently
denied
- Check cacheMapArea return value and show banner on failure
- Add error handling around shelter Flow and location Flow collection
- Add contentDescription to direction arrow views for screen readers
- Use safe casts for system services (as? instead of as)
- Use explicit dark theme parent (Theme.Material3.Dark.NoActionBar)
instead of DayNight with hardcoded dark colors
- Add error_no_compass and direction_arrow_description strings in
en/nb/nn
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Wrap deleteAll+insertAll in Room transaction to prevent data loss
on crash during refresh
- Add CancellationException rethrow in ShelterRepository and
MapCacheManager to preserve structured concurrency
- Close OkHttp response body on error paths (response.use{})
- Add ZIP bomb protection (10MB cap) in GeoJSON parser
- Add per-feature error handling — skip malformed records instead of
losing all shelters
- Validate coordinates within Norway's bounding box
- Enforce HTTPS-only via network_security_config (remove cleartext
allowance for tile.openstreetmap.org)
- Disable android:allowBackup to prevent DB extraction via ADB
- Strip Log.v/d/i in release builds via ProGuard to prevent location
data leakage
- Restore map position in MapCacheManager.finally block on
cancellation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove accidentally committed node_modules/ and dist/ directories,
and add .gitignore to prevent them from being tracked.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Vite + TypeScript PWA that mirrors the Android app's core features:
- Pre-processed shelter data (build-time UTM33N→WGS84 conversion)
- Leaflet map with shelter markers, user location, and offline tiles
- Canvas compass arrow (ported from DirectionArrowView.kt)
- IndexedDB shelter cache with 7-day staleness check
- Service worker with CacheFirst tiles and precached app shell
- i18n for en, nb, nn (ported from Android strings.xml)
- iOS/Android compass handling with low-pass filter
- Respects user map interaction (no auto-snap on pan/zoom)
- Build revision cache-breaker for reliable SW updates
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>