An on-device AI-powered iOS app to search screenshots and photos using natural language — no cloud, no account, no tracking.
Have you ever taken a screenshot of something important — a product, a receipt, a saved post — and then spent 10 minutes scrolling to find it again?
FindKeep solves this. It uses on-device OCR + semantic AI search to let you type what you remember, and instantly surface the right photo or screenshot — all without ever sending a single byte to the cloud.
"Think of it as Spotlight Search, but for your photos and screenshots — smart, private, and always on."
| Feature | Description |
|---|---|
| 🔍 AI-Powered Search | Hybrid BM25 + semantic embeddings + tag matching for highly accurate results |
| 📸 Camera Capture | Snap anything and FindKeep auto-titles, tags, and indexes it instantly |
| 🖼 Screenshot Import | Bulk import from Photos library with automatic OCR text extraction |
| 🤖 On-Device OCR | Apple Vision framework extracts text — no internet required |
| 🧠 MobileCLIP Embeddings | Apple's Core ML model for image-to-text semantic understanding |
| 📂 Smart Collections | Auto-categorize into Receipts, Documents, Screenshots, and more |
| 📍 Place Tagging | Tag items by location for spatial memory ("that thing I saw at IKEA") |
| 🔦 Spotlight Integration | Find items from iOS system search without opening the app |
| 🔒 100% Private | All data stays on-device. No account. No uploads. Ever. |
| ⚡ Swift 6 Concurrency | Full strict concurrency compliance — zero data races |
Build and run the project in Xcode to see FindKeep in action.
To quickly test the search intelligence, add a screenshot of a receipt or label, then search:
"grocery bill","blue shoes","wifi password"— FindKeep finds it instantly.
FindKeep is built with Clean Architecture — a strict separation between Domain, Data, and UI layers. Every layer is independently testable and replaceable.
FindKeep/
├── FindKeepApp/
│ ├── App/ ← App entry, environment, tab router
│ ├── Core/
│ │ ├── DesignSystem/ ← AppTheme, AppBrand, reusable components
│ │ └── Utilities/ ← BM25, EmbeddingMath, CategoryHeuristics
│ ├── Domain/ ← Entities, protocols, use-case interfaces
│ ├── Data/
│ │ ├── Models/ ← SwiftData persistence models
│ │ ├── Repositories/ ← Concrete data access implementations
│ │ ├── Search/ ← VaultSearchService (hybrid ranking engine)
│ │ ├── AI/ ← OCR, MobileCLIP, VisionFeaturePrint services
│ │ ├── Services/ ← OCRService (Vision framework)
│ │ └── Mappers/ ← Domain ↔ persistence model converters
│ ├── Features/
│ │ ├── Home/ ← Dashboard with recents and quick filters
│ │ ├── Search/ ← Search bar, facets, live results
│ │ ├── Capture/ ← Camera capture + review flow
│ │ ├── Collections/ ← Smart groups and place-based views
│ │ ├── ItemDetail/ ← Full-screen item view with OCR text overlay
│ │ ├── Onboarding/ ← First-run permissions and setup
│ │ └── Settings/ ← Data management and privacy controls
│ └── Platform/
│ ├── PhotoKit/ ← Photos library access and sync
│ ├── Camera/ ← AVFoundation camera capture
│ ├── Spotlight/ ← CoreSpotlight index management
│ ├── Notifications/ ← Background task notifications
│ └── BackgroundTasks/ ← BGTaskScheduler for re-indexing
├── FindKeepTests/ ← Unit tests (VaultSearchService coverage)
├── Scripts/ ← Asset generators, MobileCLIP setup
└── project.yml ← XcodeGen project definition
| Layer | Technology | Why |
|---|---|---|
| UI | SwiftUI + MVVM | Declarative, composable, 100% native |
| State | @Observable + @Bindable | iOS 17+ modern observation, no Combine boilerplate |
| Persistence | SwiftData | Native, type-safe, no third-party ORM |
| Search | BM25 + Cosine Similarity | Combines keyword precision with semantic recall |
| OCR | Apple Vision (VNRecognizeTextRequest) | On-device, free, accurate |
| Embeddings | MobileCLIP → VisionFeaturePrint fallback | Best-in-class on-device image-text alignment |
| Background | BGTaskScheduler | Re-index new photos without draining battery |
| Concurrency | Swift 6 strict concurrency | Zero runtime data races |
The VaultSearchService ranks every item using a weighted hybrid score:
final score = (0.50 × semantic) + (0.35 × BM25) + (0.10 × tag match) + (0.05 × recency boost)
| Component | Weight | What it does |
|---|---|---|
| Semantic | 50% | Cosine similarity between query embedding and item embedding (MobileCLIP / VisionFeaturePrint) |
| BM25 | 35% | Classic term-frequency ranking over OCR text, title, and summary |
| Tag Match | 10% | Keyword overlap between query tokens and auto-generated tags |
| Recency Boost | 5% | Slight boost for recently added or updated items |
This means FindKeep handles both exact keyword searches ("Spotify receipt") and fuzzy natural language queries ("music subscription bill last month") with equal accuracy.
| Tool | Version |
|---|---|
| macOS | Sequoia or newer |
| Xcode | 26.0+ |
| XcodeGen | Latest (brew install xcodegen) |
| iOS Simulator or device | iOS 26.0+ |
git clone https://github.com/devendrabhumca12/FindKeep.git
cd FindKeepbrew install xcodegen # skip if already installed
xcodegen generate
open FindKeep.xcodeproj- Select an iPhone simulator (e.g., iPhone 16 Pro)
- Choose the FindKeep scheme
- Press ⌘R
No Apple Developer account needed for simulator builds.
- Connect your iPhone and enable Developer Mode (Settings → Privacy & Security)
- In Xcode → Target → Signing & Capabilities
- Enable Automatically manage signing, select your Apple ID team
- Press ⌘R to build and install
Free Apple ID certificates expire after 7 days — just reinstall to renew.
./Scripts/setup-mobileclip.shDownloads Apple's MobileCLIP Core ML models. The app runs perfectly without them, falling back to VisionFeaturePrint embeddings automatically.
xcodebuild \
-project FindKeep.xcodeproj \
-scheme FindKeep \
-destination 'platform=iOS Simulator,name=iPhone 16 Pro' \
testSee TESTING.md for full manual QA checklists including simulator photo seeding, accessibility checks, and edge cases.
FindKeep was designed with privacy as a non-negotiable, not an afterthought:
- ✅ All processing is on-device — OCR, embeddings, search, storage
- ✅ No network calls — no analytics, no telemetry, no third-party SDKs
- ✅ No account or sign-in — your data is yours, always
- ✅ Delete anytime — removing an item from FindKeep does not touch your Photos library
- ✅ Photos permission is optional — camera-only mode works without library access
- iCloud sync (opt-in, end-to-end encrypted)
- Siri / Shortcuts integration
- Home screen widget for quick capture
- Share extension (save directly from Safari, Messages, etc.)
- Export vault as encrypted ZIP
Contributions are welcome!
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature - Commit with a clear message
- Open a Pull Request
Please follow Swift 6 strict concurrency rules and respect the Clean Architecture layering — new features belong in Features/ and should depend only on Domain/ protocols, never directly on Data/.
| File | Description |
|---|---|
| TESTING.md | Build, simulator, device, and accessibility testing guide |
| APP_STORE.md | App Store submission metadata and notes |
Built by Devendra Kumar — iOS Developer specializing in Swift & SwiftUI
- 📧 Email:devendra.bhumca12@gmail.com
- 💼 LinkedIn:linkedin.com/in/devendra-agnihotri-5b0617a8
- 🐙 GitHub:github.com/devendrabhumca12
If you find this project useful or interesting, please ⭐ star the repo — it helps others discover the work!
FindKeep is released under the MIT License.