De app-map is niet langer de relay van Trezor met een Postgres en een quota-manager ernaast, maar de relay van Evolu met onze eigen allowlist eromheen. Drie containers werden relay, agent en nginx; het wachtwoord en de database zijn verdwenen. De poorten zijn omgedraaid en dat is de kern. Tot 0.0.2 hing de relay achter app_proxy en moest de inlog van umbrelOS dus uit, waardoor een statuspagina net zo onbeschermd zou zijn als de relay zelf. Nu hangt de pagina daar met de inlog aan, en publiceert de relay zijn eigen poort 3852 waar Zoraxy met TLS naartoe wijst. Dat is hetzelfde patroon als Electrum Gate met 50022. Niet 4000 op de host, want dat is een veelgebruikte poort en een botsing merk je pas als de app niet start. De agent beslist niets: hij leest wat het relay-proces heeft opgeschreven en legt opdrachten in een postbus die de relay zelf leegmaakt. Twee processen die in dezelfde allowlist schrijven is een wedloop die je een keer per jaar treft en dan niet kunt reproduceren. Hij weigert ook een tweede opdracht zolang de vorige er nog ligt, want overschrijven zou er stil een laten verdwijnen. De pagina volgt het ontwerpsysteem van Electrum Gate, zonder de Google Fonts-verwijzing daaruit: een app op een Umbrel hoort niet te wachten op een lettertype van buiten. Alles is met stringoptelling geschreven en zonder enig dollarteken, want umbreld haalt elke template door envsubst en zou een JavaScript-template-literal stilzwijgend leegmaken. De image is door de gebruiker gebouwd en geduwd; de compose is gepind op tag plus digest. Manifest naar 0.2.0, met een beschrijving en releaseNotes die kloppen met wat er nu draait in plaats van met het vorige pakket. Wat hier NIET mee bewezen is, en dat is meer dan gebruikelijk: de agent is alleen op syntaxis gecontroleerd, de pagina is nooit gerenderd, en of een opdracht van de pagina daadwerkelijk bij het relay-proces aankomt is niet gemeten. Dat kan alleen op het apparaat en staat als taak. Tests: alle vier groen (32, 54, 39 en 60 goed, 0 fout). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
11 KiB
Voortgang - Umbrelapp
Chronologisch sessielog, nieuwste bovenaan. Kort: 3 tot 6 regels per entry. Wat er is gebeurd en waarom, niet wat er nog moet: dat staat in TAKEN.md.
28-08-2026 (avond) - het pakket is omgebouwd: relay, agent en pagina
De app-map is nu de kale relay met onze allowlist eromheen. De poorten zijn omgedraaid: de statuspagina
hangt achter app_proxy mét de inlog van umbrelOS, de relay publiceert 3852 waar Zoraxy met TLS naartoe
gaat wijzen. Postgres, het wachtwoord en de quota-manager zijn eruit.
De gebruiker heeft de image gebouwd en naar het Gitea-register geduwd; de compose is gepind op tag plus digest. Manifest naar 0.2.0, met een beschrijving en releaseNotes die niet langer over Trezor's relay en een quota-manager gaan.
Alles van vanavond is ongetest gedrag. De agent is alleen op syntaxis gecontroleerd, de pagina is nooit gerenderd, en of een opdracht van de pagina bij het relay-proces aankomt is niet gemeten. Dat is de eerstvolgende taak en die kan alleen op het apparaat.
Geraakt: de hele app-map, tools/evolu-relay/build.sh en de documentatie van dit plan.
Tests: alle vier groen (32, 54, 39 en 60 goed, 0 fout).
28-08-2026 (later) - het relay-programma staat, met een test erop
tools/evolu-relay/src/ bevat nu een eigen programma dat createRelay uit @evolu/nodejs aanroept met
onze twee terugroepfuncties. Het beleid staat apart in policy.js als pure functies, zodat het te toetsen
is zonder relay en zonder Docker: node tests/test_limiter.mjs, 60 toetsen. De beslissende regel is
muteertest gedaan, en de juiste toets viel om: een geblokkeerde eigenaar mag er niet alsnog in via de
leerstand.
build.sh bouwt niet langer de repo van Trezor maar onze eigen Dockerfile, en Git is daarvoor niet meer
nodig. Onderweg bleek dat de 1 MB uit de gepubliceerde image per schrijfactie geldt en niet per
eigenaar; dat is op twee plekken rechtgezet waar het verkeerd stond.
Geraakt: tools/evolu-relay/, tests/test_limiter.mjs, CLAUDE.md en de documentatie van dit plan.
Tests: alle vier groen (32, 54, 39 en 60 goed, 0 fout).
28-08-2026 - de proef is geslaagd: de kale relay werkt
Trezor Suite op de desktop stuurde elf labels naar docker.io/evoluhq/relay:latest en die kwamen aan:
de database in het volume groeide van 40960 naar 49152 bytes. Daarmee klopt de protocolversie en is de
richting van 27-08 een gemeten feit. Geen Postgres, geen quota-manager, geen eigenaarsregistratie. De
leeskant is niet bewezen: er is geen tweede cliënt geweest.
Het testprotocol staat nu uitgeschreven in PLAN.md §6a, en het is tijdens de sessie drie keer
gecorrigeerd op instrumenten die een vals negatief gaven: docker diff kijkt niet in een volume, een
browser of gewone curl krijgt van deze WS-server niets terug, en healthy komt uit een healthcheck die
alleen een TCP-verbinding opent. Alle drie wezen ze een probleem aan dat er niet was.
iOS deed niet mee en dat is een eigen vraag geworden (open punt 9). Het veld voor de relay-URL bestaat
daar wel, valideert op http(s):// en onthoudt zijn waarde, maar de app doet geen enkele
verbindingspoging. Het vermoeden is TLS; dat is niet gemeten en het is duur, want een certificaat voor een
LAN-adres bestaat niet.
Het ontwerp van de limiter en de pagina staat er ook, en de limiter bleek veel kleiner dan
Bereikbaarheid §4b aannam: createRelay neemt twee terugroepfuncties, en Trezor doet zelf niets
anders. De poorten gaan om, zodat de pagina achter de umbrelOS-inlog kan en Zoraxy met TLS naar de relay
wijst. De gebruiker heeft de oude installatie weggehaald; die wordt niet geüpdatet maar opnieuw gebouwd.
Geraakt: documentatie van dit plan plus Referenties/Upstream-evolu-relay.md §8. Tests: niet van
toepassing.
27-08-2026 - richting gekozen: kaal, met een limiter en een pagina erop
Nog niets gebouwd; dit is een sessie waarin alleen vastgelegd is. De gebruiker kiest voor de kale Evolu-relay, met een eigen limiter erop en de statuspagina uit open punt 2. Zijn woorden: "dat wordt beter." De app staat op dit moment uit op de Umbrel.
Die drie horen bij elkaar en dat is het inzicht van vandaag. De kale relay heeft geen toegangscontrole, en dat is bij Evolu het ontwerp en geen omissie. Wat vandaag de schade beperkt is juist een applicatiecontrole: Trezor's relay weigert elke eigenaar zonder limietenrij. Kaal gaan haalt precies die bescherming weg, dus de limiter is de vervanging ervan en geen extraatje. En de statuspagina krijgt er een taak bij: tonen wélke eigenaar toegelaten is, met de knop om die keuze te wissen.
De spanning is opgeschreven in plaats van weggepoetst: de meest voor de hand liggende limiter breidt de
relay uit via createRelay, en dan komen de bouwstap en het eigen register terug die kaal gaan juist zou
besparen. De gebruiker heeft dat ondervangen: de broncode staat nog op zijn Umbrel, dus opnieuw bouwen en
naar het eigen Gitea-register duwen kan gewoon. Wat sowieso vervalt zijn de Postgres en het wachtwoord.
Het blijft een richting en geen besluit, want de proef is niet gedaan: klopt de protocolversie van
docker.io/evoluhq/relay:latest met de @evolu/web@3.0.0-next.1 plus patch die Suite gebruikt? Die proef
blijft de eerste taak, en er wordt niets verbouwd voordat hij geslaagd is.
Geraakt: alleen documentatie van dit plan. Tests: niet van toepassing.
25-08-2026 - hij draait, en de weg erheen liep via een verkeerde aanname
Gebouwd op de Umbrel in 50 seconden, en toen twee keer misgegaan op dezelfde muur voordat die muur begrepen was.
De installatie faalde met pull access denied op een image die lokaal gebouwd was. Mijn eerste
verklaring kwam uit app-script van umbreld, waar install een compose "${app}" pull doet, en de
reparatie was pull_policy: never. Dat faalde identiek. De oorzaak stond in de stacktrace en niet in de
foutmelding: at /opt/umbreld/node_modules/docker-modem/lib/modem.js:382. umbreld haalt élke image via
de Docker Engine API op en niet via compose, dus pull_policy wordt nooit gelezen. app-script is de
legacy-compat-laag en niet het pad dat umbrelOS 1.x loopt. Les die breder is dan deze app: een bron die
overtuigend leest, is nog geen bron die het draaiende pad beschrijft.
Daarmee was "lokaal bouwen als eerste stap" geen keuze meer. Elke image moet anoniem uit een register
komen. Dat werd het Gitea-register op dezelfde server als de store: sc.kamenier-hamer.nl/sysop/evolu-relay,
gepind op tag plus digest. Anoniem halen is eerst met een uitgelogde pull gecontroleerd, met dezelfde
valkuil als bij het klonen van de store (uitloggen in de context waarin je inlogde, anders meet je je eigen
sessie).
Daarna draaide hij in één keer. Drie containers omhoog, db gezond, de app-proxy op 3851. De lokale
images waren vooraf weggehaald, dus de pull is echt gedaan en het hele pad is bewezen: broncode van Trezor →
bouwrecept → eigen register → gepinde digest → installatie.
Kleinigheid met een staart: de gebruiker umbrel zit hier niet in de groep docker, dus bouwen vraagt
sudo. Dat komt bij elke herbouw terug en staat daarom in het plan.
Geraakt: whatsnext-evolu-relay/docker-compose.yml en umbrel-app.yml (0.0.2),
tools/evolu-relay/build.sh, Docs/Referenties/Umbrel-appstore-spec.md, dit plan.
Tests: 32 goed 0 fout, 54 goed 0 fout en 39 goed 0 fout, niets overgeslagen.
Nagekomen dezelfde dag, op de vraag van de gebruiker of deze app kwaad kan: er is een tweede weg naar
binnen die in geen enkel bestand van deze app staat. umbrelOS maakt per app een Tor hidden service, en
die stond aan. In combinatie met PROXY_AUTH_ADD: "false" betekent dat: de relay bereikbaar vanaf het
internet, alleen beschermd doordat het .onion-adres onraadbaar is. De gebruiker zet hem uit.
Het mechanisme geldt voor élke app en staat daarom in de gedeelde naslag en niet alleen hier. Het gevólg
verschilt: bij Electrum Gate legt dezelfde hidden service alleen de inlogpagina van umbrelOS bloot, want
daar staat de proxy-inlog gewoon aan. De les is de combinatie en niet de instelling: wie
PROXY_AUTH_ADD op "false" zet, moet meteen de hidden service beoordelen.
Wat nog steeds niet bewezen is: of het databaseschema zichzelf aanmaakt, of Trezor Suite dit adres accepteert, en of een eigenaar te registreren is. "Draait" is hier nog geen "synchroniseert".
25-08-2026 - plan werd actief, en het pakket staat er
De gebruiker besloot het pakket meteen te maken in plaats van te wachten op de proefopstelling. Dat kon, omdat fase 1 van Proefopstelling die middag de feiten had opgeleverd: één image met meerdere startscripts, een quota-manager die in de praktijk verplicht is, en geen publieke image.
De zwaarste ontwerpvraag is met een precedent beslecht en niet met een gok. Trezor Suite kan niet achter
de inlog van umbrelOS, en het was onduidelijk of PROXY_AUTH_ADD: "false" dan een verantwoorde keuze is of
een omweg. De eigen nostr-relay-app van Umbrel doet exact hetzelfde, om precies dezelfde reden, en heeft
ook geen eigen ports:. Daarmee is de vorm van de compose niet zelfbedacht.
Twee dingen kwamen boven die niet in het ontwerp zaten. build/ staat in .gitignore als bouwselmap,
dus het bouwrecept zou stilzwijgend buiten de repo zijn gebleven; het staat nu onder tools/. Dat kwam pas
bij het stagen aan het licht en niet bij het schrijven, wat precies is waarom git status lezen erbij hoort.
En de poort werd 3851 en niet 4000: 4000 is de eigen poort van de relay, maar ook een veelgebruikte poort,
en een botsing op de host merk je pas als de app niet start. Die les komt van 50002 tegen Fulcrum.
Er is een derde testbestand, tests/test_appstore_vorm.py, en het gaat over de store en niet over één
app: id gelijk aan mapnaam, store-voorvoegsel, veldvolgorde, app_proxy die naar een bestaande service
wijst, en elke gemounte map die in de repo bestaat. Het vindt zijn apps zelf, dus een derde app valt er
automatisch onder. Digests toetst het expres niet: geen van de twee apps haalt die regel vandaag, en een
suite die altijd rood staat wordt niet gelezen.
Mutatie-getest met drie ingrepen: het app-id laten afwijken van de mapnaam, APP_HOST naar een
niet-bestaande service laten wijzen, en de .gitkeep weghalen. Alle drie vielen om bij de juiste toets, met
een bruikbare melding, en git diff was daarna leeg.
Geraakt: whatsnext-evolu-relay/ (nieuw), tools/evolu-relay/build.sh (nieuw),
tests/test_appstore_vorm.py (nieuw), Docs/CHANGELOG-evolu-relay.md (nieuw), dit plan,
Docs/CONTINUE_HERE.md, CLAUDE.md, README.md.
Tests: 32 goed 0 fout (nieuw), 39 goed 0 fout en 54 goed 0 fout (bestaand), niets overgeslagen.
Wat er níet geverifieerd is, en dat is veel: er is nog niets gebouwd en niets geïnstalleerd. Of het databaseschema zichzelf aanmaakt, of Trezor Suite dit adres accepteert, en of een eigenaar te registreren is zonder iets extern: alle drie onbekend. "Gebouwd" is hier nadrukkelijk niet "werkend".