Concept-fase, technische verkenning

Stayd

Technische verkenning

Onderzoek naar bouwstenen, geen vastgelegde architectuur.

Deze pagina beschrijft hoe Stayd en Outpost technisch in elkaar zouden kunnen zitten. Welke keuzes zijn overwogen, welke richtingen lijken nu het meest passend, en waar zitten nog open vraagstukken die in een pilot of via onderzoek beantwoord moeten worden. Geen "dit is de oplossing", wel een eerlijke beschrijving van wat tot nu toe is uitgedacht.

Veel onderdelen op deze pagina zijn voorlopige richtingen. Het concept wordt momenteel gevalideerd. Voor de bredere context, zie stayd.brenco.nl.

Op deze pagina:

Architectuur in twee lagen

Het systeem bestaat uit twee delen die los van elkaar kunnen bestaan, maar samen het sterkst zijn. De Stayd-app draait op een gewone smartphone, tablet of laptop. De Outpost-infrastructuur is een netwerk van kleine apparaten op verzamelpunten in een wijk, die via LoRa-radio met elkaar communiceren en via lokale WiFi toegankelijk zijn voor bewoners.

In normale tijden werkt Stayd gewoon over het internet, zoals iedere messenger-app. De gebruiker merkt niets van het Outpost-netwerk: dat ligt stand-by op de verzamelpunten in de wijk en is in normale tijden niet actief als publieke voorziening.

Pas wanneer het internet uitvalt, komt het Outpost-netwerk in actie. Vanaf dat moment kan de Stayd-app berichten doorgeven via de LoRa-mesh tussen Outposts. Een gebruiker krijgt verbinding door fysiek naar een Outpost te lopen en zijn telefoon met de lokale Outpost-WiFi te verbinden (eenmaal verbonden, voortaan vanzelf in de buurt). Dat Outpost-WiFi is geen open netwerk: alleen de Stayd-app weet er mee om te gaan, en alleen de Stayd-app krijgt toegang tot het mesh-verkeer erachter. Voor wie geen Stayd-app heeft, is het een gesloten netwerk.

De Stayd-app

De app is bedoeld om op elk gangbaar platform te draaien (iOS, Android, en als webapp in de browser), zonder dat de gebruiker extra hardware nodig heeft.

Huidige voorkeursrichting

Een cross-platform app gebouwd met Expo en React Native, met daarnaast een Progressive Web App-variant via PWA-technologie voor distributie via Outpost-nodes zelf.

Waarom deze keuze nu: één codebase voor iOS, Android en web. Geen App Store nodig voor de PWA-variant (cruciaal in een crisis als App Stores ontoegankelijk zijn). De PWA kan via Outpost-WiFi verspreid worden zonder internet.

Alternatieven die zijn overwogen

De app gebruikt een lokaal-first ontwerp. Alle data (contacten, berichten, hulpprofiel) staat op het apparaat zelf, alleen toegankelijk voor de Stayd-app, niet voor andere apps of externe tracking. Een centrale dienst (de "Stayd-backend") wordt alleen gebruikt als doorgeefluik en als versleutelde backup. De app blijft volledig functioneel bij uitval van die backend.

Wat de gebruiker krijgt bij eerste opzet

Bij installatie en eerste opzet van Stayd genereert de app een paar dingen die later belangrijk worden:

Deze drie samen vormen het minimum dat een gebruiker buiten zijn telefoon bij zich heeft, voor het geval dat telefoon onbruikbaar wordt.

De Outpost-infrastructuur

Outpost-nodes zijn kleine, relatief goedkope apparaten die op verzamelpunten in een wijk staan: buurthuizen, scholen, kerken, of bij voorkeur op gebouwen die al noodstroom hebben (ziekenhuizen, brandweerkazernes, gemeentehuizen, verzorgingstehuizen).

Huidige voorkeursrichting voor hardware

Voor de eerste pilot lijken boards met een LoRa-radio en geïntegreerde WiFi/Bluetooth een natuurlijke startkeuze. Voorbeelden: RAK Wireless WisGate Connect of vergelijkbaar, Heltec-boards, of een Raspberry Pi-gebaseerde build voor de krachtigere primaire nodes.

Twee niveaus van nodes:

