Zpět na blog
startup kvalty ai

Před rokem jsem neuměl postavit web

Dnes provozuji největší srovnávač autoškol v Česku. Možná největší český projekt postavený s pomocí AI.

Před rokem jsem neuměl postavit web. Jsem Android vývojář — Kotlin, Jetpack Compose, to je můj svět.

Dnes provozuji největší srovnávač autoškol v České republice. A možná i největší projekt v zemi postavený s pomocí AI.

Celé jsem to stavěl po práci. Žádný tým. Jen já, AI a odhodlání dodat.

Impuls

Začalo to rozhovorem. Kamarád hledal autoškolu v Praze a zeptal se mě na doporučení. Žádné jsem neměl. Tak jsem mu řekl, ať si to vygooglí.

Zkuste si někdy vygooglovat „autoškola Praha”. Najdete pár SEO-optimalizovaných škol na první stránce, pár zastaralých katalogů s nefunkčními odkazy a absolutně žádný způsob, jak porovnat ceny, úspěšnost nebo recenze na jednom místě. Ty informace existují — pohřbené v PDF na webech magistrátů, roztroušené po individuálních stránkách škol (z nichž mnohé vypadají, jako by se stavěly v roce 2005) a zamčené za telefonáty. Každá autoškola v Česku má IČO a je registrovaná u dopravního úřadu. Data jsou technicky veřejná. Ale nikdo je neagregoval do ničeho použitelného.

Jsem typ člověka, který tohle vidí a nedokáže to pustit z hlavy. Je tu mezera. Je očividná. Někdo by ji měl zaplnit. A když se ten „někdo” dlouho neobjeví, stanu se jím já.

Začátky

Když jsem začínal, strávil jsem týdny studováním dokumentace a hledáním „ideální architektury”. Pak mě to praštilo — kdybych se snažil pochopit všechno dopředu, nikdy nezačnu.

Tak jsem přešel na vibe coding. Místo memorování syntaxe jsem začal AI popisovat, co chci postavit — a dolaďoval to za pochodu.

Dobře — „vibe coding” zní lehkovážně. Ale tady je, co to reálně znamenalo: věděl jsem, co chci, aby systém dělal. Věděl jsem, jak funguje softwarová architektura — stavěl jsem Android aplikace profesionálně roky. Jen jsem neznal specifické zaklínadla webového ekosystému. React hooks místo Compose remember bloků. CSS místo XML layoutů. getServerSideProps místo ViewModel lifecycle. Koncepty se přenesly. Syntaxe ne.

Android na web: Co se přeneslo, co ne

Budu konkrétní ohledně změny mentálního modelu, protože si myslím, že to je užitečné pro každého nativního vývojáře, který zvažuje web.

Co se přeneslo přímo: Koncepty správy stavu. V Jetpack Compose přemýšlíte v pojmech state hoisting, unidirectional data flow a recomposition. React je stejná filozofie s jinou syntaxí. useState je mutableStateOf. useEffect je LaunchedEffect. useMemo je derivedStateOf. Jakmile jsem pochopil to mapování, mohl jsem AI popsat chování komponenty a okamžitě poznat, jestli je výstup strukturálně správný, i když jsem to neuměl napsat zpaměti.

Patterny dependency injection. Android má Hilt/Dagger. Web má… no, všechno od React Context po module-level singletony. Princip je identický — oddělte vytváření od používání. Mohl jsem popsat graf závislostí, který jsem chtěl, a AI ho zapojilo webově vhodným způsobem.

Co se absolutně nepřeneslo: Server-side rendering. Android nemá SSR. Neexistuje ekvivalentní koncept. Myšlenka, že se komponenta nejdřív vyrendruje na serveru, pošle HTML klientovi a pak se „hydratuje” do interaktivní aplikace — na tom mi dva týdny padal mozek. Pořád jsem psal komponenty, které předpokládaly, že klientský stav je dostupný při prvním renderu. Claude generoval správný SSR-kompatibilní kód a já ho „opravoval” přidáváním klientských závislostí, které rozbily hydrataci. Chvíli trvalo, než jsem si to zvnitřnil.

CSS. Android má constraint layouty, linear layouty a relativně předvídatelný box model. CSS je jiný vesmír. Flexbox dává smysl, jakmile ho pochopíte, ale kaskáda, specificita a 47 různých způsobů, jak vycentrovat div? Pořád občas popíšu, co chci vizuálně, a nechám AI vyřešit CSS. Žádná hanba.

Routing. Android má navigation graph — explicitní, typovaný, deklarativní. Next.js má file-based routing, což je elegantní, dokud nepotřebujete dynamické segmenty, catch-all routy, paralelní routy a intercepting routy. App Router vyšel přibližně když jsem začínal, a i zkušení weboví vývojáři z něj byli zmatení.

Křivka učení

Tady je upřímný timeline toho, jak vypadaly první měsíce.

Týden 1-2: Nedokázal jsem ani rozjet Next.js lokálně s konfigurací, kterou jsem chtěl. Pořád jsem pletl Pages Router a App Router dokumentaci. Nastavil jsem PostgreSQL databázi na Cloud SQL a strávil celý večer debugováním connection stringů, protože jsem nechápal, že Cloud Run používá Unix sockety, ne TCP, pro připojení ke Cloud SQL.

Týden 3-4: První funkční stránka — seznam autoškol vytažený z databáze. Bylo to ošklivé. Datový model byl špatně (měl jsem kurzy jako JSON blob uvnitř záznamu školy místo separátní tabulky). Ale rendrovalo se to. To byl obrovský pocit.

Měsíc 2: Autentizace. Tohle málem zabilo projekt. Zkoušel jsem NextAuth, pak jsem si vyrobil vlastní JWT implementaci (špatný nápad), pak jsem se vrátil k NextAuth s Directus jako backendem. Rozjet OAuth s Google a email/heslem současně zabralo celý týden. Session management mezi Next.js aplikací a Directus držel pohromadě lepící páskou.

Měsíc 3: První funkční prototyp s vyhledáváním, filtrováním a detailními stránkami škol. Ukázal jsem to pár kamarádům. Jejich první feedback: „Data jsou super, ale design vypadá jako vládní web.” Oprávněné. Další dva týdny jsem strávil na UI.

Měsíc 4-5: Sběr dat ve velkém měřítku. Napsal jsem scrapery (s pomocí Claude), které stahovaly data autoškol z veřejných registrů, městských webů a individuálních stránek škol. Parsování českých vládních PDF s ceníky bylo speciální druh pekla — každá obec je formátuje jinak. Některé jsou naskenované obrázky. Některé mají tabulky přes více stránek. Zvládli jsme to.

Měsíc 6: První skuteční uživatelé z organického vyhledávání. Google začal indexovat stránky škol. Pamatuju si ten přesný den — úterý — kdy Google Search Console ukázala 47 kliknutí. Ne 47 tisíc. 47. Byl jsem neúměrně nadšený.

Výsledek: Kvalty.cz

Aktuálně největší databáze autoškol v České republice a první krok k platformě, která srovná trh. Cíl je jednoduchý: přinést transparentnost tam, kde roky chyběla, a zviditelnit ty, kteří svou práci dělají poctivě.

Díky AI se podařilo zkrotit data, která byla dříve nedostupná:

  • 1 700+ autoškol zmapovaných po celé zemi
  • 15 000+ kurzů, služeb a poplatků extrahovaných a sjednocených
  • Ceníky schované v PDF → nyní porovnatelné jedním klikem
  • 237 000+ řádků TypeScript v monorepu
  • 163 databázových tabulek pohánějících platformu
  • Organický růst přes SEO, s reálnými recenzemi přibývajícími měsíčně

Dnešní stack: Turborepo monorepo se 3 Next.js aplikacemi (veřejný srovnávač, admin dashboard, portál pro autoškoly), Hono/tRPC backend, PostgreSQL s PostGIS pro geografické dotazy, všechno běží na Google Cloud. Každý kousek postaven s pomocí AI.

Plot twist

Původně jsem Android vývojář.

Stavba webové aplikace na moderním stacku (Next.js, PostgreSQL, Cloud Run) by normálně znamenala měsíce studia. Vibe coding otevřel zkratku. Já držím vizi a architekturu, AI řeší implementaci, UI/UX a datovou strukturu. Ne jako „nástroj na psaní kódu”. Spíš jako senior partner, který nikdy nespí.

