Masterplan Testclient: een eigen client om de relay te beproeven
Vandaag is Trezor Suite de enige client, en die vraagt hardware die aan het toestel kan. Daardoor rusten vier beweringen over deze app op redenering uit de broncode in plaats van op een proef, waaronder dat blokkeren pas bij de volgende verbinding werkt. Paragraaf 4c zet die vier op een rij als proeven. Alles wordt vanuit een scherm bediend, en dat scherm gaat over de client. Aan de server-app wordt niets gedaan: die draait en synchroniseert met Trezor Suite op de Mac, bevestigd door de gebruiker op 09-09-2026. De leerstand openzetten en iemand blokkeren blijft dus op de statuspagina van de app, want de agent-API hangt achter de inlog van umbrelOS. Dat staat er als feit om te kennen, zodat er later geen knoppen bij komen die niet kunnen werken. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -70,6 +70,7 @@ daaronder, dus deze tabel en de mapinhoud kunnen niet uit elkaar lopen.
|
||||
| Plan | App | Afhankelijk van | Waarover het gaat |
|
||||
|-|-|-|-|
|
||||
| [Bereikbaarheid.PLAN.md](Plannen/Masterplannen/Bereikbaarheid.PLAN.md) | Relay | Umbrelapp: er valt niets bereikbaar te maken zolang er niets draait | Synchroniseren buiten het thuisnetwerk. **Suite eist geen TLS**, dus Tailscale blijft open en een certificaat is geen voorwaarde. Het risico van een publiek eindpunt is niet vertrouwelijkheid (dat regelt de versleuteling) maar misbruik als gratis opslag: een kale relay kent geen accounts. Wil je tóch open, dan is een eigenaars-allowlist nodig; drie manieren in §4b |
|
||||
| [Testclient.PLAN.md](Plannen/Masterplannen/Testclient.PLAN.md) | Relay | – | Een eigen cliënt om meerdere eigenaars aan te maken en gegevens door de relay te duwen, zonder Trezor Suite en zonder hardware. Vult het gat dat vier beweringen over deze app op redenering laat rusten in plaats van op een proef, waaronder "blokkeren werkt pas bij de volgende verbinding". Alles vanuit één scherm, en aan de server-app wordt niets gedaan: die draait en synchroniseert met Trezor Suite (bevestigd 09-09-2026) |
|
||||
| [Publicatie-Relay.PLAN.md](Plannen/Masterplannen/Publicatie-Relay.PLAN.md) | Relay | Umbrelapp | Inleveren bij de officiële appstore. De image bestaat en is gepind sinds **Eigenimage** (08-09-2026); wat ontbreekt is `linux/arm64`, en `build.sh` heeft er een ongeteste schakelaar voor. Het andere risico: de eis dat de umbrelOS-inlog aan blijft terwijl de relay een cliënt zonder sessie moet bedienen |
|
||||
| [Publicatie-Gate.PLAN.md](Plannen/Masterplannen/Publicatie-Gate.PLAN.md) | Gate | Appstore: de herstart-controle | **Doel van de gebruiker sinds 20-08-2026:** de app inleveren als standaard-app voor Umbrel. Dat verandert de maatstaf van "hij werkt hier" naar "iemand anders keurt het pakket goed". Het meeste is al goed; de image is eigen en gepind sinds **Eigenimage** (08-09-2026). Wat er nog moet: `linux/arm64` erbij bouwen, het app-id kaal maken en de manifestvelden op orde. Het risico zit niet in die lijst maar in de leesmount op de certificaten van Zoraxy |
|
||||
| [Configuratie.PLAN.md](Plannen/Masterplannen/Configuratie.PLAN.md) | Gate | – | **Grotendeels ingehaald op 19-08-2026** en moet opgeschoond worden voordat promotie nog zin heeft: de agent doet de certificaatbronnen en de keuze al, en het hardgecodeerde domein is uit de compose en uit `nginx.conf.template` verdwenen. Wat er nog in zit is een configuratiebestand voor de poort- en padoverstemmingen, plus de README |
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
# Testclient - masterplan
|
||||
|
||||
> **App: Evolu Relay.** Status: nog niet actief. Dit is één bestand en dat is bewust: er wordt nog niet aan
|
||||
> gewerkt. Bij promotie naar `Plannen/Actief/NNN-Testclient/` worden de paragrafen hieronder over de vier
|
||||
> bestanden verdeeld; zie `HomeGit/Docs/Werkproces.md` §1b.
|
||||
>
|
||||
> Afhankelijk van: niets. De relay draait sinds 28-08-2026 en de haken die dit plan beproeft bestaan al.
|
||||
|
||||
## 1. Doel
|
||||
|
||||
Een eigen cliënt waarmee je meerdere eigenaars kunt aanmaken, ze op de relay kunt laten verbinden en er
|
||||
gegevens doorheen kunt duwen, om het toegangsbeleid en de opslag te beproeven zonder Trezor Suite en zonder
|
||||
hardware.
|
||||
|
||||
Aanleiding: Suite is vandaag de enige cliënt, en die vraagt een apparaat dat aan het toestel kan (zie
|
||||
[Upstream-evolu-relay.md](../../Referenties/Upstream-evolu-relay.md) §9). Daardoor rust een deel van wat we
|
||||
over deze app opschrijven op redenering in plaats van op een proef. Het scherpste voorbeeld staat in §10 van
|
||||
datzelfde document: blokkeren werkt pas bij de volgende verbinding. Dat is uit de broncode afgeleid en nooit
|
||||
gezien.
|
||||
|
||||
## 2. Afbakening
|
||||
|
||||
Een programma dat buiten de Umbrel draait, op de laptop, en dat via de gepubliceerde relay-poort verbindt.
|
||||
Meerdere eigenaars naast elkaar, elk met een eigen sleutelmateriaal en een eigen lokale database. Eén
|
||||
bedieningsvlak waarin je die eigenaars ziet en aanstuurt.
|
||||
|
||||
## 3. Niet-doelen
|
||||
|
||||
- **Geen tweede relay en geen wijziging aan de app.** Als dit plan een aanpassing in `tools/evolu-relay/`
|
||||
nodig lijkt te hebben, is dat een aanwijzing dat er iets misgaat in de opzet, niet een taak. De relay
|
||||
wordt beproefd zoals hij draait.
|
||||
- **Geen ontcijfering van gegevens van Trezor Suite.** De cliënt maakt eigen sleutels en leest zijn eigen
|
||||
gegevens. Wat Suite op de relay zet blijft onleesbaar, en dat is de belofte in het manifest. Zie
|
||||
`CLAUDE.md`, "Zet geen ontcijfering in deze app", en §11 van het naslagdocument.
|
||||
- **Geen onderdeel van de app store.** Dit is gereedschap in `tools/` en het gaat nooit in een image of in
|
||||
een app-map mee.
|
||||
- **Geen nabouw van het protocol.** Net als bij de relay geldt: `@evolu/common` doet het werk, wij roepen
|
||||
het aan.
|
||||
|
||||
## 4. Ontwerp
|
||||
|
||||
### 4a. Een eigenaar is een mnemonic plus een eigen map
|
||||
|
||||
Evolu leidt een `AppOwner` af uit een mnemonic. Een tweede eigenaar is dus niets anders dan een tweede
|
||||
mnemonic met een eigen SQLite-bestand ernaast; er is geen accountbegrip dat gedeeld moet worden. De cliënt
|
||||
bewaart per eigenaar een map met de mnemonic en de database, onder een pad dat in `.gitignore` staat.
|
||||
|
||||
Dat sleutelmateriaal is van deze proefopstelling en heeft geen waarde buiten de relay, maar het blijft
|
||||
sleutelmateriaal: het staat niet in de repo en het wordt niet in een logregel afgedrukt. Het `OwnerId` wel,
|
||||
want dat is publiek en je hebt het nodig om de eigenaar op de statuspagina terug te vinden (§1b van het
|
||||
naslagdocument).
|
||||
|
||||
### 4b. Eén bedieningsvlak voor de cliënt
|
||||
|
||||
**Alles wat de cliënt doet, gebeurt vanuit één scherm.** Geen losse opdrachten per eigenaar en geen tweede
|
||||
terminal ernaast: je ziet de eigenaars in een lijst en bedient ze daar. Wat dat scherm kan:
|
||||
|
||||
| Onderdeel | Wat je ziet of doet |
|
||||
|-|-|
|
||||
| De lijst | per eigenaar zijn naam, zijn `OwnerId`, of hij verbonden is, wanneer er voor het laatst iets over de lijn ging, en hoeveel er geschreven is |
|
||||
| Per eigenaar | aanmaken, verbinden, verbreken, een blob schrijven met een instelbare omvang, teruglezen, en weggooien |
|
||||
| Het log | wat er per verbinding gebeurt, met tijdstip. Dit is waar de proeven uit §4c af te lezen zijn |
|
||||
| De relay | het adres waarmee verbonden wordt, en of hij een verbinding aanneemt |
|
||||
|
||||
Vorm: een kleine HTTP-server in hetzelfde proces met één pagina ervoor, in de stijl van de statuspagina's
|
||||
van beide apps. Geen bouwstap en geen framework; die pagina's laten zien dat dat hier genoeg is. De
|
||||
opdrachtregel blijft eronder bestaan, want stap 2 van §5 heeft hem toch nodig en het is prettig om een proef
|
||||
te kunnen scripten.
|
||||
|
||||
**Aan de server-app wordt niets gedaan.** Bevestigd door de gebruiker op 09-09-2026: die draait en
|
||||
synchroniseert met Trezor Suite op de Mac. Dit plan raakt `tools/evolu-relay/` dus niet, en een bevinding
|
||||
uit §4c is materiaal voor **Umbrelapp**, geen taak hier.
|
||||
|
||||
**Eén grens om te kennen voordat iemand er knoppen bij wil zetten:** de leerstand openzetten, blokkeren en
|
||||
labelen kán deze UI niet, en dat is de poortindeling van de app en geen tekortkoming van het gereedschap.
|
||||
De relay publiceert hostpoort 3852 en daar praat de cliënt mee, maar de agent-API (`GET /api/status`,
|
||||
`POST /api/command`, `POST /api/label`) hangt achter `app_proxy` met de inlog van umbrelOS, en poort 8000
|
||||
staat niet op de host. Dat blijft dus op de statuspagina van de app, in een tweede tabblad. Het omzeilen
|
||||
daarvan zou een onbeschermde poort vragen, en dat haalt precies de bescherming weg waarvoor de poorten in
|
||||
0.0.2 omgedraaid zijn (`CLAUDE.md`, "De poorten staan omgekeerd ten opzichte van wat je verwacht").
|
||||
|
||||
### 4c. Wat er dan te beproeven valt
|
||||
|
||||
Dit is de eigenlijke opbrengst, en elk punt is vandaag niet te proberen:
|
||||
|
||||
| Proef | Wat er hoort te gebeuren | Waar het vandaan komt |
|
||||
|-|-|-|
|
||||
| Onbekende eigenaar, venster dicht | HTTP 401, socket dicht, niets in de database van de relay, wel een regel in de weigerlijst | §10 van het naslagdocument, afgeleid uit de broncode |
|
||||
| Diezelfde eigenaar toelaten en opnieuw verbinden | de hele geschiedenis komt alsnog binnen, want de cliënt was niets kwijt | §10, punt 3 |
|
||||
| Blokkeren tijdens een lopende verbinding | de eigenaar blijft schrijven tot hij opnieuw verbindt | §10, punt 4. Open punt 10 van **Umbrelapp** |
|
||||
| Venster van twee minuten, met de pagina dicht | de teller loopt in het relay-proces en sluit vanzelf | `CLAUDE.md`, "Het tijdvenster loopt in het relay-proces" |
|
||||
| Eén blob boven `RELAY_MAX_WRITE_BYTES` (1 MB) | geweigerd; meerdere kleinere samen niet, want de grens is per schrijfactie | §8 van het naslagdocument |
|
||||
| Twee eigenaars die tegelijk verbinden | onafhankelijk, en elk ziet alleen zijn eigen gegevens | §1b |
|
||||
|
||||
Wat er als bijvangst uit kan komen, en dat is de reden om de proeven echt te dóen: `owners.json` groeit hier
|
||||
voor het eerst voorbij één of twee regels, en de statuspagina is nog nooit met een handvol eigenaars en een
|
||||
volle weigerlijst gezien.
|
||||
|
||||
### 4d. Waar het staat, en wat het niet raakt
|
||||
|
||||
`tools/relay-client/`, met een eigen `package.json`. Niet in een app-map, want alles daar wordt bij
|
||||
installatie naar het apparaat gekopieerd (`CLAUDE.md`, "Zet geen CLAUDE.md of andere werkbestanden in een
|
||||
app-map"). Geen `VERSION`, geen image, geen manifest: er is niets uit te rollen, dus de versieregels van de
|
||||
twee apps gelden hier niet.
|
||||
|
||||
## 5. Het werk in grote lijnen
|
||||
|
||||
1. **De cliënt-API van `@evolu/common` 8.7.0 verifiëren.** Een eigenaar uit een mnemonic, een schema met een
|
||||
kolom waar een blob in past, en verbinden met een `syncUrl`. Dit staat expres eerst: van de relaykant is
|
||||
alles nagetrokken, van de cliëntkant niets. Valt die API tegen, dan verandert de rest van dit plan.
|
||||
2. Een kale opdrachtregel die één eigenaar maakt, verbindt en schrijft. Dat is het moment waarop bekend is
|
||||
of het werkt.
|
||||
3. Meerdere eigenaars naast elkaar, elk in een eigen map, met een register erbij.
|
||||
4. De UI eromheen: de lijst, de knoppen per eigenaar, en de meldingen uit de verbinding.
|
||||
5. De proeven uit §4c lopen, en de uitkomsten terugschrijven naar de plek waar de bewering nu staat: §10 van
|
||||
het naslagdocument en open punt 10 van **Umbrelapp**.
|
||||
|
||||
## 6. Open punten
|
||||
|
||||
1. **Hoe zichtbaar is een 401 in de cliënt?** Evolu probeert opnieuw en is ontworpen om een relay te
|
||||
overleven die er niet is. Als een weigering en een relay die plat ligt in de cliënt hetzelfde signaal
|
||||
geven, is de eerste proef uit §4c niet af te lezen. De uitweg blijft binnen dit gereedschap: een eigen
|
||||
WebSocket-poging naast Evolu, met dezelfde `OwnerId` in de URL, die de statuscode wel te zien krijgt.
|
||||
Dat is een handeling van een paar regels, want de `OwnerId` staat in de URL van de verbinding (§10 van
|
||||
het naslagdocument).
|
||||
2. **Wat is een zinnige blob om mee te experimenteren?** Willekeurige bytes zijn genoeg voor de bytegrens,
|
||||
maar niet om te zien of gegevens werkelijk heen en weer gaan. Iets met leesbare inhoud en een teller is
|
||||
waarschijnlijk beter.
|
||||
3. **Wordt de gegevensmap van de proef opgeruimd?** Twintig eigenaars die blijven staan is rommel, en het
|
||||
is sleutelmateriaal. Waarschijnlijk een opdracht die er één weggooit en één die alles weggooit.
|
||||
4. **Data per eigenaar wissen op de relay staat al open bij Umbrelapp.** Dit gereedschap maakt dat makkelijk
|
||||
te beproeven maar lost het niet op; het blijft schrijven in andermans schema (§8 van het naslagdocument).
|
||||
|
||||
## 7. Verificatie
|
||||
|
||||
**Wat automatisch kan is klein en dat is eerlijk om vooraf te zeggen.** Het meeste van dit gereedschap is
|
||||
netwerk en UI. Wat wél in de suite hoort:
|
||||
|
||||
- het register van eigenaars: aanmaken, teruglezen, een naam die al bestaat, een map die half is;
|
||||
- het afleiden van een `OwnerId` uit een mnemonic, met een vaste mnemonic en een vaste verwachte uitkomst.
|
||||
Dat is de toets die omvalt als de bibliotheek onder ons iets anders gaat doen;
|
||||
- het lezen van de opdrachtregel.
|
||||
|
||||
Alles wat een relay nodig heeft is handwerk, en dat is precies het doel van dit plan: de proeven uit §4c
|
||||
worden met de hand gedaan en de uitkomst wordt opgeschreven. Een groene suite zegt hier dus weinig, en de
|
||||
uitslag van dit plan staat in de documenten die het corrigeert.
|
||||
Reference in New Issue
Block a user