Alternatieven die zijn overwogen
Waarom geen Starlink of andere satelliet-uplink als hoofdroute?

Een satelliet-terminal op elke Outpost zou technisch werken: ook bij volledige uitval van internet en mobiel via reguliere paden kan zo'n terminal verbinding maken met een satelliet-netwerk. Toch is het bewust niet de hoofdroute van Stayd. Vier redenen:

Dat betekent niet dat satelliet-verbinding geen rol kan spelen. In een hybride opstelling kan één Outpost in een wijk via een satelliet-uplink fungeren als brug naar buiten de regio, naast LoRa-mesh op wijk-niveau. Optioneel, niet structureel.

Het mesh-protocol

Tussen Outpost-nodes is een netwerk-protocol nodig dat werkt zonder internet, en dat overweg kan met de zeer beperkte bandbreedte van LoRa. LoRa levert een paar honderd bytes per seconde tot enkele kilobytes per seconde, afhankelijk van afstand en instellingen.

Huidige voorkeursrichting: Reticulum op een eigen Outpost-mesh

Reticulum is een transport-agnostische crypto-stack die over verschillende media kan draaien (LoRa, internet, serieel). Voordelen: end-to-end versleuteling is ingebouwd, routing is decentraal via announces, en de stack is ontworpen voor lage-bandbreedte en hoge-latency-netwerken.

Het Outpost-netwerk zou Reticulum gebruiken als bovenliggende crypto-laag, met een LoRa-mesh-protocol als transport eronder. Implementaties zoals MeshCore en Meshtastic zijn bruikbaar als technische basis, maar het Outpost-netwerk draait op een eigen, voor crisis-doeleinden gereserveerde frequentieband, gescheiden van het bestaande MeshCore- of Meshtastic-netwerk. Dat voorkomt interferentie en houdt de capaciteit beschikbaar voor noodverkeer.

DARES onderzoekt LoRa-mesh officieel voor noodcommunicatie en is daarmee een waardevolle inhoudelijke partner, ook al draait Outpost op een eigen band. Internationaal vergelijkbaar werk gebeurt rond LXMF en RFC 9171 (Bundle Protocol) voor delay-tolerant networking.

Alternatieven die zijn overwogen

Een aantal protocolkeuzes liggen nog open. Welke LoRa-preset (snelheid versus bereik), welke frequentie-band (G3 op 869 MHz versus de minder drukke 863-865 MHz sub-band), en of een tweede LoRa-radio voor bridging met de bestaande MeshCore-community zinvol is. Deze keuzes hangen samen met de praktijktest in een pilotwijk.

Berichten, routing en wachttijden

In normale tijden lijken berichten op die van een gewone messenger: je stuurt iets naar een geverifieerd contact, en even later komt er een antwoord. Bij uitval van internet is het anders. Dan reist een bericht via LoRa-mesh tussen verzamelpunten, en blijft het bij het verzamelpunt in de wijk van de ontvanger wachten tot die langskomt en in bereik komt van de lokale WiFi.

Routing-richting

Elke gebruiker heeft een home_station: het verzamelpunt in zijn eigen wijk. Dat dient als hint voor de eerste route. Tegelijk leert het mesh-protocol decentraal waar gebruikers recent gezien zijn (via "announces"). Daardoor kan iemand ook bereikt worden via een andere Outpost dan zijn home_station, bijvoorbeeld als hij op werk is in een andere wijk. Vergelijkbaar met hoe GSM met "home" en "visitor" registraties werkt.

Announces hebben een korte levensduur (6-24 uur). Daarmee onthoudt het netwerk recente bewegingen kort, en vergeet oude vanzelf. Geen privacy-archief, geen geheugen-stapeling.

Bericht-status voor de gebruiker

Vier statussen worden zichtbaar gemaakt:

Bij een druk netwerk worden de bevestigingen geleidelijk teruggeschroefd om bandbreedte te besparen. Bij heel drukke momenten alleen nog "verzonden".

