From 5ee21b10e7feba027199dd6438b05e2685711c25 Mon Sep 17 00:00:00 2001 From: Harmen Date: Mon, 31 Aug 2026 12:14:37 +0200 Subject: [PATCH] Gate 0.0.27: de statuskaart loog na elke herstart. Relay 0.5.4: Status naar rechts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit De melding van de gebruiker was "Not answering" met [Errno 111] Connection refused, terwijl de gateway van buiten gewoon werkte. Het was een startvolgorde en geen storing: 1. de compose laat `server` ná de agent starten (depends_on: [agent]), want nginx lost http://agent:8000 bij het starten op en breekt af op een onbekende naam; 2. build_status draait meteen bij het opstarten, vóór de eerste WAKE.wait; 3. de branch die de meting uitstelt hing alleen aan `reloaded`, en die is bij een herstart met een ongewijzigd certificaat False, dus er werd gemeten; 4. nginx luisterde toen nog niet op 50022; 5. en het bleef staan, want de volgende meting kwam pas na SELF_CHECK_INTERVAL. Twee reparaties, elk voor een helft. De eerste ronde van een proces meet niet maar zet `pending` (die toestand heeft geen `at`, dus de ronde daarna meet gewoon), en na een mislukking wordt er na GATE_SELF_CHECK_RETRY (60s) opnieuw gemeten in plaats van na 300. Een geslaagde meting blijft op 300, want dat is de waarde die zelden verandert en die het activiteitenlog belast. De fout zat er sinds de zelfcontrole bestaat (27-08-2026) en was alleen binnen vijf minuten na een herstart te zien. Mutatie-getest: de eerste-rondebranch uitschakelen laat twee tests omvallen, de snelle herhaling uitschakelen precies één. Relay: de statuswidget staat nu rechts in de bovenste rij en heet Status in plaats van Relay, gelijk aan Electrum Gate. De twee pagina's zijn één app store en horen op dezelfde manier te lezen, en dit is de widget die als enige begrijpelijk is zonder buur. De id's relay-state en relay-sub blijven. Suite groen: 54 + 28 + 65 + 39 + 43 + 22 + 115. Co-Authored-By: Claude Opus 5 --- Docs/CHANGELOG-electrum-gate.md | 26 ++++++ Docs/CHANGELOG-evolu-relay.md | 13 +++ Docs/CONTINUE_HERE.md | 4 +- tests/test_agent_zelfcontrole.py | 102 ++++++++++++++++++++++ whatsnext-electrum-gate/agent.py.template | 53 ++++++++++- whatsnext-electrum-gate/umbrel-app.yml | 15 +++- whatsnext-evolu-relay/index.html.template | 25 ++++-- whatsnext-evolu-relay/umbrel-app.yml | 11 ++- 8 files changed, 234 insertions(+), 15 deletions(-) diff --git a/Docs/CHANGELOG-electrum-gate.md b/Docs/CHANGELOG-electrum-gate.md index ab0d204..231645a 100644 --- a/Docs/CHANGELOG-electrum-gate.md +++ b/Docs/CHANGELOG-electrum-gate.md @@ -8,6 +8,32 @@ Wat er nog moet gebeuren staat **niet** hier maar in de plannen; zie [CONTINUE_H Een lijst met geplande features op twee plekken loopt uit elkaar, en dan is geen van beide meer te vertrouwen. +## [0.0.27] - 2026-08-31 + +### Fixed + +- **Na elke herstart of update las de statuskaart vijf minuten lang "Not answering"** met + `[Errno 111] Connection refused` eronder, terwijl de gateway van buiten gewoon werkte. Gemeld door + de gebruiker. Het was een startvolgorde en geen storing, en de keten is de moeite van het + onthouden waard: + + 1. de compose laat `server` ná de agent starten (`depends_on: [agent]`, want nginx lost + `http://agent:8000` bij het starten op en breekt af op een onbekende naam); + 2. `build_status` draait meteen bij het opstarten, vóór de eerste `WAKE.wait`; + 3. de branch die de meting uitstelt hing alleen aan `reloaded`, en die is bij een herstart met een + ongewijzigd certificaat `False`. Er werd dus gemeten; + 4. nginx luisterde toen nog niet op 50022, dus `ECONNREFUSED`; + 5. en dat bleef staan, want de volgende meting kwam pas na `SELF_CHECK_INTERVAL`. + + Twee reparaties, elk voor een helft. **De eerste ronde van een proces meet niet** maar zet + `pending`, zodat de kaart "Checking" toont in plaats van een onwaarheid; die toestand heeft geen + `at`, dus de ronde daarna meet gewoon. En **na een mislukking wordt er na + `GATE_SELF_CHECK_RETRY` (60 seconden) opnieuw gemeten** in plaats van na 300. Een geslaagde meting + blijft op 300, want dat is de waarde die zelden verandert en die het activiteitenlog belast. + + Deze fout zat er sinds de zelfcontrole bestaat (27-08-2026); je moest er binnen vijf minuten na een + herstart naar kijken om hem te zien. Vastgelegd in `tests/test_agent_zelfcontrole.py`, mutatie-getest. + ## [0.0.26] - 2026-08-31 ### Changed diff --git a/Docs/CHANGELOG-evolu-relay.md b/Docs/CHANGELOG-evolu-relay.md index 6ba5818..9c1c47f 100644 --- a/Docs/CHANGELOG-evolu-relay.md +++ b/Docs/CHANGELOG-evolu-relay.md @@ -19,6 +19,19 @@ De regel is: **verhoog je `VERSION`, dan verhoog je ook het manifest; andersom n > geschreven uit de `releaseNotes` in het manifest en uit `PROGRESS.md` van het plan **Umbrelapp**. Ze zijn > daarom korter dan de rest. +## 0.5.4 - 31-08-2026 + +**Alleen de pagina, dus geen nieuwe image.** + +De statuswidget staat nu **rechts** in de bovenste rij in plaats van links, en heet **Status** in +plaats van **Relay** (keuze gebruiker). Gelijk aan Electrum Gate, en dat is de reden: de twee +pagina's zijn één app store en horen op dezelfde manier te lezen. Het is bovendien de widget die als +enige begrijpelijk is zonder buur, dus hij is de juiste om alleen op een regel te belanden als het +scherm versmalt. + +De id's `relay-state` en `relay-sub` blijven zoals ze zijn: dat is nog steeds waar de waarde vandaan +komt, en hernoemen zou alleen het JavaScript raken zonder dat iemand er iets aan heeft. + ## 0.5.3 - 31-08-2026 **Alleen de pagina, dus geen nieuwe image.** `VERSION` in `tools/evolu-relay/build.sh` blijft op 0.5.0. diff --git a/Docs/CONTINUE_HERE.md b/Docs/CONTINUE_HERE.md index 72a33e1..6be2d87 100644 --- a/Docs/CONTINUE_HERE.md +++ b/Docs/CONTINUE_HERE.md @@ -29,9 +29,9 @@ | Plan | App | Volgende stap | Status | |-|-|-|-| -| [Umbrelapp](Plannen/Actief/008-Umbrelapp/TAKEN.md) | Relay | **0.5.3 staat klaar (31-08-2026): "Running" weer in de accentkleur en op een telefoon terug naar de vlakke stand.** Daarvóór 0.5.2 (31-08-2026): de opfrisbeurt uit het gedeelde designsysteem** (accentgloed, doorschijnende kaarten met randlicht en schaduw, één hoek voor elk buitenste kader, het volle accentpalet met oranje als stand). Alleen de pagina, dus geen nieuwe image. **Nog nakijken op het apparaat, en dat is een blik.** Daarvóór stond er: **0.5.1 staat klaar en de pagina is af op de lijst van de gebruiker (30-08-2026):** tijdvenster van twee minuten met de teller in het relay-proces, labels op een eigenaar-id, geblokkeerd en geweigerd in één kader, maatvoering gelijk aan Electrum Gate. De image is dezelfde dag op de Umbrel gebouwd, geduwd en gepind. **Volgende stap is van de gebruiker en is een blik, geen sessie:** verversen, updaten, en dan de drie dingen nakijken die alleen het apparaat kan zeggen (teller met de pagina dicht, label na een herstart, het adres achter de app-proxy). Wat daarna nog open is: data per eigenaar wissen, en een `package-lock.json`. **Het pinnen van `python:3-alpine` en `nginx:alpine` is bewust géén werk meer hier** en wacht op Eigenimage; zie [KNOWLEDGE.md](KNOWLEDGE.md) | 🔶 | +| [Umbrelapp](Plannen/Actief/008-Umbrelapp/TAKEN.md) | Relay | **0.5.4 staat klaar (31-08-2026): de statuswidget staat rechts en heet Status, gelijk aan Electrum Gate.** Daarvóór 0.5.3 (31-08-2026): "Running" weer in de accentkleur en op een telefoon terug naar de vlakke stand.** Daarvóór 0.5.2 (31-08-2026): de opfrisbeurt uit het gedeelde designsysteem** (accentgloed, doorschijnende kaarten met randlicht en schaduw, één hoek voor elk buitenste kader, het volle accentpalet met oranje als stand). Alleen de pagina, dus geen nieuwe image. **Nog nakijken op het apparaat, en dat is een blik.** Daarvóór stond er: **0.5.1 staat klaar en de pagina is af op de lijst van de gebruiker (30-08-2026):** tijdvenster van twee minuten met de teller in het relay-proces, labels op een eigenaar-id, geblokkeerd en geweigerd in één kader, maatvoering gelijk aan Electrum Gate. De image is dezelfde dag op de Umbrel gebouwd, geduwd en gepind. **Volgende stap is van de gebruiker en is een blik, geen sessie:** verversen, updaten, en dan de drie dingen nakijken die alleen het apparaat kan zeggen (teller met de pagina dicht, label na een herstart, het adres achter de app-proxy). Wat daarna nog open is: data per eigenaar wissen, en een `package-lock.json`. **Het pinnen van `python:3-alpine` en `nginx:alpine` is bewust géén werk meer hier** en wacht op Eigenimage; zie [KNOWLEDGE.md](KNOWLEDGE.md) | 🔶 | | [Proefopstelling](Plannen/Actief/007-Proefopstelling/TAKEN.md) | Relay | **Volledig ingehaald op 28-08-2026 en klaar voor het archief.** Beide vragen die het nog bezat zijn beantwoord door **Umbrelapp**: Trezor Suite accepteert een eigen relay, en een eigenaar registreren is niet meer nodig sinds de quota-manager eruit is. Wat er in fase 2 en 3 stond gaat over een pakket dat niet meer bestaat. **Eén beslissing van de gebruiker: opheffen of laten staan** | 🔶 | -| [Webinterface](Plannen/Actief/005-Webinterface/TAKEN.md) | Gate | **0.0.26 (31-08-2026): "Running" weer in de accentkleur en op een telefoon terug naar de vlakke stand.** Daarvóór 0.0.25 (31-08-2026): dezelfde opfrisbeurt als de Relay**, uit het gedeelde designsysteem, plus een reparatie die daarbij aan het licht kwam: `prefers-reduced-motion` zette per ongeluk de hele opmaak plat, omdat die wens met `prefers-reduced-transparency` in één media-query stond. **Nog nakijken op het apparaat.** Daarvóór: **De pagina is af en goedgekeurd, op een breed scherm én op een telefoon (27-08-2026).** Op 28-08-2026 kapotgegaan door de tweede app en gerepareerd in 0.0.23. In 0.0.24 (30-08-2026) is de statuswidget van "Answering" naar "Running" gegaan en is er een menu-item "About this app" bij gekomen; dat kwam uit het werk aan Evolu Relay, waar de gebruiker de twee pagina's naast elkaar zag. **Nog nakijken op het apparaat, en dat is een blik en geen sessie.** Wat er verder staat wacht op tijd (het activiteitenlog een etmaal laten lopen) of is een beslissing van de gebruiker (waar Nginx Proxy Manager zijn certificaten neerzet, en of Zoraxy een harde afhankelijkheid wordt) | 🔶 | +| [Webinterface](Plannen/Actief/005-Webinterface/TAKEN.md) | Gate | **0.0.27 (31-08-2026): de statuskaart loog vijf minuten na elke herstart.** De agent mat vóórdat nginx luisterde (die start ná de agent) en herhaalde pas na vijf minuten; nu slaat de eerste ronde over en wordt een mislukking binnen een minuut herhaald. Daarvóór 0.0.26 (31-08-2026): "Running" weer in de accentkleur en op een telefoon terug naar de vlakke stand.** Daarvóór 0.0.25 (31-08-2026): dezelfde opfrisbeurt als de Relay**, uit het gedeelde designsysteem, plus een reparatie die daarbij aan het licht kwam: `prefers-reduced-motion` zette per ongeluk de hele opmaak plat, omdat die wens met `prefers-reduced-transparency` in één media-query stond. **Nog nakijken op het apparaat.** Daarvóór: **De pagina is af en goedgekeurd, op een breed scherm én op een telefoon (27-08-2026).** Op 28-08-2026 kapotgegaan door de tweede app en gerepareerd in 0.0.23. In 0.0.24 (30-08-2026) is de statuswidget van "Answering" naar "Running" gegaan en is er een menu-item "About this app" bij gekomen; dat kwam uit het werk aan Evolu Relay, waar de gebruiker de twee pagina's naast elkaar zag. **Nog nakijken op het apparaat, en dat is een blik en geen sessie.** Wat er verder staat wacht op tijd (het activiteitenlog een etmaal laten lopen) of is een beslissing van de gebruiker (waar Nginx Proxy Manager zijn certificaten neerzet, en of Zoraxy een harde afhankelijkheid wordt) | 🔶 | | [Appstore](Plannen/Actief/010-Appstore/TAKEN.md) | Gate | De repo `ElectrumTLS` weghalen op de Git-server; daar staat het domein nog in de historie. **De omschakeling naar Fulcrum is op 27-08-2026 gelukt zonder aanpassing**, dus daarvan is alleen de herstartcontrole nog over, en die komt vanzelf bij de eerstvolgende herstart | 🔶 | ## C - Wacht op afhankelijkheid diff --git a/tests/test_agent_zelfcontrole.py b/tests/test_agent_zelfcontrole.py index 0c5c153..2257fd5 100644 --- a/tests/test_agent_zelfcontrole.py +++ b/tests/test_agent_zelfcontrole.py @@ -24,6 +24,7 @@ import sys # Zelfde reden als in test_agent_certificates.py: geen .pyc naast de app-map. sys.dont_write_bytecode = True +import json # noqa: E402 import os # noqa: E402 import socket # noqa: E402 import ssl # noqa: E402 @@ -315,6 +316,106 @@ def test_ronde_meet_niet_elke_keer(agent, u): server.close() +def test_eerste_ronde_en_snelle_herhaling(agent, u): + """De startrace, en de rem die een mislukking vasthield. + + AANLEIDING (gemeld door de gebruiker, 31-08-2026): na elke herstart of update + las de statuskaart vijf minuten lang "Not answering" met + `[Errno 111] Connection refused`, terwijl de gateway van buiten gewoon werkte. + + De oorzaak was een startvolgorde en geen storing. De compose laat `server` ná + de agent starten (`depends_on: [agent]`), en `build_status` draait meteen bij + het opstarten. De allereerste meting valt dus gegarandeerd in het gat waarin + nginx nog niet luistert. Dat was op zichzelf te verdragen; het probleem was dat + de volgende meting pas na SELF_CHECK_INTERVAL kwam. + + Twee dingen worden hier vastgelegd, en ze repareren allebei een helft: + + 1. de eerste ronde van een proces meet niet, ook niet als het certificaat + ongewijzigd is (dus met `reloaded` op False, en dát is het geval dat de + bestaande toets hierboven NIET raakt: daar is de eerste ronde `pending` + omdat het certificaat net gekozen is); + 2. na een mislukking wordt er na SELF_CHECK_RETRY opnieuw gemeten en niet pas + na SELF_CHECK_INTERVAL. + """ + with tempfile.TemporaryDirectory() as tmp: + bron = os.path.join(tmp, "certs") + os.makedirs(bron) + paar = openssl_paar(bron, "gate", "gate.example.org") + if not paar: + print("OVERGESLAGEN: geen openssl, dus de startrace is niet getoetst") + return + cert, key = paar + + agent.SOURCES = [("Own folder", bron)] + agent.ELECTRUM_HOST = "" + agent.STATE_DIR = tmp + agent.CONFIG_DIR = os.path.join(tmp, "config") + agent.SELECTED_FILE = os.path.join(agent.CONFIG_DIR, "selected-cert") + agent.STATUS_FILE = os.path.join(tmp, "status.json") + agent.CERT_CONF = os.path.join(tmp, "cert.conf") + agent.RELOAD_FLAG = os.path.join(tmp, "reload") + agent.STREAM_LOG = os.path.join(tmp, "stream.log") + agent.SESSIONS_FILE = os.path.join(tmp, "sessions") + agent.SELF_CHECK_INTERVAL = 300 + agent.SELF_CHECK_RETRY = 60 + + server = TlsServer(cert, key) + try: + richt(agent, server.port) + + def ronde(): + status = agent.build_status([]) + agent.write_status(status) + return status + + ronde() # certificaat gekozen: pending via reloaded + tweede = ronde()["tls"]["self_check"] + u.check("de meting lukt zodra het certificaat staat", + tweede.get("state") == "ok", "gaf %r" % tweede) + + # Nu doen alsof het proces opnieuw begint, met een ONGEWIJZIGD + # certificaat. Vóór de reparatie mat hij hier gewoon door. + agent.EERSTE_RONDE = True + herstart = ronde()["tls"]["self_check"] + u.check("de eerste ronde na een herstart meet niet", + herstart.get("state") == "pending", "gaf %r" % herstart) + u.check("en zonder `at`, zodat de volgende ronde wél meet", + "at" not in herstart, "gaf %r" % herstart) + + derde = ronde()["tls"]["self_check"] + u.check("de ronde daarna meet wel", + derde.get("state") == "ok", "gaf %r" % derde) + + # De tweede helft: een mislukking mag niet vijf minuten blijven staan. + # De opgeslagen meting met de hand op 'failed' zetten, 90 seconden oud: + # dat is meer dan SELF_CHECK_RETRY en minder dan SELF_CHECK_INTERVAL. + def zet_vorige(state, ouderdom): + with open(agent.STATUS_FILE, "r", encoding="utf-8") as f: + status = json.load(f) + status["tls"]["self_check"] = { + "at": int(time.time()) - ouderdom, "state": state, + } + with open(agent.STATUS_FILE, "w", encoding="utf-8") as f: + json.dump(status, f) + + zet_vorige("failed", 90) + na_fout = ronde()["tls"]["self_check"] + u.check("na een mislukking wordt er binnen een minuut opnieuw gemeten", + na_fout.get("state") == "ok", "gaf %r" % na_fout) + + # En de tegenproef, want anders toetst het bovenstaande alleen dat er + # ooit gemeten wordt: een GESLAAGDE meting van dezelfde ouderdom hoort + # juist te blijven staan. + zet_vorige("ok", 90) + na_goed = ronde()["tls"]["self_check"] + u.check("een geslaagde meting van 90 seconden oud blijft staan", + na_goed.get("at") == int(time.time()) - 90, + "gaf %r" % na_goed) + finally: + server.close() + + def main(): u = Uitslag() agent = load_agent() @@ -325,6 +426,7 @@ def main(): test_eigen_sessies_uit_het_log(agent, u) # Als laatste, want deze verzet de module-instellingen naar een tijdelijke map. test_ronde_meet_niet_elke_keer(agent, u) + test_eerste_ronde_en_snelle_herhaling(agent, u) return u.rapport() diff --git a/whatsnext-electrum-gate/agent.py.template b/whatsnext-electrum-gate/agent.py.template index 030da8f..ae6bd95 100644 --- a/whatsnext-electrum-gate/agent.py.template +++ b/whatsnext-electrum-gate/agent.py.template @@ -66,6 +66,17 @@ TLS_PORT = int(os.environ.get("GATE_TLS_PORT", "50022")) # er sowieso gemeten. TLS_HOST = os.environ.get("GATE_TLS_HOST", "server") SELF_CHECK_INTERVAL = int(os.environ.get("GATE_SELF_CHECK_INTERVAL", "300")) + +# Na een MISLUKTE meting sneller opnieuw kijken dan na een geslaagde. Toegevoegd +# op 31-08-2026, samen met de overgeslagen eerste ronde hieronder; de aanleiding +# staat daar. +# +# De 300 seconden hierboven bestaan om het activiteitenlog niet vol te schrijven +# met onze eigen sessies, en dat argument weegt hier minder zwaar: een mislukking +# is juist de meting die je wilt herhalen, en een storing die een uur duurt is +# zestig extra regels waard. Een geslaagde meting blijft op 300, want dat is de +# waarde die zelden verandert. +SELF_CHECK_RETRY = int(os.environ.get("GATE_SELF_CHECK_RETRY", "60")) INTERVAL = int(os.environ.get("GATE_INTERVAL", "60")) API_PORT = int(os.environ.get("GATE_API_PORT", "8000")) HISTORY_SECONDS = 24 * 3600 @@ -674,6 +685,18 @@ SELF_CHECK_NOTES = { } +def self_check_wacht(previous_self): + """Hoeveel seconden er tussen deze en de vorige meting moet zitten. + + Alleen `ok` en `off` zijn rustige toestanden. `failed` en `wrong-certificate` + zijn allebei iets waar de gebruiker wat aan doet, en dan hoort de pagina + binnen een minuut te volgen in plaats van binnen vijf. + """ + if previous_self.get("state") in ("failed", "wrong-certificate"): + return SELF_CHECK_RETRY + return SELF_CHECK_INTERVAL + + def probe_self(active): """Antwoordt de eigen TLS-poort, en met het gekozen certificaat? @@ -912,7 +935,16 @@ def write_status(status): os.replace(tmp, STATUS_FILE) +# Waar of onwaar voor de duur van dit proces; `build_status` zet hem bij de eerste +# aanroep om. Zie de toelichting in die functie bij de zelfcontrole. +EERSTE_RONDE = True + + def build_status(events): + global EERSTE_RONDE + eerste_ronde = EERSTE_RONDE + EERSTE_RONDE = False + now = int(time.time()) previous = read_previous() @@ -966,7 +998,26 @@ def build_status(events): # geeft juist de interessantste meting die er is, want een herlading die # niet aankomt is precies wat deze controle moet vinden. self_check = {"state": "pending"} - elif now - int(previous_self.get("at") or 0) >= SELF_CHECK_INTERVAL: + elif eerste_ronde: + # DE EERSTE RONDE VAN DIT PROCES MEET NIET, en dat is geen voorzichtigheid + # maar een zekerheid (gemeld door de gebruiker, 31-08-2026). + # + # De compose laat `server` ná de agent starten (`depends_on: [agent]`, + # want nginx lost `http://agent:8000` bij het starten op en breekt af op + # een onbekende naam). Deze functie draait meteen bij het opstarten, vóór + # de eerste `WAKE.wait`. Op dat moment luistert nginx dus gegarandeerd nog + # niet op de TLS-poort, en de meting levert `[Errno 111] Connection + # refused` op. + # + # Dat op zichzelf zou een schoonheidsfoutje zijn; het probleem was dat het + # BLEEF STAAN. De volgende meting kwam pas na SELF_CHECK_INTERVAL, dus na + # elke herstart of update las de statuskaart vijf minuten lang "Not + # answering" terwijl er niets aan de hand was. + # + # `pending` heeft geen `at`, dus de rem hieronder laat de vólgende ronde + # gewoon meten: een minuut later staat er een echte uitkomst. + self_check = {"state": "pending"} + elif now - int(previous_self.get("at") or 0) >= self_check_wacht(previous_self): self_check = probe_self(active) if self_check.get("state") != "off": # Ook bij een mislukking: een geweigerde handdruk is voor nginx nog diff --git a/whatsnext-electrum-gate/umbrel-app.yml b/whatsnext-electrum-gate/umbrel-app.yml index 1f3d43a..7eaf517 100644 --- a/whatsnext-electrum-gate/umbrel-app.yml +++ b/whatsnext-electrum-gate/umbrel-app.yml @@ -9,7 +9,7 @@ manifestVersion: 1 id: whatsnext-electrum-gate category: bitcoin name: Electrum Gate -version: "0.0.26" +version: "0.0.27" tagline: Your own node from anywhere, without waiting for Tor description: >- The privacy win is already yours: you run the Electrum server. A public one gets asked for @@ -56,7 +56,18 @@ description: >- # staan. In 0.0.9 stond er daardoor drie keer "Earlier releases" en twee keer # dezelfde 0.0.4-regel. De toets let er nu op. releaseNotes: >- - Two adjustments to yesterday's refresh. The Status card reads in the accent colour again when it says + Fixes the Status card reading "Not answering" for five minutes after every restart or update, with + a connection error underneath, while the gateway itself was working fine the whole time. The check + runs from inside the app and it ran before the part it checks had started, so the very first + measurement of every restart was bound to fail, and nothing looked again for five minutes. It now + says Checking on that first round and takes a real measurement a minute later, and a failed + measurement is repeated within a minute instead of after five. + + + Everything in 0.0.26: + + + Two adjustments to the refresh. The Status card reads in the accent colour again when it says Running, and on a phone the page drops back to the flat look: the glow is wider than a phone screen, so it stopped being a gradient and became a haze over everything. diff --git a/whatsnext-evolu-relay/index.html.template b/whatsnext-evolu-relay/index.html.template index 9b21b09..ac9a046 100644 --- a/whatsnext-evolu-relay/index.html.template +++ b/whatsnext-evolu-relay/index.html.template @@ -671,14 +671,6 @@ body {
-
-

Relay

-
-
unknown
-
-
-
-

Stored data

@@ -719,6 +711,23 @@ body {
+ +
+

Status

+
+
unknown
+
+
+
diff --git a/whatsnext-evolu-relay/umbrel-app.yml b/whatsnext-evolu-relay/umbrel-app.yml index 9212567..d76dc45 100644 --- a/whatsnext-evolu-relay/umbrel-app.yml +++ b/whatsnext-evolu-relay/umbrel-app.yml @@ -11,7 +11,7 @@ manifestVersion: 1 id: whatsnext-evolu-relay category: files name: Evolu Relay -version: "0.5.3" +version: "0.5.4" tagline: Encrypted sync and backup for your local-first apps description: >- Local-first apps keep your data on your own device and work whether or not you have a @@ -43,7 +43,14 @@ description: >- your app at the address shown there. Away from home you will need a way in, such as Tailscale or a reverse proxy with your own domain. releaseNotes: >- - Two adjustments to yesterday's refresh. The Relay card reads in the accent colour again when it says + The status widget has moved to the right of the top row and is now called Status, matching Electrum + Gate. The two pages are one app store and they should read the same way. + + + Everything in 0.5.3: + + + Two adjustments to the refresh. The Relay card reads in the accent colour again when it says Running, and on a phone the page drops back to the flat look: the glow is wider than a phone screen, so it stopped being a gradient and became a haze over everything.