Op verzoek van de gebruiker, in beide apps. De accentgloed uit Gate 0.0.25 en Relay 0.5.2 gaat uit; de rand, de schaduw, het randlicht en de doorschijnende kleur van de vlakken blijven staan. Het is een schakelaar geworden en geen verwijdering: data-glow="on" op het html-element zet hem terug, en alleen samen met data-depth="deep". Die tweede eis is van de gebruiker en hij is juist: de gloed is de onderste van de vier dieptelagen, dus aanzetten op een vlakke pagina legt een verloop achter vlakken die er dekkend voor staan. De blur hangt nu aan de gloed en niet aan de diepte, want een backdrop-filter op een egale ondergrond levert per definitie niets op. Daarmee verviel het mobiele terugvalblok (Gate 0.0.26, Relay 0.5.3) volledig: dat zette gloed, blur en vlakkleur om, en de eerste twee staan nu al uit. Meegevonden en gerepareerd: een selector met twee attributen wint van de :root in de prefers-reduced-transparency-query, die daardoor de blur niet meer uit kreeg. Die query noemt de gloedselector nu letterlijk. Alle zeven tests groen: 22 + 43 + 39 + 54 + 28 + 115 + 65 goed, 0 fout. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
475 lines
32 KiB
Markdown
475 lines
32 KiB
Markdown
# Voortgang - Webinterface
|
|
|
|
## 04-09-2026 - de gloed uit, maar als schakelaar
|
|
|
|
Tweede opdracht van dezelfde dag, en hij raakt beide apps: de accentgloed achter de pagina mag eruit, en
|
|
wel zo dat hij optioneel aan of uit te zetten is. Dat laatste is de reden dat dit meer werk was dan een
|
|
regel weghalen. De gloed zat vast aan `data-depth="deep"`, samen met de drie andere dieptelagen, en dat is
|
|
precies waarom hij niet los uit te zetten was.
|
|
|
|
Nu is het `data-glow`, en op verzoek van de gebruiker eist de selector beide attributen. Dat is de juiste
|
|
eis: de gloed is de onderste laag, dus aanzetten op een vlakke pagina legt een verloop achter vlakken die
|
|
er dekkend voor staan. Vlak blijft vlak.
|
|
|
|
De blur hangt aan de gloed en niet aan de diepte, en daarmee verviel het mobiele terugvalblok uit 0.0.26
|
|
volledig: dat zette gloed, blur en vlakkleur om, en de eerste twee staan nu al uit. Meegevonden en
|
|
gerepareerd: twee attributen in de selector winnen van de `:root` in de
|
|
`prefers-reduced-transparency`-query, die daardoor de blur niet meer uit kreeg. Dezelfde klasse fout als
|
|
in 0.0.25.
|
|
|
|
Gate 0.0.29, Relay 0.5.5, en het gedeelde designsysteem in `HomeGit/Docs` heeft de gloed nu als eigen
|
|
schuif naast Diepte, met de combinatie-eis erin beschreven.
|
|
|
|
## 04-09-2026 - de blokhoogte was niet van deze app
|
|
|
|
Opdracht van de gebruiker: de widget met de blokhoogte helemaal weg, want het is niet aan deze app om die
|
|
informatie te tonen. Dat is ook zo: dit is een voordeur op een Electrum-server, en de keten staat in elke
|
|
wallet die de gebruiker al heeft. Vier widgets over, alle vier over deze gateway. Versie 0.0.28.
|
|
|
|
Wat er niet in de opdracht stond maar er wel bij hoort: de leeftijd van de meting stond onder de blokhoogte
|
|
en was daarmee de laatste plek waar de pagina zei hoe oud zijn gegevens zijn. De voetregel en de badge die
|
|
hetzelfde zeiden zijn in augustus weggehaald met precies dat argument. Die regel staat nu onder de
|
|
reactietijd, ná de sparkline zodat de vier onderregels op één lijn blijven.
|
|
|
|
De rij is een raster van vier geworden met breekpunten op 1100 en 560 pixels: vier deelt door twee, dus de
|
|
stap die bepaalde wélke widget alleen kwam te staan is vervallen. In de agent is de hoogte uit het antwoord
|
|
gehaald, maar het verzoek niet: daar wordt de reactietijd uit gemeten.
|
|
|
|
## 30-08-2026 - wat de buur duidelijker deed, is hier overgenomen
|
|
|
|
Geen gepland werk aan dit plan. Bij het verbouwen van de pagina van Evolu Relay zag de gebruiker de twee
|
|
naast elkaar, en toen kwam eruit wat op deze pagina al maanden stond zonder dat iemand erover viel: de
|
|
statuswidget zei "Answering" met "answered in 7 ms, from inside the app" eronder, en dat is in beide helften
|
|
onduidelijk. Nu "Running", met de meting eronder.
|
|
|
|
**De nuance die daarin zat is niet weg maar verplaatst.** Dat "from inside the app" was er niet voor niets:
|
|
de agent verbindt van container naar container, dus een router die de poort niet meer doorstuurt leest hier
|
|
alsnog als in orde. Die bewering staat nu onder een eigen kopje in de nieuwe dialoog "About this app", waar
|
|
er ruimte is om hem uit te schrijven. Vier woorden waren er te weinig voor.
|
|
|
|
Die dialoog is de tweede wijziging, en hij zit in beide apps: de marketingtekst stond alleen in het manifest
|
|
en dus alleen in de winkel, terwijl je hem ná het installeren nog eens wil kunnen nalezen. Versie 0.0.24.
|
|
|
|
## 28-08-2026 - deze pagina ging kapot door een andere app, en dat was te voorzien
|
|
|
|
Geen werk aan dit plan; wel een reparatie die er thuishoort. `nginx.conf.template` proxyde naar
|
|
`http://agent:8000`, en dat werkte zolang Electrum Gate de enige app met een service `agent` was. Sinds
|
|
Evolu Relay er een heeft, verdeelt Docker die naam over beide containers: van tien verzoeken kwamen er vijf
|
|
bij de verkeerde app uit. Op de pagina zag dat eruit als waarden die kwamen en gingen.
|
|
|
|
Beide apps wijzen nu naar `<app-id>_agent_1`. Dat is dezelfde les die al in de compose stond over de
|
|
servicenaam `server`, en die stond alleen daar en niet in de nginx-config. `test_appstore_vorm.py` toetst
|
|
het nu voor elke app, dus deze fout kan niet meer stil terugkomen.
|
|
|
|
Uitgerold als 0.0.23. **Geraakt:** `nginx.conf.template` en `umbrel-app.yml`. **Tests:** alle vier groen.
|
|
|
|
## 27-08-2026 - de nieuwe widget vond meteen een fout, en die zat in de widget zelf
|
|
|
|
De gebruiker heeft 0.0.17 bekeken: het werkt, met een lijst bijstellingen. Verwerkt in 0.0.18. De
|
|
belangrijkste is geen smaakkwestie maar een echte fout: **de Status-widget meldde `Not answering` met
|
|
`[Errno 111] Connection refused` op een gateway die gewoon werkte.**
|
|
|
|
Die foutmelding was het bewijs. Geweigerd betekent dat de naam oploste, alleen niet naar ons.
|
|
`GATE_TLS_HOST` stond op de servicenaam `server`, en dat is een naam die meer apps op een Umbrel
|
|
gebruiken; op een gedeeld netwerk is het dan een gok wie je krijgt. Nu de volledige containernaam, precies
|
|
de vorm die umbrelOS van `APP_HOST` verlangt en die er in dezelfde compose al twee regels boven stond.
|
|
|
|
Wat dit zegt over de aanname van gisteren: er stond dat de weg naar `server` "dezelfde weg is die nginx
|
|
andersom gebruikt". Dat klopte voor de richting maar niet voor de naam, en het was opgeschreven als
|
|
redenering in plaats van als meting.
|
|
|
|
De rest is opmaak: het menu is drie kale punten met hover-accent in plaats van een knop, de eerste
|
|
menuregel heet `Settings…` zonder de certificaatnaam erachter, de dialoog opent in het midden in plaats
|
|
van linksboven, de widgets zijn hoger met hun waarde onderin, reactietijd en blokhoogte zijn omgedraaid,
|
|
en het log is half zo hoog.
|
|
|
|
**Geraakt:** `index.html.template`, `docker-compose.yml`, `agent.py.template` (alleen commentaar),
|
|
`umbrel-app.yml` (0.0.18), dit plan, de changelog. **Tests:** 39, 32, 54 en 22 goed, 0 fout. De
|
|
manifest-toets ving onderweg een echte fout: bij het herschrijven van de release notes was de sleutel
|
|
`releaseNotes` zelf weggeknipt.
|
|
|
|
## 27-08-2026 - de tweede indeling gebouwd, en er ging meer weg dan erbij kwam
|
|
|
|
Fase 6 in één keer gebouwd, uitgeleverd als 0.0.17: vijf widgets op de bovenste rij, de certificaatkeuze
|
|
in een dialoog achter een puntjesmenu, het log vol breed, en het instelkader dichtgeklapt met twee
|
|
kopieerknoppen. De zelfcontrole uit 0.0.16 heeft daarmee eindelijk een plek om te verschijnen.
|
|
|
|
**Wat opvalt aan deze verbouwing is wat er verdween.** Twee mechanismen bestonden alleen omdat er kaders
|
|
naast elkaar stonden: het meerekken van de tegels met de hoogte van hun buur, en het samen groeien en
|
|
krimpen van log en certificaatkader. Dat tweede was de hele inhoud van 0.0.13. Vijf gelijke widgets en een
|
|
vol breed log hebben geen buur, dus beide zijn weg, net als `.col-5` en `.col-7`.
|
|
|
|
**Twee dingen zijn onderweg bijgestuurd.** Het menu werd drie punten in plaats van een hamburger, op
|
|
aanwijzing van de gebruiker: dat is wat umbrelOS bij zijn eigen apps toont. En het ontwerp beweerde dat de
|
|
certificaatlijst een lijst was; dat was op 20-08-2026 al een dropdown geworden. Die is ongewijzigd
|
|
meeverhuisd naar de dialoog.
|
|
|
|
De harde eis uit §4a2 staat in de code en niet alleen in het plan: de foutmelding "geen certificaat in
|
|
gebruik" heeft de knop die de dialoog opent, want een verse installatie moet die keuze kunnen vinden.
|
|
|
|
**Geraakt:** `index.html.template` (kop, meldingen, hele raster, dialoog, script), `umbrel-app.yml`
|
|
(0.0.17), dit plan, de changelog. **Tests:** 39, 32, 54 en 22 goed, 0 fout. **Niet geverifieerd:** niets
|
|
hiervan is in een browser gezien, op geen enkele schermbreedte.
|
|
|
|
## 27-08-2026 - de app kijkt eindelijk naar zijn eigen voordeur, en meet minder dan beloofd
|
|
|
|
Open punt 5 is goedgekeurd en gebouwd in 0.0.16. De agent verbindt met de eigen TLS-poort, maakt de
|
|
handdruk af en vergelijkt het getoonde certificaat byte voor byte met het gekozen bestand. Dat laatste
|
|
bleek waardevoller dan de handdruk zelf: het vangt een certificaatwissel die nginx nooit heeft toegepast,
|
|
en dat is precies het geval waar een controle op vertrouwen blind voor is.
|
|
|
|
**Twee dingen liepen anders dan het plan zei, en allebei zijn ze in de documentatie rechtgezet.** De
|
|
belofte "bewijst luisteren, certificaat en doorverbinding in één keer" klopte voor twee van de drie: na de
|
|
handdruk wordt er niets verstuurd. Een echt verzoek zou de sessie bytes geven, en sessies met bytes worden
|
|
nooit uit het activiteitenlog gefilterd, want dat zou een storing kunnen verbergen.
|
|
|
|
En dat filteren was de tweede verrassing: elke meting is voor nginx een gewone sessie en levert dus een
|
|
logregel op. Zonder rem en zonder filter ging het activiteitenlog over onszelf in plaats van over wallets.
|
|
Er zit nu een rem op van vijf minuten, er wordt niet gemeten vlak na een herlading (dan staat het vorige
|
|
certificaat er nog), en de eigen regels worden weggelaten op grond van het moment.
|
|
|
|
De widget zelf komt bij fase 6; tot die tijd is een wijziging zichtbaar als regel in het activiteitenlog.
|
|
|
|
**Geraakt:** `agent.py.template`, `docker-compose.yml`, `umbrel-app.yml` (0.0.16),
|
|
`tests/test_agent_zelfcontrole.py` (nieuw), dit plan, de changelog (waar 0.0.15 nog ontbrak).
|
|
**Tests:** 22 goed 0 fout nieuw, plus 54, 39 en 32 goed 0 fout bestaand. Alle vier de beslissende regels
|
|
mutatie-getest.
|
|
|
|
## 20-08-2026 - scans zijn geen weigeringen, en meer lucht tussen de kaders
|
|
|
|
De gebruiker vroeg wat een logregel `refused ... status 500` met nul bytes betekende. Antwoord: een
|
|
TLS-handdruk die niet is afgemaakt, en op een doorgestuurde poort vrijwel altijd een scanner. Dat is geen
|
|
storing, maar het log liep er wel vol met rode regels die suggereerden dat de app iets geweigerd had.
|
|
|
|
**Nu een eigen soort `probe`, en de grens ligt bij de bytes.** Niet bij de duur en niet bij de status: een
|
|
scan die tien seconden open blijft is nog steeds een scan, en een sessie die na een halve seconde omvalt
|
|
maar wél verkeer had is nog steeds een storing. Dat de bytetellers niets over de handdruk zeggen, bleek uit
|
|
de sessies van de gebruiker zelf: een mislukte verbinding kwam op 0 en 0 uit terwijl er wél een handdruk
|
|
geprobeerd is. Rood is nu voorbehouden aan het geval waar je iets aan moet doen.
|
|
|
|
Verder de ruimte tussen de kaders van 1 naar 1,5rem. De kaders hebben 1,8rem binnenin, dus de ruimte ertussen
|
|
was kleiner dan die erbinnen; dat is de reden dat het krap aanvoelde.
|
|
|
|
**Geraakt:** `agent.py.template`, `index.html.template`, `umbrel-app.yml` (0.0.14), `PLAN.md` §4e-tabel,
|
|
`tests/test_agent_certificates.py`. **Tests:** 54 goed 0 fout en 39 goed 0 fout, niets overgeslagen; de
|
|
indeling van de sessieregels is mutatie-getest met een grens op de duur in plaats van de bytes, en dat viel
|
|
om zoals het moest.
|
|
|
|
## 20-08-2026 - de mobiele opmaak, en een tegel minder
|
|
|
|
De pagina liep op een telefoon buiten beeld. **De oorzaak was één regel CSS:** de clientlijst stond op
|
|
`minmax(420px, 1fr)`, en dat eist een track van minstens 420 pixels ook op een smaller scherm. Nu met
|
|
`min(420px, 100%)` eromheen. Daarbij vouwen de lijstregels en de logregels onder de 700 pixels om, met de
|
|
waarde onder de titel in plaats van ernaast.
|
|
|
|
Voor de logregels is dat een **herziening** van een eerdere keuze: die scrollen liever dan dat ze afkappen,
|
|
omdat de kolomvorm dan blijft staan. Dat argument geldt op een breed scherm en daar blijft het zo, maar op
|
|
een telefoon betekende het dat je de bytes nooit zag.
|
|
|
|
Verder is de tegel met het aantal dagen tot het certificaat verloopt eruit, op verzoek van de gebruiker.
|
|
Dezelfde redenering als bij de badges: de kaart eronder zegt het al, en met een datum erbij. Backend
|
|
response is nu twee kolommen breed, want de sparkline is het enige op die rij dat met breedte iets doet.
|
|
|
|
**Diezelfde dag nagekeken op een telefoon en het ziet er goed uit.** Eén regressie kwam eruit: door het
|
|
omvouwen volgde de kopieerknop de tekst, en het ene adres is langer dan het andere, dus stonden de knoppen
|
|
niet op één lijn. Verholpen in **0.0.11** met `margin-left: auto` op de knop, en niet met `space-between` op
|
|
de rij: bij de gesplitste weergave staat er ook een notitie naast de waarde die daar tegenaan hoort te
|
|
blijven staan.
|
|
|
|
Bijvangst die geen opmaak is: **`0.0.10` na `0.0.9` leverde gewoon een update op.** Daarmee is de aanname
|
|
uit die release bevestigd en is een tekstvergelijking met groter-dan uitgesloten. Staat in de naslag, want
|
|
het scheelt de volgende keer een omweg via `0.1.0`.
|
|
|
|
**Geraakt:** `index.html.template`, `umbrel-app.yml` (0.0.10 en 0.0.11), `CHANGELOG.md`,
|
|
`Referenties/Umbrel-appstore-spec.md`. **Tests:** 39 goed 0 fout op de manifest- en configuratietoetsen; aan
|
|
de agent is niets geraakt.
|
|
|
|
## 20-08-2026 - nagekeken in de browser, en dit plan is nu tier A
|
|
|
|
Na de verse installatie van 0.0.9 heeft de gebruiker alles nagekeken wat alleen met de hand kan.
|
|
**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; alleen de weigering bij een sleutel die niet bij het certificaat hoort is nog niet in een
|
|
browser gezien.
|
|
|
|
**Dit plan is naar tier A gegaan** en van nummer 020 naar 005. Niet omdat er meer werk bij kwam, maar omdat
|
|
het het enige plan is met werk dat nu te doen is: **Appstore** is in de kern af en wacht op een herstart die
|
|
niet te plannen is, en **Publicatie** wacht op een publieke repo.
|
|
|
|
Eén nieuwe bevinding van de gebruiker om mee te beginnen: in mobiele weergave lopen de verbindingsregels
|
|
met hun kopieerknoppen en de logregels buiten beeld. Dat laatste is een bewuste keuze geweest (de logregels
|
|
scrollen liever dan dat ze afgekapt worden), maar op een telefoon is dat het verkeerde antwoord.
|
|
|
|
**Geraakt:** alleen documentatie. **Tests:** niet van toepassing.
|
|
|
|
## 20-08-2026 - uploaden gebouwd, en de pagina verder uitgekleed
|
|
|
|
**Een certificaat uploaden kan nu via de pagina**, open punt 6. Het echte werk zat niet in het formulier
|
|
maar in de validatie: het paar gaat onder een `.tmp`-naam naar de doelmap en wordt daar door
|
|
`ssl.SSLContext.load_cert_chain` geopend, dezelfde OpenSSL die nginx straks gebruikt. Zonder die controle
|
|
levert een verkeerde sleutel een nginx die niet meer herlaadt, en dat is dezelfde klasse storing als
|
|
waardoor 0.0.3 niet startte. **De bestandsnaam komt uit het certificaat zelf**, dus de hele klasse padtrucs
|
|
is weg zonder invoerfiltering. Uploaden kiest niet: de nieuwe komt voorgeselecteerd in de lijst.
|
|
|
|
Twee dingen die bij het bouwen bijna fout gingen en het opschrijven waard zijn: `os.replace` uit `/tmp`
|
|
naar `/certs/own` faalt met EXDEV omdat dat een bind-mount is, en `-subj "/CN=../.."` in openssl leest de
|
|
schuine streep als scheidingsteken, waardoor de padtruc-toets zichzelf stil oversloeg.
|
|
|
|
Verder op verzoek van de gebruiker: het app-icoon in de kop in plaats van het schildje, de badges uit de
|
|
hoek van álle kaders, "your choice" weg achter het actieve certificaat, en Trezor Suite is niet
|
|
desktop-only. Die laatste is de tweede keer dat leveranciersdocumentatie het aflegt tegen één keer kijken.
|
|
Bijgevangen: de teller zweeg over een wallet die al verbonden was voordat de agent begon, en dat is precies
|
|
het geval waarin iemand komt kijken.
|
|
|
|
Aan het eind van de dag nog één tekstbesluit: de pagina had een andere tagline dan de appstore, en die van
|
|
de appstore wint (0.0.8). Zie [OPEN.md](OPEN.md) punt 8; de reden is dezelfde maatstaf als bij het
|
|
hernoemen van de app, namelijk de opbrengst en niet het middel.
|
|
|
|
**Geraakt:** `agent.py.template`, `index.html.template`, `nginx.conf.template`, `docker-compose.yml`,
|
|
`umbrel-app.yml` (0.0.7 en 0.0.8), `OPEN.md` punt 6 en 8, `Referenties/Clients.md`, beide testbestanden.
|
|
**Tests:** 48 goed 0 fout en 24 goed 0 fout, niets overgeslagen; de sleutelcontrole en de beschrijfbare
|
|
mount zijn mutatie-getest. **Niet geverifieerd:** het uploaden in een echte browser.
|
|
|
|
## 20-08-2026 - de pagina naast een werkende app, en §4e afgemaakt
|
|
|
|
Eerste sessie met een app die echt draait, en dat leverde meteen de bevinding op waar §4e om vroeg: de
|
|
gebruiker zag van zijn verbonden wallet niets terug. Oorzaak is bekend en staat in het plan, namelijk dat
|
|
nginx `stream` pas bij het sluiten van een sessie logt. Het open punt was hoe je de lopende verbinding dan
|
|
wél afleest. **Antwoord: `/proc/net/tcp`, geteld in de nginx-container**, want dat bestand geldt per
|
|
netwerk-namespace en de agent zit in een andere. Het aantal gaat via een bestand naar de agent, net als de
|
|
herlaadvlag. **`traffic` is daarbij vervallen:** bytes van een lopende sessie zijn er niet af te lezen, en
|
|
een schatting die als meting leest is precies wat §4c verbiedt.
|
|
|
|
Daarnaast een reeks verzoeken van de gebruiker, alle om dezelfde reden: de pagina was te druk. De
|
|
certificaatkeuze is een dropdown geworden (met veertien certificaten was die lijst het drukste onderdeel
|
|
van de pagina, voor iets wat je één keer doet), `disconnected` heet `session ended` met leesbare details
|
|
erachter, en er zijn vijf stukken tekst geschrapt: de voetnoot onder het log, de regel bij Certificate, de
|
|
stip in de badges, de zin over apps op de Umbrel zelf en de uitleg over één regel versus twee velden.
|
|
Bijgevangen bij de dropdown: de oude keuzelijst zette zichzelf elke ronde terug, dus een keuze verdween
|
|
binnen tien seconden weer. Verder heet Blockstream Green nu Blockstream; die app is omgedoopt.
|
|
|
|
**Geraakt:** `index.html.template`, `agent.py.template`, `docker-compose.yml`, `umbrel-app.yml` (0.0.6),
|
|
`PLAN.md` §4e, `OPEN.md` punt 6 en 7, `Referenties/Clients.md`, `tests/`. **Tests:** 29 goed 0 fout en 19
|
|
goed 0 fout, niets overgeslagen; de teller en de logregel zijn mutatie-getest. **Niet geverifieerd:** alles
|
|
in de browser, dus de dropdown, de hoogtes en de badge. Dat is handwerk van de gebruiker.
|
|
|
|
## 19-08-2026 - sessie afgesloten; plan zakt naar tier C
|
|
|
|
Laatste twee wijzigingen van de dag: certificaat en activiteitenlog omgedraaid, en het losse
|
|
verbindingsadres met kopieerknop eruit samen met het label "tested clients". Het omdraaien pakte beter uit
|
|
dan als voorkeur alleen, want de kolomgrens valt nu samen met die van de rij erboven (x=738 in beide rijen)
|
|
en logregels hebben de breedte beter nodig dan keuzerondjes. Het adres verdween zonder verlies: het staat
|
|
bij elke clientregel in de vorm die díe client wil, met kopieerknop.
|
|
|
|
**Het plan zakt van A naar C**, wachtend op de installatie. De pagina is af voor zover dat zonder de Umbrel
|
|
kan; al het resterende werk hier begint met kijken of de agent doet wat hij zou moeten doen.
|
|
|
|
**Geraakt:** `whatsnext-electrum-gate/index.html.template`, de plannen, `CONTINUE_HERE.md`.
|
|
**Tests:** 21 goed, 0 fout. Die raken de pagina niet.
|
|
**Niet geverifieerd:** de agent heeft nooit gedraaid, en ik heb de pagina zelf nooit gezien; het
|
|
browserpaneel bleef dicht, dus alles is gemeten in plaats van bekeken.
|
|
|
|
## 19-08-2026 - voetregel weg, certificaatlijst scrollt, kaders gelijk
|
|
|
|
De voetregel met "Last reading ... ago" en het versienummer is eruit; de gebruiker houdt van een rustige
|
|
interface en de leeftijd stond al bij de waarden zelf. Het **versienummer** is op verzoek dezelfde dag
|
|
teruggezet, klein achter de tagline als `v0.0.3`: dit project verloor een keer een dag aan een wijziging
|
|
die niet uitrolde door een niet-verhoogde `version`, en dan is dat precies de vraag die je stelt. Het
|
|
staat in `--text-sec`, want `--text-ter` is in de lichte variant `#bbbbbb` op wit en op die grootte niet
|
|
te lezen.
|
|
|
|
De gebruiker vroeg of de certificaatlijst een scrollbalk moest krijgen of beter een dropdown werd, en of
|
|
het logblok en het certificaatkader dan even hoog konden. Het is een scrollende lijst geworden en geen
|
|
dropdown, want je kiest hier op de hostnaam waarop je wallet verbindt en dan wil je bron, naam en
|
|
resterende dagen kunnen vergelijken; in een dropdown zie je er één per keer en kan een verlopen
|
|
certificaat er niet rood in. De hoogtewinst kwam er met een scrollend vak toch, dus er hoefde niets
|
|
ingeleverd te worden. Het aantal staat nu in de kop, want met een scrollbalk is niet meer te zien hoeveel
|
|
er onder de rand staan.
|
|
|
|
Gemeten met negentien certificaten: 1062px inhoud in een vak van 360px, en de knop blijft eronder staan.
|
|
Met vier: geen scrollbalk, dus geen leeg vak. In beide gevallen zijn de twee kaders exact even hoog, 773px
|
|
respectievelijk 636px. Eerst stond het vak op 460px, maar dan werd de rij 873px en vulde die op een
|
|
1080p-scherm het hele beeld.
|
|
|
|
**Geraakt:** `whatsnext-electrum-gate/index.html.template` en de plannen.
|
|
**Tests:** 21 goed, 0 fout; die raken de pagina niet. Nagemeten op 1760px en op mobiel, in beide gevallen
|
|
zonder horizontale schuifbalk en zonder console-fouten.
|
|
|
|
## 19-08-2026 - kaders gelijkgetrokken, en een badge die niets zei
|
|
|
|
De drie statustegels hadden een eigen kleine grijze kop in kapitalen en de andere kaders een witte titel.
|
|
Op verzoek is dat nu overal hetzelfde: een `card-head` met een titel in `t-h3`. Wel met de token
|
|
`--text-primary` en niet met letterlijk wit, want in de lichte variant is wit onzichtbaar. Bij het
|
|
nameten bleek het getal van "Backend response" 21px hoger te staan dan de andere twee, omdat daar een
|
|
sparkline onder hangt in plaats van een tekstregel; de onderregel van een tegel heeft nu dezelfde hoogte
|
|
als die sparkline.
|
|
|
|
De badge "Serving this page" is eruit. De gebruiker wees erop dat die niets zegt: de pagina wordt nooit
|
|
getoond aan een wallet die op 50022 verbindt. Mijn gedachte erachter was dat de pagina en de
|
|
TLS-terminatie in dezelfde container zitten en dat de een de ander dus bewijst, maar dat stond er niet en
|
|
zo leest niemand het. Een badge waarvan de betekenis niet in één zin op te schrijven is, hoort er niet te
|
|
staan.
|
|
|
|
Wat dat wel opleverde, en dat is als open punt 5 vastgelegd: **de app controleert of de Electrum-server
|
|
antwoordt, maar niet of hij zelf antwoordt**, en dat is zijn enige taak. Een TLS-verbinding naar de eigen
|
|
poort zou het luisteren, het certificaat en de doorverbinding in één keer bewijzen. Nog geen taak, want
|
|
het raakt de agent en die heeft nog nooit gedraaid.
|
|
|
|
**Geraakt:** `whatsnext-electrum-gate/index.html.template` en de plannen.
|
|
**Tests:** 21 goed, 0 fout; die raken de pagina niet. Gemeten in beide thema's en op 1760px: zeven
|
|
identieke koppen, drie getallen op één lijn, geen horizontale schuifbalk, geen console-fouten.
|
|
|
|
## 19-08-2026 - de vervallen-melding eruit
|
|
|
|
De gebruiker vond de melding "Readings are out of date" niet nuttig, en dat klopt: dezelfde mededeling
|
|
staat al onder de blokhoogte ("as of ... ago"), in de badge bij de Electrum-server die grijs wordt met
|
|
"last answered", en in de voettekst met het tijdstip. De banner was een vierde keer hetzelfde en wel de
|
|
hardste.
|
|
|
|
De berekening blijft staan, want die stuurt de badge; alleen de melding is weg. Gecontroleerd met een
|
|
`status.json` van een uur oud: geen enkele melding zichtbaar, badge grijs met "last answered 2 hours ago",
|
|
"as of 2 hours ago" onder de blokhoogte, en de voettekst met datum en tijd. Er gaat dus geen informatie
|
|
verloren.
|
|
|
|
De afweging staat nu in [PLAN.md](PLAN.md) §4a, omdat hij geldt voor elke volgende melding die iemand wil
|
|
toevoegen: een banner is er voor iets wat je nergens anders ziet.
|
|
|
|
Wat de gebruiker zag was trouwens de preview en niet de app: die `status.json` is een vast bestand dat
|
|
niets ververst, dus die verloopt altijd als je het tabblad open laat staan.
|
|
|
|
**Geraakt:** `whatsnext-electrum-gate/index.html.template` en de plannen.
|
|
**Tests:** 21 goed, 0 fout; die raken de pagina niet.
|
|
|
|
## 19-08-2026 - de pagina opnieuw ingedeeld, breed en met kaders naast elkaar
|
|
|
|
De gebruiker zag dat "Point your wallet here" en "Setting up your wallet" dezelfde vraag stelden. Die zijn
|
|
er één geworden, en dat kader is naar onderen verhuisd. De volgorde is nu: Electrum-server, de drie
|
|
statustegels, het activiteitenlog, de certificaatkeuze, en onderaan het instellen. De regel erachter is de
|
|
moeite van het opschrijven waard, want hij beslist waar een volgend kader komt: eerst waar je naar kijkt
|
|
als je iets nakomt, onderaan waar je naar kijkt als je iets instelt.
|
|
|
|
Op verzoek ook breed, met kaders naast elkaar: twaalf kolommen, rijen die 5/7 en 7/5 afwisselen, afgekapt
|
|
op 1760px omdat een kader van 2500px regels oplevert die niemand leest. Belangrijk detail dat bewust zo is
|
|
gebouwd: er staat geen `order` in de CSS, dus de leesvolgorde in de HTML is de bedoelde volgorde en
|
|
stapelen op een smal scherm geeft exact dezelfde reeks.
|
|
|
|
Twee dingen die het meten opleverde en die anders waren blijven staan. De statustegels waren 146px naast een
|
|
kader van 293px, dus stond er een gat rechtsboven; ze rekken nu mee en zetten hun inhoud onderaan. En het
|
|
logblok kapte op een smal scherm de bytes af met puntjes; het scrollt nu zelf horizontaal, want stil
|
|
verbergen is dezelfde soort onwaarheid als een verzonnen statuswaarde.
|
|
|
|
**Geraakt:** `whatsnext-electrum-gate/index.html.template` en de plannen.
|
|
**Tests:** de suite raakt de pagina niet; wel gedraaid en groen (21). Gecontroleerd via de afmetingen van
|
|
de kaders op 1760px en op mobiel: volgorde gelijk, geen horizontale schuifbalk op de pagina, logblok
|
|
scrollt zelf, geen console-fouten.
|
|
**Niet geverifieerd:** ik heb de pagina niet met eigen ogen gezien; het browserpaneel stond dicht, dus dit
|
|
is gemeten en niet bekeken.
|
|
|
|
## 19-08-2026 - een tweede container, en de eerste tests in dit project
|
|
|
|
De gebruiker vroeg of de WebDAV-truc de gebruikelijke manier is om een backend in een Umbrel-app te
|
|
bouwen. Dat was hij niet, en het uitzoeken veranderde het ontwerp. umbrelOS biedt precies één instelling
|
|
per app, de afhankelijkheidskeuze in `AppSettingsSchema`; apps met instelbare configuratie zijn zelf een
|
|
backend, in hun eigen image. De gebruiker koos daarop een tweede container met een klein python-programma,
|
|
uit een `*.template` zodat het bij een update meekomt, zonder eigen image.
|
|
|
|
Dat loste meer op dan de keuzelijst. De controles op `openssl`, `nc` en de WebDAV-module zijn alle drie
|
|
vervallen, want de agent doet dat werk met de standaardbibliotheek. En het hardgecodeerde domein is weg uit
|
|
`docker-compose.yml` en `nginx.conf.template`: de agent schrijft `cert.conf` en nginx doet daar een
|
|
`include` op. Daarmee is dat deel van **Configuratie** fase 2 af.
|
|
|
|
Twee dingen die het bouwen opleverde. De standaardbibliotheek heeft geen X.509-parser, dus die is er nu:
|
|
een DER-lezer voor de einddatum en de domeinnamen. Dat is precies het soort code dat niet faalt met een
|
|
fout maar met een verkeerd antwoord, en een certificaatdatum die er een jaar naast zit valt nooit op.
|
|
Daarom is hij getoetst tegen `ssl` op 74 echte CA-certificaten, op een levend servercertificaat voor de
|
|
subjectAltName, en op beide tijdvormen met zelfgebouwde certificaten, want het CA-materiaal gebruikt
|
|
uitsluitend UTCTime na 2000. Dit project had nog geen suite; die staat nu in `tests/` en `CLAUDE.md`
|
|
vertelt hoe je hem draait.
|
|
|
|
Het tweede: bij het schrijven van de compose bleek mijn eigen `choose` het plan **Configuratie** §4c tegen
|
|
te spreken. Die koos bij meerdere certificaten "de langst geldige", terwijl daar uitdrukkelijk staat dat er
|
|
niet gegokt mag worden. Nu weigert de app en noemt de kandidaten, en de pagina zet er een foutmelding
|
|
boven, want geen certificaat betekent geen TLS.
|
|
|
|
**Geraakt:** nieuw `whatsnext-electrum-gate/agent.py.template`, nieuw `tests/`, nieuw `CLAUDE.md`,
|
|
gewijzigd `docker-compose.yml`, `nginx.conf.template`, `index.html.template`, en de plannen.
|
|
**Tests:** 21 goed, 0 fout. Mutatietest gedaan op de twee guards: de keuze-validatie en de verloopfilter,
|
|
allebei met de juiste enkele test die omvalt.
|
|
**Niet geverifieerd:** de agent heeft nog nooit op de Umbrel gedraaid. Alles over de echte werking, dus de
|
|
certificaatscan op de Zoraxy-map, de Electrum-vraag, het herladen via de vlag en de keuze via de API, staat
|
|
nog open.
|
|
|
|
## 19-08-2026 - certificaatkeuze op het dashboard
|
|
|
|
De gebruiker vroeg hoe je aanwijst welk certificaat van welke app je wilt gebruiken, en koos daarbij voor
|
|
een keuzelijst op het dashboard boven een sleutel in een configuratiebestand. Dat draait het niet-doel
|
|
"geen instellingenscherm in de web-UI" terug, en dat is opgeschreven als uitzondering met de reden erbij:
|
|
dit is de enige instelling waarvan de app de mogelijke waarden zelf al kent, want hij kijkt in de
|
|
gemounte mappen.
|
|
|
|
Terugschrijven kan zonder backend met de WebDAV-module van nginx: één `location` die een `PUT` van
|
|
hooguit een kilobyte aanneemt, naar `${APP_DATA_DIR}/config/` zodat de keuze een herstart overleeft.
|
|
Of die module in de image zit, is de eerste van drie controles die nu op de Umbrel moeten gebeuren.
|
|
|
|
Twee dingen bewust níet gedaan. De mount voor Nginx Proxy Manager staat uitgecommentarieerd, want het pad
|
|
is een gok en Docker maakt een ontbrekend bind-mountpad aan; dat zou een lege maphierarchie neerzetten in
|
|
de app-data van een app die er misschien niet is. En de pagina meldt geen succes na het opslaan: nginx
|
|
moet het certificaat nog herladen, en dat blijkt pas uit de volgende `status.json`.
|
|
|
|
**Geraakt:** `index.html.template`, `nginx.conf.template`, `docker-compose.yml`, en de plannen
|
|
Webinterface en Configuratie.
|
|
**Tests:** geen suite. In de lokale render gecontroleerd dat de lijst vier certificaten toont met het
|
|
verlopen exemplaar als zodanig, dat het actieve aangevinkt staat, en dat de knop pas aangaat bij een
|
|
andere keuze. **Het wegschrijven zelf is niet geprobeerd**, want daar is de Umbrel voor nodig.
|
|
|
|
## 19-08-2026 - dashboard uitgedund na de eerste blik
|
|
|
|
De gebruiker heeft de pagina bekeken en er drie dingen af gehaald: de grafiek blokken per uur, de tegel
|
|
blokken laatste uur, en het kader over Tor tegenover TLS. De eerste twee beantwoorden een vraag over de
|
|
Electrum-server en niet over deze proxy; de derde is positionering en hoort in de winkelbeschrijving,
|
|
waar iemand nog staat te kiezen. Er blijven drie tegels over. `history` in `status.json` hoeft daardoor
|
|
alleen nog de reactietijd te bewaren.
|
|
|
|
De badge bij de Electrum-server zei `answering`, en op de vraag wat dat betekende was er geen goed
|
|
antwoord: het liet in het midden of dat nú gold of ooit. Hij noemt nu de meting en het moment, dus
|
|
`answered 2 minutes ago`, `no answer 2 minutes ago` of `not checked yet`.
|
|
|
|
De activiteitenkaart is omgebouwd tot logregels onder elkaar in monospace, nieuwste bovenaan. Daarbij
|
|
hoort een grens die op de pagina zelf staat: een regel per protocolaanroep kan niet, want die verzoeken
|
|
zitten in de versleutelde verbinding en ze tellen zou betekenen dat de app het verkeer van de gebruiker
|
|
uitleest.
|
|
|
|
Kopieerknoppen in een lijstregel verschijnen nu bij hover. Met `opacity` en niet met `display`, zodat ze
|
|
met de tab-toets bereikbaar blijven; op aanraakschermen staan ze altijd aan.
|
|
|
|
**Geraakt:** `whatsnext-electrum-gate/index.html.template` en de plannen.
|
|
**Tests:** geen suite. In de lokale render gecontroleerd: drie tegels, zestien logregels, geen
|
|
console-fouten, blokkengrafiek en Tor-kader weg.
|
|
|
|
## 19-08-2026 - plan werd actief, en de pagina is herbouwd
|
|
|
|
Gepromoveerd vanuit `Plannen/Masterplannen/` omdat het werk begon. De oude pagina beweerde `Online` als
|
|
platte tekst in de HTML, had een verzonnen logvenster en noemde een hardgecodeerd domein. Die is
|
|
vervangen door een pagina die alles uit `status.json` haalt en elk veld dat hij niet kent zichtbaar op
|
|
`unknown` laat staan.
|
|
|
|
Twee dingen die het ontwerp veranderd hebben ten opzichte van het masterplan. De pagina is verhuisd van
|
|
`web/index.html` naar `index.html.template` in de app-root: umbreld ververst bij een update alleen een
|
|
whitelist, dus onder `web/` zou elke latere wijziging stilzwijgend niet aankomen en een herinstallatie
|
|
kosten. En doordat de pagina niets meer hardgecodeerd heeft, is de afhankelijkheid van **Configuratie**
|
|
vervallen; dat deel van Configuratie fase 2 is hiermee meteen af.
|
|
|
|
Op verzoek van de gebruiker zijn er drie dingen bijgekomen: verbindingsregels per client met een
|
|
kopieerknop (uit `Referenties/Clients.md` §4), een korte eerlijke uitleg over Tor tegenover TLS, en een
|
|
kaart voor wallet-activiteit die nu op `no data` staat zodat de vorm beoordeeld kan worden voordat er
|
|
iets voor gebouwd wordt. Dat laatste is een herziening van het niet-doel "live logs", en de grens ligt
|
|
bij een samenvatting per sessie zonder client-IP.
|
|
|
|
**Geraakt:** `whatsnext-electrum-gate/index.html.template` (was `web/index.html`),
|
|
`nginx.conf.template`, `docker-compose.yml`, `umbrel-app.yml`.
|
|
**Tests:** dit project heeft geen suite. Handmatig gecontroleerd in een lokale render met een
|
|
voorbeeld-`status.json`: beide thema's, alle kaarten, geen console-fouten.
|
|
**Nog niet geverifieerd:** alles wat een echte `status.json` vraagt, want die wordt nog niet geschreven
|
|
(fase 2). De kopieerknop is niet achter de app-proxy van umbrelOS geprobeerd, en dat is juist het pad
|
|
waar de terugval voor http gebruikt wordt.
|