Případová studie · Mobilní aplikace + Backend

Sportsman — sociální síť pro 70+ sportů

Kompletní vývoj iOS a Android aplikace pro amatérské sportovce, kteří hledají soupeře, organizují tréninky a budují si sportovní komunitu. Včetně vlastního backendu na Google Cloud Platform a databáze.

React Native Expo SDK 54 Go (Echo) Google Cloud Platform Cloud SQL / MySQL Apple Sign-In Push notifikace Mapy & geolokace
Sportsman — ikona aplikace
Klient
Sportsman s.r.o.
Platformy
iOS, Android, web
Délka projektu
Aktivní vývoj od roku 2024
Role Reactive Studio
Kompletní vývoj — design, mobilní apps, backend, infrastruktura
Stav
V provozu, App Store i Google Play
Aktuální verze
1.0.9 (build 265)

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.

Hledáte podobné řešení?

Plánujete sociální nebo komunitní aplikaci, řešíte multiplatformní mobilní vývoj nebo škálovatelný backend na cloudu? Ozvěte se — projdeme s vámi zadání a navrhneme cestu.