Kde projekt stojí, čo je opravené, čo ďalej
Kompletný audit šiestich oblastí (úvodná stránka, aplikácia, databáza, nasadenie, dokumenty, právo). Každý nález má závažnosť, stav a dôkaz. Všetko, čo sa dalo urobiť bez Richardovho rozhodnutia, je urobené a nasadené v ten istý deň; čo rozhodnutie potrebuje, je v kapitole 5 s možnosťami a odporúčaním.
- Stav v číslach
- Audit podľa oblastí
- Čo sa dnes urobilo
- Plán v bodoch
- Rozhodnutia pre Richarda
- Domény, e-mail, hosting, Bärn Kit
- Zábrany – ako sa to stráži
kritické dôležité drobné v poriadku · stav: HOTOVÉ ČAKÁ na rozhodnutie OTVORENÉ – blokuje prostredie
1 · Stav v číslach
db/002_rls_test.sql)2 · Audit podľa oblastí
A · Úvodná stránka (index.html)
| Nález | Závažnosť | Stav | Dôkaz / čo sa urobilo |
|---|---|---|---|
| List „Wer nimmt Essen an“ sa na iPade nedal skrolovať, vrch bol mimo obrazovky (Richardov screenshot) | kritické | HOTOVÉ | Príčina: veil bol display:grid; place-items:end s výškou v dvh – list vyšší než obrazovka vyrastal nahor a Safari ho neorezal. Oprava fb401b5: flex ukotvený dole, vh záloha + @supports dvh, overscroll-behavior, zámok skrolovania stránky. Zábrana: e2e kontrola „orgs sheet inside viewport and scrollable“ – videná červená na reprodukovanej chybe, zelená na opravenom kóde. |
Kontrast Tlmenej farby (#7A746C) na Papieri bol 4,0 : 1 – pod AA (4,5) – a používal sa aj na vety pod poľami | dôležité | HOTOVÉ | Manuál mal výnimku „len popisky“, kód ju nedodržal. Token stmavený na #6B655D (5,0 : 1 na Papieri, 5,3 : 1 na Hárku) v stránke, app, Datenschutz a manuáli. Mosadz (2,3 : 1) sa už nepoužíva ako farba textu. Zábrana: e2e počíta pomer z vypočítaných štýlov pre 8 kombinácií a padne pod 4,5. |
Kontrola v deploy-workflowe počítala riadky s data-lang=, nie výskyty – po presune jazykov do lišty zhodila beh #14 | drobné | HOTOVÉ | 564ebe3: každé tlačidlo jazyka na vlastnom riadku; test beží pred nasadením a počíta prvky, nie riadky. |
| Písma sa sťahujú z Google Fonts – prehliadač posiela IP adresu tretej strane | dôležité | OTVORENÉ | Self-hosting z tohto prostredia nejde: jsDelivr aj npm registry vracajú 403 (skúšané 3 spôsoby). Zatiaľ priznané v Datenschutz. Pri otvorenej sieti je to 10 minút: stiahnuť OFL woff2 (Fraunces, Atkinson Hyperlegible, IBM Plex Mono) do fonts/, prepísať @font-face. |
| Stránka nefunguje bez signálu (žiadny service worker) – kuchyňa v suteréne | drobné | ČAKÁ | Rozhodnutie R2. Riziko service workera: zastaraný obsah po nasadení, ak sa urobí zle. Návrh: network-first pre HTML, cache pre ikony a písma. |
| Na iOS s „Bewegung reduzieren“ krúžky neblikajú (Richard: „na mobile nepreblikne nič“) | drobné | ČAKÁ | Kód bliká len keď je pohľad Prüfen viditeľný a nie je otvorený list – to bola prvá príčina (blikalo pod introm) a je opravená. Druhá možná príčina je systémové nastavenie; pätička to teraz oznámi. Overiť na Richardovom iPhone (R8). |
Žiadne sieťové volania, dáta len v localStorage | v poriadku | – | Workflow zakazuje fetch(, XMLHttpRequest, sendBeacon; e2e kontroluje prenos starého protokolu ub_state. |
| Tlač etikety = jedna strana; 7/7 tok; validácia e-mailu a povinné potvrdenie; log otvoriť/upraviť | v poriadku | – | Všetko kryté e2e (PDF má presne 1 stranu, hint pri chýbajúcom potvrdení, úprava záznamu nahradí pôvodný). |
B · Aplikácia (app/index.html)
| Nález | Závažnosť | Stav | Dôkaz / čo sa urobilo |
|---|---|---|---|
| App spracúva osobné údaje (e-mail, telefón, adresa) a nemala nijaký odkaz na ochranu údajov | kritické | HOTOVÉ | datenschutz.html napísaný podľa kódu, ako existuje dnes (nie podľa zámeru): čo je len v prehliadači, čo je v Supabase (Paríž), kto čo vidí po rezervácii, Google Fonts a jsDelivr priznané. Odkaz v pätičke stránky aj app; e2e kontroluje prítomnosť odkazu a dostupnosť súboru. |
Richardov profil bol po prvom prihlásení kitchen / nicht freigegeben – nikto by nemohol nikoho schváliť | kritické | HOTOVÉ | Migrácia 003_bootstrap_admin (podľa e-mailu, nie podľa ID) nasadená a overená: role=admin, approved=true. Prvý admin sa dá nastaviť len z databázy – zapísané v db/003_bootstrap_admin.sql. |
| Starý oranžový vizuál, iné písma než úvodná stránka | dôležité | HOTOVÉ | 8e07c7f: tokeny „Lístok a pečiať“, Fraunces / Atkinson / Plex Mono, lis, kruh, ponuky ako lístky. Logika dát nedotknutá (diff len v <style>, hlavičke a pätičke). Overené snímkami 6 pohľadov; e2e stráži, že app nemá innerHTML s dátami. |
| Admin v záložke „Meine“ videl len ponuky, ktoré sám rezervoval (t. j. nič) | drobné | HOTOVÉ | Admin teraz vidí všetky ponuky (RLS mu to dovoľuje, klient to len nevyužíval). |
Expirácia ponuky sa počíta len v prehliadači (Meine), v databáze ostáva open | drobné | ČAKÁ | Pri 0 ponukách neškodí. Do fázy 1 architektúry: pg_cron alebo podmienka v politike / RPC. Súvisí s R1 (Pro plán má cron bez obmedzení). |
supabase-js z jsDelivr bez integrity atribútu | drobné | OTVORENÉ | Hash sa nedá spočítať bez stiahnutia súboru (403 z tohto prostredia). Pri otvorenej sieti: SRI hash alebo súbor vo vendor/. |
Realtime: odber všetkých zmien tabuľky offers bez filtra | v poriadku | – | RLS filtruje riadky aj v realtime; každá zmena len znovu načíta zoznam. Pri berskej škále (desiatky ponúk denne) správne; pri expanzii filter podľa regiónu (architektúra, fáza 2). |
Verejný publishable kľúč v config.js | v poriadku | – | Zámer Supabase modelu: kľúč je verejný, prístup riadi výlučne RLS – a tá má 20 testov. |
| Text pravidiel: „heiss ≥ 65 °C, innert 2 h auf ≤ 5 °C“ | drobné | ČAKÁ | Prísnejšie než niektoré odporúčania (60 °C / 2 h + 3 h chladenie). Prísnejšie je bezpečné; overiť jedným telefonátom na Kantonales Laboratorium Bern (R7) a potom zjednotiť text stránky, app a README. |
C · Databáza (Supabase tegbrfloehfblkmjawha, Paríž, Free)
| Nález | Závažnosť | Stav | Dôkaz / čo sa urobilo |
|---|---|---|---|
| Free plán pozastaví projekt po 7 dňoch bez aktivity – živá app by jedno ráno nešla | kritické | ČAKÁ | Rozhodnutie R1: Pro (25 USD/mes., denné zálohy, e-mail limity vyššie) alebo Free + týždenný „keep-alive“ z GitHub Actions. Do pilotu s reálnymi organizáciami odporúčam Pro. |
Prihlasovacie e-maily idú cez vstavaný SMTP Supabase – limit rádovo jednotky e-mailov za hodinu, odosielateľ noreply@mail.app.supabase.io | kritické | ČAKÁ | Pri onboardingu troch organizácií v jeden večer by sa magic-linky zastavili. Rozhodnutie R3: vlastná doména + SMTP (Resend má bezplatných 3 000 e-mailov mesačne a je pripojený ako nástroj v tomto prostredí). |
Kuchyňa mohla priamo meniť status/reserved_by; pomocné funkcie neboli obalené (select …); vnorené EXISTS | kritické | HOTOVÉ | Migrácia 002_hardening: BEFORE UPDATE trigger-guard, všetky politiky znovu vytvorené s obalenými volaniami, private.can_see_profile. Test 002_rls_test.sql: 20 / 20, protokol db/RLS_TEST_2026-09-25.md. |
Security advisor: 3 × „SECURITY DEFINER volateľné prihlásenými“ (reserve_offer, release_offer, mark_picked) | v poriadku | – | Zámer: rezervácia musí zamknúť riadok cudzej kuchyne (FOR UPDATE), preto beží ako definer; funkcie vnútri overujú auth.uid(), schválenie a stav. Zapísané, netreba meniť. |
| Security advisor: „Leaked password protection disabled“ | drobné | – | App nepoužíva heslá (len magic-link), nastavenie sa netýka ničoho. Zapnúť sa dá jedným klikom v Dashboard → Auth → Passwords, ale nič nemení. |
| Bez záloh mimo Supabase (Free plán nemá automatické zálohy) | dôležité | ČAKÁ | Pri 0 ponukách zatiaľ nič nehrozí. Riešenie: Pro (denné zálohy) alebo týždenný pg_dump z GitHub Actions do privátneho repozitára – potrebuje heslo databázy ako GitHub secret, ktoré držíš len ty (súčasť R1). |
| Schéma: 2 tabuľky, každá s RLS, statusy ako ENUM, žiadne zbytočné tabuľky | v poriadku | – | Zodpovedá zásade „štíhle jadro“. Fáza 1 architektúry pridá organizations (dnes 6 organizácií natvrdo v index.html) a stĺpec regiónu. |
D · Nasadenie a CI (.github/workflows/pages.yml)
| Nález | Závažnosť | Stav | Dôkaz / čo sa urobilo |
|---|---|---|---|
| Pred nasadením nebežal žiadny test správania – iPad chyba prešla na live | dôležité | HOTOVÉ | Job test (Playwright + Chromium, ~1 minúta) beží pred deploy; červený test = žiadne nasadenie. Beh #17: test 34 kontrol zelený, deploy zelený. Lokálne spustiteľné jedným príkazom (README). |
Nové súbory (ikony, manifest, Datenschutz) sa nekopírovali do _site | dôležité | HOTOVÉ | paths aj krok „Stage site“ rozšírené; e2e overuje, že datenschutz.html a research/plan.html odpovedajú 200. |
| Minúty GitHub Actions | v poriadku | – | ~2 minúty na beh (test 1 min + deploy 1 min), 17 behov za 2 dni – hlboko pod bezplatným limitom. paths filter bráni behom pri zmene len poznámok. |
Push na main nasadzuje priamo, bez PR a ochrany vetvy | drobné | – | Pri jednom vývojárovi správne; test pred deployom je tá ochrana. Pri druhom človeku zapnúť „require status checks“. |
E · Dokumenty
| Nález | Závažnosť | Stav | Dôkaz / čo sa urobilo |
|---|---|---|---|
| README opisoval app v starom vizuáli a nepoznal Datenschutz, testy ani migrácie 002/003 | drobné | HOTOVÉ | Prepísané sekcie App, Research, Technik; odkaz na tento dokument. |
| Dizajnový manuál: kapitola 14 mala ☐ pri PWA a app, kontrastná výnimka bola v rozpore s kódom | drobné | HOTOVÉ | ☑ manifest + ikony, ☑ app na tokenoch; kapitola 08 a tabuľka kontrastov opravené s dátumom merania. |
| Chýbal dokument „kde stojíme“ – všetko bolo rozptýlené v commitoch a chate | dôležité | HOTOVÉ | Tento dokument; odkaz v navigácii všetkých research dokumentov aj v build skriptoch (aby ho prebuild nezmazal). |
| Research: 634 neotvorených zdrojov v Čo doveriť | drobné | OTVORENÉ | Blokuje sieť tohto prostredia (WebSearch vyčerpaný, väčšina hostov 403). Richard alebo otvorená sieť. |
F · Právo
| Nález | Závažnosť | Stav | Dôkaz / čo sa urobilo |
|---|---|---|---|
| Datenschutzerklärung | kritické | HOTOVÉ | Napísaná podľa kódu; každé tvrdenie som overil grepom (kľúče localStorage, región projektu, politiky viditeľnosti telefónu po rezervácii). Otvorená položka v texte: e-mail pre žiadosti o údaje – doplní sa s R4. |
| Impressum chýba (v CH povinné pri komerčnej ponuke; pri spolku odporúčané a očakávané) | dôležité | ČAKÁ | Potrebuje meno, adresu a kontakt zodpovednej osoby alebo spolku (R4). Šablóna je pripravená, doplním do 10 minút po odpovedi. |
| Licencia CC0 v repozitári, OSM atribúcia (ODbL) v mape, zodpovednosť za bezpečnosť potravín uvedená na stránke, v app a v Datenschutz | v poriadku | – | LICENSE, pätička mapy, kapitola 5 Datenschutz. |
| Darovací kanál: list „Unterstützen“ hovorí „Spendenkonto folgt mit der Vereinsgründung“ | drobné | ČAKÁ | Pravdivé, ale bez cesty. R6: Twint QR / bankový účet spolku / Open Collective. |
3 · Čo sa dnes urobilo (25. 9. 2026)
- fb401b5 – skrolovanie listov na iOS (Richardov screenshot), zámok stránky,
vhzáloha. - 564ebe3 – kontrola workflowu (jazyky po riadkoch), beh #15 zelený.
- 8e07c7f – PWA manifest + 7 ikon + og obrázok; Datenschutz; app v dizajne „Lístok a pečiať“; e2e test 34 kontrol ako brána pred nasadením; beh #17 zelený.
- tento commit – prvý admin (migrácia 003), kontrast Tlmenej 4,0 → 5,0 : 1 + strážca, admin „Meine“, mosadz nie ako text, manuál kap. 08/14, README, navigácia, tento dokument; e2e 37 kontrol.
- Databáza – 002_hardening + 20 testov RLS ráno; 003_bootstrap_admin večer; advisors prečítané a zapísané.
- Negatívne testy – strážca skrolovania videný červený na reprodukovanej chybe (grid +
place-items:end), zelený na zdravom kóde; kontrastný strážca padá pri návrate#7A746C.
4 · Plán v bodoch
Poradie je podľa toho, čo najskôr zastaví pilot. Pri každom bode je, kto ho odblokuje a čím sa overí, že je hotový.
- Backend pripravený na pilot (týždeň 1). Vlastný SMTP + odosielateľská doména (R3), Pro alebo keep-alive (R1), týždenná záloha. Overenie: tri magic-linky za 5 minút doručené na tri rôzne adresy; záloha v repozitári s dátumom. Odblokuje: Richard (R1, R3, secret).
- Impressum + e-mail pre údaje (týždeň 1). Po R4 doplním Impressum a Datenschutz, e2e overí odkaz v oboch pätičkách. Odblokuje: Richard (R4).
- Prvé tri organizácie (týždeň 1–2). Passantenheim, Sleeper, Gassenküche zo zoznamu na stránke: nemecká správa (pilot-comms), registrácia ako
taker, Richard schváli v „Freigaben“. Overenie: 3 schválené profily v databáze; každá organizácia otvorila app na svojom telefóne. - Prvá kuchyňa a prvá skutočná ponuka (týždeň 2–3). Kandidáti z mapy (zatváranie 19–22 h, do 1,5 km od príjemcov). Overenie: jedna ponuka → rezervácia → „Abgeholt“ na dvoch reálnych telefónoch; čas od ponuky k rezervácii zmeraný.
- App, kolo 2 – s reálnymi dátami (týždeň 3). Lístky v zozname ponúk doladiť podľa skutočných textov, rezervácia ako pečiať, expirácia v databáze (
pg_cron), e2e pre app proti testovaciemu projektu (R5). Overenie: e2e app ≥ 10 kontrol zelené v CI. - Offline a písma (keď je sieť). Service worker network-first (R2), self-host písiem, SRI pre
supabase-js. Overenie: stránka sa otvorí v režime letu po prvej návšteve; Datenschutz stratí odsek o Google. - Architektúra, fáza 1 (mesiac 2). Podľa architektúry: tabuľka
organizationsnahradí 6 natvrdo zapísaných organizácií, stĺpec regiónu, záznam odovzdaní ako udalosti. Overenie: RLS testy rozšírené o región, 0 zmien pre existujúcich používateľov. - Meranie (od prvej ponuky). Týždenný počet ponúk, porcií, podiel vyzdvihnutých, čas do rezervácie – z databázy do research dokumentu, nikdy z pamäti. Overenie: prvá mesačná správa s číslami a commitom, na ktorom boli merané.
5 · Rozhodnutia pre Richarda
Stačí odpovedať číslom a písmenom (napr. „R1 a, R2 b“). Odporúčanie je označené.
- Pro, 25 USD/mesiac (odporúčam pred prvou organizáciou) – projekt sa nepozastaví, denné zálohy, vyššie limity e-mailov a cron bez obmedzení.
- Free + týždenný keep-alive ping z GitHub Actions + týždenný
pg_dump(potrebujem heslo DB ako GitHub secret – nastavíš ho ty). - Free bez ničoho – riziko: app jedno ráno nejde.
- Áno, network-first (odporúčam) – po prvej návšteve funguje bez signálu, nové verzie sa načítajú, keď je sieť.
- Nie, zatiaľ nechať – menej pohyblivých častí.
- Kúpiť doménu (napr. uebrig.ch alebo uebrig.bern) a nastaviť Resend ako SMTP (odporúčam) – magic-linky z
login@uebrig.ch, 3 000 e-mailov mesačne zadarmo; stránka ostáva na GitHub Pages s vlastnou doménou. - Len SMTP cez Resend na subdoméne, ktorú už máš.
- Nechať vstavaný SMTP Supabase – funguje pre teba, nie pre pilot.
- Do založenia spolku: ty ako fyzická osoba (meno, poštová adresa, e-mail) – odporúčam, dá sa doplniť dnes.
- Počkať na spolok a uviesť spolok (názov, sídlo, e-mail, predsedu).
V oboch prípadoch potrebujem: poštovú adresu a e-mail pre žiadosti o údaje (môže byť nová schránka, napr. hallo@…).
- Druhý Supabase projekt „uebrig-test“ (Free) len pre CI (odporúčam) – testy rezervácie bežia proti skutočnej RLS bez rizika pre produkciu.
- Testovať len klientske správanie so zamockovaným Supabase – rýchlejšie, ale RLS netestuje.
- Twint QR na tvoje meno už teraz (najrýchlejšie, osobná zodpovednosť).
- Bankový účet spolku po založení + Twint (odporúčam, čisté účtovníctvo).
- Open Collective (transparentné, poplatok ~10 %).
- Zavoláš na Kantonales Laboratorium Bern (031 633 11 11) a potvrdíš alebo upravíš – odporúčam, 10 minút.
- Nechať prísnejšiu verziu bez overenia.
Nastavenia → Zugänglichkeit → Bewegung → „Bewegung reduzieren“: ak je zapnuté, krúžky neblikajú a pätička to oznámi. Napíš, či je zapnuté a či pätičku vidíš. Zároveň otvor list „Wer nimmt Essen an“ na iPade a potvrď, že skroluje.
- Dáš mi na chvíľu prostredie so sieťou (alebo spustíš lokálne skript, ktorý pripravím) – odporúčam: self-host písiem, SRI hash, a začnem odškrtávať 634 zdrojov v „Čo doveriť“.
- Nechať Google Fonts a priznanie v Datenschutz.
6 · Domény, e-mail, hosting a Bärn Kit (doplnené 26. 9. 2026)
Stav: Richard kúpil uebrig.ch (Hostpoint, 25. 9. 2026 – 24. 9. 2027) a na Cloud Office Basic založil schránky info@uebrig.ch a hallo@uebrig.ch (15 GB každá). Tým je R3 rozhodnuté (vlastná doména + vlastný SMTP cez Hostpoint, nie Resend) a R4 z polovice (kontaktný e-mail existuje, poštová adresa pre Impressum ešte nie). Hosting má byť cez Cloudflare tak, aby sa neplatilo nič navyše.
Aktualizácia 27. 9. 2026 – platí toto, nie plán nižšie: DNS ostáva u Hostpointu (žiadny Cloudflare). übrig a Bärn Kit sú v jednom repozitári richardcervenka111-create.github.io: www.uebrig.ch = übrig, /app/ = aplikácia, /barnkit/ = Bärn Kit, aplikácie Bärn Kitu na /<priečinok>/. Doména sa nastavuje v Settings → Pages (súbor CNAME sa pri nasadzovaní cez Actions ignoruje). Supabase posiela prihlasovacie e-maily cez Hostpoint z info@uebrig.ch; info@ sa preposiela na hallo@uebrig.ch. Repozitár uebrig už len presmerúva na www.uebrig.ch.
Ako to bude zapojené (nula nákladov navyše):
- DNS obidvoch domén → Cloudflare (Free). Nameservery sa prepnú v Hostpointe; Cloudflare pri pridaní zóny naimportuje existujúce záznamy, ale MX, SPF (TXT), DKIM a autodiscover/autoconfig Hostpointu sa musia skontrolovať ručne, inak prestane chodiť pošta. Pošta ostáva u Hostpointu (zaplatená).
- uebrig.ch → GitHub Pages (repozitár
uebrig): 4 záznamy A na IP GitHub Pages + CNAMEwww; v Cloudflare najprv DNS only (sivý oblak), aby GitHub vydal certifikát; potom sa v GitHube zapne „Enforce HTTPS“. SúborCNAMEv repozitári sa pridá až po nastavení DNS – inak by github.io adresa presmerovala na doménu, ktorá ešte nefunguje. Workflow už CNAME kopíruje, keď existuje. - kit.uebrig.ch → Bärn Kit (repozitár
-brig): CNAME záznam narichardcervenka111-create.github.io, rovnaký postup. Bärn Kit je informačná appka zadarmo pre všetkých, súčasť projektu übrig – reklamný panel v hube vedie na übrig. - Supabase Custom SMTP = Hostpoint: odosielateľ
hallo@uebrig.ch, server a port podľa stránky „E-mail client settings“ v Control Paneli (spravidlaasmtp.mail.hostpoint.ch, 465 SSL). Heslo zadáva Richard v Supabase Dashboard sám. - Po prepnutí: og:image URL v
index.htmlaapp/index.html, odkazy v README a v Datenschutz prepísať na uebrig.ch; e2e test doplniť o kontrolu, že žiadny súbor už neodkazuje na github.io.
Čo je hotové 26. 9.: Datenschutz má kontakt hallo@uebrig.ch; oba workflowy (übrig, Bärn Kit) kopírujú CNAME, keď existuje; Bärn Kit je zapísaný ako súčasť projektu.
Čo čaká na Richarda: prepnutie nameserverov a záznamy v Cloudflare (prompt pre Cowork dodaný v chate), heslo pre SMTP v Supabase, poštová adresa pre Impressum. Hneď po jeho „DNS je nastavené“ pridám CNAME súbory, prepíšem URL a overím HTTPS na oboch doménach.
7 · Zábrany – ako sa to stráži
| Čo | Kde beží | Videné padnúť? |
|---|---|---|
| 37 e2e kontrol (intro, listy a skrolovanie, 7/7, validácia, tlač = 1 strana, log, jazyky, prenos starého protokolu, kontrast, app hülle, Datenschutz, plán) | GitHub Actions, job test pred každým deployom; lokálne jedným príkazom | áno – skrolovanie (reprodukovaná chyba), kontrast (návrat starej farby), e-mail validácia (zámerne zlý vstup) |
| Žiadne sieťové volania na úvodnej stránke; 4 jazyky; viewport | job deploy, krok „Sanity check“ | áno – beh #14 (počítanie riadkov) |
| 20 izolačných testov RLS | db/002_rls_test.sql, opakovateľný cez apply_migration, výsledky do dočasnej tabuľky | áno – pred hardeningom padali 3 z 20 |
Trigger-guard na offers (status, kitchen_id, reserved_by, časové pečiatky) | databáza, BEFORE UPDATE | áno – v RLS testoch (kuchyňa skúša status='picked') |
| Security advisors Supabase | ručne po každej migrácii (dnes 2×) | – |
🟥 Dôležité: dve veci môžu pilot zastaviť bez ohľadu na kód – pozastavenie Free projektu po 7 dňoch nečinnosti (R1) a limit prihlasovacích e-mailov vstavaného SMTP (R3). Obe sú rozhodnutia s peniazmi alebo doménou, preto sú tvoje.