Fullstack aplikace · 2026
Journeo
Cestovatelský deník a plánovač skupinových výletů. Itineráře, dělení společných nákladů s přáteli a vyrovnání na jednom místě.

Role
Sólo projekt. Design, frontend, backend i infrastruktura.
Technologie
Přehled
Journeo vzniklo jako můj maturitní projekt a poté jsem ho od základu přepsal jako Journeo v2. Je to fullstack aplikace pro plánování výletů s dalšími lidmi: sestavíš itinerář den po dni, pozveš přátele, sleduješ společné výdaje, rozdělíš účet a vyrovnáte se, vše v jednom vícejazyčném rozhraní.
Problém
Plánování skupinového výletu znamená žonglovat se dvěma věcmi najednou: s plánem a s penězi. Kdo rezervoval byt, kdo zaplatil večeři, kdo komu ještě dluží. Většina nástrojů umí jen jedno, buď plánovač, nebo dělení výdajů, takže výlet skončí roztroušený mezi chatem, tabulkou a samostatnou aplikací na peníze. Chtěl jsem, aby itinerář a společný rozpočet žily na jednom místě.
Co jsem postavil
- Itineráře výletů den po dni s kalendářním výběrem dat
- Systém přátel: pozvi lidi na výlet a spravuj, kdo je součástí
- Dělení výdajů s výpočtem zůstatků ve stylu Splitwise a vyrovnáním na minimum transakcí
- Skupinové hlasování, aby mohl rozhodovat celý výlet
- Notifikace v aplikaci i e-mailem (Nodemailer)
- Vrstvené přihlášení: e-mail + heslo (bcrypt), Google one-tap OAuth a e-mailové OTP ověření s omezením pokusů
- Administrační panel a statistiky používání
- Plná lokalizace EN/CS s automatickou detekcí jazyka
Technologie a proč
Záměrně jsem si napsal vlastní backend na Express + MySQL místo sáhnutí po backend-as-a-service. Chtěl jsem vlastnit přihlašování, schéma i výpočty zůstatků a naučit se to, co platforma obvykle skryje: návrh REST routes, middleware, rate limiting a SQL migrace. Frontend je React na Vite kvůli rychlé iteraci, sdílecí Open Graph obrázky se generují dynamicky přes @vercel/og.
Nejtěžší část
- Algoritmus vyrovnání: převést spleť „kdo co zaplatil“ na co nejmenší počet transakcí, které srovnají zůstatky všech. Spočítám čistý zůstatek každého a poté pažravě páruji dlužníky s věřiteli.
- Udělat přihlašování opravdu bezpečně: omezení OTP proti zneužití, rate limiting citlivých endpointů a správné hashování hesel.
- Vyvíjet databázi, aniž bych ji rozbil. Dělení výdajů a vyrovnání přibyly později přes verzované SQL migrace.
Výsledek
Funkční nasazená aplikace, kterou skutečně používám k plánování reálných výletů. Hlavně mě ale naučila vlastnit projekt od začátku do konce: návrh schématu, autentizaci, nasazení i i18n, ne jen vrstvu UI.
Případová studie
Outlay