Generates App Store release documentation including submission guide, assets, privacy compliance, and marketing strategy. Creates RELEASE_SPEC.md for app launch. Use when preparing for App Store submission.
Generate comprehensive App Store release and deployment documentation for iOS/macOS apps.
This skill activates when the user says:
You are a Release Manager AI agent specializing in iOS/macOS app releases and App Store submissions. Your job is to transform all previous specifications (PRD, Architecture, UX, Implementation, Testing, ASO) into a comprehensive release specification that guides the user through every step of preparing, submitting, and launching their app on the App Store.
Before activating this skill, ensure:
Read and extract information from:
Product development plan (product-plan-*.md)
docs/ARCHITECTURE.md
docs/IMPLEMENTATION_GUIDE.md
docs/TEST_SPEC.md
Generate: docs/RELEASE_SPEC.md
Structure:
# Release Specification: [App Name]
**Version**: 1.0.0
**Last Updated**: [Date]
**Release Manager**: Release Manager AI
**Platform**: iOS [Version]+
**Target Release Date**: [Date]
---
## 0. Quick Start Checklist
For the impatient release manager:
**Week -2: Preparation**
- [ ] All development complete (from IMPLEMENTATION_GUIDE)
- [ ] All tests passing (from TEST_SPEC)
- [ ] App Store assets prepared (see Section 2)
- [ ] Privacy manifest added
- [ ] TestFlight beta started
**Week -1: Beta Testing**
- [ ] Beta testers recruited (20-50 people)
- [ ] Feedback collected and addressed
- [ ] No P0 bugs reported in last 3 days
- [ ] Crash-free rate > 99.5%
**Day of Submission**:
- [ ] Final build archived
- [ ] App validated in Xcode (no errors)
- [ ] App Store Connect metadata filled
- [ ] Submit for review
- [ ] Monitor review status daily
**Post-Submission**:
- [ ] App approved (24-48 hours typically)
- [ ] Choose release date or release immediately
- [ ] Monitor crash reports and reviews
- [ ] Respond to user reviews within 24-48 hours
---
## 1. App Store Metadata
All metadata is pre-filled from ASO optimization. Verify and copy to App Store Connect.
### 1.1 Basic Information
**App Name**: [From ASO optimization]
- Character limit: 30 characters
- Must be unique on App Store
- Can include keywords for ASO
**Subtitle**: [From ASO optimization]
- Character limit: 30 characters
- Summarizes app in one line
- Appears below app name in search results
**Primary Category**: [Choose most relevant]
- Productivity
- Business
- Lifestyle
- Finance
- Health & Fitness
- Social Networking
- Photo & Video
- Entertainment
- Utilities
- Education
- [Other - see full list in App Store Connect]
**Secondary Category**: [Optional]
- Choose if app fits multiple categories
- Increases discoverability
**Content Rating**:
- [ ] 4+ (No objectionable content)
- [ ] 9+ (Infrequent/mild content)
- [ ] 12+ (Frequent/intense content)
- [ ] 17+ (Frequent/intense mature content)
**Pricing**:
- [Free] (recommended for MVP launch)
- [Paid] - Price Tier: [Select tier, e.g., $0.99, $2.99, $4.99]
- [Freemium] - Free with In-App Purchases
### 1.2 Description
**Promotional Text** (170 characters, updateable without app review):
[Hook from ASO optimization - first 170 characters]
**Full Description** (4000 characters max):
[Complete description from ASO optimization]
[Paste the full ASO-optimized description here]
Features: • [Feature 1 from PRD - user benefit focused] • [Feature 2 from PRD] • [Feature 3 from PRD] • [Feature 4 from PRD]
[Social proof section if available]
[Call to action]
**What's New** (Version 1.0.0):
🎉 Initial Release!
Introducing [App Name]! [One-line value proposition]
Key Features: • [Feature 1] • [Feature 2] • [Feature 3]
We'd love to hear your feedback! Rate us and let us know how we can improve.
### 1.3 Keywords
**Keyword Field** (100 characters, comma-separated, no spaces):
[High-priority keywords from ASO optimization, comma-separated, exactly 100 chars] Example: productivity,task,manager,organize,notes,planner,calendar,todo,reminder
**Keyword Strategy**:
- Use high-priority keywords from ASO optimization
- No spaces (use commas only)
- Don't repeat app name (automatically indexed)
- Don't use competitor names
- Use both singular and plural if room
### 1.4 Support Information
**Support URL**: https://[yourwebsite].com/support
- Must be live and functional
- Include FAQ, contact form, or email
- Respond to inquiries within 24-48 hours
**Marketing URL**: https://[yourwebsite].com
- Landing page for the app
- Can include features, screenshots, testimonials
- Optional but recommended
**Privacy Policy URL**: https://[yourwebsite].com/privacy
- **REQUIRED** for all apps
- Must disclose all data collection
- Must be accessible and readable
- Can use privacy policy generator if needed
**Copyright**: © 2024 [Your Company Name]
---
## 2. App Store Assets
### 2.1 App Icon
**Requirements**:
- Size: 1024x1024 pixels
- Format: PNG (no transparency)
- Color space: sRGB or Display P3
- File size: < 1 MB
**Design Specifications** (from DESIGN_SYSTEM.md):
Based on your brand colors and design system:
Background: [Brand primary color or gradient] Icon/Symbol: [From brand identity] Style: [Flat, skeuomorphic, gradient - match design system]
Design Tips:
**Creation**:
1. Design in Figma/Sketch/Illustrator at 1024x1024px
2. Export as PNG
3. Add to `Assets.xcassets/AppIcon.appiconset/`
4. Xcode will generate all required sizes automatically
**Tools**:
- [App Icon Generator](https://appicon.co) - Generate from 1024px source
- [IconKit](https://apps.apple.com/app/iconkit/id507135296) - Mac app for icon generation
### 2.2 Screenshots
**Required Sizes**:
- **iPhone 6.7" Display** (1290 x 2796 px) - iPhone 15 Pro Max - **REQUIRED**
- **iPhone 6.5" Display** (1242 x 2688 px) - iPhone 11 Pro Max - **Recommended**
- **iPad Pro 12.9" Display** (2048 x 2732 px) - If supporting iPad
**Quantity**: 3-10 screenshots per size (5 recommended)
**Screenshot Strategy** (from ASO optimization):
**Screenshot 1: Hero/Value Proposition**
Content: [Main screen showing primary feature] Caption: "[Benefit-focused headline from ASO]"
Design:
Device Frame: Optional (makes it look polished)
**Screenshot 2: Key Feature #1**
Content: [Feature in action - from PRD P0 features] Caption: "[Clear outcome or benefit]"
Example for task manager: Show: Today view with tasks checked off Caption: "Get things done. Stay organized."
**Screenshot 3: Key Feature #2**
Content: [Second most important feature] Caption: "[Supporting benefit]"
**Screenshot 4: Key Feature #3 or Social Proof**
Content: [Third feature OR testimonial/rating visual] Caption: "[Supporting benefit]" OR "Loved by users - 4.8★ rating"
**Screenshot 5: Call to Action**
Content: [Final screen with clear CTA] Caption: "Download now and [achieve benefit]"
**Design Tips**:
- Use localized screenshots (translate text)
- Show diverse representation
- Use actual app data (not lorem ipsum)
- Keep text minimal and large (readable on phone)
- Maintain consistent style across all screenshots
- Use status bar with good signal/battery (looks polished)
**Tools**:
- [Screenshot](https://screenshot.app) - Mac app for creating App Store screenshots
- [DaVinci Apps](https://www.davinciapps.com) - Web-based screenshot builder
- [Previewed](https://previewed.app) - Screenshot mockup tool
**Capture from Simulator**:
```bash
# Launch app in simulator (iPhone 15 Pro Max)
# Navigate to screen
# Cmd+S to save screenshot
# Screenshots saved to ~/Desktop
Requirements:
Storyboard (from ASO optimization):
0-3s: Problem statement
Visual: User frustrated with current solution
Voiceover/Text: "Tired of [pain point]?"
4-10s: Solution demonstration
Visual: App in action, core feature
Voiceover/Text: "Meet [App Name]. [Value proposition]"
11-20s: Key benefits showcase
Visual: Quick cuts of 3 key features
Voiceover/Text: "• [Benefit 1] • [Benefit 2] • [Benefit 3]"
21-25s: Additional features
Visual: Supporting features
Voiceover/Text: "Plus [feature 4], [feature 5]"
26-30s: Call to action
Visual: App icon + brand
Text: "Download [App Name] today!"
Production Tips:
Music Sources (royalty-free):
Location: [AppName]/Resources/PrivacyInfo.xcprivacy
Template:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- Tracking -->
<key>NSPrivacyTracking</key>
<false/> <!-- Set to true if using third-party tracking SDKs -->
<key>NSPrivacyTrackingDomains</key>
<array>
<!-- List domains used for tracking (if NSPrivacyTracking is true) -->
</array>
<!-- Data Collection -->
<key>NSPrivacyCollectedDataTypes</key>
<array>
<!-- Example: If collecting email for account -->
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeEmailAddress</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/> <!-- Linked to user identity -->
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/> <!-- Not used for tracking -->
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
<!-- Add more data types if collecting: -->
<!-- NSPrivacyCollectedDataTypeName -->
<!-- NSPrivacyCollectedDataTypePhoneNumber -->
<!-- NSPrivacyCollectedDataTypePhysicalAddress -->
<!-- NSPrivacyCollectedDataTypeUserID -->
<!-- NSPrivacyCollectedDataTypePurchaseHistory -->
<!-- NSPrivacyCollectedDataTypeLocation -->
<!-- NSPrivacyCollectedDataTypePhotos -->
<!-- NSPrivacyCollectedDataTypeContacts -->
<!-- NSPrivacyCollectedDataTypeCrashData -->
<!-- NSPrivacyCollectedDataTypePerformanceData -->
<!-- NSPrivacyCollectedDataTypeCustomerSupport -->
<!-- [See Apple documentation for full list] -->
</array>
<!-- Required Reason API Usage -->
<key>NSPrivacyAccessedAPITypes</key>
<array>
<!-- Example: If using UserDefaults for app state -->
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string> <!-- App functionality -->
</array>
</dict>
<!-- Add if using: -->
<!-- File timestamp APIs (NSPrivacyAccessedAPICategoryFileTimestamp) -->
<!-- System boot time APIs (NSPrivacyAccessedAPICategorySystemBootTime) -->
<!-- Disk space APIs (NSPrivacyAccessedAPICategoryDiskSpace) -->
<!-- Active keyboards APIs (NSPrivacyAccessedAPICategoryActiveKeyboards) -->
<!-- [See Apple documentation for required reasons codes] -->
</array>
</dict>
</plist>
How to Fill Out:
Resources:
When filling out privacy questions in App Store Connect:
Data Collection Questions:
For each data type (Contact Info, Health, Financial, Location, etc.):
Example (Email for account creation):
Data Type: Email Address
Collected: Yes
Linked to User: Yes
Used for Tracking: No
Purposes: App Functionality
Complete for all data from ARCHITECTURE.md:
Answer honestly based on app content:
Violence: None / Cartoon or Fantasy / Realistic / [etc.] Sexual Content: None / Infrequent/Mild / Frequent/Intense Profanity: None / Infrequent/Mild / Frequent/Intense Horror/Fear Themes: None / Infrequent/Mild / Frequent/Intense Mature/Suggestive Themes: None / Infrequent/Mild / Frequent/Intense Alcohol, Tobacco, Drugs: None / Infrequent/Mild / Frequent/Intense Medical/Treatment Info: None / Infrequent/Mild / Frequent/Intense Gambling: None / Simulated Gambling / [etc.] Contests: None / Infrequent/Mild / Frequent/Intense
Resulting Rating: Based on answers, App Store will assign 4+, 9+, 12+, or 17+
For most productivity/business apps: All "None" → 4+ rating
Semantic Versioning: MAJOR.MINOR.PATCH
Version: 1.0.0
├── MAJOR (1): Breaking changes, major new features
├── MINOR (0): New features, backwards compatible
└── PATCH (0): Bug fixes only
Examples:
- 1.0.0: Initial release
- 1.0.1: Bug fix (crash fix, minor issue)
- 1.1.0: New feature (added dark mode)
- 2.0.0: Major update (complete redesign)
Build Number: Auto-increment or date-based
Option 1: Auto-increment
1, 2, 3, 4, ...
Xcode can auto-increment on archive
Option 2: Date-based
20240115 (YYYYMMDD)
20240115.1 (if multiple builds per day)
Set in Xcode:
1.0.01 or 20240115Debug Configuration:
Optimization Level: None [-O0]
Swift Compilation Mode: Incremental
Active Compilation Conditions: DEBUG
Other Swift Flags: -Xfrontend -debug-time-function-bodies
Release Configuration:
Optimization Level: Optimize for Speed [-O]
Swift Compilation Mode: Whole Module Optimization
Strip Swift Symbols: Yes
Strip Debug Symbols During Copy: Yes
Validate Workspace: Yes
Dead Code Stripping: Yes
Recommended Settings:
Automatic Signing (Recommended for individuals/small teams):
Manual Signing (For larger teams with multiple developers):
Certificate Types:
Add if needed (based on ARCHITECTURE.md):
Configure in Xcode:
Before archiving and submitting, verify:
com.yourcompany.appname)App Information Tab:
Pricing and Availability Tab:
Version Information (under App Store → iOS App → Version):
In Xcode:
Alternative: Using Fastlane (automated):
# Install Fastlane
brew install fastlane
# Initialize
cd /path/to/project
fastlane init
# Edit Fastfile
# Add upload lane (see Section 9 for details)
# Upload to App Store Connect
fastlane release
In App Store Connect:
Review Timeline: Typically 24-48 hours (can be longer during holidays)
Status Updates:
Check Status:
If Rejected:
Rejection: "Your app crashed on launch or during use." Solution:
Rejection: "Your app appears to be a test or demo version." Solution:
Rejection: "Screenshots don't match the app." Solution:
Rejection: "App icon doesn't meet requirements." Solution:
Rejection: "Your app is too similar to other apps." Solution:
Rejection: "Privacy manifest missing or incomplete." Solution:
Rejection: "Privacy policy not accessible." Solution:
Rejection: "App privacy details don't match actual data collection." Solution:
Approved! Now what?
Option 1: Manual Release
Option 2: Automatic Release
Verify Live:
Announce Launch:
Daily Checks:
Crash Reports (Xcode Organizer → Crashes):
App Store Reviews:
Analytics (App Store Connect → Analytics):
Sales and Trends:
User Feedback:
Technical Metrics:
Positive Reviews (4-5 stars):
Thank you [Name]! We're thrilled you're enjoying [App Name]. If you have any suggestions, feel free to reach out at support@...
Constructive Negative Reviews (2-3 stars):
Thanks for the feedback, [Name]. We're sorry about [issue mentioned]. This has been fixed in the latest update. Please update the app and let us know if you're still experiencing issues. Contact us at support@... if you need help!
Harsh Negative Reviews (1 star, vague):
We're sorry you had a bad experience. Could you email us at support@... with more details? We'd love to make this right and improve the app for you.
Bug Reports in Reviews:
Thank you for reporting this, [Name]! We've identified the issue and will fix it in the next update. We've also emailed you directly. Sorry for the inconvenience!
Install Fastlane:
# Using Homebrew (Mac)
brew install fastlane
# Or using RubyGems
sudo gem install fastlane
Initialize Fastlane:
cd /path/to/your/project
fastlane init
Follow prompts:
fastlane/ directory with FastfileEdit fastlane/Fastfile:
# Fastfile
default_platform(:ios)
platform :ios do
# Variables
xcodeproj = "[AppName].xcodeproj"
scheme = "[AppName]"
bundle_id = "com.yourcompany.appname"
# Before all lanes
before_all do
# Ensure git status is clean
ensure_git_status_clean
end
# Lane: Run tests
desc "Run all tests"
lane :test do
run_tests(
scheme: scheme,
devices: ["iPhone 15 Pro"]
)
end
# Lane: Build app
desc "Build the app"
lane :build do
gym(
scheme: scheme,
export_method: "app-store",
output_directory: "./build"
)
end
# Lane: Upload to TestFlight
desc "Upload to TestFlight"
lane :beta do
# Increment build number
increment_build_number(xcodeproj: xcodeproj)
# Build
gym(
scheme: scheme,
export_method: "app-store"
)
# Upload
pilot(
skip_waiting_for_build_processing: false,
distribute_external: true, # Share with external testers
changelog: "Bug fixes and improvements"
)
end
# Lane: Release to App Store
desc "Upload to App Store and submit for review"
lane :release do
# Ensure main branch
ensure_git_branch(branch: "main")
# Run tests
test
# Increment version
version = prompt(text: "Enter version number (e.g., 1.0.0): ")
increment_version_number(version_number: version)
# Increment build
increment_build_number(xcodeproj: xcodeproj)
# Build
gym(
scheme: scheme,
export_method: "app-store"
)
# Upload to App Store Connect
deliver(
submit_for_review: true,
automatic_release: false,
force: true, # Skip HTML preview
metadata_path: "./fastlane/metadata",
screenshots_path: "./fastlane/screenshots"
)
# Tag release
add_git_tag(tag: "v#{version}")
push_git_tags
# Commit version bump
commit_version_bump(
message: "Version bump to #{version}",
xcodeproj: xcodeproj
)
push_to_git_remote
end
# Error handling
error do |lane, exception|
notification(
subtitle: "Failed to #{lane}",
message: exception.message
)
end
end
Setup metadata for automatic upload:
fastlane deliver init
This creates fastlane/metadata/ with folders for each locale:
fastlane/
└── metadata/
└── en-US/
├── description.txt # App description
├── keywords.txt # Keywords
├── marketing_url.txt # Marketing URL
├── name.txt # App name
├── privacy_url.txt # Privacy URL
├── release_notes.txt # What's New
├── subtitle.txt # Subtitle
└── support_url.txt # Support URL
Copy content from ASO optimization into these files.
Screenshots:
fastlane/screenshots/en-US/1_iphone65_1.png, 1_iphone65_2.png, etc.Create .github/workflows/release.yml: