Commit Graph
8 Commits
Author SHA1 Message Date
HarmenandClaude Opus 5 c57197637f Wat de eerste echte gebruiksdag opleverde: logging, geschiedenis, uitlijning
Drie dingen die vandaag misgingen of ontbraken, en die alle drie uit gebruik
kwamen en niet uit nadenken.

De allowlist logde niets als een bekende eigenaar terugkwam en niets als er een
geweigerd werd. Daardoor stond er een tweede eigenaar drieentwintig keer aan de
deur zonder dat het log er iets over zei; het stond alleen op de pagina. Nu is er
een regel per eigenaar per keer dat het proces draait, dus ook bij terugkomst en
bij weigering, met een bovengrens omdat een weigering een id bevat dat de ander
zelf verzint. Een geweigerde schrijfactie logt voortaan hoeveel bytes er gevraagd
werden en welke grens gold, met de naam van de variabele erbij.

Allow gooide de geschiedenis weg. Een eigenaar die je alsnog toeliet kreeg "first
seen" op het moment van de klik, terwijl hij al twintig minuten stond te
kloppen. Juist daar wil je zien sinds wanneer. Met een toets erop.

En de knoppen stonden niet recht: id, gegevens en knoppen stonden naast elkaar,
dus de lengte van de gegevensregel bepaalde of de rij afbrak. Een eigenaar met
een last seen duwde zijn knoppen naar de volgende regel en dus naar links.
Nu staan naam en gegevens onder elkaar in een kolom en worden de knoppen altijd
naar rechts geduwd.

Inhoudelijk het belangrijkste: "de eerste eigenaar wint" is te smal. Een enkele
app kan meer dan een eigenaar gebruiken, en de pagina adviseerde de deur te
sluiten zodra de eerste binnen was. Daarmee sluit je je eigen tweede eigenaar
buiten. De tekst zegt nu te wachten tot er een minuut niets nieuws meer bij komt.

Image naar 0.3.0. De digest van 0.2.0 is uit de compose gehaald in plaats van
blijven staan: die zou naar de vorige image wijzen terwijl de tag iets anders
belooft.

Tests: alle vier groen (34, 54, 39 en 61 goed, 0 fout).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 12:08:19 +02:00
HarmenandClaude Opus 5 f029144572 De pagina werkt op het apparaat, en de uitleg volgt nu de schakelaar
De hele keten is gemeten: de knop Close schreef een opdracht, de agent legde hem
in de postbus, het relay-proces paste hem toe en schreef hem weg, en de pagina las
de nieuwe toestand terug. De leerstand staat op closed en de geleerde eigenaar
staat in de lijst met eerste en laatste verschijning. Dat was het laatste stuk van
dit pakket dat nog nooit gelopen had.

Wat daarbij opviel: de uitleg onder de schakelaar bleef de open toestand
beschrijven terwijl hij dicht stond. Hij volgt nu de toestand, met een derde tekst
voor het geval de relay nog niets gemeld heeft.

Versie naar 0.2.2. De vorige stond mogelijk al geinstalleerd, en zonder verhoging
bereikt een gewijzigde template geen bestaande installatie.

Tests: test_appstore_vorm 34 goed, 0 fout.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 11:51:41 +02:00
HarmenandClaude Opus 5 d5bbc3fc0b De app losgetrokken van een enkele client
Op verzoek van de gebruiker is dit geen app meer over de labels van een bepaalde
wallet, maar wat het technisch al was: een relay voor apps die op Evolu gebouwd
zijn. De tagline, de beschrijving, de releaseNotes en de statuspagina noemen geen
enkele client meer, en category gaat van bitcoin naar files, waar de officiele
store ook synchronisatie tussen apparaten onderbrengt.

De tekst leunt op wat Evolu zelf schrijft en niet op een verzinsel: local-first,
end-to-end versleuteld voordat het je apparaat verlaat, en een relay die alleen
een owner id, tijdstempels en gevulde blobs ziet. Daar staat expliciet bij wat
zelf hosten wel en niet verandert, want geheimer wordt de data er niet van; wie de
versleutelde kopie bewaart en wie kan zien dat je synchroniseert wel.