Een lastig deel is het beheren van schaarste op het LoRa-netwerk. Bij een crisis willen veel mensen tegelijk iets versturen. Hoe verdeel je die schaarste eerlijk, en hoe communiceer je dat begrijpelijk naar de gebruiker? De Stayd-app is bewust ontworpen om binnen de beperkingen van het Outpost-mesh werkbaar te zijn. Dat betekent niet alleen harde limieten ophalen (een maximale berichtgrootte, een maximaal aantal berichten per uur per gebruiker), maar ook positief: features die nuttige communicatie mogelijk maken binnen die beperkingen. Een paar ingebouwde voorbeelden:

Inspiratie komt van hoe radioamateurs al decennia met schaarste omgaan: korte berichten, vaste formats, gedeelde discipline.

Identiteit, vertrouwen en privacy

Identiteit in Stayd is gebaseerd op cryptografische sleutelparen. Elke gebruiker heeft een Ed25519-sleutelpaar voor handtekeningen en een Curve25519-sleutelpaar voor versleuteling. Voor de gebruiker blijft dit onzichtbaar; het werkt voor zover hij weet "gewoon".

Hoe vertrouwen wordt opgebouwd

Een contact toevoegen gaat via een fysieke handeling: een QR-code scannen van een apparaat dat je in handen hebt. Daarmee is het contact "in persoon bevestigd". Hulpverleners (huisarts, EHBO) worden geverifieerd via een institutionele certificate authority (CA): een overheidsinstantie (lokaal of landelijk) ondertekent hun sleutels op basis van een BIG-register-check, zodat de app weet dat het echt de huisarts is.

Voor officiële berichten van gemeente of veiligheidsregio bestaat een hiërarchie: een landelijke CA tekent regionale CA's, regionale CA's tekenen gemeentelijke. Daarmee kan een burger zien dat een waarschuwing echt van zijn eigen gemeente komt.

Privacy: wat de infrastructuur wel en niet ziet

Vier mechanismen samen beschermen de "sociale grafiek" (wie kent wie):

In een crisis-context ziet een Outpost-node natuurlijk wel routing-metadata: welke pubkey heeft een bericht gestuurd naar welke andere pubkey, op welk tijdstip. Dat is onvermijdelijk om berichten af te kunnen leveren. Pubkeys zijn echter pseudoniem en niet direct gekoppeld aan persoonsgegevens.

Energie en hardware

Outpost-nodes moeten dagen tot weken kunnen werken bij langdurige uitval. Daarvoor is een goed energie-ontwerp nodig: accu, zonnepaneel, en een protocol dat de LoRa-radio cyclisch aan en uit kan zetten zonder berichten te missen.

Energie-strategie per accu-niveau

Voorlopige richting (cijfers zijn schattingen):

Een externe knop met een gekleurde lamp (rood/groen) maakt voor de bewoner zichtbaar of er een venster is om de WiFi te gebruiken. Past bij hoe verzamelpunten in een crisis ook fysiek voelbaar moeten zijn.

De fysieke vorm: behuizing en plaatsing

Een Outpost-node hangt op een buurthuis, een school, een kerk. Het moet er passend uitzien (niet als een rare techniek-kast), bestand zijn tegen weer en vandalisme, en eenvoudig te onderhouden. Industrieel ontwerp en antenne-keuze zijn open vraagstukken voor de pilot.

Toegang zonder werkend apparaat

Niet iedereen heeft op het juiste moment een werkende telefoon. De batterij is leeg, het apparaat is gestolen of kapot, of iemand is op stap zonder zijn telefoon. Stayd is ontworpen rond drie oplopende lagen. De meeste situaties worden door de eerste laag opgelost; de derde is voor het zeldzame echt-niets-meer-scenario.

Laag 1: telefoon bijna leeg, USB-laden bij de Outpost

Een Outpost kan een of meerdere USB-laadpoorten hebben. Vijf tot tien minuten laden geeft een gemiddelde telefoon weer genoeg accu om de Stayd-app rustig te gebruiken: een paar berichten lezen, beantwoorden, statusje sturen. De gebruiker doet alles op zijn eigen apparaat. Geen externe sleutels, geen tijdelijke proxy, privacy blijft volledig intact.

Voor de meeste mensen lost dit het hele probleem op. De Outpost wordt daardoor ook een natuurlijk samenkomstpunt in een crisis, wat past bij de sociale laag waar Stayd op leunt.

