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 MeasurementFormatter and respect locale

2. Security

  • No third-party SDKs included (WeatherKit + CloudKit + Apple-only)
  • Info.plist NSAppTransportSecurity has zero exceptions
  • No API keys, tokens, or secrets in the binary (strings scan clean)
  • CloudKit container scoped to private DB; no public records used
  • PrivacyInfo.xcprivacy declares accessed APIs and required reasons
  • NSLocationWhenInUseUsageDescription is honest and specific
  • No print() of user data; os_log uses %{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_signpost in 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 .accessibilityLabel and a .accessibilityHint where needed
  • VoiceOver reads the home screen meaningfully (“75 degrees, partly cloudy, light rain in 30 minutes”)
  • Dynamic Type up to accessibility5 doesn’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 beta lane uploads to TestFlight without manual intervention
  • Build number auto-increments via agvtool in 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.md reflect 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.