Kód není akademicky čistý a nerozumím každému řádku pod kapotou. Ale funguje to pro tisíce lidí a to je pro mě teď důležitější. AI se přitom ukázalo jako překvapivě dobrý mentor.

Přemýšlení v produktech

Lidi se ptají, co „přemýšlení v produktech” vlastně znamená. Tady je konkrétní příklad.

Na začátku jsem musel rozhodnout: postavím vyhledávání jako full-text search, nebo systém strukturovaných filtrů? Vývojář zaměřený na kód by vybral technicky zajímavou variantu — třeba Elasticsearch, třeba fancy vektorové vyhledávání. Vývojář zaměřený na produkt se zeptá: co uživatel doopravdy potřebuje?

Člověk, který si vybírá autoškolu, se zajímá o: lokaci (blízko domova nebo práce), cenu (v rozpočtu), typ vozidla (motorka? náklaďák?) a možná jazyk (pro cizince). Nepotřebuje fuzzy full-text search. Potřebuje pět dropdown filtrů a mapu. Tak to jsem postavil. Zabralo to zlomek času, perfektně to slouží účelu a full-text můžu přidat kdykoliv, pokud data ukážou poptávku.

Další příklad: mohl jsem postavit propracovaný systém recenzí s nahráváním fotek, ověřenými nákupy a ML spam detekcí. Místo toho jsem spustil jednoduché textové recenze s manuální moderací. Není to škálovatelné. Nemusí být — dostávám tak 15 recenzí týdně. Až budu dostávat 150 týdně, zautomatizuju to. Ne dřív.

To je produktové přemýšlení. Stavějte pro fázi, ve které jste, ne pro fázi, o které fantazírujete.

Milníky, na kterých záleželo

  • 100 zmapovaných škol: Asi 6 týdnů. Minimální životaschopný dataset — dost na to, aby to bylo užitečné pro někoho v Praze, ale ještě ne komplexní.
  • 500 škol: Měsíc 3. Pokryta velká města. Tady jsem začal věřit, že projekt je reálný.
  • 1 000 škol: Měsíc 5. Celostátní pokrytí začalo být věrohodné. Mohl jsem hledat v jakémkoliv okresu a dostat výsledky.
  • První organická recenze od cizího člověka: Měsíc 7. Někdo, koho jsem nikdy nepotkal, napsal recenzi své autoškoly v Brně. Kvalty našel přes Google. To byl moment, kdy se produkt stal skutečným — lidi ho nacházeli, používali a přispívali daty bez jakéhokoliv pobízení ode mě.
  • První kontakt od majitele autoškoly: Měsíc 8. Majitel z Olomouce mi napsal s dotazem, jak aktualizovat informace o své škole. Tím jsem věděl, že platforma má viditelnost. Portálový dashboard pro školy jsem postavil následující týden.

Ohlédnutí

Jestli mě tenhle projekt něco naučil, tak to, že znalost frameworku je méně důležitá než vědět, co stavět. Produktové myšlení a ochota začít, i když nemáte všechny odpovědi — to je to, co tohle celé dostalo do produkce.

Přešel jsem od npx create-next-app k provozování největší platformy svého druhu v České republice za necelý rok. Sám, po pracovní době, s AI jako kopilotrem. 237 000 řádků TypeScript, 163 databázových tabulek, 1 700+ škol — nic z toho neexistovalo před 14 měsíci.

Mohl by webový vývojář tohle postavit rychleji? Asi prvních pár týdnů. Ale nemyslím, že ten rozdíl je tak velký, jak lidi předpokládají. Doménové znalosti jsou důležitější než znalost frameworku. Vědět, co stavět, je důležitější než vědět, jak to stavět. A AI je velmi, velmi dobrá v překlenování toho „jak”, jakmile máte jasno v „co”.

Udělal bych to znovu? Už plánuju další funkci. Před čtrnácti měsíci jsem neuměl postavit web. Teď provozuju největší platformu svého druhu v zemi. Pořád mi to úplně nedochází.


Mrkněte na to: kvalty.cz

Martin Svoboda

Martin Svoboda

Android vývojář ve Fortuně, zakladatel Kvalty.cz a Ferda App. Stavím produkty s Kotlin, React a AI-asistovaným vývojem z Prahy.