Power-management is hier kritiek: de Outpost mag nooit zijn kerntaak verliezen door teveel telefoons te laden. Drie mechanismen samen: een harde sessielimiet (bijvoorbeeld vijf minuten, daarna gaat de poort uit tot de kabel wordt losgekoppeld en opnieuw aangesloten), een automatische cutoff zodra de Outpost-accu onder bijvoorbeeld dertig procent zakt, en een zichtbare countdown-LED bij elke poort zodat iedereen ziet hoeveel tijd er nog is. De LED geeft tegelijk een sociaal signaal aan wachtenden: er komt zo plek vrij.

Laag 2: telefoon kapot, gast-sessie op andermans Stayd-app

De Stayd-app ondersteunt meerdere accounts op één toestel. Voor de noodsituatie betekent dat: als het apparaat van iemand totaal onbruikbaar is (gevallen, gestolen, oplaadpoort kapot), kan diegene een gast-sessie openen op de telefoon van een naaste contact in de buurt, een familielid bij de Outpost, of een wijkbewoner die ook Stayd gebruikt.

Inloggen gebeurt met de herstel-passphrase of twaalf-woorden herstelzin die bij eerste opzet zijn aangemaakt (zie "Wat de gebruiker krijgt bij eerste opzet" hierboven). De app downloadt de versleutelde sleutel-backup uit de Stayd-backend en ontsleutelt die lokaal voor de duur van de sessie. Na uitloggen wordt alle ontsleutelde materiaal weer gewist. De host-telefoon ziet niets na afloop.

Deze laag vereist niet per se dat de versleutelde sleutel-backup bereikbaar is. Zelfs zonder toegang tot de backup blijft de gast-sessie nuttig: uit de herstelzin kan de app lokaal de cryptografische identiteit reconstrueren, dus de gast is direct bereikbaar voor nieuwe berichten. Alleen zijn eerder ontvangen berichten die in de backup zaten blijven ontoegankelijk tot de backup weer beschikbaar is. Voor de backup zelf is een werkend pad nodig: internet via mobiel, een ongekoppelde WiFi, of een Outpost met satelliet-uplink, of een eerder gecachte versie op de host-telefoon.

Trade-off: de gebruiker moet zijn herstel-passphrase of woordenzin paraat hebben. Wie die nooit heeft opgeslagen of vergeten is, kan deze laag niet gebruiken en valt terug op laag 3. Daarnaast is er een afhankelijkheid van vertrouwen in de host-telefoon. Voor uitzonderlijke situaties acceptabel, voor structureel gebruik niet bedoeld.

Laag 3: telefoon onbruikbaar én geen passphrase paraat, noodtokens op de Stayd-kaart

Bij de eerste opzet van Stayd genereert de app een paar kleine noodtokens, bedoeld om op de fysieke Stayd-kaart in de portemonnee geschreven te worden. Elk token is een kort, alfanumeriek codewoord in vier groepen van vier tekens, vooraf ondertekend door de private sleutel:

STAY-A3B7-9KMD-2NQX

Door de teken-set zonder verwarrende karakters (geen 0/O of 1/I) en een ingebouwde checksum kan de Stayd-app van een ander aanwezig persoon verkeerd overgeschreven codes meteen herkennen en aangeven welk teken niet klopt.

Elk token autoriseert één specifieke beperkte actie: "ik ben hier", "alles in orde", of "ik heb hulp nodig". Eenmaal gebruikt is het token op. Vervaldatum van bijvoorbeeld twee jaar, met een herinnering in de app om ze bij een wijk-oefening te vernieuwen.

Een noodtoken wordt niet rechtstreeks bij een Outpost ingevoerd (Outposts hebben geen scherm of toetsenbord). De gebruiker geeft de code op aan iemand anders bij het verzamelpunt met een werkende Stayd-app: een buurman, een familielid of een andere medeburger die ook gekomen is. Die persoon typt de code in zijn eigen Stayd-app; de app verifieert de handtekening, stuurt de actie via het mesh-netwerk, en markeert het token als gebruikt. De ander ziet niet welke actie aan het token gekoppeld is dan wat hij invoert.

Lees-toegang is niet mogelijk via noodtokens. Een token kan ondertekenen maar niet ontsleutelen, en de private sleutel is precies wat ontbreekt. Voor de meeste situaties is dat acceptabel: status sturen lost al heel veel op (familie weet dat je veilig bent), lezen kan wachten tot de telefoon weer werkt of er een gast-sessie via laag 2 mogelijk is.

Toegang voor mensen die niet zelf bij een Outpost kunnen komen

Niet iedereen kan in een crisis naar het verzamelpunt lopen: kwetsbare ouderen, mensen die slecht ter been zijn, bewoners aan de rand van het bereik. Voor hen biedt Stayd twee aanvullende routes.

Meerdere accounts op één telefoon. Wie zelf niet kan komen, kan zijn account tijdelijk laten toevoegen aan de Stayd-app van een buurman of mantelzorger die wel naar de Outpost kan lopen. De Stayd-app ondersteunt meerdere accounts naast elkaar, elk afgeschermd met een eigen PIN of biometrie. Wanneer de drager bij de Outpost komt, haalt de app berichten op voor álle accounts die op die telefoon staan, niet alleen het eigen. Bij thuiskomst logt de oorspronkelijke eigenaar in op zijn eigen account op die telefoon en leest zijn eigen berichten. De drager heeft geen inzage in de inhoud van andermans account.

Berichten meedragen naar het eigen apparaat van de ander. Een variant waarbij de helpende persoon de versleutelde berichten van de Outpost ophaalt en thuis bij de ontvanger via een korte lokale verbinding (Stayd-app naar Stayd-app over hetzelfde WiFi) overzet naar diens eigen telefoon. De berichten blijven onderweg versleuteld voor de uiteindelijke ontvanger, dus de helpende persoon ziet de inhoud niet. De controle blijft bij de eigenaar van het account.

Walking Outpost via QR-codes. Voor mensen in een erg afgelegen dorp of bij een groep huizen in het buitengebied, ver van enige Outpost, kan een vrijwilliger bij de dichtstbijzijnde Outpost een kopie ophalen van alle versleutelde berichten die daar tijdelijk zijn opgeslagen, en die kopie in zijn Stayd-app meedragen naar zijn dorp. Hij kan zelf alleen de berichten lezen die aan hem zijn geadresseerd; de rest blijft versleuteld. Komt hij iemand tegen die ook iets verwacht, dan toont die persoon een QR-code met zijn pubkey, en de app van de vrijwilliger levert in één of enkele QR-codes precies de berichten voor die persoon. Geen extra hardware, geen extra netwerk, alleen het scherm en de camera van twee telefoons.

Een derde aanpak, telefoons die via Bluetooth of WiFi-Direct automatisch berichten aan elkaar doorgeven (zoals Briar doet), is niet gekozen wegens hoge batterij-belasting en restricties die iOS en Android op achtergrondprocessen zetten.

App-distributie wanneer app stores onbereikbaar zijn

Als internet en de mobiele netwerken langere tijd uitvallen, is ook de Google Play Store en de Apple App Store niet meer bereikbaar. Mensen die op dat moment de Stayd-app nog niet hebben, kunnen die dan niet meer langs de gebruikelijke route downloaden. Stayd zet daarom in op één primaire route, met één aanvulling voor wie meer OS-integratie wil.

Primaire route: Stayd als Progressive Web App (PWA). De Stayd-app is ook beschikbaar als webpagina die werkt zoals een geïnstalleerde app: te openen in een browser, op te slaan op het startscherm, en daarna offline werkbaar. De PWA wordt gehost op elke Outpost zelf en is bereikbaar via de Outpost-WiFi. Wie binnen bereik komt kan de pagina ophalen en meteen gebruiken, zonder ooit langs een app store te gaan. Sleutels en berichten worden lokaal opgeslagen (Web Crypto API plus persistente browser-opslag), dezelfde privacy-eigenschappen als de native versie.

Verbinden met het Outpost-WiFi gaat via een fysiek bordje bij de Outpost met een QR-code in het standaard WiFi-formaat. De gewone camera-app van iOS of Android herkent die en stelt vanzelf voor om te verbinden. Daarna onthoudt de telefoon het netwerk en verbindt in het vervolg automatisch zodra die binnen bereik is. Geen extra installatie nodig voor deze stap.