De tegenwerping is niet weerlegd maar geaccepteerd, en dat staat als zodanig in
open punt 7: "Evolu Relay" zegt een Umbrel-gebruiker niets, terwijl de labels van
een bekende wallet een concrete reden zijn om te installeren. Vindbaarheid
inleveren is hier een keuze. Blijkt het te knellen, dan is daar terug te lezen
waarom.

In het Nederlandse codecommentaar blijft de historische toelichting staan, want
die legt uit waarom de relay van Trezor eruit is gegaan. Alleen de regels die de
app beschrijven zijn generiek gemaakt.

Tests: test_appstore_vorm 34 goed, 0 fout.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 11:49:15 +02:00
HarmenandClaude Opus 5 2b17f79181 De korte containernaam 'agent' wees naar de verkeerde app
Alle apps van umbrelOS delen een Docker-netwerk, dus een servicenaam als 'agent'
is daar niet uniek. Electrum Gate heeft er een op poort 8000 en Evolu Relay sinds
vandaag ook, en Docker verdeelde de naam netjes over allebei. Gemeten op het
apparaat: van tien verzoeken vanuit de nginx-container kwamen er vijf bij de
verkeerde app uit, met een 404 tot gevolg. Op de statuspagina zag dat eruit als
een status die wisselde tussen "running" en "agent unreachable".

Dit raakte twee apps, en de tweede is de vervelende: de pagina van Electrum Gate
proxyde ook naar http://agent:8000 en werkte alleen omdat die app tot vandaag de
enige met die naam was. Het installeren van Evolu Relay heeft die pagina dus
kapotgemaakt. Beide gaan nu naar <app-id>_agent_1, en beide manifesten gaan
omhoog, want zonder verhoging bereikt een gewijzigde template geen bestaande
installatie.

Dezelfde les stond al in de compose van Electrum Gate, over de servicenaam
'server', en die is bij het schrijven van de nginx-config genegeerd. Daarom nu een
toets erop: test_appstore_vorm controleert voor elke app dat een proxy_pass en
elke *_HOST-variabele een naam gebruiken die met het app-id begint. Muteertest
gedaan, de toets viel om op precies de korte naam.

Bijgewerkt in build.sh: VERSION daar is het etiket op de image, en `version` in
het manifest is een ander nummer dat erop vooruit mag lopen. Ze lopen uiteen zodra
er een reparatie in de app-map zit zonder dat de image wijzigt, en dat is nu het
geval.

Tests: alle vier groen (34, 54, 39 en 60 goed, 0 fout).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 11:41:58 +02:00
HarmenandClaude Opus 5 576acd20dd Het pakket omgebouwd: kale relay, statuspagina, poorten omgedraaid
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>
2026-08-28 11:22:32 +02:00
HarmenandClaude Opus 5 eeb7f969ea Een eigen icoon voor Evolu Relay
Het bestand is van de gebruiker; hier komt alleen de manifestregel erbij. De
verwijzing wijst naar de rauwe versie in deze repo, dezelfde constructie als bij
Electrum Gate, en hij staat als laatste regel van het manifest zodat hij bij
inlevering in de officiele store in een keer te schrappen is.

Geen versieverhoging: de app is vandaag van de Umbrel gehaald en wordt in fase 5
opnieuw gebouwd, dus er is geen installatie om iets naartoe te rollen. Het nummer
gaat mee omhoog als de compose omgaat.

Tests: test_appstore_vorm 32 goed, 0 fout.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 11:13:23 +02:00
HarmenandClaude Opus 5 730621d850 De image in het eigen register, gepind op digest
umbreld haalt elke image via de Docker Engine API op, dus een lokaal gebouwde tag
is voor hem onbereikbaar. De image staat nu in het Gitea-register op dezelfde
server als deze store, en anoniem halen werkt daar: dat is dezelfde voorwaarde
als voor het klonen van de store zelf, en de eigenaar sysop staat publiek.

