Skip to content

Repository files navigation

FindKeep App Icon

FindKeep

Find what you saved — privately on your iPhone.

An on-device AI-powered iOS app to search screenshots and photos using natural language — no cloud, no account, no tracking.


SwiftSwiftUIiOSSwiftDataLicensePRs Welcome


What is FindKeep?

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."


Key Features

FeatureDescription
🔍 AI-Powered SearchHybrid BM25 + semantic embeddings + tag matching for highly accurate results
📸 Camera CaptureSnap anything and FindKeep auto-titles, tags, and indexes it instantly
🖼 Screenshot ImportBulk import from Photos library with automatic OCR text extraction
🤖 On-Device OCRApple Vision framework extracts text — no internet required
🧠 MobileCLIP EmbeddingsApple's Core ML model for image-to-text semantic understanding
📂 Smart CollectionsAuto-categorize into Receipts, Documents, Screenshots, and more
📍 Place TaggingTag items by location for spatial memory ("that thing I saw at IKEA")
🔦 Spotlight IntegrationFind items from iOS system search without opening the app
🔒 100% PrivateAll data stays on-device. No account. No uploads. Ever.
Swift 6 ConcurrencyFull strict concurrency compliance — zero data races

Demo

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.


Architecture

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

Technology Decisions

LayerTechnologyWhy
UISwiftUI + MVVMDeclarative, composable, 100% native
State@Observable + @BindableiOS 17+ modern observation, no Combine boilerplate
PersistenceSwiftDataNative, type-safe, no third-party ORM
SearchBM25 + Cosine SimilarityCombines keyword precision with semantic recall
OCRApple Vision (VNRecognizeTextRequest)On-device, free, accurate
EmbeddingsMobileCLIP → VisionFeaturePrint fallbackBest-in-class on-device image-text alignment
BackgroundBGTaskSchedulerRe-index new photos without draining battery
ConcurrencySwift 6 strict concurrencyZero runtime data races

Search Engine — Technical Deep Dive

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)
ComponentWeightWhat it does
Semantic50%Cosine similarity between query embedding and item embedding (MobileCLIP / VisionFeaturePrint)
BM2535%Classic term-frequency ranking over OCR text, title, and summary
Tag Match10%Keyword overlap between query tokens and auto-generated tags
Recency Boost5%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.


Getting Started

Prerequisites

ToolVersion
macOSSequoia or newer
Xcode26.0+
XcodeGenLatest (brew install xcodegen)
iOS Simulator or deviceiOS 26.0+

1. Clone the repository

git clone https://github.com/devendrabhumca12/FindKeep.git
cd FindKeep

2. Generate the Xcode project

brew install xcodegen # skip if already installed
xcodegen generate
open FindKeep.xcodeproj

3. Run in Simulator

  1. Select an iPhone simulator (e.g., iPhone 16 Pro)
  2. Choose the FindKeep scheme
  3. Press ⌘R

No Apple Developer account needed for simulator builds.

4. Run on a real device (optional)

  1. Connect your iPhone and enable Developer Mode (Settings → Privacy & Security)
  2. In Xcode → Target → Signing & Capabilities
  3. Enable Automatically manage signing, select your Apple ID team
  4. Press ⌘R to build and install

Free Apple ID certificates expire after 7 days — just reinstall to renew.

5. Enable MobileCLIP for stronger search (optional)

./Scripts/setup-mobileclip.sh

Downloads Apple's MobileCLIP Core ML models. The app runs perfectly without them, falling back to VisionFeaturePrint embeddings automatically.


Running Tests

xcodebuild \
-project FindKeep.xcodeproj \
-scheme FindKeep \
-destination 'platform=iOS Simulator,name=iPhone 16 Pro' \
test

See TESTING.md for full manual QA checklists including simulator photo seeding, accessibility checks, and edge cases.


Privacy — A Hard Constraint

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

Roadmap

  • 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

Contributing

Contributions are welcome!

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/your-feature
  3. Commit with a clear message
  4. 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/.


Documentation

FileDescription
TESTING.mdBuild, simulator, device, and accessibility testing guide
APP_STORE.mdApp Store submission metadata and notes

Contact

Built by Devendra Kumar — iOS Developer specializing in Swift & SwiftUI

If you find this project useful or interesting, please ⭐ star the repo — it helps others discover the work!


License

FindKeep is released under the MIT License.


Built with Swift 6 · SwiftUI · SwiftData · Vision · Core ML · Clean Architecture

About

FindKeep - iOS App

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages