A clean, fast, fully-offline native iOS document scanner β scan, enhance, OCR, and export to PDF or JPG in a few taps. Nothing ever leaves your device.
| iPhone | iPad |
|---|---|
![]() |
![]() |
Tertiary Scanner is a native iOS document scanner built with Swift 6, SwiftUI, and an MVVM architecture. It uses Apple's VisionKit document camera for edge detection and perspective correction, Core Image for enhancement filters, and the Vision framework for on-device OCR. Documents are stored locally with SwiftData β no account, no cloud, no tracking.
| Feature | |
|---|---|
| πΈ | Scanning β VisionKit auto edge detection, perspective correction, auto-crop, multi-page, manual corner adjust, retake, flash |
| π¨ | 8 enhancement filters β Original, Auto, White Document, Black & White, Denoise, Brighten, Sharpen Text, Receipt (live preview) |
| π€ | OCR β Vision text recognition; copy, export, and search your library by content |
| π | Export β single/multi-page PDF (A4 / Letter / fit, adjustable quality) and high-quality JPG |
| π€ | Destinations β Photos, Files, iCloud Drive, native iOS Share Sheet (AirDrop, Mail, Messages, Print, β¦) |
| ποΈ | Library β SwiftData-backed: thumbnails, rename, delete, duplicate, share, export, search |
| βΏ | Accessibility β Dynamic Type, VoiceOver, Dark/Light, semantic colors |
| Category | Technologies |
|---|---|
| Language / UI | Swift 6, SwiftUI, MVVM |
| Scanning | VisionKit (VNDocumentCameraViewController) |
| OCR | Vision (VNRecognizeTextRequest) |
| Image Processing | Core Image (CIFilter) |
PDFKit / UIGraphicsPDFRenderer |
|
| Persistence | SwiftData (metadata) + on-disk files (images/PDFs) |
| Project Gen | XcodeGen (project.yml) |
| Min OS | iOS 18+ Β· universal (iPhone + iPad) |
βββββββββββββββββββββββββββββ SwiftUI Views βββββββββββββββββββββββββββββ
β Home Β· Scanner Β· Preview Β· Filter Β· Export Β· Library Β· Detail Β· Settings β
βββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββ
β @MainActor @Observable β
βββββββββΌβββββββββ ββββββββββΌβββββββββ
β ScannerViewModelβ β LibraryViewModel β
βββββββββ¬βββββββββ ββββββββββ¬βββββββββ
β β
ββββββββββββββΌβββββββββ Services (async) ββββββββββββββββΌββββββββββββ
β ScannerService Β· OCRService Β· PDFService Β· ExportService Β· Storage β
ββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββ
Core Imageβ Vision β PDFKit β Photos/Files β SwiftData
ββββββββββββββΌβββββββββββββββββββββββ βββββββββββββββΌβββββββββββ
β ImageProcessor (shared CIContext) β β ScanDocument / ScanPage β
βββββββββββββββββββββββββββββββββββββ β + files on disk β
βββββββββββββββββββββββββββ
scannerapp/
βββ project.yml # XcodeGen spec (signing, Info.plist, entitlements)
βββ DocumentScannerApp/
β βββ App/ # @main App + SwiftData ModelContainer
β βββ Models/ # ScanDocument, ScanPage (@Model), FilterType
β βββ Services/ # Scanner, OCR, PDF, Export, Storage
β βββ ViewModels/ # ScannerViewModel, LibraryViewModel
β βββ Views/ # SwiftUI screens + Components/
β βββ Utilities/ # ImageProcessor, SettingsStore, Constants
β βββ Resources/ # Assets.xcassets, PrivacyInfo.xcprivacy
βββ screenshots/ # App Store / README screenshots
βββ .claude/skills/ # app-store-submission, mobile-ios-design, ipados-design-guidelines
- Xcode 26+ and XcodeGen (
brew install xcodegen)
git clone https://github.com/alfredang/scannerapp.git
cd scannerapp
xcodegen generate
open DocumentScannerApp.xcodeprojOr from the CLI (Simulator):
xcodebuild -project DocumentScannerApp.xcodeproj -scheme DocumentScannerApp \
-destination 'platform=iOS Simulator,name=iPhone 17' build CODE_SIGNING_ALLOWED=NOThe Simulator has no camera, so the Scan button falls back to the photo picker. Launch with
SCANNER_SEED_DEMO=1to populate sample documents for testing/screenshots.
To run on a device, open the target β Signing & Capabilities β select your Team.
Tertiary Scanner is live on the App Store β download it here (com.tertiaryinfotech.scannerapp).
The end-to-end submission workflow (API-first, with the few web-UI-only steps documented) lives in
.claude/skills/app-store-submission/.
- Fork the repo
- Create a feature branch (
git checkout -b feature/amazing) - Commit your changes
- Open a Pull Request
Released under the MIT License.
Developed by Tertiary Infotech Academy Pte. Ltd.
β Star this repo if you find it useful!
Powered by Tertiary Infotech Academy Pte Ltd

