Android için cihaz üzerinde çalışan ekran içeriği filtresi. Site listesi yok — ekranı gerçek zamanlı analiz eder, eşik aşılınca tam ekran overlay bindirip ana ekrana atar.
Ekranı iki ayrı yoldan okur: pikseli (görsel sınıflandırma) ve içeriği (erişilebilirlik ağacındaki metin). Gizli sekme pikseli kapatıyor, içeriği kapatmıyor — kör nokta oradan kapanıyor.
Hiçbir veri cihazdan çıkmaz. Tüm analiz lokal.
Ekranı iki ayrı yoldan okuyoruz, çünkü Android ikisini birden kapatmıyor.
ForegroundAppWatcher ─ izlenen uygulama önde mi? (değilse her şey kapalı → batarya)
↓
┌────────────────────────────┬────────────────────────────┐
│ KANAL 1 — PİKSEL │ KANAL 2 — İÇERİK │
│ takeScreenshot() │ erişilebilirlik ağacı │
│ ↓ │ ↓ │
│ NsfwClassifier (TFLite) │ ScreenReader (metin) │
│ ↓ │ ↓ │
│ ImageEvidence (ten/renk) │ ContentAnalyzer │
│ │ │
│ FLAG_SECURE'da KÖR │ FLAG_SECURE'dan ETKİSİZ │
└────────────────────────────┴────────────────────────────┘
↓ ↓
└──────────► max(görsel, metin) ◄────┘
↓
DetectionEngine ─ EMA → pencere oylama → histerezis → soğuma
↓
OverlayManager ─ SYSTEM_ALERT_WINDOW overlay + HOME intent
İki kanal da aynı ölçeğe eşlenip aynı karar motoruna giriyor. Yani gizli sekmede devreye giren yol, normal kullanımdakiyle aynı yanlış-pozitif katmanlarından geçiyor; ayrı kuralları, ayrı eşikleri yok.
Tek karelik yüksek skor asla bloklamaz — HARD eşiği bile iki ardışık kare istiyor. Altı katman sırayla:
| Katman | Ne yapar | Neyi engeller |
|---|---|---|
| Sınıf ağırlığı | sexy sınıfı 0.35 ile çarpılır, drawings 0 |
Plaj, spor, moda, tişörtsüz fotoğraf |
Görsel kanıt (ImageEvidence) |
Ten/renk/düzlük ölçer, model iddiasını pikselle doğrular | Çöp adam, diyagram, çizgi çizim, metin ekranı |
| EMA (α=0.45) | Skoru yumuşatır | Ani tek kare sıçraması |
| Pencere oylama | Son 8 karenin 5'i ≥0.68 olmalı | Kaydırırken denk gelen kare, thumbnail, reklam |
| Histerezis | Açılma 0.68, kapanma 0.40 | Bloğun açılıp kapanıp titremesi |
| Soğuma | Blok kalktıktan 4s sonra yeniden tetiklenebilir | Flapping |
Model stil ile içeriği ayıramıyor: çizgi çizimleri drawings ile hentai
arasında bölüyor ve hentai ağırlığı 0.95 olduğu için basit bir çizim
0.94'ü aşıp tek karede blok tetikleyebiliyordu.
İki düzeltme:
ImageEvidence— çıplaklık ten gerektirir. Kare 4×6 karoya bölünüp en yoğun karonun ten oranı ölçülüyor; ten yoksa modelin iddiasını piksel desteklemiyor demektir ve skor kırpılıyor. Çizgi çizim (akromatik piksel oranı yüksek + renklilik düşük + ten yok) doğrudan sıfırlanıyor.HARD_FRAMES_REQUIRED = 2— hızlı yol artık iki ardışık kare istiyor.
Bedeli, bilerek kabul edilen iki boşluk: siyah-beyaz fotoğraf (ten kroması yok, kural devre dışı bırakılıyor) ve çizgisel/siyah-beyaz manga.
Simülasyon sonuçları (sim.py mantığıyla):
Tek kare sıçrama -> tetiklenmedi ✓
İki kare sıçrama -> tetiklenmedi ✓
Plaj/spor (sürekli 0.30) -> tetiklenmedi ✓
Moda reklamı (sürekli 0.58) -> tetiklenmedi ✓
Gürültülü, ort. düşük -> tetiklenmedi ✓
Gerçek içerik, sabit yüksek -> BLOK @3s
Gerçek içerik, yavaş artan -> BLOK @8s
Tartışmasız (HARD) -> BLOK @0s
Dalgalı ama sürekli yüksek -> BLOK @4s
Tepki süresi 3-8 saniye. Bu bilinçli bir takas: daha hızlı tetiklemek için pencereyi daraltırsan false positive oranı fırlar.
app/src/main/assets/nsfw.tflite yok — bunu sen koyacaksın. Uygun aday: MobileNetV2 tabanlı 5 sınıflı NSFW sınıflandırıcı (drawings, hentai, neutral, porn, sexy), Keras/H5 formatındaki açık kaynak sürümlerini TFLiteConverter ile dönüştürebilirsin:
import tensorflow as tf
m = tf.keras.models.load_model("nsfw_mobilenet_v2_140_224")
c = tf.lite.TFLiteConverter.from_keras_model(m)
c.optimizations = [tf.lite.Optimize.DEFAULT] # int8 quant, ~4x küçük, çok daha hızlı
open("nsfw.tflite", "wb").write(c.convert())Farklı bir model kullanırsan Config.INPUT_SIZE ve NsfwClassifier.NUM_CLASSES ile sınıf sırasını (weighScore) güncelle.
Android Studio → yeni proje aç → bu dosyaları kopyala. Kök build.gradle.kts ve settings.gradle.kts Android Studio'nun ürettiği standart hâliyle kalabilir.
- Overlay — uygulama içinden buton, Ayarlar'a atar
- Kullanım erişimi — Ayarlar > Özel erişim > Kullanım erişimi, manuel açman gerekiyor, runtime prompt yok
- Erişilebilirlik — Ayarlar > Erişilebilirlik > Perde. Atlanabilir değil. İki iş birden yapıyor: ekran görüntüsünü izin sormadan alıyor ve içerik kanalını besliyor. Kapalıysa gizli sekme kör nokta olarak kalır ve koruma süreç ölümünden sonra geri gelmez
- Ekran yakalama — yalnızca erişilebilirlik yolu çalışmıyorsa (API 30 altı) sorulur; her yeniden başlatmada tekrar sorar
- Pil optimizasyonu dışına al — yoksa sistem servisi öldürür. Ayarlar > Pil > Kısıtlanmamış
İlk kurulumdan sonra eşikleri kendi kullanımına göre ayarla. ScreenGuardService.tick() içine geçici log ekle:
Log.d("CAL", "raw=%.3f ema=%.3f pkg=%s".format(raw, decision.smoothedScore, pkg))adb logcat -s CAL ile normal kullanımda 1-2 gün skorları izle. Günlük içerikte gördüğün en yüksek skor SOFT_THRESHOLD'un belirgin altında kalmalı. Kalmıyorsa:
- Yanlış tetikleniyor →
SOFT_THRESHOLD+0.05,WINDOW_HITS_REQUIRED+1,W_SEXY-0.10 - Geç/hiç tetiklenmiyor →
SOFT_THRESHOLD-0.05,WINDOW_HITS_REQUIRED-1
Tek seferde tek parametre değiştir, yoksa neyin işe yaradığını göremezsin.
Varsayılan mod BLACKLIST: Config.EXCLUDED_PACKAGES dışındaki her
uygulama kapsanıyor. Liste bakımı yok, bilmediğin bir tarayıcı da kapsam
içinde. WATCHED_PACKAGES yalnızca monitorMode elle WHITELIST
yapılırsa kullanılıyor.
Dışlama listesine bir şey eklemek isteyebileceğin tek durum: yanlış tetiklenmenin gerçekten zarar vereceği yerler (harita — araba kullanıyorsundur, kamera — acil bir an olabilir).
Gerçek cihazda ölçüldü (Xiaomi, Android 16 / HyperOS). Üçü de "uygulama kurulu görünüyor ama hiçbir şey yapmıyor" tablosuna çıkıyor ve üçü de hata değil. Kullanıcıya anlatılmazsa uygulamanın bozuk sanılmasının ana sebebi bunlar.
1. Play Protect kurulumu reddediyor (INSTALL_FAILED_VERIFICATION_FAILURE).
adb, pm install, elle kurulum — hepsi aynı kapıya çıkıyor. Sebebi mantıklı:
ekran görüntüsü + overlay + erişilebilirlik + kapatma gecikmesi, Play
Protect'in izleme yazılımı imzasıyla birebir örtüşüyor.
Aradaki fark şu: izleme yazılımı gördüğünü bir yere göndermek zorundadır,
Perde'nin ise INTERNET izni hiç yok — soket açamaz. Bu ayrım hem doğru hem
de manifestten doğrulanabilir, kullanıcıya böyle anlatılmalı.
Play Store › profil › Play Protect › ⚙ › taramayı kapat → kur → geri aç
2. Android 13+ kısıtlanmış ayarlar. Mağaza dışından kurulan uygulamada erişilebilirlik anahtarı sistem tarafından kilitli geliyor. Açılmazsa metin kanalı hiç çalışmaz; gizli sekme kapsanmaz ve tablo dışarıdan "tespit etmiyor" gibi görünür.
Ayarlar › Uygulamalar › Perde › ⋮ › Kısıtlanmış ayarlara izin ver
Bu duvara projenin kendi geliştiricisi iki kez takıldı ve ikisinde de kod hatası sandı. Kullanıcıdan farkını anlamasını beklemek gerçekçi değil.
3. Klon / ikili uygulama profilleri. Üreticinin "dual app" ya da klon profilinde (Xiaomi Second Space gibi) çalışan tarayıcı, ana profildeki Perde tarafından ne okunabiliyor ne de görüntülenebiliyor. Çözümü yok; Android'in uyguladığı bir sınır.
- Bildirim gizlenemez. Foreground service kalıcı bildirim zorunlu. IMPORTANCE_MIN ile en aza indirildi ama kaldırılamaz.
- Ekran kayıt göstergesi. Android 14+ MediaProjection aktifken durum çubuğunda gösterge çıkarabilir. Bu sistem davranışı, bypass edilemez.
- Uygulamayı öldüremezsin.
killBackgroundProcessesüçüncü parti uygulamalara işlemiyor. Overlay + HOME intent pratikte aynı işi görüyor. - Kapatma gecikmesi.
DISABLE_DELAY_MS= 15 dk. Bunu düşürürsen uygulamanın anlamı kalmaz — anlık dürtüyle kapatılabilen filtre filtre değildir. Sideload ettiğin içinadb uninstallile her zaman kaldırabilirsin; asıl sürtünme buradan geliyor, teknik kilitten değil. - Batarya. Sadece izlenen uygulamalar öndeyken çalışır. Quantize edilmiş model + 1 fps + 1/4 çözünürlükte pratik etki düşük. GPU delegate destekleniyorsa otomatik kullanılır.
Gizli sekmede ve FLAG_SECURE kullanan uygulamalarda ekranın pikseli
alınamaz: takeScreenshot ERROR_TAKE_SCREENSHOT_SECURE_WINDOW döner,
MediaProjection siyah kare verir ya da hiç kare vermez. Bu bir hata değil,
Android'in tasarımı ve root olmadan piksel seviyesinde çözümü yok.
Ama piksel içerik değildir.
FLAG_SECURE render edilmiş yüzeyi korur. Erişilebilirlik ağacı ayrı bir yapıdır ve o bayraktan etkilenmez. Gizli sekmede ekran görüntüsü siyah gelirken adres çubuğu, sayfa başlığı, başlıklar, bağlantı metinleri ve görsel alt metinleri okunmaya devam eder. Yani gizli sekmede "hiçbir şey göremiyoruz" doğru değil: pikseli göremiyoruz, içeriği görüyoruz.
Uygulamanın gizli sekme yanıtı bu: piksel yerine içeriği okumak ve kararı okuduğu şeye göre vermek.
Önceki sürüm "tarayıcıda ekranı göremiyorsam gizli sekmedir, blokla" diyordu. Bu bir tahmindi ve tahmin olduğu için etrafına sürekli yama gerekiyordu:
- FLAG_SECURE'u meşru kullanan uygulamaları ayırmak için tarayıcı listesi
- Reddit anonim mod / Telegram gizli sohbet için "önce okunabiliyordu, sonra gizledi" davranış kuralı
- O kuralın bankaların splash ekranında yanlış tetiklenmemesi için ısınma sayacı
- Ve hepsine rağmen Netflix oynatmaya basınca bloklanıyordu
Hepsi silindi. Yerine tek cümlelik bir kural geldi: kanıt varsa blok var, yoksa yok. Bankacılık uygulaması da okunuyor; okunan şey bankacılık olduğu için skoru sıfır çıkıyor ve bloklanmıyor. Banka isimlerini bilmeye gerek yok, davranışını izlemeye de gerek yok.
Bu bir anahtar kelime listesi kontrolü değil. Sözlükte tek bir alan adı, tek bir marka adı yok — alan adı sonsuzdur, o savaş kaybedilir. Sözlükte olan şey dil: bir sayfanın pornografik olduğunu söyleyen kelimeler. Sitenin adı ne olursa olsun sayfanın metni aynı kelimelerden kuruluyor, o yüzden hiç duyulmamış bir alan adı da yakalanıyor.
Beş katman:
| Katman | Ne yapar |
|---|---|
| Normalizasyon | PORNO, pоrno (Kiril o), p0rn0, p o r n o, pornosu → hepsi tek biçime iner. Türkçe karakter, aksan, Kiril/Yunan görsel ikizleri, leet, ayraçla parçalama |
| Kanıt birleşimi | Terimler dört ağırlık sınıfında (güçlü / belirsiz / destek / ters). Noisy-OR ile birleşir; hiçbir tek terim tek başına 1.0'a ulaşamaz |
| Destek çarpanı | Tek eşleşme karar veremez: 1 terim 0.49, 2 terim 0.74, 5 terim 0.96 katsayı alır. Sohbette geçen tek kelime bu yüzden bloklamıyor |
| Yoğunluk | 100 kelimede kaç eşleşme. Ölçüldü: haber yazısı ~2, ansiklopedi maddesi ~9, porno sayfası 23-79. Tek başına en ayırt edici sinyal |
| Ters kanıt | Bankacılık, sağlık, eğitim, alışveriş, yazılım kelimeleri skoru aşağı çeker. Yoğunluk 20'yi aşınca devre dışı — porno sayfası "güvenli ödeme" yazarak bağışıklık kazanamasın |
Metin skoru, Hassasiyet.textSoft eşiği tam olarak görsel soft eşiğine
denk gelecek şekilde eşlenip aynı karar motoruna giriyor. Yani gizli
sekmede de aynı pencere oylaması, aynı histerezis, aynı soğuma işliyor.
python tools/metin_sim.py — sözlüğü Lexicon.kt'den doğrudan okur, yani
simülasyon uygulamadan sapamaz. 28 gerçekçi ekran metni örneği:
BLOKLANMASI GEREKENLER skor
porno tube (TR) 1.000
porn tube (EN) 1.000
gizli sekme, sadece adres + başlık 0.965
erotik hikaye sitesi (metin, görüntü yok) 1.000
obfuske arama ("p0rn", "p o r n o") 1.000
porno sayfası, İspanyolca (sözlükte yok) 0.958
BLOKLANMAMASI GEREKENLER skor
bankacılık 0.000
şifre yöneticisi 0.000
kadın doğum randevu uygulaması 0.000
YouTube / Netflix / Instagram / Tinder 0.000
küfürlü tweet 0.000
cinsel sağlık makalesi 0.078
haber: tecavüz davası 0.049
biyoloji dersi: üreme sistemi 0.297
wikipedia: insan cinselliği 0.318
sözlük maddesi: cinsellik 0.371
porno bağımlılığıyla mücadele yazısı 0.453
iç giyim alışverişi 0.143
eşik (DENGELİ) 0.780
en düşük doğru pozitif 0.958
en yüksek doğru negatif 0.453
boşluk 0.506
DENGELİ eşiğinde hata yok. SIKI (0.68) ve KATI (0.60) eşiklerinde de yok — aradaki boşluk yarım puandan geniş.
Ölçülen, kabul edilen, gizlenmeyen:
| Boşluk | Neden | Ne kadar önemli |
|---|---|---|
| Metinsiz sayfa | Tek video sayfası, örtmeceli başlık ("Üvey abla ile - 1080p"), kelimesiz alan adı | O sayfaya bir liste sayfasından gelinir; liste sayfası zaten bloklanır. Gizli sekmede doğrudan adres girilirse kaçar |
| Latin dışı alfabe | Sözlük Latin; Kiril/Arapça/CJK metin normalizasyonda düşüyor | Rusça/Arapça porno sayfası kaçar. İspanyolca/Almanca/Fransızca "porno" ortak kelime olduğu için yakalanıyor |
| Erişilebilirlik kapalı | İçerik kanalı tamamen bu servise bağlı | Servis kapalıysa gizli sekme kör nokta olarak kalır. Tanı ekranında erisilebilir KAPALI yazar |
| Salt görsel içerik | Sayfada gerçekten hiç metin yoksa | Nadir; sayfa başlığı bile genelde bir şey söyler |
Son çare olarak "hiçbir şey okunamazsa engelle" ayarı var (varsayılan kapalı, yalnızca tarayıcılarda, 8 tick kesintisiz sessizlikten sonra). DRM'li video oynatıcılar da bu duruma düştüğü için kapalı geliyor.
Okunan metin yalnızca bellekte tutuluyor, bir sonraki okumada üzerine
yazılıyor. Diske yazılmıyor, loglanmıyor, cihazdan çıkmıyor. Tanı ekranı
metni değil yalnızca sayıları gösteriyor (s2 m1 d5 g0 yog12.4 tok80).
Koruma kapalıyken hiç okuma yapılmıyor.
Erişilebilirlik servisi ekrandaki her metni okuyabilir — bu güçlü bir yetki. Sideload edilmiş, kaynağı elinde olan bir uygulamada veriyorsun; Play Store'dan kurulan bir uygulamaya vermeden önce iki kere düşün.
Ayarlar > Ağ > Özel DNS > sağlayıcı adı gir. Filtreleyen bir DoT sağlayıcı kullanırsan gizli sekme dahil sistemin tamamı kapsanır — DNS piksel görmüyor, FLAG_SECURE'ın etkisi yok.
Sınırı: alan adı bazlı, IP'ye doğrudan gitmek veya VPN kurmak atlatır. Ayarı değiştirmek 10 saniye sürer, teknik kilit değil.
LSPosed üzerinde FLAG_SECURE'ı sistem genelinde devre dışı bırakan modüller var; pikseli gerçekten geri getiriyorlar. Bedeli: bootloader açma (cihaz sıfırlanır), root, Play Integrity kırılması — bankacılık uygulamaların ve bazı oyunlar çalışmaz.
İçerik kanalı geldikten sonra bu takasın karşılığı kalmadı: root'un getireceği tek ek şey metinsiz sayfaların pikseli.
Bu bölüm tahmin değil, derlenmiş kod üzerinde ölçüldü.
| İçerik | DENGELI | SIKI | KATI |
|---|---|---|---|
| Açık içerik | BLOK | BLOK | BLOK |
| Hentai / çizim | BLOK | BLOK | BLOK |
| Güçlü müstehcen, giyimli | geçer | BLOK | BLOK |
| Instagram teşvik edici | geçer | geçer | BLOK |
| TikTok dans / vücut | geçer | geçer | BLOK |
| Plaj / tatil fotoğrafı | geçer | BLOK | BLOK |
| Spor salonu / fitness | geçer | geçer | BLOK |
| Moda / iç giyim reklamı | geçer | geçer | BLOK |
Kalın olanlar yanlış tetiklenme.
Bu bir ayar sorunu değil, modelin sınırı. MobileNetV2 "müstehcen ama giyimli" her şeyi tek bir sınıfa (sexy) atıyor. Plaj tatili fotoğrafıyla teşvik edici içerik o sınıfın içinde aynı skoru üretiyor — model niyeti göremiyor, sadece pikselleri görüyor.
Yani "Instagram'ı yakala ama tatil fotoğrafımı bloklama" bu modelle mümkün değil. Üçünden birini seçmen gerekiyor. Ayrımı istiyorsan tek yol kendi verinle fine-tune etmek, o da ayrı bir proje.
| Görsel modelin körlüğü | İçerik kanalı ne yapıyor |
|---|---|
| Metin. Erotik hikâye, sohbet, altyazı — sınıflandırıcı piksel görüyor, okumuyor | Kapatıyor. Metin zaten onun tek girdisi. Ölçümde erotik hikâye sitesi 1.000 |
| FLAG_SECURE ekranları. Piksel yok | Kapatıyor. Erişilebilirlik ağacı o bayraktan etkilenmiyor |
| Ses. Video sesi | Kapsam dışı — ikisinde de |
| Metinsiz görsel sayfa | Kapatamıyor; görsel kanal gerekiyor. İkisi de yoksa (gizli sekme + metinsiz sayfa) kaçıyor |
WATCHED_PACKAGES artık varsayılan olarak devrede değil: mod BLACKLIST,
yani dışlananlar hariç her uygulama kapsanıyor. Liste bakımı gerekmiyor.
Üç optimizasyon katmanı:
| Katman | Kazanç |
|---|---|
| Uygulama kapısı | İzlenen uygulama önde değilse yakalama tamamen kapalı |
| Ekran kapalıyken durma | PowerManager.isInteractive false ise hiçbir şey yapılmıyor |
Kare farkı (FrameDiffer) |
Durağan ekranda inference ~%90 azalır |
| Uyarlanabilir aralık | 20 kare sakin geçerse 1 fps → 0.33 fps |
İçerik kanalının maliyeti ayrı: erişilebilirlik ağacı yürüyüşü uygulama sınırını aşan IPC demek. Üç bütçe birden sınırlıyor — en fazla 1400 düğüm, 45 derinlik, 90 ms — ve iki okuma arasında en az 500 ms bekleniyor. Olay yağmuru (kaydırma sırasında saniyede onlarca olay) aynı kısıtlayıcıya girdiği için maliyet doğurmuyor.
FrameDiffer en büyük kazanç. Gerçek kullanımda ekranın çoğu durağandır: metin okuyorsun, video duraklamış, uygulama açık ama etkileşim yok. O karelerde inference çalıştırmak saf israf, sonuç zaten aynı çıkacak. Kare 16x16 parmak izine indirilip öncekiyle karşılaştırılıyor, fark eşiğin altındaysa model hiç çalışmıyor.
BlackFrameDetector de düzeltildi: getPixel() piksel başına ayrı çağrı yapıyordu, getPixels() ile tek okumaya indirildi.
Ölçülmedi. Bu tahminler mimariden çıkarım. Gerçek rakam için kur ve adb shell dumpsys batterystats ile bak. Cihaz, model boyutu ve GPU desteği sonucu ciddi değiştirir.
Motivation.kt — profil bazlı (İslam / Hristiyanlık / Yahudilik / Seküler / Kişisel).
Tasarım notu: ilk fikir "utandırıcı olsun" idi. Utanç temelli müdahale güvenilmez: utanç → sıkıntı → sıkıntıyı bastırmak için aynı davranışa dönüş. Mesajlar bu yüzden suçlayıcı değil, değer hatırlatıcı yazıldı. Fark ince, sonuç farkı büyük.
Telif konusu çözüldü, listeler dolu. Kur'an ve İncil meallerinin çevirileri telif hakkına tabidir — orijinal metin kamu malı olsa da modern Türkçe meal çevirmenin ya da yayınevinin telifindedir. Bu yüzden uygulamadaki Türkçe ve İngilizce metinler mevcut hiçbir mealden alınmadı, kamu malı orijinallerden (Arapça Kur'an, İbranice Tanah, Yunanca Yeni Ahit) yeniden yazıldı. Orijinal metin de gösterilebiliyor ve sure/bölüm:ayet referansı ekranda duruyor ki kullanıcı kendi tercih ettiği mealle karşılaştırabilsin.
Bunlar yetkili meal değildir ve uygulama içinde de böyle belirtiliyor. Yayınlamadan önce her metni konusunda yetkin birine kontrol ettir; dini metni yanlış aktarmak teknik bir hatadan çok daha ciddi bir güven kaybıdır.
Perde ücretsiz ve reklamsız; öyle kalacak. Reklam SDK'sı her istekte cihaz kimliği ve IP gönderir — ekrandaki her metni okuyabilen bir uygulamada bu, verilen tek sözü bozmak olur. Uygulama hiçbir ağa bağlanmıyor; içindeki "Katkıda bulun" butonu yalnızca sen dokununca tarayıcıda bu adresi açıyor.
Bu tercih bilinçli. Perde erişilebilirlik servisiyle ekrandaki her metni okuyabiliyor ve tek satışı "hiçbir veri cihazdan çıkmaz" iddiası. Copyleft, birinin kodu alıp kapalı kaynak bir türev üretmesini — içine reklam SDK'sı, telemetri ya da sunucuya gönderim koyup aynı isimle dağıtmasını — engelliyor. Türev üretmek serbest, ama kaynağı açmak zorunda; yani iddia doğrulanabilir kalıyor.