Son güncelleme: 2026-09-17

WingerApp Gizlilik Politikası (v0 — kod-doğrulamalı taslak)

Son güncelleme: 2026-09-17 · Durum: Taslak, hukuki onay bekliyor (bu belge bir avukatın nihai onayının yerine geçmez).

Bu politika, WingerApp'in gerçekte hangi veriyi nerede işlediğini, kodun bugünkü hâline bakılarak yazılmıştır. Doğrulanamayan veya backend-engineer/security-privacy-reviewer teyidi gereken her madde [VERIFY: ...] ile işaretlenmiştir — bunlar yayından önce kapatılmalıdır.

Veri sorumlusu: Winger App (bkz. kvkk-aydinlatma-metni.md — tüzel kimlik [VERIFY: şirket unvanı/adresi]).

2026-09-18 güncelleme notu (web ekibi): S96/S98 (docs/security/backend-router-inventory-2026-09-17.md, commit 0044e1fb) kodda 2026-09-17'de düzeltildi ve bu belge o değişikliği yansıtacak şekilde güncellendi (aşağıda §1 madde 2, §3 ve §5'teki location_snapshots satırları). compliance-docs-writer bu güncellemeyi nihai hukuki incelemede doğrulamalıdır.


1. Özet — mimari ilke ve bilinen istisnalar

WingerApp'in tasarım ilkesi "kişisel veri cihazdan çıkmaz, sunucuya yalnızca geri döndürülemez SHA256 hash gider"dir (CLAUDE.md, memory-bank/Architecture.md). Ancak kod incelemesi bu ilkenin bilinen istisnalarını ortaya koymaktadır ve bu politika bunları gizlemez:

  1. Kayıt sırasında cinsiyet, ilgi cinsiyeti, şehir ve yaş bandı düz metin olarak sunucuya gönderilir ve saklanır (hash değil) — eşleştirme adayı filtrelemesi için gereklidir (backend/app/models/__init__.py, User tablosu; backend/app/api/auth.py::RegisterRequest). "İlgi cinsiyeti" alanı, kiminle flört etmek istediğinizi (dolayısıyla dolaylı olarak cinsel yönelimi) ifade edebilir — bkz. §9 ve acik-riza-metni.md. Kayıt formu ayrıca ilçe ve ülke bilgisini de düz metin olarak sunucuya gönderir ve users tablosunda saklar, ancak eşleştirme motoru bu iki alanı hiç okumaz ve bunlar artık GET /auth/me üzerinden de geri döndürülmez (S96, 2026-09-17) — bu iki kolon, gelecekte tamamen kaldırılması planlanan bir "drop-candidate" olarak işaretlenmiştir (bkz. docs/security/backend-router-inventory-2026-09-17.md).
  2. (S98, 2026-09-17'de düzeltildi) Konum güncellemesi artık yalnızca şehrinizi sunucuya gönderir — ham enlem/boylam artık kalıcı olarak saklanmaz. Önceden POST /api/location/update gerçek GPS koordinatınızı da location_snapshots tablosuna yazıyordu; bu davranış kaldırıldı (backend/app/api/location.py::update_location, commit 0044e1fb) çünkü kodda bu alanları okuyan hiçbir tüketici yoktu (eşleştirme motoru yalnızca users.city'yi kullanır) ve mobil uygulama zaten bu uç noktayı hiç çağırmıyordu. Uç nokta lat/lng/accuracy alanlarını kabul etmeye devam edebilir ama artık hiçbir yere yazmaz. location_snapshots tablosunun kendisi henüz silinmedi (bkz. §3, §5) — bu, izleyen bir temizlik migration'ına bırakılmıştır.
  3. Satın alma makbuzları (App Store/Google Play) doğrulama için Apple/Google'a gider — bu, platformların kendi zorunlu satın alma altyapısıdır.

Bunların dışında: profiliniz (isim, biyografi, fotoğraflar), tercih cevaplarınız, sohbetleriniz, yüz doğrulama verisi ve eşleştirme hesaplaması cihazınızda kalır.


2. Cihazınızda kalan, sunucuya hiç gitmeyen veriler

