Fulcrum is uitgesynct en de gebruiker heeft omgeschakeld. De app hoefde niets
te weten van de wissel, want hij leest ${APP_ELECTRS_NODE_IP} en Fulcrum aliast
zichzelf naar die naam. Bevestigd langs alle drie de wegen: een wallet van
buiten over TLS op 50022, een wallet binnen het netwerk, en het dashboard met
een antwoordende server.
Daarmee is hoofdstuk 4 van de appstore-spec waargenomen gedrag in plaats van
een afleiding uit andermans broncode, en is de poortbotsing op 50002 ook in de
praktijk weg. Fase 3 van Appstore is af.
Gratis meegekomen: umbrelOS herstartte de app zelf bij de wissel en hij kwam
terug met dezelfde certificaatkeuze. Dat is de vervangende start/stop-controle,
maar nadrukkelijk geen antwoord op de volgordevraag, want Zoraxy draaide al.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
18 KiB
Voortgang - Appstore
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.
27-08-2026 - Fulcrum is uitgesynct, de omschakeling gedaan, en er hoefde niets aangepast
De controle die sinds 19-08-2026 alleen nog op tijd wachtte, is gedaan en geslaagd. Fase 3 is daarmee
helemaal af. De app merkte van de wissel niets: hij leest ${APP_ELECTRS_NODE_IP} en
${APP_ELECTRS_NODE_PORT}, en Fulcrum aliast zichzelf naar die namen in zijn eigen exports.sh. Bevestigd
langs alle drie de wegen die er zijn: een wallet van buiten over TLS op 50022, een wallet binnen het
netwerk, en het dashboard met het Fulcrum-adres en een antwoordende server. Daarmee is §4 van
Umbrel-appstore-spec.md geen broncode-afleiding meer maar waargenomen gedrag, en is ook de poortbotsing
op 50002 in de praktijk weg: Fulcrum en de gate draaien naast elkaar.
Er kwam één controle gratis bij. umbrelOS stopte en startte de app zelf omdat zijn afhankelijkheid wijzigde, en hij kwam terug met dezelfde certificaatkeuze en werkende TLS. Dat is de vervangende start/stop-controle uit fase 6. Het is nadrukkelijk geen antwoord op open punt 7: Zoraxy draaide al, dus het certificaat bestond al toen de app opkwam, en juist die volgorde is de enige echte twijfel.
Geraakt: alleen documentatie: Umbrel-appstore-spec.md, dit plan, Docs/CONTINUE_HERE.md.
Tests: niet van toepassing.
25-08-2026 - de repo werd een store met twee apps, en dat kostte een herinstallatie
Evolu Relay komt erbij en umbrelOS leest per store één repo, dus de repo ElectrumTLS is opgegaan in
UmbrelApps, verse historie, met de documentatie van beide apps in één Docs/-boom. De app zelf hoefde
niet te wijzigen: het app-id hangt aan het store-id whatsnext en niet aan de URL. Alleen de vijf
URL-velden en version gingen mee, in 0.0.15.
De open vraag uit punt 8 is beantwoord, en het antwoord is nee: een geïnstalleerde app overleeft een
wisseling van store-URL niet. Wat het verraderlijk maakt is dat umbrelOS de update naar 0.0.15 wél
tóónde en hem daarna niet uitvoerde, zonder foutmelding. Tonen en ophalen gaan blijkbaar niet langs
dezelfde weg; de herkomst van een geïnstalleerde app blijft de store waaruit hij kwam. Deïnstalleren en
opnieuw installeren loste het op. De prijs is app-data, dus de certificaatkeuze moest opnieuw gemaakt
worden.
Meegenomen bewijs dat er gratis bij kwam: de app komt nog steeds omhoog op een installatie waar nooit een certificaat gekozen is. Dat was de fout die 0.0.3 velde en hij blijft dicht.
Diezelfde dag is ook de oude stunnel-container weggehaald, stap 1 van open punt 2. Die bond poort
50002 en overleefde met restart: unless-stopped een herstart, dus hij was de laatste blokkade voor de
Fulcrum-test die je zelf kon opheffen. Wat er nu nog tussen zit is de eerste sync van Fulcrum, die op 72%
stond. De map ~/umbrel/home/Containers/ElectrumTLS blijft bewust staan als weg terug tot de
herstart-controle gedaan is.
Geraakt: de hele repo (verse UmbrelApps), umbrel-app.yml (0.0.15), CLAUDE.md, README.md,
Docs/CONTINUE_HERE.md, Docs/README.md, Docs/KNOWLEDGE.md, Umbrel-appstore-spec.md, dit plan.
Tests: 39 goed 0 fout en 54 goed 0 fout, niets overgeslagen.
20-08-2026 - alles van de verse installatie nagekeken; dit plan zakt naar B
De hele checklist van de herinstallatie is bevestigd door de gebruiker: data/ met certs/ en runtime/
eronder, de pagina komt op zonder gekozen certificaat, v0.0.9 staat achter de tagline, de keuzelijst voor
de Electrum-server verscheen bij het installeren, en daarna werkten kiezen én uploaden.
Daarmee is dit plan in de kern af en gaat het van A naar B. Alles waar het om begon is bewezen: de app is een echte umbrelOS-app, hij komt op uit een schone installatie, en een wallet van buiten verbindt over TLS. Wat er nog staat is niet te plannen (de herstartcontrole) of hoort bij het masterplan Publicatie. Webinterface is daarmee tier A geworden en van 020 naar 005 hernummerd; dit plan houdt 010.
Geraakt: alleen documentatie. Tests: niet van toepassing.
20-08-2026 - verse installatie van 0.0.9, en die werkte
De gebruiker heeft de app gedeïnstalleerd en opnieuw geïnstalleerd in plaats van geüpdatet, zodat de app-data schoon is. Dat werkte, en het bewijst iets wat op een bestaande installatie niet te bewijzen was: de pagina komt omhoog op een installatie waar nog nooit een certificaat gekozen is. Dat is precies de situatie waarin 0.0.3 stukliep, en de reparatie uit 0.0.4 was tot nu toe alleen getoetst op een installatie die die keuze al had.
Wat er nog níet uit volgt: of de twee .gitkeep-bestanden hun werk deden. Een werkende app bewijst dat
niet, want Docker maakt een ontbrekende bind-mount-map zelf aan; het verschil zit alleen op schijf. Staat
als losse taak, want het is een eis voor het masterplan Publicatie.
Geraakt: alleen documentatie. Tests: niet van toepassing.
20-08-2026 - data onder data/, en een doel dat de maatstaf verandert
De gebruiker vroeg of het klopt dat alle runtime-bestanden in de installatiemap staan, want bij andere apps
ziet hij daar geen app-code. Dat klopt, en het verschil zit niet in umbrelOS: voor elke app wordt de
hele app-map naar app-data gekopieerd, maar andere apps hebben hun code in een image. Config uit
app-data mounten is wél een bestaand patroon; electrs doet zijn torrc precies zo, en torrc en
*.template staan met naam in de update-whitelist. Bijvangst: de invulling gebeurt met envsubst, en dat
is de onderbouwing van de architectuurregel over accolade-variabelen.
Waar deze app echt afweek was de plaats van de data, en dat is in 0.0.9 verholpen: runtime/ en
certs/ staan nu onder data/, met een .gitkeep per map. Aanleiding was het antwoord op de vervolgvraag:
de gebruiker wil de app publiceren als standaard-app voor Umbrel. De packaging-documentatie van umbrel
zegt woordelijk dat gebruikersstaat onder ${APP_DATA_DIR}/data/... hoort, dus dit was geen smaak.
Dat doel verandert de maatstaf van "hij werkt hier" naar "iemand anders keurt het pakket goed", en dat is een eigen plan geworden: Publicatie, als masterplan. Het meeste blijkt al goed; wat er nog moet is de images pinnen, het app-id kaal maken en de manifestvelden op orde brengen. Het risico staat niet in die lijst: deze app leest de certificaatmap van een andere app, en dat is precies waar een review over valt.
Geraakt: docker-compose.yml, umbrel-app.yml (0.0.9 en backupIgnore), twee .gitkeep-bestanden,
Referenties/Umbrel-appstore-spec.md, OPEN.md punt 7 en 9, nieuw
Plannen/Masterplannen/Publicatie.PLAN.md, tests/test_server_start_zonder_certificaat.py.
Tests: 48 goed 0 fout en 33 goed 0 fout, niets overgeslagen; de data-conventie is mutatie-getest.
20-08-2026 - de app werkt: pagina, keuze, TLS en een wallet van buiten
De reparatie werkt. Na de uitrol van 0.0.4 laadt het dashboard, met de melding "No certificate in use" en de reden van de agent erbij. De agent vond veertien certificaten in Zoraxy en koos daarom niets; dat is de weigering die zo bedoeld is, en het antwoord op de vraag die de log van 0.0.3 openliet.
Wat de gebruiker er meteen van zei: die reden somde alle veertien domeinnamen op, en dat is een muur tekst die zegt wat de keuzelijst eronder al toont. 0.0.5 geeft alleen het aantal. De weigering zelf blijft.
En daarna liep het hele pad. Een certificaat kiezen op de pagina werkt: de agent nam de keuze aan, nginx kwam met poort 50022 door, en na het aanpassen van de doorstuurregel in de router verbindt een wallet van buiten. Daarmee is fase 6 in de kern klaar en is de app voor het eerst als umbrelOS-app af.
Geraakt: agent.py.template (choose), umbrel-app.yml (0.0.5), tests/test_agent_certificates.py,
CHANGELOG.md. Tests: 21 goed 0 fout en 15 goed 0 fout, niets overgeslagen; de ingekorte reden is
mutatie-getest. Nog open op de Umbrel: de herstartcontrole en het omschakelen naar Fulcrum.
20-08-2026 - 0.0.3 geinstalleerd, geen UI, en de oorzaak was het ontwerp
De app is geinstalleerd en er kwam geen pagina. De log van app_proxy meldde alleen dat de server niet
te bereiken was, en die van server herhaalde "Wachten tot de agent een certificaat gekozen heeft". Dat is
geen storing maar een klem in het ontwerp: het stream-blok met listen 50022 ssl includeerde de cert.conf
van de agent, nginx weigert te starten zonder dat certificaat, dus ook de pagina kwam niet omhoog. En de
pagina is precies waar je dat certificaat kiest.
Verholpen in 0.0.4 door het TLS-deel naar stream.conf.template te verplaatsen; het command-blok legt
dat pas in /var/lib/gate/tls/ als cert.conf bestaat, en nginx.conf haalt die map met een jokerteken op.
Meegenomen: een mislukte nginx -s reload brak de herlaadlus af, want die draait onder set -e.
Wat de log wél bewees: de agent start en luistert ([gate] api listening on port 8000), en Tor bootstrapt.
Wat de agent in de certificaatmappen vond, is nog onbekend; dat leest de pagina van 0.0.4 straks voor.
Geraakt: nginx.conf.template, docker-compose.yml, nieuw stream.conf.template, umbrel-app.yml
(0.0.4 en release notes), CLAUDE.md, CHANGELOG.md, nieuw
tests/test_server_start_zonder_certificaat.py. Tests: 21 goed 0 fout en 15 goed 0 fout, niets
overgeslagen. De reparatie zelf is niet geverifieerd: dat vraagt de uitrol op de Umbrel.
19-08-2026 - sessie afgesloten; dit plan is de enige tier A
Bij de prioriteitsherziening blijft Appstore de enige tier A, en de reden is dat er precies één handeling openstaat waar al het andere achter wacht: de app installeren. Webinterface is naar C gezakt; dat plan is af voor zover het zonder de Umbrel kan.
Wat er van de gebruiker moet, in deze volgorde: de doorstuurregel in de router naar 50022, dan de oude app
verwijderen, de store-URL opnieuw laten ophalen en whatsnext-electrum-gate installeren. Versie staat op
0.0.3 en de release notes kloppen, dus daar hoeft niets meer aan.
Ook opgemerkt en als taak vastgelegd: het plan Configuratie is grotendeels ingehaald door het werk van
vandaag. De agent doet de certificaatbronnen en de keuze al, en het hardgecodeerde domein is uit de compose
en uit nginx.conf.template verdwenen. Dat plan moet dus eerst opgeschoond worden voordat promotie nog
zin heeft, anders lijkt het groter dan het is.
Geraakt: alleen documentatie in deze entry. Tests: 21 goed, 0 fout.
19-08-2026 - hernoemd naar Electrum Gate, fase 7 grotendeels af
De wallet-verbinding had de nacht doorstaan, dus de proxy_timeout-fix is bewezen en de storing waar de
sessie van gisteren mee begon is verklaard en verholpen.
De app heet nu Electrum Gate, met store-id whatsnext en app-id whatsnext-electrum-gate. Bij het
voorleggen van die keuze zat een fout in mijn eigen redenering: ik nam aan dat de repo-naam het store-id
bepaalt, omdat de store-URL de repo-URL is. Dat is niet zo, het store-id is gewoon een veld. Daardoor kon
het meteen goed en kan de repo-naam wachten tot er een publieke versie op GitHub komt.
Twee dingen die er vooruitlopend op andere plannen bij konden, omdat er tóch opnieuw geïnstalleerd wordt: de TLS-poort is 50022 in plaats van 50002, wat de botsing met Fulcrum wegneemt, en de web-UI is herbouwd. Dat vraagt eenmalig een aanpassing van de doorstuurregel in de router, anders komt een wallet van buiten niet meer binnen.
De tagline en de beschrijving zijn Engels geworden en gaan nu over de afweging Tor tegenover snelheid, in plaats van over TLS als middel.
Geraakt: umbrel-app-store.yml, de app-map (hernoemd), umbrel-app.yml, docker-compose.yml,
nginx.conf.template, README.md en de plannen.
Tests: dit project heeft geen suite. Niets hiervan is op de Umbrel gedraaid: de nieuwe app is nog
niet geïnstalleerd, en version staat nog op 2.0.1 omdat de gebruiker de UI eerst wilde zien.
18-08-2026 - storing na tien minuten, en de besluiten over naam en dashboard
Kort na de installatie viel de wallet-verbinding weg. De container bleef onafgebroken draaien
(status=running, restarts=0, schone nginx-log), wat de container als oorzaak uitsloot en één
verdachte overliet: proxy_timeout in een stream-blok staat standaard op tien minuten, en een
Electrum-wallet houdt een langlopende, grotendeels stille verbinding open. Dit was een regressie van
diezelfde dag: stunnel hanteerde twaalf uur, en dat verschil is bij de vertaling naar nginx niet
opgemerkt. Nu op twaalf uur, met proxy_socket_keepalive.
Meegenomen omdat ze bij het uitzoeken bovenkwamen: nginx draaide als achtergrondproces onder een shell,
die daardoor PID 1 was en signalen niet doorgaf, en het script eindigde met exitcode 0 als nginx omviel,
waardoor restart: on-failure niet zou ingrijpen. Nginx is nu met exec het hoofdproces.
De gebruiker vroeg of umbrelOS een update wel zou zien, en dat was de goede vraag: het version-veld
stond nog op 2.0.0, dus de fix was nooit uitgerold. Zonder melding en zonder fout. Na 2.0.1 kwam de
update binnen en werkte hij, wat meteen de hele uitleverketen aantoont.
Aan het eind besloten: de app gaat Electrum Gateway heten, want de oude naam beschreef het middel en niet de waarde. En het dashboard krijgt alleen lokale gegevens; koersdata valt af omdat de browser van elke bezoeker dan bij een derde partij aanklopt.
Geraakt: docker-compose.yml, nginx.conf.template, umbrel-app.yml, en de plannen.
Tests: niet van toepassing. De proxy_timeout-fix is nog niet bewezen: die brak pas na tien
minuten stilte, dus dat vraagt een langere observatie. Ook de herstart-controle staat nog open.
18-08-2026 - geinstalleerd op de Umbrel, wallet verbindt
De app is als Umbrel-app geïnstalleerd en een Electrum-wallet krijgt over TLS direct data terug. Dat
bewijst het hele pad in één keer: het stream-blok, het certificaat, en de verbinding naar de
Electrum-server via APP_ELECTRS_NODE_IP.
De weg erheen kostte drie omwegen die allemaal buiten de app zelf lagen. De Gitea-repo was als SHA-256
aangemaakt terwijl isomorphic-git alleen SHA-1 kan. Daarna weigerde Gitea anonieme toegang, en de oorzaak
bleek niet de repo maar de zichtbaarheid van het account: Gitea staat niet toe dat een repo
zichtbaarder is dan zijn eigenaar en zet hem dan zwijgend terug naar "intern". En de installatie faalde
drie keer op Bind for 0.0.0.0:50002 failed: port is already allocated, omdat de oude handmatige
container nog draaide. Dat laatste was de voorspelde en gewenste faalrichting: de bestaande dienst bleef
gewoon werken.
Eén les die het onthouden waard is: een git ls-remote vanaf de eigen machine bewees niets over anonieme
toegang, want de credential-helper stuurde de opgeslagen inloggegevens stilzwijgend mee. Dat leidde tot
een verkeerde diagnose die pas onderuitging met -c credential.helper=.
Geraakt: niets in de app; alleen documentatie en de configuratie van de Gitea-server. Tests: niet van toepassing. Wallet-verbinding handmatig geverifieerd. De herstart-controle staat nog open, en dat is de aanleiding van het hele plan.
18-08-2026 - fases 1 tot en met 5 gebouwd
De repo heeft de vorm van een community app store, de compose is omgezet naar
app_proxy, de backend loopt via de afhankelijkheid, en het manifest klopt met een eigen icoon.
Twee dingen die het uitzoekwerk opleverde en die het ontwerp veranderd hebben. De controle op de Umbrel
bevestigde dat nginx:alpine alle vier de stream-modules meebrengt, waardoor drie containers er één
werden en de Docker-socket kon vervallen; dat was de grootste beveiligingswinst en hij was gratis. En
umbreld blijkt bij een update alleen een whitelist te verversen (docker-compose.yml, *.template,
exports.sh, torrc, hooks, umbrel-app.yml), terwijl bij installatie de hele map wordt gekopieerd.
Daarom staat de nginx-configuratie in een *.template en niet in een los script: anders had een git push stilzwijgend niets gedaan bij een bestaande installatie.
Ook bleek de awk-splitsing van de certificaatketen niet overgenomen te hoeven worden maar juist fout
te zijn: nginx wil de volledige keten in ssl_certificate, waar stunnel hem gesplitst wilde.
Geraakt: umbrel-app-store.yml, electrumtls-electrum-tls/ (compose, manifest, nginx.conf.template,
icon.png), verwijderd zijn entrypoint.sh, cert-watch.sh, install.sh en uninstall.sh.
Tests: niet van toepassing, dit project heeft er geen. Niets is op de Umbrel geïnstalleerd of
gedraaid; dat is fase 6.
18-08-2026 - plan werd actief
Dit plan is als eerste actief geworden omdat het de aanleiding van de hele sessie oplost: de app draait als een handmatig neergezette docker-compose die umbrelOS niet kent, en moet na elke herstart of na een storing in een afhankelijkheid met de hand opgestart worden.
De repo is dezelfde dag onder versiebeheer gebracht en gepusht naar
https://sc.kamenier-hamer.nl/sysop/ElectrumTLS.git. Dat kostte één omweg: de Gitea-repo was als SHA-256
aangemaakt, en de push faalde met een melding die de oorzaak niet noemt. Bij het uitzoeken bleek het
probleem groter dan de push, want umbreld kloont met isomorphic-git en die kan uitsluitend SHA-1. De repo
is opnieuw aangemaakt als SHA-1.
Twee dingen die het uitzoekwerk opleverde en die het werk kleiner maken dan gedacht. umbrelOS doet géén
hostnaamcontrole op de store-URL, dus een eigen Gitea kan de app store zijn. En wisselen tussen Electrs,
Fulcrum en ElectrumX vraagt geen eigen mechanisme: die declareren implements: [electrs] en aliassen
zichzelf naar APP_ELECTRS_*, dus twee regels volstaan. Dat was oorspronkelijk een apart plan waard en
is nu fase 3.
Geraakt: promotie vanuit Plannen/Masterplannen/Appstore.PLAN.md; nog geen app-bestanden.
Tests: niet van toepassing, dit project heeft er geen. Er is nog niets op de Umbrel geverifieerd.