Beide services krijgen tag plus digest. De digest hoort erbij en niet alleen de
tag, want een tag kan opnieuw geduwd worden en dan draait er iets anders dan er
in de repo staat. De toets in tests/test_appstore_vorm.py drukt de pinstatus af
en beide regels staan nu op "gepind"; van Electrum Gate nog geen.

Wat er expres bij staat in commentaar: dit is de digest van één architectuur.
Er is alleen amd64 geduwd, want deze Umbrel is amd64. Voor de officiele store
moet het een multi-arch index-digest zijn met arm64 erin, en dat is buildx met
QEMU. Zonder die notitie leest een gepinde digest als "eis gehaald".

build.sh wijst nu ook naar het register, anders levert een volgende bouw weer een
tag op waar de compose niet naar kijkt. De slotregels van het script zijn geen
suggestie meer maar de resterende stappen: push, digest overnemen, version
verhogen, en anoniem controleren met een uitgelogde pull in dezelfde context als
de login.

Manifest naar 0.0.2, met release notes die zeggen waarom: 0.0.1 was niet te
installeren.

Tests: 32 goed 0 fout, 54 goed 0 fout en 39 goed 0 fout, niets overgeslagen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 18:31:20 +02:00
HarmenandClaude Opus 5 b2e9c8fc7a Evolu Relay als tweede app in de store, plus het bouwrecept
De gebruiker koos ervoor het pakket meteen te maken en een installatie te
proberen, met de image lokaal gebouwd en het recept in de repo. Dit is dat
pakket. Er is nog niets gebouwd en niets geinstalleerd; "gebouwd" is hier
nadrukkelijk niet "werkend".

De zwaarste ontwerpvraag is met een precedent beslecht en niet met een gok.
Trezor Suite is geen browser met een sessiecookie en kan dus niet achter de inlog
van umbrelOS; het was onduidelijk of PROXY_AUTH_ADD "false" dan verantwoord is of
een omweg. De eigen nostr-relay-app van Umbrel doet exact hetzelfde, om precies
dezelfde reden, en heeft ook geen eigen ports:. De prijs staat in de compose en in
het plan: wie die poort bereikt, bereikt de relay. Wat de schade beperkt is dat de
relay elke eigenaar zonder limietenrij weigert.

Daarom gaat de quota-manager mee, en dat is geen restje van Trezor's betaalde
hosting: hij is wat die rijen aanmaakt. Relay en quota-manager komen uit dezelfde
image met een ander command, want bovenstrooms is het een codebase met meerdere
startscripts. Het command staat expliciet en leunt niet op de CMD van de
Dockerfile, waar yarn start staat met bovenstrooms zelf een twijfel erbij.

Het bouwrecept staat in tools/ en niet in de app-map. Dat is geen netheid: een
Dockerfile staat niet in de update-whitelist, dus bouwen-in-de-app zou elke
nieuwe versie een deinstallatie plus herinstallatie kosten. Onder tools/ en niet
onder build/, want dat laatste staat in .gitignore als bouwselmap en het recept
zou stilzwijgend buiten de repo zijn gebleven. Dat kwam pas bij git status aan het
licht.

De poort is 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.

Nieuw testbestand test_appstore_vorm.py, en het gaat over de store en niet over
een 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, en git diff was daarna leeg.

Umbrelapp is gepromoveerd naar Actief als 008, tussen Proefopstelling en
Appstore, en het masterplan is naar het archief. Wat er in de plannen als open
blijft staan is niet klein: of Trezor Suite dit adres accepteert, of het
databaseschema zichzelf aanmaakt, en hoe je een eigenaar registreert.

Tests: 32 goed 0 fout, 39 goed 0 fout en 54 goed 0 fout, niets overgeslagen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 17:18:22 +02:00