Geo-Harbor

Dokumentation

Teknisk beskrivning av hur Geo-Harbor fungerar — arkitektur, GPS-logik, dataflöde och API. Riktar sig till den som vill förstå appen på djupet innan de testar den.

Arkitektur & teknikstack

Appen består av en Android-klient skriven i Flutter/Dart och en backend-server skriven i Node.js med TypeScript. Klienten kommunicerar med servern via både REST (HTTP) och WebSocket. REST används för engångsoperationer som att skapa grupp, lägga till markering eller hämta historik. WebSocket används för realtidsdataflödet — positioner, larm och gruppnotiser.

Alla positioner lagras i en SQLite-databas med ett device-centrerat schema: varje GPS-punkt sparas en gång per enhet och tidsstämpel oavsett hur många grupper användaren är med i. En kopplingstabellen (location_visibility) bestämmer vilka grupmedlemmar som ser vilka punkter. Markeringar, grupper och e-postverifiering lagras i separata tabeller.

Flutter / DartAndroid-klientapp
Node.js + TypeScriptREST API + WebSocket-server
WebSocket (ws)Realtidskommunikation
SQLiteLokal databas på server
OpenStreetMapKartvisning (flutter_map)
Yr.no / MET NorwayVäderdata (yr.no, CC BY 4.0)

GPS-lägen

⚡ Standardläge (Balanserat & smart)

Standardläge kombinerar GPS, Wi-Fi och mobilmaster (PRIORITY_BALANCED_POWER_ACCURACY) för minimal batteripåverkan. Positionen uppdateras var 60:e sekund vid rörelse över 30 meter. Om appen känner av att du kör bil (via Androids aktivitetsigenkänning) växlar den automatiskt till fordonsprioritet med uppdatering var 15:e sekund vid rörelse över 50 meter. GPS-strömmen pausas automatiskt när du står stilla för att spara ström. Det här läget rekommenderas för de flesta situationer.

⚡⚡ Exakt läge (Hög noggrannhet)

Exakt läge använder ren GPS med högsta prioritet (PRIORITY_HIGH_ACCURACY). Positionen uppdateras var 5:e sekund vid rörelse över 5 meter för att ge ett helt exakt rörelsespår på kartan. Detta läge drar mer batteri och passar bäst när absolut precision krävs under kortare tidsperioder.

Realtidskommunikation via WebSocket

Klienten ansluter till servern via WebSocket vid inloggning och håller anslutningen öppen i bakgrunden (med en bakgrundstjänst). Varje positionsuppdatering skickas som ett JSON-meddelande och vidarebefordras omedelbart till alla andra anslutna grupmedlemmar. Latensen är typiskt under 100 ms inom Europa.

WebSocket-meddelanden inkluderar: positionsuppdateringar (lat/lng, riktning, hastighet, aktivitetstyp), markerings-händelser (ny/ändrad/borttagen/flyttad), larmsignaler (utlöst/återkallat), grupphändelser (godkänd, borttagen, ägarskifte). Vid avbruten anslutning försöker appen återansluta automatiskt var femte sekund.

Grupper och behörigheter

En grupp skapas med en slumpmässig 6-teckens inbjudningskod. Den som skapar gruppen blir automatiskt ägare. Ägaren kan: godkänna eller neka ansökningar, ta bort medlemmar, bjuda in via e-postlänk, överlåta ägarskapet och byta gruppens kod. Vanliga medlemmar kan se alla godkända grupmedlemmar och deras positioner, lägga till markeringar och utlösa larm.

En användare kan vara med i flera grupper samtidigt och byta aktiv grupp från menyn. Varje grupp har en separat WebSocket-kanal och positionsdatan hålls isolerad per grupp. E-postverifiering krävs vid anslutning till en grupp för att förhindra missbruk.

Data och integritet

All data lagras på servern geo-harbor.se. Ingen data delas med tredje part. Positionshistorik sparas med enhetens device-ID kopplat till grupmedlemskapet — det finns inget globalt användarkonto. Avinstallerar du appen och återinstallerar kan du återhämta ditt medlemskap via e-post.

Markeringar med tillhörande foton lagras på servern så länge gruppen existerar. Foton nås via autentiserade URL:er och visas inte för utomstående. Lämnar du en grupp tas ditt grupmedlemskap bort men markeringar du skapat behåller ditt smeknamn som skapare.

Fastighetsgränser och GPX-import

Appen stöder import av fastighetsgränser och markområden som GPX-fil — en funktion som är särskilt användbar för jaktlag som behöver hålla koll på vilken mark de har tillgång till. Gränsen ritas ut på kartan och delas direkt med alla i gruppen via WebSocket. Alla gruppmedlemmar ser samma gräns i realtid utan att behöva importera filen individuellt.

GPX-parsern stöder tre punktformat: spårpunkter (trkpt), rutpunkter (rtept) och waypoints (wpt). Filen måste innehålla minst 3 punkter. GPX-filer med markgränser kan exporteras från t.ex. Lantmäteriets karttjänst, jaktkartsappar eller andra kartverktyg. Det går också att rita gränsen manuellt direkt på kartan punkt för punkt och spara den på samma sätt.

API-översikt

Servern exponerar ett REST-API under /api/groups/. Alla anrop kräver giltigt groupId och memberId.

Grupper

Position & historik

Markeringar

Larm & övrigt