VeriNerede tutulurKanıt
Profil adı, biyografi, fotoğraflarCihaz (AsyncStorage), ProfileService.tsMobil kod tabanında bu alanları backend'e gönderen hiçbir çağrı yok (grep "/profiles/me" → 0 sonuç); bkz. §2.1 aşağıdaki önemli not
Tercih soru-cevap cevaplarınız (ilişki hedefi, sigara/alkol, vb.)Cihaz, PreferenceProfileServiceagents/agent-represented-matching.md
Sohbet mesajları (insan-insan)Cihazlar arası, uçtan uca şifreli (E2EE) P2P kanal; sunucu içeriği hiç görmezbackend/app/models/__init__.py::Conversation — yalnızca participant_1_id, participant_2_id, zaman damgaları; mesaj metni kolonu yok
Yüz doğrulama görüntüsü/embedding'iTamamen cihaz (Apple Vision / Google ML Kit)memory-bank/Features/Face-Verification.md; backend'e fotoğraf/embedding yükleyen hiçbir çağrı bulunamadı
Eşleştirme skoru, tercih ağırlıkları, gece-ajan-müzakeresi transkriptiCihazagents/agent-represented-matching.md §"Backend'e giden outcome yalnızca no_match | match"
Gece ajan müzakeresinde paylaşmayı seçtiğiniz kategori cevaplarıKarşı tarafın cihazına, uçtan uca şifreli (E2EE) — sunucuya değilAşağıdaki §7

2.1 Kullanılmayan ama var olan bir uç nokta — şeffaflık notu

Backend'de PUT /api/profiles/me adlı, profil adı/biyografi/fotoğraf URL'lerini kabul edip user_profiles tablosuna yazabilen bir uç nokta mevcuttur (backend/app/api/profiles.py). Ancak mobil uygulamanın hiçbir ekranı bu uç noktayı çağırmamaktadır (kod tabanında sıfır çağrı doğrulandı) — profil verisi bugün fiilen yalnızca cihazda tutulmaktadır. [VERIFY: backend-engineer] — bu uç noktanın amacı/geleceği netleştirilmeli; kullanılmayan PII-kabul edebilen uç noktalar bu projede daha önce (S15/S16, GET /api/profiles/{user_id}) güvenlik açığına dönüşmüştür ve kaldırılmıştır. Aynı sınıf risk burada da mevcuttur, kaldırılması veya en azından launch öncesi netleştirilmesi önerilir.


3. Sunucuya (backend) giden veriler — tablo tablo