Native apps in de app stores als opt-in. Voor wie meer OS-integratie wil (achtergrond-notificaties, ruimere offline werking, vlottere prestaties) is er ook een Android- en iOS-versie via de reguliere stores. Vereist installatie vooraf, werkt in normale tijden net wat soepeler.

Hoe goed dit in praktijk werkt voor verschillende Android- en iOS-versies, en welke OS-restricties hier in de weg gaan zitten, is een open vraag die zich uitstekend leent voor verder onderzoek: hoe verspreid en gebruik je in een crisis-situatie een Stayd-achtige app op beide platforms? Een denkbare uitbreiding daarbinnen: kan de native versie van Stayd via een eigen WiFi-hotspot de PWA serveren aan andere telefoons in de buurt, zodat lokale distributie ook werkt zonder Outpost?

Niet alleen techniek: hoe het er voor de gebruiker uitziet

Techniek is maar de helft. De gebruiker moet de app ook willen openen, kunnen begrijpen, en in een stressmoment niet vastlopen.

Foreground-only en bewust opzoeken

De app draait niet permanent op de achtergrond. Wie bericht wil, opent de app actief. Dat scheelt batterij, vermijdt de complexiteit van push-notificaties (die in een crisis sowieso niet werken), en past bij de bewuste-schaarste-cultuur die het systeem nodig heeft. In normale tijden kunnen wel Web Push-meldingen worden ontvangen, gemaximeerd op 1-2 per maand.

Open vraagstukken

Veel keuzes op deze pagina zijn voorlopig. Hieronder eerst de drie vragen die als eerste opgehelderd moeten worden, daarna de bredere lijst van openstaande punten.

Wat als eerste opgehelderd moet worden

Drie vragen vormen samen de kern van de Outpost-aanpak. Zolang die niet beantwoord zijn, blijft die aanpak een aanname en is een aanvraag voor grootschalige uitrol prematuur:

Een kleinschalige veldproef met een paar prototype-nodes in één straat of buurt is genoeg om deze drie vragen voor het grootste deel te beantwoorden.

Bredere openstaande punten

Als een kern-aanname niet klopt

Veel keuzes op deze pagina rusten op aannames. Niet alle zullen overleven in praktijk. Hieronder voor de drie meest kritieke aannames een eerlijke schets van wat overblijft als ze sneuvelen. Doel: niet alles weggooien als één ding niet werkt.

Als LoRa in NL stedelijke context niet voldoende blijkt

Stel de eerste veldproef wijst uit: het LoRa-bereik door bebouwing is te beperkt of de doorvoer is te laag voor zinvolle wijk-communicatie. Wat blijft over?

De combinatie van app plus lokale infrastructuur blijft het ontwerp. Alleen de radio-technologie verandert. Er zijn alternatieve routes beschikbaar (andere frequentiebanden, samenwerking met radioamateurs, of hybride opstellingen waar één Outpost via een ander pad nog wel internet heeft) die werken waar LoRa tekortschiet. Welke radio-laag de Outposts vullen is een ontwerpkeuze, niet een principe. Wat niet verandert: er staat hardware in de buurt die los van het reguliere internet kan werken.

Als Reticulum in praktijk niet goed werkt op de Outpost-mesh

Stel Reticulum blijkt te veel overhead te hebben voor de beperkte LoRa-doorvoer, of de announces schalen niet naar wijk-niveau. Wat blijft over?

Verlies: minder verfijnde routing en identiteits-beheer dan Reticulum biedt. Winst: minder afhankelijkheid van één specifieke stack.

Als de Outpost geen 7 dagen autonomie haalt

Stel een Outpost komt na 2 of 3 dagen zonder zon stil te liggen. Wat blijft over?

Zelfs als de meest ambitieuze claims onhaalbaar blijken, blijft er een waardevol product over. Vroeg ontdekken dat iets niet werkt is veel goedkoper dan datzelfde later in een pilot ontdekken.

Bronnen

De keuzes op deze pagina bouwen voort op bestaand werk en bestaande standaarden. Hieronder de belangrijkste verwijzingen.

Mesh-protocollen en netwerken

Cryptografie en privacy

App-techniek

Hardware-platforms

Vergelijkbare systemen voor inspiratie

Nederlandse context