SkyWatch — Hardening Checklist
Before you call SkyWatch “done” — before TestFlight invites go out and before you list it on your portfolio — every box below should be ticked. This is the pre-release review I’d run on a team.
1. Functional correctness
- Home screen renders in < 2 s with cached data on a cold launch
- Pull-to-refresh enforces a 5-minute minimum interval per location
- Saved locations sync across two devices within 30 s
- Map overlay scrub doesn’t drop frames on iPhone 13 or newer
- Widget refreshes every ~15 min on a device left idle overnight
- Severe-weather notification is delivered within 15 min of the alert appearing in WeatherKit
-
All currency/temperature/distance values use
MeasurementFormatterand respect locale
2. Security
- No third-party SDKs included (WeatherKit + CloudKit + Apple-only)
-
Info.plistNSAppTransportSecurityhas zero exceptions -
No API keys, tokens, or secrets in the binary (
stringsscan clean) - CloudKit container scoped to private DB; no public records used
-
PrivacyInfo.xcprivacydeclares accessed APIs and required reasons -
NSLocationWhenInUseUsageDescriptionis honest and specific -
No
print()of user data;os_loguses%{public}@only for non-PII -
No force-unwraps in app or widget code (
SwiftLint force_unwrapping = error)
3. Privacy
- Privacy Nutrition Label declares: Location (App Functionality, not linked to identity, not tracking)
-
No analytics SDK, no Firebase, no Sentry — verify in
Package.resolved - Background refresh task identifier is documented and disclosed in the app description
- Severe-weather notifications are clearly explained at first permission request
- User can disable notifications and delete all saved locations from within the app
4. Performance
-
Launch time < 400 ms (cold) measured by
os_signpostin Instruments - WeatherKit calls per user per day average < 8 (instrument with a counter and log to Console)
- Widget extension binary < 5 MB (Xcode → product → show → check)
- No retain cycles (Instruments → Leaks, run a 5-minute session)
- Map overlay redraws < 16 ms per frame (Instruments → Time Profiler)
- App responds within 100 ms after the user taps a saved location
5. Accessibility
-
All interactive elements have a
.accessibilityLabeland a.accessibilityHintwhere needed - VoiceOver reads the home screen meaningfully (“75 degrees, partly cloudy, light rain in 30 minutes”)
-
Dynamic Type up to
accessibility5doesn’t break layouts - Reduce Motion disables the map overlay animation
- Color contrast for all text meets WCAG AA (use the Accessibility Inspector)
- Widgets respect the system color scheme and tint mode (iOS 18)
6. Localization
-
All user-facing strings use
String(localized:) - App localized for English (Base), Spanish, German, Japanese at minimum
- Date/temperature/distance formatting verified in each locale
- No truncation in German (long compound words)
- Right-to-left layout verified in Arabic pseudo-localization
7. CI/CD + Release
- Unit tests pass on GitHub Actions on every PR
- UI test for “load home screen with cached data” passes
-
Fastlane
betalane uploads to TestFlight without manual intervention -
Build number auto-increments via
agvtoolin CI - App icon set complete for all sizes (1024 marketing icon included)
- Launch screen storyboard or Info.plist key configured
- App Store metadata (description, keywords, screenshots) drafted
8. Documentation
- README on GitHub with screenshot, architecture diagram, “how to run locally”
-
Architecture decision records (ADRs) in
architecture.mdreflect the shipped build - Interview talking points rehearsed at least twice
- You can deliver the 30-second pitch from memory
- A 60-second screen capture is on your portfolio
Sign-off
If you can tick every box above, SkyWatch ships. You can put it on your CV, link it on LinkedIn, and answer interview questions about it with confidence. Now read Interview talking points and rehearse.