Zgodność z regulacjami
- WCAG
- RODO
01 · Wyzwanie
Wyzwanie
Podróżnik wpisuje w Google "szczepienia Kenia" i trafia na stronę CDC. Czyta listę 12 szczepień, z czego 3 są obowiązkowe, 4 zalecane, a reszta "w zależności od regionu". Nie wie, które dotyczą jego trasy. Nie wie, gdzie umówić wizytę u lekarza medycyny podróży. Nie wie, ile to kosztuje. Zamyka kartę.
Po drugiej stronie jest klinika travel medicine w Warszawie, która ma wolne terminy, wszystkie szczepionki na stanie i lekarza, który odpowiedziałby na każde z tych pytań w 5 minut. Ale ta klinika nie istnieje w Google dla hasła "szczepienia Kenia". Jej strona to wizytówka z numerem telefonu i mapką dojazdu.
To jest Care Gap: przepaść między rzetelną informacją medyczną a umówieniem wizyty. Dane WHO i CDC są publiczne, kliniki istnieją, pacjenci ich szukają. Brakuje warstwy, która łączy jedno z drugim.
Medova zamyka tę lukę. Jedno miejsce, w którym podróżnik dowiaduje się, jakie publiczne wymagania zdrowotne obowiązują dla jego kierunku, a klinika partnerska zyskuje kanał dotarcia do pacjenta, który już szuka rozwiązania. Sama kwalifikacja medyczna i plan szczepień powstają u lekarza w klinice, do której pacjent rezerwuje wizytę. Medova nie zastępuje konsultacji, tylko ją poprzedza.
Wymagania, które musieliśmy spełnić
Projekt prowadzony przez zespół EPKO w roli odpowiedzialnej za architekturę, kod, bezpieczeństwo i compliance. Zakres wprost wymagał potraktowania tematu enterprise od pierwszego dnia:
- 15 języków od dnia pierwszego, w tym arabski (RTL) i japoński. Rynek travel health jest globalny, a SEO w jednym języku to rezygnacja z 90% ruchu organicznego. Bez "dodamy później". Od pierwszego commita.
- Codzienna synchronizacja publicznych źródeł WHO i CDC. Pipeline odpytuje 6 zewnętrznych źródeł raz dziennie, normalizuje dane i aktualizuje publikowane wymagania per kraj × choroba × szczepionka. Aktualność danych to nie wygoda. To podstawa zaufania do platformy.
- Marketplace z bookingiem, płatnościami i weryfikacją klinik. Pełny flow: profil kliniki, kalendarz lekarza, slot, płatność, potwierdzenie. Każda klinika przechodzi weryfikację tożsamości, zanim trafia do wyników wyszukiwania.
- Architektura zgodna z RODO i ISMS od pierwszego commita. Dane art. 9 RODO (informacje zdrowotne) wymagają nadzwyczajnej ostrożności. Row-Level Security na każdej tabeli, audit trail, szyfrowanie, polityki retencji, jawne zgody. Wszystko zaprojektowane w architekturze, nie dopisane przed launchem.
- Granica MDR/AI Act narysowana świadomie. Medova prezentuje publiczne wymagania i łączy z kliniką. Sama diagnostyka, kwalifikacja medyczna i decyzje o szczepieniach pozostają po stronie lekarza w klinice partnerskiej. Ta granica jest spisana, udokumentowana i pilnowana w copy oraz UI.
- Budżet startupu, dyscyplina enterprise. Infrastruktura miała kosztować jak Supabase plus serwer dedykowany, nie jak AWS z konsultantem. Każda decyzja architektoniczna podejmowana z oglądem na koszt długoterminowy.
02 · Rozwiązanie
Rozwiązanie
Zamiast planować architekturę przez kwartał, zespół EPKO postawił działający prototyp w 6 tygodni. Kluczowa decyzja na starcie: nie budujemy "platformy, która kiedyś obsłuży 15 języków". Budujemy platformę, która obsługuje 15 języków teraz. Każdy dzień bez tureckiej, indonezyjskiej czy hiszpańskiej wersji to ruch organiczny, którego się nie odzyska.
Stack: świadome kompromisy, nie hype
Next.js 16 z App Routerem. SSR dla SEO (Google musi zobaczyć przetłumaczoną treść, nie spinner), a jednocześnie dynamiczne dashboardy dla klinik i adminów. Jeden framework na oba przypadki.
Supabase jako fundament backendu. PostgreSQL 15 z Auth, Storage, Edge Functions i Row-Level Security w jednym pakiecie. Alternatywa to kwartał na boilerplate autentykacji i autoryzacji, w platformie obsługującej dane art. 9 RODO niedopuszczalny start od zera. Trade-off: mniejsza elastyczność w skrajnych przypadkach. Akceptowalny dla tego etapu produktu.
Sanity v5 jako CMS treści edukacyjnych. Document-level i18n, Portable Text, embedded Studio pod /studio. Redaktor merytoryczny przygotowuje treść w jednym miejscu, a artykuł pojawia się w 15 wersjach językowych bez udziału developera.
Coolify na Hetzner zamiast Vercel/AWS. Serwer dedykowany w Niemczech (EOG, bez transferów do USA na warstwie hostingu), Docker standalone, zero vendor lock-in. Cloudflare jako CDN i DDoS, z polityką DPF dla zgodności RODO. Koszt: ułamek alternatywy chmurowej przy porównywalnej dostępności.
Routing wielojęzyczny: jeden z trudniejszych problemów
URL /pl/wiedza/choroby musi prowadzić do tego samego komponentu co /en/knowledge/diseases. Pliki na dysku leżą pod angielskimi ścieżkami, a tłumaczenia URL żyją w bazie, żeby dodanie nowego języka nie wymagało redeployu.
Rozwiązaliśmy to proxy w warstwie routingu. Nie middleware Next.js, nie redirecty, nie 15 kopii tych samych plików. Proxy przechwytuje request, rozpoznaje locale, tłumaczy ścieżkę na angielski odpowiednik i przekazuje do właściwego komponentu. Wszystko transparentnie dla użytkownika.
Bezpieczeństwo: 935 polityk RLS jako fundament zero-trust
Każda z 160 tabel ma polityki Row-Level Security. Kto może czytać, pisać, modyfikować, usuwać, na poziomie pojedynczego wiersza. Pacjent widzi tylko swoje dane. Klinika widzi tylko swoich pacjentów. Moderator widzi zgłoszenia. Admin widzi wszystko. Nawet gdyby ktoś ominął frontend i strzelił bezpośrednio do API, baza odmówi.
935 polityk to wynik systematycznego procesu, nie efekt uboczny. Każda nowa tabela uruchamia natychmiastowe pytanie: kto ma dostęp i dlaczego. Mamy własne narzędzie audytu, które blokuje merge, jeśli pojawi się tabela bez RLS.
Pipeline integracji publicznych źródeł
6 Edge Functions w runtime Deno odpytuje codziennie zewnętrzne źródła publiczne:
- WHO: Global Health Observatory, Disease Outbreak News
- CDC: Travel Notices, Vaccination Requirements
- Dane klimatyczne, koszty podróży, travel advisories
Dane trafiają do PostgreSQL, gdzie 16 zadań pg_cron normalizuje je i odświeża widoki publiczne. Pacjent w interfejsie widzi wymagania publikowane przez WHO i CDC dla wybranego kraju, z oznaczeniem źródła i daty ostatniej aktualizacji. Pełna kwalifikacja medyczna pacjenta odbywa się w klinice, do której rezerwuje wizytę.
Na wierzchu pipeline wewnętrzny w Pythonie, którego celem jest jakość danych źródłowych. XGBoost analizuje kompletność i stabilność feedów, Isolation Forest wykrywa anomalie (np. nagłe braki w feedzie WHO, wartości odstające od historycznego trendu). Alerty trafiają do redakcji Medovy, która decyduje o aktualizacji widoków publicznych. To jest narzędzie operacyjne dla zespołu treści, nie system rekomendacyjny dla pacjenta.
Compliance i ochrona danych: enterprise od pierwszego dnia
Medova przetwarza dane art. 9 RODO (szczególna kategoria, informacje o zdrowiu). To wymaga reżimu, który większość startupów odkłada na "potem". My traktujemy to jako warunek brzegowy:
- Dokumentacja zgodna z art. 30 RODO (rejestr czynności przetwarzania), z mapą wszystkich strumieni danych pacjenta między systemami.
- Ocena skutków przetwarzania (DPIA, art. 35 RODO) przygotowana dla operacji wysokiego ryzyka. Aktualizowana przy każdej istotnej zmianie architektury.
- Procedura zgłaszania naruszeń w 72 godziny do organu nadzorczego, z playbookami incydentu i listą kontaktów.
- Polityka retencji per typ danych, z automatyczną anonimizacją po upływie ustalonych okresów.
- Granica MDR/AI Act spisana w architekturze: Medova prezentuje publicznie ogłoszone wymagania WHO i CDC. Nie wydaje rekomendacji medycznych dla konkretnego pacjenta. Każde miejsce w UI, w którym pojawiają się wymagania zdrowotne, zawiera jednoznaczne zastrzeżenie o roli platformy oraz wskazanie, że decyzję kliniczną podejmuje lekarz w klinice partnerskiej.
Proces inżynierski: trzy bramy, zero ślepych punktów
Każdy push do produkcji musi być bezpieczny. Zbudowaliśmy trójbramkowy pipeline, w którym ciężkie sprawdzenia odbywają się lokalnie:
Brama 1, lokalna: pre-commit sprawdza sekrety, formatowanie i lint. Pre-push odpala pełny zestaw: lint strict, typecheck, 7 929 testów, build produkcyjny i kontrola rozmiaru bundle'a. Jeśli cokolwiek padnie, push nie przejdzie.
Brama 2, GitHub Actions: safety net. Lint i typecheck na każdym PR (łapie sytuacje, w których ktoś obszedł lokalne hooki). Na merge do main automatyczny push migracji do bazy produkcyjnej.
Brama 3, Coolify: wykrywa nowy commit na main, buduje obraz Dockera, deployuje kontener z zero-downtime. Rollback to jedno kliknięcie.
Cały proces wsparty narzędziami AI pair-programming (Claude Code, Cursor) jako częścią nowoczesnego workflow inżynierskiego. AI przyspiesza implementację powtarzalnych wzorców i pomaga w refaktoryzacji. Decyzje architektoniczne, schemat bazy, polityki bezpieczeństwa i code review pozostają w rękach inżynierów. To narzędzie, nie zastępstwo.
03 · Rezultaty
Rezultaty
Platforma w produkcji. Działający marketplace z bookingiem, płatnościami, panelem kliniki i panelem admina, obsługujący ruch organiczny w 15 językach. Liczby mówią więcej niż opis.
Skala kodu
1 778 plików TypeScript w strict mode. Każdy typ jawny, każdy null sprawdzony, każdy nieużywany import to błąd kompilacji. 904 migracje SQL oznaczają, że każda zmiana w bazie jest wersjonowana, odtwarzalna i audytowalna. Zero ręcznych zmian na produkcji.
- 541 komponentów React
- 105 endpointów API, 13 Edge Functions w runtime Deno
- 665+ commitów
- 15 języków z pełnym routingiem i przetłumaczonymi URL-ami
Jakość i bezpieczeństwo
7 929 testów to nie efekt pisania testów dla testów. Każdy test istnieje, bo chroni konkretny scenariusz. Od kalkulacji wskaźników jakości danych, przez flow rejestracji kliniki, po edge case'y w tłumaczeniach RTL. Do tego mutation testing (Stryker), który weryfikuje, że testy naprawdę łapią błędy, a nie tylko podnoszą coverage.
935 polityk RLS na 160 tabelach. Poziom bezpieczeństwa, który w tradycyjnym podejściu wymagałby dedykowanego security engineera na pół etatu. W Medovie wbudowany w architekturę bazy i utrzymywany przez tooling.
- 6 ról w systemie: patient, clinic, moderator, admin, analytics_viewer, sales
- ISMS zgodny z ISO 27001, fazy 1 do 4 ukończone, gotowość do certyfikacji ~90%
- 93 kontrole bezpieczeństwa, 10 udokumentowanych ryzyk, 4 playbooki incydentów
- Dokumentacja RODO: rejestr czynności przetwarzania (art. 30), ocena skutków (DPIA, art. 35), procedura 72h zgłaszania naruszeń
Infrastruktura
Cała infrastruktura w EOG (Hetzner DE) plus Cloudflare na warstwie CDN (DPF-compliant). Koszt miesięczny niższy niż jedna godzina pracy senior developera. Porównywalny ruch na Vercel Pro to rachunek 10 do 20 razy wyższy.
- Hosting: Coolify na Hetzner dedicated, koszt rzędu dziesiątek euro miesięcznie
- CDN: Cloudflare (DPF), DDoS protection, edge caching, SSL
- CI/CD: lokalne hooki plus GitHub Actions, ciężkie testy lokalnie
- Monitoring: SigNoz (OpenTelemetry), pełna obserwowalność bez licencji Datadog
Co to oznacza dla biznesu
- Marketplace w produkcji: pełny flow od wyszukania kliniki przez booking po płatność Stripe
- B2B API w beta: dokumentacja, klucze, rate limiting, gotowe dla partnerów integracyjnych (biura podróży, ubezpieczyciele)
- Founder's Program uruchomiony: pierwsze 50 klinik z zerową prowizją
- 4 tiery cenowe: od darmowego profilu po Enterprise z dedykowanym opiekunem
Co zachowujemy z tego projektu
Trade-offy mówią o partnerze technologicznym więcej niż listy sukcesów. Klient szuka kogoś, kto potrafi mówić o jednych i drugich.
Supabase: doskonały do MVP i szybkiego startu w warstwie auth, storage i RLS. Ale 935 polityk RLS to świadomy dług architektoniczny. Można było uprościć kosztem bezpieczeństwa. Zostawiliśmy.
15 języków od dnia 1: trudniejsza decyzja niż "dodamy potem". Routing, testy, treści, SEO, wszystko 15 razy bardziej złożone. W zamian przewaga w wyszukiwarkach, której się nie nadrabia retroaktywnie.
Mutation testing (Stryker): obok unit testów. Wyłapuje false-positive coverage, gdzie testy przechodzą, ale nie testują tego, co powinny. Dodatkowy koszt w CI, ale wart zachodu.
Granica MDR/AI Act od pierwszego dnia: platformy healthtech, które nie rysują tej granicy świadomie, wpadają w nią z impetem po roku rozwoju. My spisaliśmy ją w architekturze, w copy i w procesie code review.
