Files
UmbrelApps/Docs/CHANGELOG-electrum-gate.md
T
HarmenandClaude Opus 5 67ed9b603b Eén app store, twee apps
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>
2026-08-25 16:27:57 +02:00

406 lines
25 KiB
Markdown

# Changelog
Alle belangrijke wijzigingen aan dit project worden hier vastgelegd. Het formaat volgt
[Keep a Changelog](https://keepachangelog.com/nl/1.0.0/) en het project volgt
[Semantic Versioning](https://semver.org/lang/nl/).
Wat er nog moet gebeuren staat **niet** hier maar in de plannen; zie [CONTINUE_HERE.md](CONTINUE_HERE.md).
Een lijst met geplande features op twee plekken loopt uit elkaar, en dan is geen van beide meer te
vertrouwen.
## [0.0.14] - 2026-08-20
### Added
- **`probe` naast `refused` in het activiteitenlog.** Aanleiding was een vraag van de gebruiker over een
regel `refused ... status 500` met nul bytes: dat is een TLS-handdruk die niet is afgemaakt, en op een
poort die in de router doorgestuurd staat vrijwel altijd een scanner. Elke scan gaf dus een rode regel die
suggereerde dat de app iets geweigerd had, terwijl er niets gebeurd was.
**Het onderscheid ligt bij de bytes, niet bij de duur of de status.** Nul in beide richtingen betekent dat
er nooit iets doorgegeven is; die tellers gaan over de doorgegeven verbinding en niet over de handdruk, wat
af te lezen was aan de sessies van de gebruiker. 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. Rood
blijft dus voor `refused`, en dat is nu het geval waar je iets aan moet doen.
De notitie bij een probe blijft feitelijk ("nothing exchanged, status 500") en beweert niet dat het de
handdruk was; bij status 500 is dat de bijna zekere oorzaak, en bijna is hier niet genoeg. De bytes worden
bij nul weggelaten, want "0 B from wallet" naast die notitie is dubbelop en "wallet" is dan ook het
verkeerde woord.
### Changed
- **Meer ruimte tussen de kaders**, van 1 naar 1,5rem, op verzoek van de gebruiker. De kaders hebben 1,8rem
ruimte binnenin en een radius van 28 pixels; met 1rem ertussen was de ruimte tússen twee kaders kleiner
dan die erbinnen, en dan plakken ze aan elkaar.
## [0.0.13] - 2026-08-20
### Fixed
- **De twee kaders van die rij groeien en krimpen nu samen.** Dit was de echte oorzaak van het hoogteprobleem
dat 0.0.12 alleen kleiner maakte: het logblok stond op `flex: 1 1 auto`, en met basis `auto` telt zijn
inhoud mee voor de natuurlijke hoogte van zijn kader. Een log met tien regels duwde de rij dus hoger dan
het certificaatkader nodig had, en dat kwam aan de andere kant terug als leegte onder de knop, precies de
leegte die verdween als je het uploadblok uitklapte.
Nu `flex: 1 1 0`: het logblok draagt niets bij aan die natuurlijke hoogte, het certificaatkader bepaalt de
rij, en uitklappen laat beide kaders meegroeien. Wat er niet in past scrolt in het logblok, en daar is een
log voor. De `max-height` van 620 pixels kon eruit, want de rij is nu begrensd door het kader ernaast.
**Op één kolom geldt het omgekeerde** en daar staat het log op zijn eigen hoogte, met een plafond van 60%
van het venster: er staat dan geen kader naast om de hoogte van te lenen, en een etmaal aan regels zou
anders één lange pagina worden.
## [0.0.12] - 2026-08-20
### Changed
- **Het certificaatkader en het activiteitenlog zijn minder hoog.** Gevraagd door de gebruiker. Het
mechanisme erachter is het opschrijven waard: de twee kaders staan in één rij met `align-items: stretch`,
dus het hoogste bepaalt de hoogte. Het certificaatkader is dat, en alles wat daar aan ruimte overbleef
kwam als leegte terug ónder het log ernaast. Krappere marges rond de keuzekop en de knop, minder ruimte om
het uploadblok, en de bodem van het logblok van 180 naar 150 pixels.
- **De regel over Nginx Proxy Manager is eruit.** Die stond er als bron van certificaten, terwijl die mount
nog uitgecommentarieerd in de compose staat omdat het pad niet geverifieerd is; wat er stond kón dus niet
waar zijn. De uitleg is nu één regel, en waar een certificaat vandaan komt staat toch al in de optie zelf.
## [0.0.11] - 2026-08-20
### Fixed
- **De kopieerknoppen staan op een telefoon weer op één lijn.** Regressie van 0.0.10: door het omvouwen
volgde de knop de tekst, en het ene adres is langer dan het andere. Nu `margin-left: auto` op de knop, en
bewust niet `space-between` op de rij: bij de gesplitste weergave staat er ook een notitie naast de
waarde, en die hoort daar tegenaan te blijven staan.
### Changed
- **De winkeltekst zegt nu wat er níet in het pad zit.** De gebruiker merkte op dat het vermijden van
tunneldiensten en VPN-producten bij hem juist de aanleiding voor deze opstelling is, en dat dat goed is
voor de marketing. Dat is ook het scherpere argument: een tunneldienst termineert je verkeer onderweg en
een mesh-VPN vraagt een account plus een client op elk apparaat, terwijl deze app geen van beide vraagt.
Eén alinea in `description`, met de doorgestuurde poort erbij als wat het wél vraagt. Zie
[Vergelijkbare-apps.md](Referenties/Vergelijkbare-apps.md), waar ook de Engelse formulering staat voor
hergebruik in de PR bij inlevering.
- **Het uploadblok staat nu boven de keuzelijst**, tussen de rij "Last reload" en de kop "Choose a
certificate". Voorgesteld door de gebruiker om een horizontale lijn uit te sparen: de lijstregel erboven
trekt er al een, dus het blok heeft geen eigen `border-top` meer nodig. Het is bovendien de logische
volgorde, want wat je uploadt komt in die keuzelijst terecht: eerst toevoegen, dan kiezen.
### Bevestigd
- **`0.0.10` na `0.0.9` levert een update op.** Nagekeken op de Umbrel toen de melding gewoon verscheen.
Daarmee is de aanname uit 0.0.10 bevestigd en een tekstvergelijking met groter-dan uitgesloten;
tweecijferige versiedelen zijn dus veilig. Vastgelegd in
[Umbrel-appstore-spec.md](Referenties/Umbrel-appstore-spec.md).
- **De mobiele weergave werkt**, gecontroleerd op een telefoon door de gebruiker. Daarmee is 0.0.10
geverifieerd op het enige punt dat niet te toetsen was.
## [0.0.10] - 2026-08-20
### Fixed
- **Op een telefoon liep de pagina buiten beeld.** Gemeld door de gebruiker. De directe oorzaak was
`minmax(420px, 1fr)` op de clientlijst: dat eist een track van minstens 420 pixels, ook op een scherm dat
smaller is, dus liep de hele lijst met kopieerknoppen eruit. Nu `minmax(min(420px, 100%), 1fr)`, waarmee
de track tot de schermbreedte mag krimpen.
- **De lijstregels en de logregels vouwen onder 700 pixels om.** Wat op een brede kaart rechts staat, komt
daar onder de titel te staan. Voor de logregels is dat een herziening van een eerdere keuze: die scrollen
liever dan dat ze afkappen, en dat blijft zo op een breed scherm, maar op een telefoon betekende het dat
je de bytes nooit zag. `overflow-wrap: anywhere` erbij, want `host:poort:protocol` heeft geen spatie en
kan nergens afbreken.
### Changed
- **De tegel met het aantal dagen tot het certificaat verloopt is eruit**, op verzoek van de gebruiker. De
kaart Certificate zegt hetzelfde en noemt de datum, en onder de dertig dagen staat er een melding
bovenaan de pagina. **Backend response** neemt de vrijgekomen ruimte en is nu twee kolommen breed; dat is
het enige op die rij dat met breedte iets doet, want daar hangt de sparkline in.
Over het nummer: **0.0.10 en niet 0.1.0**. Dat is alleen een risico als umbreld versies als tekst zou
vergelijken, want dan is `0.0.10` kleiner dan `0.0.9`. Elke app in de officiële store gaat ooit van `.9`
naar `.10`, dus dat zou daar overal stuklopen; de aanname is dat het een gelijkheids- of semver-vergelijking
is. Blijft de update-melding weg, dan is dít de plek om te kijken.
## [0.0.9] - 2026-08-20
### Changed
- **Alles wat de app schrijft staat onder `data/`.** `${APP_DATA_DIR}/runtime` en `.../certs` zijn
`${APP_DATA_DIR}/data/runtime` en `.../data/certs` geworden. Gevraagd door de gebruiker met het oog op
publicatie in de officiële appstore, en de packaging-documentatie van umbrel zegt het woordelijk:
gebruikersstaat, config, uploads en gegenereerde geheimen horen onder `${APP_DATA_DIR}/data/...`, met
een `.gitkeep` in de repo voor elke map die bij de eerste start moet bestaan. Die twee `.gitkeep`s staan
er nu.
**Dit vraagt opnieuw kiezen, of opnieuw installeren.** Bij een update kijkt de app niet meer in de oude
map, dus zelf geüploade certificaten en de gemaakte keuze zijn weg. Certificaten uit Zoraxy niet.
### Added
- **`backupIgnore`** in het manifest, voor `data/runtime/stream.log` en `data/runtime/status.json`. Die
twee groeien of veranderen elke minuut en zijn nergens voor nodig in een back-up. Wat er bewust **niet**
in staat is `data/runtime/config`: daar zit de certificaatkeuze, en dat is het enige in die map dat niet
opnieuw te bedenken is. Paden zijn relatief aan de app-datamap; nagekeken in `app.ts` van umbreld.
- Een toets die deze conventie vasthoudt. Bij de volgende mount die iemand toevoegt is dit precies het
detail dat je vergeet, en er gaat niets van stuk; het valt pas op bij het inleveren.
### Het manifest op orde, zonder eigen versienummer
Later diezelfde dag, en met opzet **geen** verhoging naar 0.0.10: de winkeltekst leest umbrelOS uit de
repo-kloon, dus dit is zichtbaar zonder update, en aan de app verandert niets.
- **De velden staan in de voorgeschreven volgorde.** Die is geen smaak; de packaging-documentatie van de
officiële store schrijft hem voor. Wat de spec niet noemt (`icon`, `backupIgnore`) staat nu áchter die
reeks, zodat de kop van het bestand letterlijk op orde is en er bij inlevering alleen iets weg hoeft.
`icon` staat als laatste, want dat is precies de regel die dan verdwijnt.
- **`defaultUsername` en `defaultPassword` zijn eruit.** Ze stonden er leeg in. Deze app heeft geen eigen
inlog, de app_proxy van umbrelOS zet er zijn eigen voor, en een leeg veld suggereert dat er iets te
vullen valt.
- **De release notes zijn opgeschoond, en dat was een echte fout.** Drie versies achter elkaar kwam er een
nieuwe kop bovenop terwijl de oude tekst eronder bleef staan: er stond drie keer "Earlier releases" en
twee keer dezelfde regel over 0.0.4. Nu is het één verhaal over deze versie en één regel per eerdere
versie. Een toets let erop, want niemand leest zijn eigen release notes nog een keer na.
- De beschrijving noemt nu ook dat je een eigen certificaat kunt uploaden. Dat kan sinds 0.0.7 en stond
nog niet in de winkeltekst.
## [0.0.8] - 2026-08-20
### Changed
- **De pagina draagt dezelfde tagline als de appstore.** Er stond "TLS in front of your own Electrum
server", en dat was de achterblijver van de oude naam: bij het hernoemen naar Electrum Gate op
19-08-2026 was de reden juist dat de tekst over de opbrengst gaat en niet over TLS als middel. Die
maatstaf gold nog niet voor deze regel. Beslist door de gebruiker, die het verschil opmerkte.
`tests/test_server_start_zonder_certificaat.py` houdt de twee plekken nu gelijk, want niemand die het
manifest aanpast opent daarna de pagina.
## [0.0.7] - 2026-08-20
### Added
- **Een certificaat uploaden via de pagina**, open punt 6 van het plan **Webinterface**. De bron
`Own folder` bestond al, maar `${APP_DATA_DIR}/certs` is zonder SSH niet te bereiken, dus die bron was
alleen bruikbaar voor wie de shell op durft. Dat was de helft van de reden dat hij bestaat.
Wat er onder de motorkap voor nodig was, in vier stukken:
- de mount `${APP_DATA_DIR}/certs` is bij de **agent** beschrijfbaar geworden. Bij nginx blijft hij
alleen-lezen: die hoeft er nooit iets neer te zetten;
- `GATE_UPLOAD_DIR` zegt welke map dat is. Expliciet en niet afgeleid uit `GATE_CERT_SOURCES`, want
welke bron beschrijfbaar is hoort naast de mount te staan die dat toestaat. Leeg zetten schakelt
uploaden uit;
- een eigen `location` in nginx met een limiet van 96k, want een sleutel plus keten haalt de 1k van
`/api/` ruim. Een exacte match, dus die grotere limiet geldt nergens anders;
- **de validatie, en dat is het eigenlijke werk.** Het paar gaat eerst onder een `.tmp`-naam naar de
doelmap en wordt daar door `ssl.SSLContext.load_cert_chain` geopend. Dat is dezelfde OpenSSL die nginx
straks gebruikt, dus wat hier doorkomt komt daar ook door. Zonder die controle levert een verkeerde
sleutel een nginx die niet meer herlaadt, en dat is dezelfde klasse storing als waardoor 0.0.3
helemaal niet startte. Geweigerd worden verder: rommel in plaats van PEM, een versleutelde sleutel,
een verlopen certificaat, en een certificaat zonder hostnaam.
**De bestandsnaam komt uit het certificaat zelf** en niet uit het verzoek. Dat is geen detail: een naam
die van buiten komt moet je tegen padtrucs verdedigen, een naam die je uit het certificaat leest niet.
Een hostnaam met `../` erin wordt een platte naam en kan de doelmap niet uit.
**Uploaden kiest niet.** De nieuwe komt voorgeselecteerd in de lijst en de gebruiker drukt op dezelfde
knop als altijd, zodat er precies één plek blijft waar TLS van certificaat wisselt.
### Changed
- **Het app-icoon in de kop**, groter, in plaats van het generieke schildje. De pagina valt terug op dat
schildje als de mount er niet is, want een gebroken-afbeeldingicoon in de kop is erger dan een generiek
merkje. Ook als favicon voor het tabblad.
- **De badges in de hoek van de kaders zijn eruit**, op verzoek van de gebruiker. Bij de Electrum-server
stond dezelfde meting twee keer in één kader ("answered 7 seconds ago" naast de rij "Last checked"), en
bij het activiteitenlog is het log zelf genoeg. Wat er niet verloren gaat is het slechte geval: een
backend die niet antwoordt geeft nog steeds de rode melding bovenaan.
- **"your choice" staat niet meer achter het actieve certificaat.** De gebruiker merkte op dat het altijd
zijn keuze is. Het redenveld blijft voor de gevallen die niet vanzelf spreken, zoals een app die niets
koos of er zelf een pakte.
- **Een wallet die al verbonden was levert nu ook een `connected`-regel op.** De teller vergeleek met het
vorige aantal en zweeg dus over een verbinding die er al hing voor de agent begon, en dat is precies het
geval waarin iemand op de pagina komt kijken.
- **Trezor Suite staat niet meer als "desktop only".** De gebruiker heeft het op iOS nagekeken en de
instelling zit er wel; de documentatie van Trezor sprak zichzelf tegen en had het mis. Zie
[Clients.md](Referenties/Clients.md) §3.
## [0.0.6] - 2026-08-20
### Added
- **Een verbindingsteller, dus de pagina laat zien dat er nú een wallet verbonden is.** Dit was het open
punt uit §4e van het plan **Webinterface**: nginx `stream` schrijft zijn logregel pas bij het sluiten van
een sessie, en een wallet houdt zijn verbinding uren open. Een werkende opstelling zag er daardoor uit
als een stille. Het antwoord is `/proc/net/tcp`, geteld door de achtergrondlus van de nginx-container,
want die geldt per netwerk-namespace en de agent zit in een andere. Het aantal komt via een bestand in
`status.json`, net als bij de herlaadvlag, en de agent zet er een `connected`-regel bij als er één
bijkomt. Alleen het aantal: geen adres en geen bronpoort, net als in het log_format.
### Changed
- **De certificaatkeuze is een dropdown.** Op verzoek van de gebruiker: met veertien certificaten op de
machine was de lijst met keuzerondjes het drukste onderdeel van de pagina, voor iets wat je één keer
doet. Alles staat nu in de tekst van de optie, inclusief "expired" en "in use", want opmaak binnen een
option verschilt per browser. De keuzeknop eronder blijft.
- **Een keuze overleeft een verversing.** De oude lijst zette zichzelf elke ronde terug op wat er in
gebruik was, dus een keuze die je net gemaakt had verdween binnen tien seconden.
- **`disconnected` heet nu `session ended`, en de details zeggen wat ze betekenen.** De gebruiker vroeg
wat die regel betekende, en dat was terecht: er stond een tijd, een duur en twee aantallen bytes, en
niets zei dat de tijd het einde is en de duur teruggaat. Ook "up" en "down" zijn eruit; er staat nu bij
wie er stuurt.
- **Blockstream Green heet nu Blockstream** in de clientlijst en in de winkelbeschrijving; de app is
omgedoopt. Gemeld door de gebruiker. De historische entries hieronder houden hun oude naam.
- **Vijf stukken tekst eruit**, alle vijf op verzoek van de gebruiker: de voetnoot onder het
activiteitenlog, de regel "only ever read, never requested by this app" bij Certificate, de stip voor de
badges, de zin dat apps op de Umbrel zelf deze gateway niet nodig hebben, en de uitleg dat de ene wallet
één regel wil en de andere twee velden. Wat overblijft bij de verbindingsregels is de SSL-instructie en
de waarschuwing over een afwijkende externe poort.
### Niet gebouwd, met opzet
- **De `traffic`-regel uit de §4e-tabel.** Bytes van een lopende sessie zijn binnen de container niet af
te lezen: `/proc/net/tcp` heeft geen tellers en de interfacetellers van de container zitten vol met
dashboard- en backendverkeer. Het zou dus een schatting worden die als meting leest. De sessieregel bij
het sluiten geeft de echte aantallen, en de teller geeft de aanwezigheid.
## [0.0.5] - 2026-08-20
### Changed
- **De reden bij meerdere kandidaten noemt het aantal, niet de namen.** Op de Umbrel van de gebruiker
vond de agent veertien certificaten, en de melding somde ze alle veertien op. Dat is een muur tekst die
zegt wat de keuzelijst eronder al toont, en die lijst is waar je klikt. Het aantal blijft erin, want dat
verklaart waarom de app niets koos. De weigering zelf verandert niet: bij twijfel kiest de app niet.
## [0.0.4] - 2026-08-20
### Fixed
- **De app kwam niet omhoog zonder certificaat, en dat was een klem.** Het stream-blok met
`listen 50022 ssl` stond in `nginx.conf.template` en includeerde de `cert.conf` van de agent. nginx
weigert te starten als dat certificaat er niet is, dus startte ook de web-UI niet, en de web-UI is
precies waar je een certificaat kiest. Wie geen reverse proxy draait, of twee kandidaten heeft, zag
daardoor niets en had geen weg vooruit. Aangetroffen bij de eerste echte installatie van 0.0.3; de
logregels wezen ergens anders heen, want de app_proxy meldde alleen dat de server niet te bereiken was.
De reparatie: het stream-blok staat nu in `stream.conf.template`, en het `command`-blok van de compose
legt het in `/var/lib/gate/tls/` zodra `cert.conf` bestaat. `nginx.conf` haalt die map op met een
jokerteken, en een jokerteken dat niets matcht is voor nginx geen fout. Geen certificaat betekent dus
geen poort 50022, maar wel een pagina die vertelt waarom en waaruit je kunt kiezen. Een keuze zet de
poort erbij met een herlading, zonder herstart.
- **Een mislukte herlading brak de herlaadlus af.** Die lus draait onder `set -e`, dus een certificaat dat
nginx niet aanneemt liet hem verdwijnen. Daarna werd geen enkele latere wijziging meer opgepikt, zonder
dat er iets te zien was.
### Added
- **`tests/test_server_start_zonder_certificaat.py`**, dat de bovenstaande reparatie vastlegt. Het stream-
blok "netjes" terugzetten in `nginx.conf` brengt de klem terug, en geen van de bestaande toetsen zou dat
merken.
## [0.0.3] - 2026-08-19
**De nummering begint opnieuw, onder 1.0.** Besloten door de gebruiker bij het opnieuw installeren van de
app. De oude nummers, `1.0.0` en daarna `2.0.0` en `2.0.1`, beweerden een rijpheid die er niet was: het
ging om één met de hand neergezette installatie op één machine. Het project gaat naar `1.0.0` wanneer het
dat verdiend heeft.
Twee dingen die daarbij horen, zodat dit later niet als een fout leest:
- **de oude entries blijven staan onder hun oude nummer.** Er wordt niets met terugwerkende kracht
omgenummerd; dat zou de commit-historie en deze changelog uit elkaar laten lopen. `0.0.1` en `0.0.2` zijn
dus nooit onder die naam uitgeleverd. De `3` is te lezen als "de derde opzet": met de hand neergezet, toen
een echte Umbrel-app, en nu deze;
- **een stap terug in het nummer is eenmalig en veilig**, want dit is een nieuwe app-id zonder
geïnstalleerde voorganger en de gebruiker deïnstalleert de oude app. Vanaf hier moet het nummer altijd
omhoog: de spec zegt alleen dat umbreld "de versie vergelijkt", niet of dat een ongelijkheid of een
semver-groter-dan is, dus op een omlaaggaand nummer valt niet te bouwen.
### Changed
- **De app heet Electrum Gate**, met store-id `whatsnext` en app-id `whatsnext-electrum-gate`. De oude naam
beschreef het middel (TLS) en niet wat je ermee kunt. Voor umbrelOS is dit een andere app, dus het vraagt
een verwijdering en een herinstallatie.
- **De TLS-poort is 50022** in plaats van 50002. Fulcrum bezet 50002 op de host, en met Fulcrum als backend
zou de container niet starten; dat is precies het omschakelen dat deze app moet ondersteunen. **Dit vraagt
eenmalig een andere doorstuurregel in de router.**
- **De web-UI is herbouwd** op het design-systeem, in het Engels, en haalt alles uit `status.json`. De oude
pagina zette `Online` als platte tekst in de HTML en had een verzonnen logvenster; hij loog dus precies op
het moment dat je hem raadpleegt.
- **Het domein en het certificaatpad staan niet meer in de app.** Ze zijn uit `docker-compose.yml` en
`nginx.conf.template` verdwenen: de agent bepaalt ze en schrijft een `cert.conf` die nginx includeert.
- De teksten in `umbrel-app.yml` gaan nu over de afweging tussen Tor en snelheid, en over voor welke
wallets dit nuttig is, in plaats van over TLS als middel.
### Added
- **Een `agent`-container** op `python:3-alpine` die `status.json` schrijft, de certificaatmappen scant, de
Electrum-server bevraagt en de certificaatkeuze aanneemt. Geen eigen image, dus geen bouwstap en geen
registry. Hij herlaadt nginx niet zelf, want dat zou de Docker-socket vragen; hij zet een vlagbestand neer
en de nginx-container herlaadt zichzelf.
- **Certificaatkeuze op het dashboard**, uit de mappen van Zoraxy of een eigen map. Bij meer dan één
kandidaat zonder keuze weigert de app en noemt hij de kandidaten, in plaats van te gokken: een verkeerd
certificaat geeft een verbinding die het lijkt te doen en pas bij de wallet stukloopt op naamverificatie.
- **Verbindingsregels per client** met een kopieerknop, voor Trezor Suite, Electrum, Sparrow, BlueWallet,
Nunchuk, Blockstream Green en BitBoxApp.
- **Een activiteitenlog** met een regel per sessie. Zonder client-adres en zonder bronpoort, en zonder regel
per protocolaanroep: die zitten in de versleutelde verbinding en ze uitlezen zou precies het verkeer
aantasten waarvoor deze app bestaat.
- **De eerste tests van dit project**, in `tests/`. Ze toetsen de X.509-lezer van de agent tegen `ssl` op
echte certificaten, en de guards rond de certificaatkeuze. Hoe je ze draait staat in `CLAUDE.md`.
- Documentatie ondergebracht in `Docs/` volgens de HomeGit-methode. `ARCHITECTURE.md`, `STRUCTURE.md` en
`QUICKSTART.md` uit de repo-root zijn opgegaan in `Docs/Referenties/Architectuur-huidig.md`; ze
beschreven grotendeels hetzelfde in drie versies.
- `Docs/Referenties/Umbrel-appstore-spec.md`: wat umbrelOS van een community app store verwacht, met
bronvermelding per feit. Belangrijkste vondsten: umbreld doet géén hostnaamcontrole op de store-URL,
dus een eigen Gitea kan de store zijn, mits publiek en over HTTPS; en wisselen tussen Electrs, Fulcrum
en ElectrumX vraagt geen eigen mechanisme, want die aliassen zichzelf naar `APP_ELECTRS_*`.
- `Docs/Referenties/Clients.md`: welke wallets naar een eigen Electrum-server kunnen wijzen, en wanneer Tor
de betere keuze is.
### Niet geverifieerd
Hoort erbij, want dit is een release-entry en niet een plan. **De agent heeft bij het uitbrengen van deze
versie nog nooit op de Umbrel gedraaid.** Wat er getoetst is, is de X.509-lezer en de keuze-guards, met
unittests. De certificaatscan op een echte Zoraxy-map, de Electrum-vraag, het herladen via de vlag en de
keuze via de API zijn ongetest in bedrijf.
## [2.0.1] en [2.0.0] - 2026-08-18
Uitgeleverd onder de oude naam en de oude nummering; zie de noot bij `0.0.3`. Nooit als entry in deze
changelog opgenomen, en dat wordt hier alleen vastgelegd zodat de reeks niet met een gat begint.
- **2.0.0:** herbouwd als echte Umbrel-app in een eigen community app store, met nginx en de
`stream`-module in plaats van stunnel. Daarmee vervielen de installatie bij het starten, de losse
certificaatmonitor en de mount van de Docker-socket. Fulcrum en ElectrumX werken sindsdien als backend.
- **2.0.1:** de wallet-verbinding lag er na ongeveer tien minuten uit. `proxy_timeout` staat bij nginx
standaard op tien minuten en verbrak een stille verbinding; stunnel hanteerde twaalf uur, en dat verschil
was bij de overstap over het hoofd gezien. Op 19-08-2026 bevestigd dat de verbinding de nacht doorstond.
## [1.0.0] - 2024-01-15
Eerste werkende opzet, met de hand op de Umbrel neergezet.
### Added
- SSL/TLS-terminatie via stunnel voor Electrum-verbindingen, op poort 50002.
- Certificaatmonitor die elke vijf minuten de mtime van het Zoraxy-certificaat vergelijkt en stunnel
herstart bij een wijziging.
- Read-only mount van de Zoraxy-certificaten.
- Statuspagina op nginx.
- `install.sh` en `uninstall.sh` voor installatie op de Umbrel.
- Documentatie: README, ARCHITECTURE, QUICKSTART, STRUCTURE.
---
**Noot bij de 1.0.0-entry, toegevoegd 18-08-2026.** Deze entry is ingekort. De oorspronkelijke versie
noemde onder meer "TLS 1.2+ enforcement", "geen root-rechten in containers" en "minimale
Docker-socket-rechten" als geleverde beveiligingskenmerken. Die claims houden geen stand: de
stunnel-configuratie legt geen minimale TLS-versie vast, de containers draaien als root, en een
read-only mount van de Docker-socket beperkt niets, want wie de socket kan lezen kan containers starten
en is daarmee root op de host. Ze zijn geschrapt in plaats van bijgesteld, omdat een changelog-entry
beschrijft wat er geleverd is en dit niet geleverd is. De onderliggende punten zijn opgenomen in het plan
**Appstore**.