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

⚡ Standard (rekommenderat)

Standardläget kombinerar GPS, Wi-Fi och mobilmaster (PRIORITY_BALANCED_POWER_ACCURACY) för låg batteripåverkan. Positionen uppdateras var 60:e sekund vid rörelse över 30 meter. Håller du en fart över 25 km/h växlar appen automatiskt till fordonsläge: högsta noggrannhet, var 15:e sekund vid rörelse över 50 meter. Fordonsläget styrdes tidigare av Androids aktivitetsigenkänning, men den behörigheten är borttagen — farten kommer nu från GPS-mottagaren, vilket dessutom är mer träffsäkert.

⚡⚡ Smart (anpassar sig)

Smart-läget avgör i två steg hur ofta positionen behövs. Först: rör sig personen? Det avgörs av accelerometern, inte av farten, så även en jägare som smyger i 1 km/h räknas som i rörelse. Sedan: hur fort? Gång ger balanserad precision var 20:e sekund, cykel (över 7 km/h) hög precision var 12:e sekund och bil (över 25 km/h) hög precision var 8:e sekund. Står du stilla går appen över i passivt läge och slår inte på GPS:en alls — en bakgrundsvakt ser ändå till att ett fix garanteras ungefär var 15:e minut, så laget aldrig tappar dig helt.

⚡⚡⚡ Exakt (hög noggrannhet)

Exakt läge använder ren GPS med högsta prioritet (PRIORITY_HIGH_ACCURACY): var 5:e sekund vid rörelse över 5 meter, vilket ger ett detaljerat rörelsespår på kartan. Står du stilla sänks takten till ett garanterat golv på två minuter — en jägare som sitter på passet i timmar tjänar ingenting på trettio identiska positioner i minuten, men laget ser hela tiden var passet är. Läget drar mer batteri och tvingas automatiskt fram under en aktiv jakt.

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 kod som skaparen själv väljer — den slumpas inte fram, så laget kan bestämma något de kommer ihåg. 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/. Man loggar in med e-post och en engångskod; alla övriga anrop kräver inloggningsnyckeln som delas ut då (Authorization: Bearer), och gruppanrop kräver dessutom godkänt medlemskap i gruppen.

Grupper

Position & historik

Markeringar

Larm & övrigt