umbrelOS leest per store één repo, dus twee apps in twee repo's kan niet. Deze repo is de store en bevat vanaf nu Electrum Gate en het werk aan Evolu Relay. Opgezet als verse repo op verzoek van de gebruiker: de historie van ElectrumTLS en van EvoluRelay komt niet mee. Dat heeft één gevolg dat verder gaat dan opruimen. In de historie van ElectrumTLS staat het domein van de gebruiker en het certificaatpad, van vóór de opschoning van 19-08. Die komt hier niet in. Zolang die repo op de Git-server blijft staan verandert dat niets, dus het weghalen ervan is het laatste stuk van open punt 3 van het plan Appstore, en geen bijzaak. De store zelf hoefde niet te veranderen: store-id whatsnext, en dus blijft het app-id whatsnext-electrum-gate. Dat hangt aan het store-id en niet aan de URL, dus voor umbrelOS is dit dezelfde app in een andere store. Dat de store op 19-08 naar de maker genoemd werd in plaats van naar deze ene app, betaalt zich hier uit. Wat de documentatie betreft is dit één wortel voor beide apps, en dat was de reden om samen te voegen en niet de prijs ervan: de appstore-spec, het pinnen van images en de werkwijze golden al voor allebei en stonden in twee repo's naast elkaar. De kruisverwijzing die daarvoor nodig was (Referenties/Umbrel-appstore.md in de oude EvoluRelay-repo) is verdwenen; wat daarin stond over de plekken waar de relay een ander geval is, staat nu als ontwerp in het masterplan Umbrelapp §4. Botsende namen kregen een achtervoegsel met de app, en alleen die: Publicatie werd Publicatie-Gate en Publicatie-Relay, CHANGELOG.md werd CHANGELOG-electrum-gate.md. Proefopstelling kreeg 007, tussen de twee bestaande nummers, zodat de bovenkant van de reeks op tier-orde blijft staan. CONTINUE_HERE.md heeft een kolom App, maar de tiers lopen over beide apps heen: er is één volgorde van werken. Electrum Gate gaat naar 0.0.15, want website, repo, support, submission en icon wijzen nu naar UmbrelApps en zonder versieverhoging rolt dat niet uit. De release notes leggen aan de gebruiker uit dat hij de store opnieuw moet toevoegen. Of een geïnstalleerde app een wisseling van store-URL overleeft is nog steeds niet uitgezocht; dat blijkt bij het omzetten. Twee dingen in de plannen van Electrum Gate waren door deze verhuizing niet meer waar en zijn bijgewerkt: de taak "de repo hernoemen" in fase 7 is afgevinkt, en de repo-vorm in PLAN.md §4a toonde nog de store-id electrumtls, die al sinds fase 7 achterhaald was. Tests: 39 goed 0 fout en 54 goed 0 fout, niets overgeslagen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
211 lines
14 KiB
Markdown
211 lines
14 KiB
Markdown
# Taken - Webinterface
|
||
|
||
> Prioriteit: **A** | Wacht op: –
|
||
>
|
||
> **Van C naar B naar A op 20-08-2026, op één dag.** Eerst verviel de blokkade "de app geïnstalleerd en de
|
||
> agent draaiend". Aan het eind van die dag is dit het enige plan met werk dat nú te doen is: **Appstore**
|
||
> heeft alleen nog een herstart nodig die niet te plannen is, en **Publicatie** wacht op een publieke repo.
|
||
> Het nummer is daarom van 020 naar 005 gegaan; alleen dit plan kreeg een nieuw nummer, Appstore houdt 010.
|
||
>
|
||
> Afgezakt van A naar C op 19-08-2026 bij het afsluiten van de sessie. De pagina is af voor zover dat
|
||
> zonder de Umbrel kan; al het resterende werk in dit plan begint met kijken of de agent doet wat hij zou
|
||
> moeten doen, en dat kan niet vóór de installatie.
|
||
|
||
## Volgende stap
|
||
|
||
- [x] **0.0.10 op een telefoon nagekeken. In orde (20-08-2026).** De gebruiker meldt dat het er goed uitziet
|
||
op mobiel. Eén ding kwam eruit: de kopieerknoppen stonden niet op één lijn, omdat de knop door het
|
||
omvouwen de lengte van het adres volgde. Verholpen in 0.0.11 met `margin-left: auto` op de knop.
|
||
Bijvangst: `0.0.10` na `0.0.9` levert wél een update op, dus tweecijferige versiedelen zijn veilig
|
||
|
||
- [x] **De agent zien draaien. Gelukt op 20-08-2026, over drie versies.** De agent start en luistert, de
|
||
pagina laadt, hij vond veertien certificaten in `/certs/zoraxy` en weigerde daarom te kiezen, een
|
||
keuze op de pagina werd aangenomen, en daarna verbindt een wallet over 50022. De keten waar dit plan
|
||
op wachtte is dus rond.
|
||
|
||
- [ ] **Het uploaden op het niet-gelukkige pad proberen**, het enige stuk van 0.0.7 dat nog niet in een
|
||
browser gezien is: een sleutel die niet bij het certificaat hoort. Verwacht: een weigering met een
|
||
leesbare reden, en niets dat achterblijft in `data/certs`. De guard is met echte sleutelparen getoetst
|
||
en mutatie-getest, dus dit gaat over de weg van de melding naar de pagina en niet over de controle
|
||
zelf. **Eigenaar: gebruiker**
|
||
|
||
- [x] **0.0.7 en 0.0.9 in de browser nagekeken. Gelukt (20-08-2026):** uploaden werkt, kiezen werkt, ook
|
||
met de certificaten uit Zoraxy, de keuzelijst bij het installeren zag er goed uit en het
|
||
versienummer op de pagina klopt. Daarmee is het uploadpad uit 0.0.7 bewezen op het gelukkige pad
|
||
|
||
- [x] **0.0.6 in de browser nagekeken (20-08-2026).** Ziet er goed uit volgens de gebruiker. Wat eruit
|
||
kwam: de badges konden weg, "your choice" zei niets, Trezor Suite is niet desktop-only, en
|
||
Blockstream Green heet Blockstream
|
||
|
||
- [x] **De pagina naast een werkende app gelegd (20-08-2026).** Blokhoogte en backend-reactietijd komen
|
||
binnen. Wat eruit kwam: van een verbonden wallet was niets te zien, de keuzelijst was te druk, en
|
||
een reeks uitleg-teksten kon weg. Alles verwerkt in 0.0.6
|
||
|
||
- [ ] **Het activiteitenlog een etmaal laten lopen** en dan kijken of het klopt: komt er een
|
||
`connected`-regel bij een nieuwe wallet, en wat staat er na een nacht in. De teller is nieuw en is
|
||
alleen tegen tijdelijke bestanden getoetst, niet tegen een echte wallet
|
||
|
||
Daarna, en niet eerder:
|
||
|
||
- [ ] Uitzoeken waar Nginx Proxy Manager op umbrelOS zijn certificaten neerzet. De mount staat
|
||
uitgecommentarieerd in `docker-compose.yml`: een gok invullen zou Docker een lege maphierarchie
|
||
laten aanmaken in de app-data van een app die er misschien niet eens is
|
||
- [ ] Open punt 5: laten controleren of de TLS-poort zélf antwoordt. Dat is nu het enige wat de app niet
|
||
over zichzelf weet, en het is zijn enige taak
|
||
- [x] **Open punt 6: een certificaat uploaden via de pagina. Gebouwd in 0.0.7** (20-08-2026). Beschrijfbare
|
||
mount voor de agent, een eigen nginx-locatie met een grotere limiet, en validatie met
|
||
`load_cert_chain` voordat er iets geplaatst wordt. De bestandsnaam komt uit het certificaat zelf,
|
||
dus padtrucs kunnen niet. **Nog niet in een browser geprobeerd**
|
||
- [ ] Open punt 7: beslissen of Zoraxy een harde afhankelijkheid wordt. "Zoraxy of NPM" kan niet, en dat
|
||
is op 20-08-2026 in de bron nagetrokken; alleen de wens staat nog open. Zie [OPEN.md](OPEN.md)
|
||
punt 7
|
||
- [ ] Fase 5, het activiteitenlog, als de gebruiker het wil
|
||
|
||
De drie controles op `openssl`, `nc` en de WebDAV-module zijn **vervallen** met de komst van de agent: die
|
||
doet dat werk zelf met de standaardbibliotheek. Zie [PLAN.md](PLAN.md) §4a0.
|
||
|
||
Daarna, in deze volgorde:
|
||
|
||
- [ ] Fase 2 bouwen op de uitkomst van die controle
|
||
- [ ] Fase 5, als de gebruiker de wallet-activiteit wil
|
||
|
||
## Fase 1 - Het liegen eruit
|
||
|
||
- [x] De verzonnen statusblokken (`Online`, `Online`) en het verzonnen logvenster weg
|
||
- [x] Het hardgecodeerde domein weg. De pagina bevat geen enkele installatiespecifieke waarde meer
|
||
- [x] Taal naar Engels, zie [OPEN.md](OPEN.md) punt 2
|
||
- [x] Opnieuw opgebouwd op het design-systeem: tokens, `card`, `badge`, `alert`, `list-item`, `btn`,
|
||
donker met een lichte variant en een schakelaar
|
||
- [x] **De pagina verhuisd naar `index.html.template` in de app-root.** Onder `web/` zou elke latere
|
||
wijziging een herinstallatie kosten: umbreld ververst bij een update alleen een whitelist en die
|
||
kijkt niet in submappen. Als template zit hij in de whitelist én wordt hij bij elke start ingevuld
|
||
|
||
## Fase 2 - De agent schrijft `status.json`
|
||
|
||
Herzien 19-08-2026: dit is een tweede container met een python-programma geworden in plaats van een
|
||
shell-lus in de compose. Onderbouwing in [PLAN.md](PLAN.md) §4a0.
|
||
|
||
- [x] `agent.py.template`, met de instellingen uit de omgeving in plaats van uit template-invulling.
|
||
Daardoor staat er geen accolade-variabele in en blijft het geldige Python, dus is het te importeren
|
||
in een test. De eerste toets in `tests/` controleert precies die aanname
|
||
- [x] Schrijft `status.json` atomair via een tijdelijk bestand en `os.replace`, want de pagina leest het
|
||
elke minuut en een half geschreven bestand geeft een lege pagina
|
||
- [x] Einddatum van het certificaat met een eigen DER-lezer. Getoetst tegen `ssl` op 74 echte
|
||
CA-certificaten, op een levend servercertificaat, en op beide tijdvormen
|
||
- [x] Blokhoogte en reactietijd via `blockchain.headers.subscribe` over een verse socket
|
||
- [x] Een `history`-reeks bijhouden, afgekapt op 24 uur, met alléén de reactietijd. De sparkline is sinds
|
||
19-08-2026 de enige afnemer
|
||
- [x] Herkennen welke backend het is aan de hand van het adres, en `unknown` als hij niet in de tabel
|
||
staat. Zie [PLAN.md](PLAN.md) §4c: liever minder informatief dan onwaar
|
||
- [x] De lus valt nooit stil: een mislukte ronde wordt gelogd en overgeslagen. Stoppen zou de pagina op
|
||
oude gegevens bevriezen, en dat is precies het liegen dat dit plan moest afschaffen
|
||
- [ ] Draaien op de Umbrel. Niets hiervan is buiten de tests uitgevoerd
|
||
|
||
## Fase 3 - De pagina vult zichzelf
|
||
|
||
- [x] `fetch` op `status.json`, elke minuut
|
||
- [x] Elk veld heeft een zichtbare onbekend-toestand; nooit een leeg veld, want dat leest als "in orde"
|
||
- [x] "Laatst bijgewerkt" tonen, en oude gegevens als zodanig laten zien zodra ze ouder zijn dan twee
|
||
schrijfronden. **Bijgesteld 19-08-2026 op verzoek van de gebruiker:** dat gebeurt niet meer met een
|
||
melding bovenaan de pagina maar alleen bij de waarden zelf, want die melding zei voor de vierde keer
|
||
wat er al onder de blokhoogte, in de badge bij de Electrum-server en in de voettekst stond
|
||
- [x] Leesbare melding als het bestand ontbreekt, zonder dat het op een fout lijkt.
|
||
Zie [OPEN.md](OPEN.md) punt 1
|
||
- [ ] Verifiëren tegen een échte `status.json` in plaats van tegen de voorbeeldversie uit de preview
|
||
|
||
## Fase 4a - De indeling
|
||
|
||
Vastgesteld door de gebruiker op 19-08-2026 na het bekijken van de eerste versie. Ontwerp in
|
||
[PLAN.md](PLAN.md) §4a1.
|
||
|
||
- [x] Volgorde: Electrum-server, drie statustegels, activiteitenlog, certificaatkeuze, instellen van je
|
||
wallet
|
||
- [x] "Point your wallet here" opgegaan in "Setting up your wallet"; het waren dezelfde kaders
|
||
- [x] Breed met een raster van twaalf kolommen, rijen die 5/7 en 7/5 afwisselen, afgekapt op 1760px
|
||
- [x] De leesvolgorde in de HTML is de bedoelde volgorde, zonder `order` in de CSS, zodat stapelen op een
|
||
smal scherm dezelfde volgorde geeft. Gecontroleerd op 1760px en op mobiel
|
||
- [x] Statustegels rekken mee met de hoogte van hun buur, anders staat er een gat rechtsboven
|
||
- [x] Het logblok scrollt zelf horizontaal in plaats van de regel met puntjes af te kappen
|
||
- [x] **Alle kaders hetzelfde opgebouwd** (19-08-2026): een `card-head` met een titel in `t-h3`, dan de
|
||
inhoud. De drie statustegels hadden een eigen kleine grijze kop in kapitalen. De titel gebruikt de
|
||
token `--text-primary`, niet letterlijk wit, anders is hij onzichtbaar in de lichte variant
|
||
- [x] De onderregel van een statustegel is even hoog als de sparkline, zodat de drie getallen op één lijn
|
||
staan. Gecontroleerd: koppen op y=153, getallen op y=311
|
||
- [x] **De badge "Serving this page" verwijderd** (19-08-2026, op aanwijzing van de gebruiker). Zie
|
||
[OPEN.md](OPEN.md) punt 5 voor wat er wél op die plek zou horen
|
||
- [x] **De voetregel verwijderd** (19-08-2026). Daarin stond "Last reading ... ago" plus het versienummer;
|
||
het eerste stond al bij de waarden zelf
|
||
- [x] **Het versienummer teruggezet**, klein achter de tagline als `v0.0.3`. Dezelfde dag op verzoek van de
|
||
gebruiker. In `--text-sec` en niet in `--text-ter`, want die laatste is in de lichte variant `#bbbbbb`
|
||
op wit en op deze grootte onleesbaar
|
||
- [x] **De certificaatlijst scrollt**, met het aantal in de kop. Een gedeelde certificatenmap kan er
|
||
tientallen bevatten. Gecontroleerd met 19 certificaten: 1062px inhoud in een vak van 360px, knop
|
||
blijft eronder staan
|
||
- [x] **Het logblok en het certificaatkader zijn even hoog.** Het langste kader van de rij bepaalt de
|
||
hoogte, en wat mag meegroeien zegt dat zelf met flex. Gemeten: 636px bij vier certificaten, 773px bij
|
||
negentien, in beide gevallen allebei gelijk
|
||
- [x] **Certificaat en activiteitenlog omgedraaid** (19-08-2026, op verzoek). Certificaat links en smal,
|
||
log rechts en breed. Dat pakt twee kanten goed uit: de kolomgrens valt nu samen met die van de rij
|
||
erboven (gemeten: x=738 in beide rijen), en monospace logregels hebben de breedte beter nodig
|
||
- [x] **Het losse verbindingsadres met kopieerknop eruit**, plus het label "tested clients". Zonder
|
||
verlies: hetzelfde adres staat bij elke clientregel, in de vorm die díe client wil, met een
|
||
kopieerknop erbij. Het instelkader werd daarmee 533px in plaats van 610px
|
||
- [ ] Nog niet met eigen ogen gezien op een echt breed scherm; gecontroleerd via de afmetingen van de
|
||
kaders, niet visueel, want het browserpaneel stond dicht
|
||
|
||
## Fase 4 - Bruikbaar in plaats van alleen eerlijk
|
||
|
||
- [x] Verloopwaarschuwing onder de dertig dagen, en een foutmelding als het certificaat verlopen is
|
||
- [x] Kopieerknop op het verbindingsadres, met terugval voor http zonder de clipboard-API
|
||
- [x] Verbindingsregels per client, met kopieerknop per regel. Bron: `Referenties/Clients.md` §4
|
||
- [x] Kopieerknoppen verschijnen bij hover over de regel. Met `opacity` en niet met `display`, zodat ze
|
||
met de tab-toets bereikbaar blijven, plus `focus-within` en altijd zichtbaar op aanraakschermen
|
||
- [ ] De kopieerknop echt uitproberen achter de app-proxy van umbrelOS. Die draait over http, dus de
|
||
terugval met `execCommand` is daar het pad dat gebruikt wordt en niet de uitzondering. Wat op
|
||
19-08-2026 lokaal wél bewezen is: de **faalroute** meldt "Press Ctrl+C" in plaats van stil niets te
|
||
doen. De geslaagde route vraagt een echte muisklik, want de clipboard-API weigert een klik die uit
|
||
een script komt
|
||
|
||
## Fase 4b - De certificaatkeuze
|
||
|
||
Besloten 19-08-2026 door de gebruiker: een keuzelijst op het dashboard in plaats van een sleutel in het
|
||
configuratiebestand. Het ontwerp hoort bij het plan **Configuratie** §4e en §4f; hier staat alleen wat de
|
||
pagina en de compose ervoor doen.
|
||
|
||
- [x] Keuzelijst op de pagina, met per certificaat de bron, de bestandsnaam, het domein en het aantal
|
||
resterende dagen. Een verlopen certificaat staat er rood bij en wordt niet verborgen: het bestaat,
|
||
en het kiezen ervan moet een zichtbare vergissing zijn en geen onvindbare
|
||
- [x] `PUT` naar `api/certificate`, doorgestuurd naar de agent. De WebDAV-truc is vervallen: de agent
|
||
neemt de keuze aan en kan hem ook controleren, wat WebDAV niet kon
|
||
- [x] De pagina meldt níet zelf dat het gelukt is. Nginx moet het certificaat nog herladen, en dat blijkt
|
||
pas uit de volgende `status.json`
|
||
- [x] De Zoraxy-mount van `/certs` naar `/certs/zoraxy`, en `/certs/own` erbij, zodat er per bron een map
|
||
is. Beide containers hebben ze nodig: de agent om te kiezen, nginx om het bestand te openen
|
||
- [x] `certificates` in `status.json`, met per certificaat de bron, de naam, het domein uit het
|
||
certificaat en de einddatum
|
||
- [x] **De guard: een id die de agent niet zelf gevonden heeft, wordt geweigerd.** Zowel bij de `PUT` als
|
||
bij het kiezen. Getest, inclusief de mutatietest
|
||
- [x] **Bij meerdere kandidaten kiest de app niet.** Bijgesteld nadat bleek dat mijn eerste versie "de
|
||
langst geldige" pakte, wat het plan **Configuratie** §4c uitdrukkelijk verbiedt: een verkeerd
|
||
certificaat geeft een verbinding die het lijkt te doen en bij de wallet stukloopt op
|
||
naamverificatie. De pagina toont dan een foutmelding met de kandidaten erin
|
||
- [x] De pagina toont bovenaan een foutmelding als er geen certificaat actief is, want dan is er geen TLS
|
||
en dat is het ergste wat deze app kan overkomen
|
||
|
||
## Fase 5 - Het activiteitenlog
|
||
|
||
Voorstel, nog niet besloten. Ontwerp in [PLAN.md](PLAN.md) §4e. De kaart staat al op de pagina en toont
|
||
`no data`, zodat de vorm te beoordelen is voordat er iets voor gebouwd wordt.
|
||
|
||
- [x] Vorm: logregels onder elkaar, monospace, nieuwste bovenaan, met de grens erbij vermeld dat een
|
||
regel per protocolaanroep niet kan zonder het verkeer van de gebruiker uit te lezen
|
||
- [ ] Uitzoeken of een `log_format` met dollartekens langs de template-invulling te krijgen is, via een
|
||
`include` die het `command`-blok wegschrijft
|
||
- [ ] Uitzoeken hoe de bytetellers van een lopende verbinding in de container af te lezen zijn; nginx
|
||
logt een stream-sessie pas bij het sluiten
|
||
- [ ] `log` in `status.json`, zonder client-IP en zonder bronpoort
|
||
|
||
## Geblokkeerd / wacht op
|
||
|
||
- [ ] Niets. De afhankelijkheid van **Configuratie** is vervallen, zie [PLAN.md](PLAN.md)
|