Zadání
Klient přišel s vizí „Strava pro všechny sporty" — sociální platformou,
která propojí amatérské sportovce napříč disciplínami. Hlavní problém, který řešil:
v amatérských komunitách je obrovsky náročné najít soupeře nebo spoluhráče na konkrétní
sport ve svém okolí, koordinovat čas a místo, a budovat dlouhodobé sportovní vazby.
Existující sítě (Strava, Komoot) jsou orientované na výkonnostní data, ne na
socializaci a hledání lidí ke společnému tréninku.
Cílem MVP bylo vytvořit produkt, který:
- Pokryje desítky druhů sportu (od fotbalu a volejbalu přes lezení a běh až po šachy a stolní tenis) — ne jednu úzkou disciplínu
- Umožní uživatelům zveřejnit „hledám soupeře / spoluhráče" inzerát s časem, místem a úrovní
- Podpoří správu sportovních týmů — komunikaci, plánování zápasů, statistiky
- Bude od začátku multiplatformní (iOS i Android) a česky lokalizovaný
- Nabídne web pro nemobilní uživatele a marketing landing page
Naše role
Reactive Studio dodalo kompletní vývoj — od prvotní analýzy a UX
návrhu, přes design ve Figmě, mobilní aplikace v React Native, vlastní backend v Go
běžící na Google Cloud Platform, až po nasazení do App Store i Google Play
a dlouhodobou údržbu. Klient na nás přenesl celou technickou stránku produktu;
jeho tým se soustředí na byznys, marketing a komunitu.
Technologické rozhodnutí: React Native, ne dvě nativní aplikace
Pro mobilní část jsme zvolili React Native s Expo SDK 54. U sociální
aplikace s primárně CRUD UI (seznamy, profily, formuláře, chat, mapy) bylo sdílení
kódu mezi iOS a Androidem ekonomicky výrazně výhodnější než dvě nativní codebases.
Hermes JavaScript engine zajistil výkon srovnatelný s nativním pro 95 % UI scénářů.
Tam, kde to dávalo smysl (Apple Sign-In přes
@invertase/react-native-apple-authentication, push notifikace přes
expo-notifications, mapy přes react-native-maps), jsme
sáhli po established native modulech.
Pro backend jsme šli opačnou cestou — nativní Go s frameworkem Echo.
Tým má dlouhodobou expertízu v Go a u API serveru, který bude muset škálovat na
tisíce souběžných uživatelů s reálnými notifikacemi, je nízká paměťová stopa a vysoký
throughput Go binary nesrovnatelně lepší než Node.js nebo Python alternativy. Nasazení
jako Docker image na Google Cloud Run umožňuje automatické škálování
podle zátěže a nulové náklady v noci, kdy nikdo nehraje.
Architektura
Mobilní aplikace
- React Native 0.81 + Expo SDK 54
- TypeScript, Turbo monorepo (apps + packages)
- React Navigation 6 (stack + bottom tabs)
- Hermes JS engine
- Apple Sign-In, Google Sign-In
- react-native-maps, expo-location, expo-notifications
- EAS Build pro iOS i Android
- Tmavý vzhled jako primární UI styl
Backend
- Go 1.22 s Echo v4 frameworkem
- JWT autentifikace (golang-jwt)
- MySQL přes Cloud SQL (managed)
- Cloud Storage pro uživatelské obrázky
- Imaging library pro automatické thumbnaily
- Swagger / OpenAPI dokumentace endpointů
- Cron jobs (robfig/cron) pro periodické úlohy
- Firebase Cloud Messaging pro push
Infrastruktura
- Google Cloud Platform (projekt sportsman-a1549)
- Cloud Run (containerized API server)
- Cloud SQL: managed MySQL instance
- Cloud Storage pro media
- Secret Manager pro DB hesla a JWT klíče
- Managed SSL certifikáty (managed-cert)
- Service Accounts s least-privilege IAM
- Universal Links přes go.sportsmanapp.cz
Quality assurance
- Jest pro unit testy
- WebdriverIO + Appium pro end-to-end
- Allure reporting pro QA výstupy
- ESLint + TypeScript strict
- Regression test scripts pro iOS i Android
- Postman kolekce pro API ověření
- Docker compose pro lokální vývoj a CI
- Self-hosted CI pipeline pro release
Klíčové technické výzvy
1. Apple Sign-In s vlastním backendem
Apple vyžaduje, aby všechny aplikace nabízející „Sign in with Google" nabízely zároveň
i „Sign in with Apple". To není jen UI tlačítko — vyžaduje to validaci JWT tokenu na
serveru proti Apple veřejnému klíči, mapování Apple identifierů na uživatele a péči
o ten fakt, že uživatel může schovat svůj e-mail. Vyřešili jsme to
dvojí integrací: na klientovi standardně přes
@invertase/react-native-apple-authentication, na backendu vlastním
Go modulem pro JWT validaci s rotujícím Apple JWKS cache.
2. Geolokace a hledání akcí v okolí
Hlavní use-case Sportsmana — „najdi mi tenis na zítra do 10 km od domova" —
vyžaduje radius search nad MySQL. Použili jsme klasický
haversine SQL výpočet s indexem na (lat, lng), což pro očekávanou
uživatelskou bázi (desítky tisíc událostí) zvládá pod 50 ms. Až by zátěž vyžadovala
více, máme připravený přechod na PostGIS nebo geohash buckets.
3. Push notifikace s respektem k tichým hodinám
Sociální aplikace je magnet na spam notifikace. Navrhli jsme notification system,
který agreguje upozornění v 15-minutových oknech (kromě kritických — zápas za
hodinu), respektuje uživatelské tiché hodiny a nikdy neposílá víc než 3 push denně.
Backend si drží last-sent timestamp per uživatel a typ; klient zobrazuje
badge count vypočítaný z neviděných položek.
4. Multiplatformní release pipeline
Současná verze 1.0.9 je build 265 — na to jsme se dostali přes EAS Build
s automatizovaným release procesem. Z jednoho `git push` proběhne build pro iOS i
Android, run regression e2e testů, a pokud projdou, deploy do TestFlight a Google Play
internal testing. Promotion na produkci je manual gate. Při release crashe se nezvětší
blast radius — Expo Updates nám dovoluje OTA fix bez App Store review.
Co aplikace dnes umí
- 70+ druhů sportů — fotbal, futsal, volejbal, basketbal, tenis, badminton, squash, golf, lezení, běh, kolo, plavání, šachy, stolní tenis, šipky, bowling a mnoho dalších
- Inzeráty „hledám hráče" s časem, místem, úrovní a počtem volných míst
- Týmy — vytvoření, pozvánky, role, plánování zápasů, společný kalendář
- Profily uživatelů se sportovní historií a hodnocením
- Geolokace a filtrování akcí v okruhu
- Apple a Google Sign-In + klasická registrace
- Push notifikace s respektem k tichým hodinám
- Lokalizace primárně v češtině s připravenou strukturou pro další jazyky
- Web sportsmanapp.cz pro marketing a registraci nových uživatelů
Aktuální stav a další vývoj
Sportsman je v provozu a aktivně se rozvíjí. Aktuální verze 1.0.9 je k dispozici
v App Store
a Google Play. Aktivně pracujeme na rozšíření funkcí pro týmy, lepším onboardingu
uživatelů a přípravě na Apple Watch komplikaci pro nadcházející tréninky.
Co si z projektu odnášíme
Projekt potvrdil, že React Native je pro sociální aplikaci s typickým CRUD UI
ekonomicky správná volba — sdílíme přibližně 92 % kódu mezi iOS a Androidem.
Současně se osvědčil Go backend na Cloud Run s předvídatelnými náklady (95 % nákladů
tvoří Cloud SQL, ne compute) a robustní deployment pipeline přes EAS Build.
Architektura je připravená na 10× nárůst uživatelské báze bez výrazných změn.