Tablo/uç noktaİçerikAmaçKanıt
usersDID (kendi kendini sertifikleyen ortak kimlik — gizli değil), DID'in SHA256 hash'i, plan, cinsiyet, ilgi cinsiyeti, şehir, yaş bandı (düz metin, eşleştirme tarafından fiilen kullanılır) + ilçe, ülke (düz metin, saklanır ama eşleştirme tarafından okunmaz — drop-candidate, S96), negotiation_consent_enabled bayrağıKayıt, eşleştirme aday filtrelemesibackend/app/models/__init__.py:33-84
location_snapshots(S98, 2026-09-17 sonrası) artık yeni satır almıyor — tablo/kolonlar kodda duruyor ama POST /api/location/update lat/lng/accuracy'yi artık hiçbir yere yazmıyorYok (kullanılmayan, kaldırılması planlanan tablo)backend/app/api/location.py::update_location (yorum: "lat/lng/accuracy are accepted but no longer persisted anywhere")
match_outcomesİki hash'lenmiş kimlik arası tek yönlü match bildirimiKarşılıklı eşleşme tespitibackend/app/models/__init__.py:460-481
mutual_matchesKarşılıklı onaylanmış eşleşme (iki hash + zaman damgaları)Sohbet yetkilendirmesibackend/app/models/__init__.py:483-542
pair_cooldownsYönsüz çift hash'i + tekrar deneme bekleme süresiKötüye kullanımı/ısrarı önlemebackend/app/models/__init__.py:433-458
push_tokensExpo push token + platformBildirim gönderimibackend/app/models/__init__.py:274-293
payments, iap_transactionsPlan/ürün, tutar, durum, makbuzun SHA256 hash'i (ham makbuz saklanmaz)Satın alma doğrulama, muhasebebackend/app/models/__init__.py:111-138, 372-415
abuse_reportsBildiren/bildirilen DID, kategori (taciz/dolandırıcılık/sahte profil/spam/uygunsuz içerik/diğer), serbest metin açıklama (kullanıcı yazımı), kanıt hash'iModerasyonbackend/app/models/__init__.py:168-197; kategoriler mobile-app/src/screens/ReportBlockScreen.tsx:39-47
Sinyalleşme (WebRTC offer/answer/ICE)Hangi hash'lenmiş kimliğin hangisine, hangi amaçla (negotiation/chat) bağlanmaya çalıştığıP2P bağlantı kurulumubackend/app/api/signaling.py
TURN röle sunucusuBağlantı kurulamadığında medya/veri trafiğini röleler; röle sırasında IP adresinizi görür (TURN'ün doğası gereği, mesaj içeriğini görmez — trafik E2EE)Bağlanabilirlikmemory-bank/Features/P2P-Chat.md; kendi barındırılan (self-hosted) coturn
telemetry tablosu / TelemetryServiceCihaz id, oturum id, metrik adı/değeri, uygulama/İS sürümüÜrün analitiğibackend/app/models/__init__.py:141-165bkz. §8, dürüst DP uyarısı
device_attributions, revenue_sharesCihaz kimliğinin SHA256 hash'i (IDFV/Android ID), influencer kodu, gelir payıInfluencer atıf sistemibackend/app/models/__init__.py:299-366

Backend'in ASLA görmediği (mimari kısıt, kod doğrulandı): ham profil, tercih ağırlıkları/eşikleri, hangi kategorilerin sorulduğu, gece müzakeresinin transkripti, fotoğraf tercihi/kararı, fotoğrafın kendisi, eşleşme skoru/bandı (agents/agent-represented-matching.md — "Backend hiçbir zaman öğrenmez" listesi).


4. Üçüncü taraflar


5. Saklama süreleri

VeriSüreKanıt / durum
match_outcomes (karşılıksız)30 gün sonra otomatik silinir_sweep_expired_outcome_tables(), backend/app/models/__init__.py:466
mutual_matchesSon aktiviteden (sohbet) itibaren 90 gün hareketsizlik sonrası silinirbackend/app/models/__init__.py:501-515
pair_cooldownsno_match: 30 gün, incomplete: 7 gün, 90 günde en fazla 3 tekraragent-represented-matching.md
location_snapshotsS98 (2026-09-17) sonrası yeni satır yazılmıyor; hesap silindiğinde mevcut satırlar (varsa) silinir. [VERIFY: backend-engineer] — S98 öncesinden kalan eski satırlar için bir tek seferlik temizlik (backfill) yapılıp yapılmayacağı launch öncesi netleştirilmeli.
telemetry tablosu[VERIFY: backend-engineer] — otomatik TTL bulunamadı.
payments, iap_transactions, abuse_reportsHesap silindiğinde silinmez; DID bağı geri döndürülemez şekilde anonimleştirilir (bkz. §6). Finansal/moderasyon amaçlı süresiz saklanabilir.
Diğer tüm hesap verisiHesap silme talebiyle birlikte anında ve kalıcı olarak silinir (bkz. §6)

6. Hesap silme ve veri taşınabilirliği

Hesabınızı Ayarlar ekranından silebilirsiniz. Bu işlem DELETE /api/users/me uç noktasını çağırır (backend/app/api/users.py::delete_me) ve şu adımları eşzamanlı, tek bir istekte uygular:

  1. Kalıcı olarak silinenler: hesap kaydınız, profiliniz, engelleme kayıtlarınız, push token'ınız, ham konum anlık görüntüleriniz (location_snapshots), konum tercihiniz, kullanım defteri (usage_ledger), sohbet metadata'nız (conversations), tek yönlü eşleşme bildirimleriniz (match_outcomes), karşılıklı eşleşmeleriniz (mutual_matches), yeniden-deneme bekleme kayıtlarınız (pair_cooldowns).
  2. Kimlik bağı geri döndürülemez şekilde koparılan, ama kayıt tutulanlar: ödeme/satın alma kayıtlarınız (finansal denetim amaçlı) ve hakkınızda açılmış/sizin açtığınız kötüye kullanım bildirimleri (moderasyon geçmişi bütünlüğü amaçlı) — DID'iniz HMAC-SHA256(secret, did) ile geri döndürülemez bir sözde-kimliğe (deleted:<hash>) dönüştürülür; kayıt artık sizinle ilişkilendirilemez.
  3. İptal edilen: o anki oturum jetonu (JWT) anında kara listeye alınır; açık bir sinyalleşme WebSocket'iniz varsa kapatılır.

Bu işlem geri alınamaz.

Veri taşınabilirliği (KVKK m.11 / GDPR Art. 20): [VERIFY: backend-engineer] — bu görev kapsamında, kullanıcının kendi verisinin makine-okunur bir kopyasını uçtan uca otomatik olarak indirebileceği bir "veri dışa aktarma" uç noktası koda bulunamadı. legal_compliance_rolling_audit_v2.py/data_minimization.py gibi bazı backend modülleri isimlerinden "yasal denetim/dışa aktarma" çağrıştırsa da incelenen örnekler (data_minimization.py) sabit/mock veri döndüren saplama (stub) kod olduğu görüldü — gerçek bir kullanıcı-veri-dışa-aktarma akışı olarak güvenilemez. Öneri: launch öncesi ya gerçek bir öz-servis export uç noktası inşa edilmeli ya da bu hak destek talebi (support@…) üzerinden manuel karşılanmalı ve bu politika buna göre güncellenmeli.


7. Gece ajan müzakeresi (opsiyonel özellik)

Ayarlar'daki "Gece ajan müzakeresi" anahtarı varsayılan olarak kapalıdır ve istediğiniz an kapatılabilir (kapatınca devam eden bir görüşme varsa hemen iptal edilir). Açıkken:

Bu paragraf, mobile-app/src/screens/SettingsScreen.tsx'teki güncel (2026-09-16, S91 düzeltmesi sonrası) anahtar açıklamasıyla birebir tutarlı olacak şekilde yazılmıştır.


8. Telemetri — dürüst durum

Uygulama genel kullanım telemetrisi toplar (çökme/hata, özellik kullanım sayaçları). Mimari doküman "tüm telemetri Differential Privacy (DP, ε≤1.0) ile korunur" der, ancak bu iddia bugün genel telemetri hattı için DOĞRU DEĞİLDİR: TelemetryService.trackEvent() hattı gürültü eklemez, milisaniye hassasiyetli zaman damgası ve cihaz kimliği taşır, DID ile imzalanmış toplu (batch) gönderim yapar (memory-bank/Security-Privacy.md, "Kural #2 düzeltmesi", S87). Bu yüzden gece-ajan-müzakeresi özelindeki olay-bazlı telemetri şu an tamamen KAPALIDIR (NEGOTIATION_TELEMETRY_DP_READY = false, koşulsuz no-op) — gerçek DP korumalı bir telemetri hattı inşa edilene kadar hiçbir müzakere olayı sunucuya gitmez. Bu durum düzeldiğinde bu politika güncellenecektir.


9. Özel nitelikli (hassas) veri


10. Güvenlik


11. Çocukların gizliliği

WingerApp 18 yaş altı kullanıcılara yönelik değildir. Kayıt akışındaki en düşük yaş bandı seçeneği 18-25'tir (mobile-app/src/screens/OnboardingScreen.tsx:302, ageBandMinAge['18-25'] = 18). 18 yaşından küçük olduğu tespit edilen hesaplar kapatılır.


12. İletişim ve değişiklikler

Bu politika hakkında sorularınız için support@wingerapp.com (bkz. mobile-app/src/config/support.ts::SUPPORT_EMAIL). Önemli değişiklikler uygulama içi bildirimle duyurulur.


Ekler