The Challenge:
People often think “next time I’m here I should…” and then completely forget the idea. I wanted a lightweight way to attach those “next time” notes to real-world places, and then be nudged when I was nearby again, without the overhead of a full task manager.
The challenge was to design an iOS experience that feels personal and delightful while handling tricky things like location permissions, background notifications, data persistence, and syncing safely. I also needed to support backups and imports so users wouldn’t lose their notes as they switched devices or reinstalled the app.
What I built:
Next Time Notes, an iOS app that lets you save places and attach “visit notes” you want to remember for the future. You can add places using:
- your current GPS location
- search and suggestions from Google Places
- picking directly on a map
- Each place supports:
- notes
- tags
- star ratings
- photos
All of this is persisted locally using Core Data.
The home and list views show:
- stats about your saved places
- a searchable list of places
- a sortable list of places
- quick navigation into rich detail screens
- keep track of your position
- trigger location-based reminders when you’re near saved spots
- use a configurable detection radius
I added a full Settings area with:
- location controls
- notification controls
- CloudKit status
- email-based backup/restore (ZIP archives)
- Files-based backup/restore (ZIP archives)
- a support contact flow
The app uses:
- SwiftUI for the UI
- Core Location and UserNotifications for geo-reminders
- CloudKit and the Files app for data safety
- StoreKit/purchase management for a premium tier that unlocks unlimited places
What I learned:
This project deepened my understanding of location-based experiences specifically how to balance accuracy, battery usage, and user privacy while still making the app feel “magical” when it notices you’re back at a saved place.
I learned a lot about structuring a Core Data model around entities like Place and VisitNote, refreshing managed objects correctly, and keeping UI in sync with changes. Implementing backup/restore forced me to think carefully about data migration, ZIP handling, and clear user messaging for potentially destructive actions like “replace all data.”
On the UX side, I gained experience designing SwiftUI flows for permissions, personalization, and upgrades that feel integrated rather than interruptive. Finally, wiring up in-app purchases and subscription management (with place limits for free users) taught me how to connect product constraints to technical enforcement while still keeping the app friendly and transparent.