- května 2026, devět ráno, Karlín. STRV, třetí patro, Event Space. Vstupní karty. Dvacet týmů rozkládá MacBooky po stolech. Nikdo nemluví moc nahlas, všichni vědí, že do pěti odpoledne mají postavit aplikaci, kterou někdo skutečně použije.
Náš tým má tři lidi a jeden plán: postavit loyalty appku pro reálnou kavárnu, ne pro fiktivního klienta z brief slidu. Otázka byla, jestli se to za sedm hodin dá stihnout tak, aby to zvládla baristka, která appku v životě neviděla, za třicet sekund.
Co se stihlo a co bych příště udělal jinak. Níže.
Expo × STRV Hackathon — co to vlastně bylo
Pořadatel: Expo a STRV společně. Na místě jejich engineers, kteří se motali po sále jako mentoři a odpovídali na otázky.
Celý den běžel od 9:00 do 19:00. Registrace ráno, ceremoniál večer. Build window ale bylo tvrdých 10:00–17:00, sedm hodin, po kterých následoval submit demo videa. Z dvaceti týmů, jedna až tři osoby v každém, vybrala porota top 5, které prezentovaly živě před publikem.
Téma: postavit reálnou mobilní aplikaci pro byznys, který žádnou nemá. Stack povinný: Expo (React Native). Claude Code credits k dispozici. Placený tier, který si v běžné práci málokdo nasadí.
Výhry: 10 000 dolarů v Expo creditech (pro tým, co buildí pravidelně, zhruba rok EAS), lístky na App.js Conf a trofej s blog featurem na webu Expo.
Atmosféra spíš profesionální než párty. Soutěž, ne afterwork.

Pro koho jsme stavěli — PFERDA
Když máš sedm hodin a chceš postavit něco, co reálně dává smysl, první rozhodnutí je: pro koho. My jsme šli za PFERDA z.ú., českou neziskovku, která provozuje tréninková pracoviště pro lidi s mentálním postižením a duševním onemocněním.
Konkrétně jde o kavárny Láry Fáry v Náchodě, Rychnově nad Kněžnou a Trutnově, Pekárnu Na Plechu a úklidovou firmu Láry Fáry. V kavárnách dělají reální zaměstnanci: Renča, Nelča, Petr, Patrik, Karel, Lukáš, Petra. Lidé, kteří by jinde práci hledali špatně, a přitom obsluhují, dělají kafe a komunikují se zákazníky úplně normálně.
Tahle volba měla i praktický rozměr. Většina malých kaváren si appku nikdy nenechá udělat: vývoj je drahý a ROI nejasné. Pro neziskovku to platí dvojnásob. A přitom zákazník, který se vrací každé ráno na espresso, je přesně ten, pro koho má digitální razítko smysl: žádná papírová kartička v peněžence, žádné „nemám ji u sebe, dáte mi to příště?".
Záměr byl jednoduchý. Shipnout něco, co by ta kavárna mohla reálně použít. Ne demo do koše. Něco, kde si zákazník naskenuje QR kód, dostane razítko a baristka se nemusí pět minut učit, kam má klepnout.
Co jsme za 7 hodin postavili
Sedm hodin jsou soutěžní hodiny: build window 10:00–17:00. Repo začíná commitem v 10:23 a poslední soutěžní commit padl chvíli před deadlinem. Tečku za commit historií dělá 21:05, to už byla práce po hodnocení, dotahování demo videa a kosmetiky pro nás samotné. Soudci to neviděli. My bychom se na to jinak doma dívali a brečeli.
Základ je 8-stamp loyalty card. Sbíráš razítka, na osmé dostaneš odměnu. Klasický model, který funguje v každé druhé kavárně v Praze, akorát bez papírové kartičky, kterou věčně nemůžeš najít.
Zákazník otevře appku, ukáže telefon u pokladny, baristka přepne svůj telefon do barista mode přes PIN gate, vygeneruje QR kód a zákazník ho naskenuje přes expo-camera. Razítko se přičte, na obrazovce běží animace a v pozadí se zaktualizuje loyalty card. Když je razítek osm, otevře se odměna.
Druhá vrstva: Apple Wallet pass. Zákazník si jedním klepnutím přidá kartu do Wallet, takže už ani nemusí appku otvírat. Stačí ukázat Wallet u pokladny a naskenovat QR. Push notifikace ho upozorní, když mu chybí jedno razítko do odměny nebo když mu odměna brzy expiruje.
Celkem 16 obrazovek. Onboarding (tři kroky), výběr pobočky, samotná loyalty card, scan a animace razítka. Plus achievements, settings a stránka o PFERDA. Backend běží na Supabase: sedm Edge Functions, mezi nimi redeem-stamp, generate-barista-code, generate-wallet-pass, display-qr a get-loyalty. Na storage sedí obrázky odměn a wallet pass templates.
Jedno zásadní rozhodnutí, které se vyplatilo. Zero-auth. Místo emailu a hesla jen device_id a AsyncStorage. Plný auth flow s OTP a recovery ti spolehlivě sebere dvě hodiny, které jednoduše nemáš. Pro produkci je to špatně, když si zákazník přeinstaluje telefon, přijde o razítka. Pro 17:00 deadline správně.
Brand jsme nepřevzali z webu, ale postavili nový: PFERDA Orange (#E97817), Sage Green a Soft Cream. Design jsme pracovně nazvali „Artisanal Premium". V praxi to znamená serifový display font na headlines, ručně laděné spacing místo defaultního Tailwind 4/8 gridu a ikonografii s tenkým strokem (1.5px) místo plně vyplněných tvarů. Cíl: appka, kterou si nasadí kavárna s vlastním vizuálem, ne jen řetězcový vzor.

Tech stack — proč Expo + Supabase byla správná volba
Konkrétně:
- Expo SDK 55 + Expo Router (file-based routing)
- React Native 0.83 + TypeScript strict
- NativeWind v4 (Tailwind syntax v RN)
- Supabase (Postgres + Storage + Edge Functions + RLS)
- TanStack Query v5 (server state)
- Zustand v5 (UI state)
- Reanimated v4 (animace)
expo-camera(QR sken),expo-notifications,expo-haptics,expo-wallet-passreact-native-qrcode-svg(barista mode generování)
Stack vybíráme podle jediného kritéria: nic nesmí zdržet. Pár konkrétních momentů, kdy se to vyplatilo.
NativeWind class string, který Karel zkopíroval z webového PoC kavárenské karty, fungoval v RN beze změny. Žádný překlad CSS na StyleSheet.create. File-based routing v Expo Routeru znamená, že nepíšeš router config: dáš soubor do složky a máš obrazovku. První redeem-stamp Edge Function jsem deployoval jedním příkazem supabase functions deploy během toho, co Libor doháněl onboarding screen. RLS policies jsme napsali během oběda v Supabase konzoli, ne v migration souborech.
EAS Build dostal app na TestFlight v čase oběda. Sedmnáct minut od eas build --profile preview k notifikaci v TestFlightu na telefonu. To je rozdíl mezi „uvidíš to na simulátoru" a „dej to baristce do ruky".
Tým
Tři lidi u jednoho stolu. Sedm hodin se nikdo nepodíval na telefon kvůli zprávě mimo téma.
- Jakub Kontra (autor článku)
- Libor Zahradka
- Karel Hojda
Libor a Karel rozsekali backend a screen flow, já jsem dotahoval app shell, animace a polish. Při tomhle tempu se nedá rozdělit role na papíře: sedneš si ke stolu, řeknete si, kdo má co rozjeté, a pak si nepřekážíte.
Důležité číslo: 7 hodin × 3 lidi = 21 person-hours. Sám máš sedm a vyleze z toho screenshot v Figmě, který pošleš do chatu s textem „kdyby byl čas".
Co bych příště udělal jinak
Jeden konkrétní learning, ke kterému se vracím nejčastěji. Setup dev environmentu celému týmu předem, před hackathonem, ne na místě.
První hodinu jsme řešili věci, které nemají s aplikací nic společného. Node verze (každý měl jinou — od 20 po 22, někdo přes nvm). Xcode simulator, který se někomu neaktualizoval půl roku. Expo Go přihlášení napříč účty. Env proměnné na Supabase. Pozvánky do Apple Developer teamu, aby se vůbec dalo buildit na TestFlight.
To je 1/7 času, tedy 14 % rozpočtu. 14 % features, které soudce neuvidí, protože ses je v kódu nestihl objevit.
Příště to uděláme jinak. Společný setup script ve sdíleném repu, otestovaný den předem aspoň jedním člověkem, který do něj jen klikne. Předpřipravený Supabase projekt s seed daty, sdílené env proměnné v 1Passwordu a Apple Developer access pro všechny tři, ne až ráno na místě. A třicetiminutový sync den předem, kde si každý ověří, že mu appka spustí na simulátoru. Bez tohohle je všechno ostatní jen wishful thinking.
Sedm hodin je krátká doba. Setup není „warmup" před závodem. Je to čistá ztráta minut, které mohly jít do features. A na hackathonu nemáš retro, kde si řekneš „příště líp". Buď se to soudci ukáže v aplikaci, nebo ne.
Co si z toho odnést
Nevyhráli jsme. Do top 5 jsme nepostoupili. A přesto je tohle jeden z mála hackathonů, kde mám pocit, že jsme něco doopravdy postavili. Appku, se kterou si baristka v Náchodě poradí za půl minuty.
Z toho dne si nesu dál tohle. Hackathon má smysl jen tehdy, když je na druhé straně reálný uživatel. Fiktivní persona z brief slidu nedonutí tým k tvrdým rozhodnutím (zero-auth, jeden brand, žádné nice-to-have screens). A vítězství na hackathonu a hodnota z hackathonu jsou dvě různé věci. Appka je v repu a dá se nasadit do kavárny. To žádná porota neudělí ani neodebere.
Díky STRV za prostor s atmosférou „postav, neprezentuj se", a Expu za organizaci a credits. Hlavně díky PFERDA z.ú. — neziskovky, které zaměstnávají lidi s postižením, jsou důvod, proč má smysl chodit i na hackathony zadarmo. A díky Liborovi a Karlovi; sám bych za sedm hodin postavil onboarding obrazovky a místo loyalty card screen plakal nad Apple Wallet dokumentací.
Stavíš firmu, která potřebuje appku? Nebo si chceš jen probrat Expo + Supabase stack? Píšeš na me@jakubkontra.com.


