Privacy-first iOS app for detecting sensitive content using Apple's on-device ML.
🔗 Website: https://nudefndr.com 📱 App Store: https://apps.apple.com/jp/app/nudefndr/id6745149292 🌍 Languages: English, Japanese (日本語), Thai (ไทย), Simplified Chinese (简体中文) 📄 License: MIT
2026-07-25 – Version 2.5.8
Security and honesty. A new Travel Mode (Pro) lets the Vault be opened only with a PIN you choose, with biometrics disabled while it is active. The app now hides its contents from the iOS app-switcher snapshot, which could previously reveal an open Vault without anything being unlocked. Vault intake was taking the scanner's downscaled image rather than the original — photos now enter the Vault at full resolution, with EXIF and GPS still stripped. The share-sheet check no longer examines only the first photo of a multi-photo send, and no longer fails open when iOS Sensitive Content Warning is disabled. Several screens also described the Vault cipher as AES-256; it has always been ChaCha20-Poly1305, as documented here, and the app now says so too. See CHANGELOG.md for full version history and transparency repository updates.
- Vault Encryption (ChaCha20-Poly1305)
- Keychain Integration (
kSecAttrAccessibleWhenUnlockedThisDeviceOnly) - SensitiveContentAnalysis Framework Wrapper
- Proprietary UI Code
- Premium Feature Business Logic
- Closed-Source Production Binaries
- ChaCha20-Poly1305 AEAD: 256-bit authenticated encryption. The Poly1305 tag is verified on every decrypt, so modified or forged ciphertext fails to open rather than returning garbage.
- Random vault key: the vault key is a 256-bit key from the system CSPRNG — not derived from a PIN or passphrase. It lives in the Keychain and is dropped from RAM when the app leaves the foreground; no decrypted photo data is ever written to disk.
- Device-bound storage: the key is stored
kSecAttrAccessibleWhenUnlockedThisDeviceOnly, so it is readable only while the device is unlocked and never migrates to another device or to iCloud. - Key derivation, where it is actually used: PBKDF2-HMAC-SHA256 at 310,000 iterations for PIN credentials, and 600,000 iterations for the passphrase that wraps an exported key-backup file. The vault key itself is random, so no derivation is involved in opening the vault.
- No telemetry: no analytics SDK, no tracking, no crash reporting. Your photos, scan results, audit logs and vault contents never leave the device. The app's only network traffic is App Store subscription validation through RevenueCat, which sees an anonymous subscriber identifier and your entitlement status — no photos, no scan data, no personal identifiers.
- Backups: encrypted vault files may be included in an iCloud or device backup, but the key is device-only and never syncs. Ciphertext restored onto another device cannot be opened — which is exactly why Key Recovery exists.
The published sources back the claims above directly — read the file, not just the description:
| Source | Backs |
|---|---|
Sources/Vault/VaultEncryption.swift |
ChaCha20-Poly1305 AEAD seal/open and 256-bit random key generation — the vault's actual encryption path |
Sources/Vault/KeychainManager.swift |
Device-bound key storage via kSecAttrAccessibleWhenUnlockedThisDeviceOnly — keys never leave the device |
Sources/Vault/VaultKeyBackup.swift |
Passphrase-wrapped vault key export/import (PBKDF2-SHA256 200k + AES-GCM) — air-gapped .nudefndrkey file, never uploaded |
Sources/Scanner/ContentAnalyzer.swift |
On-device SensitiveContentAnalysis wrapper — no network calls |
Sources/Scanner/DocumentDetectionService.swift |
On-device Documents & IDs detection via Apple Vision — no network calls; conservative structural checks (Luhn / IBAN mod-97 / passport MRZ) |
Sources/Models/ScanResult.swift |
Scan result model — local only, no telemetry fields |
- iOS 18.0+
- CoreML compatible iPhone/iPad
- CHANGELOG.md – Version history and updates
- ARCHITECTURE.md – System design
- SENSITIVE_CONTENT_WARNING.md – Setup guide
- SECURITY.md – Security disclosure policy
- FAQ.md – Frequently asked questions
Replaces NuDefndr-Core (2024–2025, archived).
This is a partial source release: the security-critical components are published here, the full application is not. It has not been independently audited — if that matters for your threat model, weigh it accordingly.
See SECURITY.md