An iOS 26 app that turns any image of an event — flyer, screenshot, photo — into a calendar event using entirely on-device Apple frameworks.
- Import an image — use the in-app photo picker, the document scanner, or share from any app
- On-device OCR — Vision extracts all text from the image
- On-device LLM — Foundation Models parses the text into structured event details (title, date/time, location, notes)
- Location lookup — MKLocalSearch resolves partial addresses and place names into full geocoded addresses
- Calendar — a native
EKEventEditViewControllersheet lets you review, edit, and save the event with a map pin and travel time
Everything runs on-device. No data leaves your device.
| iOS | 26.0+ |
| Apple Intelligence | Required (A17 Pro / M1 chip or later) |
| Xcode | 26+ |
- Scan Flyer —
VNDocumentCameraViewControllerscans physical documents with automatic perspective correction and lighting adjustment - Choose Photo — pick any image from your photo library
- Share Extension — share an image to SnapSchedule from Photos, Safari, Files, or any other app
- Smart time parsing — handles ranges like
9-2AM(→ 9 PM–2 AM) and8AM-4PM, cross-midnight events, and relative dates like "next Friday" - Address completion — if only a venue name is present, MKLocalSearch looks up the full address automatically
- Structured location — sets
EKStructuredLocationwith coordinates so Calendar shows a map, travel time, and directions
SnapSched/ Main app target
├── App/
│ ├── SnapSchedApp.swift Entry point; handles snapsched:// URL scheme
│ └── AppState.swift Observable pipeline orchestrator
├── Services/
│ ├── OCRService.swift Vision text recognition
│ ├── EventParserService.swift Foundation Models structured output
│ ├── LocationService.swift MKLocalSearch geocoding
│ └── CalendarService.swift EventKit integration
└── Views/
├── ContentView.swift Home screen (picker + scanner)
├── ProcessingView.swift Loading state
└── EventPreviewView.swift Review & edit before saving
SnapSchedShared/ Compiled into both app and extension
└── SharedModels.swift AppGroup constants, ExtractedEvent, PendingImagePayload
ShareExtension/ Share Extension target
└── ShareViewController.swift Saves image to App Group, opens main app
SnapSchedTests/ Unit tests
This project uses XcodeGen to generate the Xcode project from project.yml.
brew install xcodegen
xcodegen generate
open SnapSched.xcodeprojSet your development team in Signing & Capabilities for both the SnapSched and SnapSchedShareExtension targets, then build and run on a physical device with Apple Intelligence enabled.
The iOS Simulator does not support Foundation Models. A physical device with Apple Intelligence turned on is required for the full pipeline.
Both targets share data via the App Group group.com.snapsched.shared. The Share Extension writes the image to the shared container and posts a PendingImagePayload to UserDefaults(suiteName:). The main app reads and processes it on launch via the snapsched://process URL scheme.