De gebruiker vroeg of iemand met kennis van de API zijn labels kan opvragen zodra de relay op een domein staat. Nee, en de reden is scherper dan "het is versleuteld". Uit een OwnerSecret worden met SLIP-21 drie onafhankelijke waarden afgeleid: een publieke OwnerId, een encryptiesleutel en een rotatable write key. Alleen de eerste gaat naar de relay. Het aardige is dat de OwnerId expres niet geheim is. De beveiliging leunt er niet op dat je adres onbekend blijft, en dat is het tegenovergestelde van een systeem waar een onraadbare URL de grens vormt. Daarom kan deze relay bij een onbekende partij staan. Twee dingen expres niet gladgestreken. Of iemand die een OwnerId kent de versleutelde blobs kan ophalen staat nergens gedocumenteerd; kan het, dan lekt dat bestaan, activiteit en bij benadering omvang, niet inhoud. En onraadbaarheid van de OwnerId beschermt tegen het aflopen van een relay, niet tegen lezen. Dat verschuift waar Bereikbaarheid over gaat. Het risico van een open eindpunt is misbruik als gratis versleutelde opslag: een kale relay kent geen accounts en kan per definitie niet weten van wie de data is. Dat is met terugwerkende kracht de tweede functie van Trezor's quota-manager, naast facturering, en die haalden wij eruit. Het voorstel van de gebruiker voor een eigen quota-manager met een allowlist van OwnerId's staat erin, met drie uitvoeringen en hun prijs. De netste is createRelay uit @evolu/nodejs, dat auth expliciet als reden noemt om die API te gebruiken, maar dan bouw je weer een eigen image en verlies je de winst van de gepubliceerde. Met een detail dat het lastiger maakt dan het klinkt: je moet je eigen OwnerId kennen om hem te vlaggen, en Suite toont die waarschijnlijk nergens. Uitweg is niet laten typen maar laten leren: de eerste eigenaar die verbindt wordt toegelaten. Meegenomen uit de vorige bevinding: open punt 2 is beantwoord, Suite eist geen TLS. Tests: niet gedraaid, dit raakt alleen documentatie. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Docs - documentatiewortel van UmbrelApps
Dit is de enige documentatieboom in de repo, en dit is de enige README erin: alle regels over
waar iets hoort staan hieronder. De onderbouwing van de methode staat in HomeGit/Docs/.
Docs/
├── CONTINUE_HERE.md - dunne index: per prioriteitstier naar de "volgende stap" van elk actief plan
├── KNOWLEDGE.md - duurzame cross-plan kennis
├── CHANGELOG-<app>.md - versiegeschiedenis, per app
├── Plannen/
│ ├── Actief/NNN-<Plan>/ - PLAN.md (ontwerp) · TAKEN.md (checklist) · PROGRESS.md (log) · OPEN.md
│ ├── Archief/<Plan>/ - afgerond; hele map verhuist hierheen, nummer vervalt
│ └── Masterplannen/ - nog niet actief; elk plan als één <Naam>.PLAN.md
│ └── Archief/ - opgevolgd; hier wordt nooit in bewerkt
└── Referenties/ - uitsluitend naslag: dingen waar je rekening mee moet houden
De map Plannen/Archief/ bestaat nog niet; lege mappen overleven git toch niet. Hij komt er zodra er
iets in gaat.
Eén boom, twee apps
Deze repo is één community app store met twee apps erin, en er is één documentatiewortel voor allebei. Dat is geen concessie maar de reden dat het samengevoegd is: de spec van de appstore, de manier om images te pinnen en de manier van werken zijn voor beide apps dezelfde, en die stonden eerst in twee repo's naast elkaar.
Wat dat vraagt:
- elk plan hoort bij één app, en dat staat in de kolom App van CONTINUE_HERE.md en in de kop van het plan zelf. De prioriteit loopt wél over beide heen: tier A is wat er nu moet gebeuren, ongeacht welke app;
- botst een plannaam, dan krijgt hij een achtervoegsel met de app, en anders niet. Inleveren bij de officiële store is per app, dus daar staan Publicatie-Gate en Publicatie-Relay. De rest houdt gewoon zijn naam;
- hetzelfde geldt voor
CHANGELOG, wantversionstaat per manifest; - een referentie zegt voor wie hij is. Sommige gelden voor beide apps, sommige voor één.
Waar hoort iets
Twee vragen, in deze volgorde:
- Is het naslag (geen status, hoort niet bij één plan, wordt niet per sessie bijgewerkt)? Dan
Referenties/. - Anders is het een plan, en de status bepaalt de plek: nog niet actief →
Plannen/Masterplannen/<Naam>.PLAN.md; er wordt aan gewerkt →Plannen/Actief/NNN-<Naam>/; afgerond →Plannen/Archief/<Naam>/.
Twijfel? De test is: zit er werk aan vast dat ooit af moet zijn? Zo ja, dan is het een plan, ook als er voorlopig niemand aan begint.
Een plan begint als één bestand
Schrijf een nieuw plan als Plannen/Masterplannen/<Naam>.PLAN.md: doel, afbakening, niet-doelen, het
werk in grote lijnen, open punten. Pas als het werk écht begint, promoveer je het naar
Plannen/Actief/NNN-<Naam>/ met de vier bestanden. De promotie-stappen staan in
HomeGit/Docs/Werkproces.md §1b.
Een masterplan heeft geen tier en geen nummer. Wat het wél kan hebben is een harde afhankelijkheid, en die staat in de masterplannen-tabel van CONTINUE_HERE.md.
Het nummer
010-, 020-, in stappen van tien zodat er altijd een 015- tussen kan. Drie cijfers. Het nummer is de
aanbevolen volgorde, niet de tier: die staat in de prioriteits-header van TAKEN.md.
Het nummer bestaat op twee plekken: de mapnaam en CONTINUE_HERE.md. Verwijs overal elders met de
naam van het plan: "zie het plan Appstore, TAKEN.md Fase 2". Binnen een plan link je relatief.
De reeks loopt over beide apps heen en is dus niet per app aaneengesloten. Dat is de bedoeling: er is één volgorde van werken, niet twee.
Sessie-protocol
Starten: CONTINUE_HERE.md → tier A → Plannen/Actief/NNN-<Plan>/TAKEN.md ("Volgende stap").
PLAN.md alleen bij twijfel over scope of ontwerp.
Afsluiten: TAKEN.md bijwerken, korte entry in PROGRESS.md, tier en de indexregel controleren,
gewijzigde bestanden opsommen.
Projectspecifiek
Alle documentatie staat hier, ook wat elders vaak in de root ligt. In de repo-root blijft alleen
README.md, en die is geen documentatie maar de voordeur: Gitea toont hem op de repo-pagina, en dat
is voor een publieke app store het eerste wat iemand ziet. Hij hoort kort te blijven en door te verwijzen
naar deze map. De oude ARCHITECTURE.md, STRUCTURE.md en QUICKSTART.md uit de root zijn opgegaan in
Referenties/Architectuur-huidig.md; ze beschreven grotendeels
hetzelfde in drie versies.
Er zijn drie testbestanden. Twee gaan over Electrum Gate en noemen die app-map bij naam; het derde,
tests/test_appstore_vorm.py, gaat over de store en vindt zijn apps zelf, dus een derde app valt daar
automatisch onder. Hoe ze draaien staat in ../CLAUDE.md.
Dat derde bestand dekt precies de fouten die je op het apparaat pas merkt: id gelijk aan de mapnaam, het
store-voorvoegsel, de voorgeschreven veldvolgorde, een app_proxy die naar een bestaande service wijst, en
elke gemounte map die in de repo bestaat. Wat het niet doet is eisen dat elke image: een
@sha256:-digest heeft. Dat is wel de regel, maar geen van de twee apps haalt hem vandaag en een suite die
altijd rood staat wordt niet gelezen; het staat als taak in de plannen en de pinstatus wordt afgedrukt.
"Gebouwd" en "werkend" liggen hier verder uit elkaar dan gebruikelijk. Elk plan heeft daarom een paragraaf Verificatie met de controles die op de Umbrel zelf gedaan moeten worden. Meld die uitslag, inclusief wat er níet gecontroleerd is.
De repo wordt publiek. Dat is geen keuze maar een eis: umbreld kloont een community app store anoniem
en kan geen inloggegevens aanbieden. Houd daar rekening mee bij wat je opschrijft. Evolu Relay krijgt een
Postgres, en dan is er meer weg te houden dan bij Electrum Gate: geen wachtwoord in de compose, geen
.env, geen dump.
Regeleindes zijn LF, afgedwongen door .gitattributes. Dat is hier geen netheid: de configuratie
draait in een Linux-container, en een CRLF achter een #!/bin/sh laat een script stuklopen op een
foutmelding die nergens naar het echte probleem wijst.