Übrig · audit a plán · 25. 9. 2026 večer

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.

  1. Stav v číslach
  2. Audit podľa oblastí
  3. Čo sa dnes urobilo
  4. Plán v bodoch
  5. Rozhodnutia pre Richarda
  6. Domény, e-mail, hosting, Bärn Kit
  7. 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

liveúvodná stránka + app na GitHub Pages, deploy #17 zelený (test + deploy)
4jazyky DE / FR / IT / EN na úvodnej stránke (app DE / FR / EN)
37kontrol v e2e teste, ktorý beží pred každým nasadením (Playwright, Chromium)
2 · 10 · 8tabuľky · politiky RLS · funkcie v databáze; 1 trigger-guard; 3 migrácie v repozitári
20 / 20izolačných testov RLS prešlo (opakovateľný skript db/002_rls_test.sql)
1používateľ v databáze – Richard, od dnes admin + freigegeben; 0 ponúk
19+commitov za dva dni (24.–25. 9.), 17 behov Pages, 1 červený (opravený za 6 minút)
83 · 48 kBindex.html · app/index.html – jeden súbor, bez buildu, bez frameworku

2 · Audit podľa oblastí

A · Úvodná stránka (index.html)

NálezZávažnosťStavDô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ľamidô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 #14drobné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 stranedô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énedrobnéČ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 localStoragev 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álezZávažnosťStavDôkaz / čo sa urobilo
App spracúva osobné údaje (e-mail, telefón, adresa) a nemala nijaký odkaz na ochranu údajovkritické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ánkadô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 opendrobnéČ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útudrobné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 filtrav 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.jsv 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álezZávažnosťStavDôkaz / čo sa urobilo
Free plán pozastaví projekt po 7 dňoch bez aktivity – živá app by jedno ráno nešlakritickéČ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.iokritickéČ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é EXISTSkritické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ľkyv 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álezZávažnosťStavDôkaz / čo sa urobilo
Pred nasadením nebežal žiadny test správania – iPad chyba prešla na livedô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 _sitedôležitéHOTOVÉpaths aj krok „Stage site“ rozšírené; e2e overuje, že datenschutz.html a research/plan.html odpovedajú 200.
Minúty GitHub Actionsv 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 vetvydrobné–Pri jednom vývojárovi správne; test pred deployom je tá ochrana. Pri druhom človeku zapnúť „require status checks“.

E · Dokumenty

NálezZávažnosťStavDôkaz / čo sa urobilo
README opisoval app v starom vizuáli a nepoznal Datenschutz, testy ani migrácie 002/003drobné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ódomdrobné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 chatedô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álezZávažnosťStavDôkaz / čo sa urobilo
Datenschutzerklärungkritické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 Datenschutzv 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)

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ý.

  1. 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).
  2. 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).
  3. 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.
  4. 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ý.
  5. 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.
  6. 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.
  7. Architektúra, fáza 1 (mesiac 2). Podľa architektúry: tabuľka organizations nahradí 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.
  8. 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é.

R1 · Supabase plán a zálohy
  1. 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í.
  2. Free + týždenný keep-alive ping z GitHub Actions + týždenný pg_dump (potrebujem heslo DB ako GitHub secret – nastavíš ho ty).
  3. Free bez ničoho – riziko: app jedno ráno nejde.
R2 · Offline režim úvodnej stránky (service worker)
  1. Áno, network-first (odporúčam) – po prvej návšteve funguje bez signálu, nové verzie sa načítajú, keď je sieť.
  2. Nie, zatiaľ nechať – menej pohyblivých častí.
R3 · Doména a odosielateľ e-mailov
  1. 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.
  2. Len SMTP cez Resend na subdoméne, ktorú už máš.
  3. Nechať vstavaný SMTP Supabase – funguje pre teba, nie pre pilot.
R4 · Impressum a zodpovedná osoba
  1. Do založenia spolku: ty ako fyzická osoba (meno, poštová adresa, e-mail) – odporúčam, dá sa doplniť dnes.
  2. 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@…).

R5 · Testovací projekt pre e2e app
  1. Druhý Supabase projekt „uebrig-test“ (Free) len pre CI (odporúčam) – testy rezervácie bežia proti skutočnej RLS bez rizika pre produkciu.
  2. Testovať len klientske správanie so zamockovaným Supabase – rýchlejšie, ale RLS netestuje.
R6 · Darovací kanál pre „Unterstützen“
  1. Twint QR na tvoje meno už teraz (najrýchlejšie, osobná zodpovednosť).
  2. Bankový účet spolku po založení + Twint (odporúčam, čisté účtovníctvo).
  3. Open Collective (transparentné, poplatok ~10 %).
R7 · Teploty v pravidlách (65 °C / 5 °C / 2 h)
  1. Zavoláš na Kantonales Laboratorium Bern (031 633 11 11) a potvrdíš alebo upravíš – odporúčam, 10 minút.
  2. Nechať prísnejšiu verziu bez overenia.
R8 · Overenie na tvojom iPhone

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.

R9 · Písma a zdroje pri otvorenej sieti
  1. 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ť“.
  2. 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):

Č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

ČoKde 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; viewportjob deploy, krok „Sanity check“áno – beh #14 (počítanie riadkov)
20 izolačných testov RLSdb/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 Supabaseruč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.