Wedding Camera
iOS
Swift
AWS
Open Source
A disposable camera app for weddings, distributed via TestFlight to guests. Guests enter their name, choose a film mode, and start shooting. Photos are processed through a Core Image filter chain, saved to Camera Roll, and uploaded silently to a private S3 album — no AWS credentials ever touch the device.
Features
- Two film modes — Disposable (27 shots, film grain + warm tone) and Polaroid (10 shots, white frame composite with developing animation)
- Core Image filter chains applied before save: desaturate, colour warm, grain, and vignette per mode
- Offline-resilient upload queue backed by disk; photos are cached immediately and retried on reconnect via NWPathMonitor
- Presigned S3 PUT URLs generated server-side by a Lambda function — no AWS credentials on device
- Photos saved to Camera Roll automatically; guest name used to namespace the S3 key
- Shot limits enforced per mode; "out of film" screen shown when exhausted
- Onboarding with name entry; instructions screen on first launch
- Full SwiftUI test suite covering upload, queue, filters, and UI flows
Architecture
- CameraService — @MainActor AVCaptureSession with delegate dispatch back to main thread
- FilterService — Core Image pipeline; Polaroid frame baked via Core Graphics composite
- UploadQueue (actor) — persists JPEGs to Library/Caches with JSON manifest before upload attempt
- UploadService — fetches fresh presign URL per upload (15-min TTL), 1 retry on failure, silent fail
- NetworkMonitor — NWPathMonitor bridge; calls UploadQueue.flush() on reconnect and app foreground
- Lambda (Node.js) — createHandler factory pattern for injectability; sanitises guest name before building S3 key
Tech Stack
Swift 6
SwiftUI
AVFoundation
Core Image
Core Graphics
NWPathMonitor
Node.js
AWS Lambda
Amazon S3
API Gateway
Terraform
TestFlight
XcodeGen
GitHub Actions