IOS / PHOTOGRAPHY
Keepsake.
A camera built around albums. Choose where your photos belong before taking them, then open that album’s camera straight from a Home Screen widget.
Shipped on the App Store
- THE ROLE
- iOS Developer · Apple Developer Academy
- THE WHEN
- May — Jun 2025
- BUILT WITH
- SwiftUIAVFoundationPhotoKitWidgetKit
The idea
Organizing photos is easy to postpone. Keepsake moves that step into taking the photo: choose or create an album, open its camera, and save each shot directly into that album in the iOS photo library.
Built with a team at the Apple Developer Academy and shipped to the App Store, the app combines a custom camera with album management and a configurable Home Screen widget. My role was iOS development.
From capture to collection
AVFoundation provides the capture session and photo output. The camera model consumes asynchronous preview and photo streams, updates the SwiftUI viewfinder, and passes captured image data to the selected photo collection. PhotoKit handles saving assets and adding them to the album.
The album manager supports creating, renaming, and deleting albums, loading their latest thumbnails, and handling photo-library permissions, including limited access. Thumbnail caching helps the album browser avoid repeatedly loading full-size images.
One tap into the right camera
The WidgetKit extension lets someone configure a widget for a particular album. Tapping it follows a deep link into Keepsake with that album selected. App Groups share album settings between the app and widget, including whether to show a photo thumbnail.
What the project taught me
The useful experience sits in the handoff between capture, storage, and navigation. Working on Keepsake meant handling asynchronous camera output, keeping UI updates on the main actor, respecting library permissions, and preserving the user’s album choice across entry points.
The result is a small, focused workflow: choose the collection once, then keep taking photos into it.
CASE FILE / 04THAT'S THE STORY.
LET'S BUILD THE NEXT ONE ↗