App Store Publishing
Generate and publish App Store and Play Store listings, screenshots, and metadata with AI.
App Store Publishing
App Store Publishing is Edsger's end-to-end pipeline for generating, managing, and submitting app store assets. AI analyzes your product and codebase to create optimized listing content and production-ready screenshots for both Apple App Store and Google Play — then submits them directly through the store APIs.
Why App Store Publishing?
App Store Optimization (ASO) is critical for app discoverability, but it's tedious and specialized work:
- Listing copywriting: App names, subtitles, descriptions, and keywords all need to be carefully crafted within strict character limits
- Screenshot production: Each store requires multiple device sizes, each with marketing-quality screenshots showing real UI
- Localization: Reaching global audiences means translating and adapting content for multiple locales
- Store differences: Apple and Google have different requirements, character limits, and screenshot dimensions
- Ongoing updates: Listings need to be refreshed with each major release
Edsger automates this entire process:
- AI reads your codebase to understand exactly what your app does
- Generates optimized listings with real product details, within exact character limits
- Creates device-framed screenshots from AI-generated UI mockups at exact store dimensions
- Uploads everything to the platform for review and editing
- Submits directly to Apple App Store Connect and Google Play Console via their APIs
Supported Stores
Apple App Store
| Device | Dimensions | Orientation |
|---|---|---|
| iPhone 6.7" | 1290 x 2796px | Portrait |
| iPhone 6.5" | 1284 x 2778px | Portrait |
| iPad 12.9" | 2048 x 2732px | Portrait |
Google Play
| Device | Dimensions | Orientation |
|---|---|---|
| Phone | 1080 x 1920px | Portrait |
| 7" Tablet | 1200 x 1920px | Portrait |
| 10" Tablet | 1920 x 1200px | Landscape |
How It Works
Step 1: Run the CLI Command
edsger app-store <product-id>Options:
| Flag | Description | Default |
|---|---|---|
--store <type> | Target store: apple, google, or all | all |
--locale <locale> | BCP 47 locale tag (e.g., en-US, ja-JP, zh-CN) | en-US |
--screenshots-only | Skip listing generation, only create screenshots | — |
--listings-only | Skip screenshot generation, only create listing content | — |
--verbose | Enable verbose output | — |
Examples:
# Generate everything for both stores
edsger app-store <product-id>
# Only Apple App Store listings in Japanese
edsger app-store <product-id> --store apple --locale ja-JP --listings-only
# Only Google Play screenshots
edsger app-store <product-id> --store google --screenshots-onlyStep 2: AI Analyzes Your Product
The AI agent:
- Clones your repository (if a GitHub repo is connected) and explores it — README, landing pages, package.json, source files — to understand real product features
- Fetches product data from Edsger — name, description, features with statuses
- Reviews existing store configs — any previously generated listings and screenshots — to build on prior work
Step 3: AI Generates Listings
For each target store and locale, the AI generates optimized listing content:
| Field | Limit | Store |
|---|---|---|
| App Name | 30 chars | Both |
| Subtitle | 30 chars | Apple only — punchy value proposition |
| Short Description | 80 chars | Google only |
| Description | 4,000 chars | Both — feature bullets, benefits, social proof |
| Keywords | 100 chars | Apple only — comma-separated, no spaces after commas |
| What's New | unlimited | Both — release notes |
| Primary Category | — | Both |
| Secondary Category | — | Both |
| Privacy Policy URL | — | Both |
| Support URL | — | Both |
| Marketing URL | — | Apple only |
All content uses real product details from your codebase — no placeholder brackets. The AI follows ASO best practices: keyword density, benefit-driven language, and channel-specific formatting.
Step 4: AI Generates Screenshots
For each screenshot (5-8 per store), the AI produces:
- HTML template: A complete, self-contained HTML page rendering a mock app UI for that feature
- Headline: Bold 2-5 word marketing text (e.g., "Track Everything")
- Subheadline: Optional supporting detail
- Visual style: Background gradient and text color
Step 5: Screenshot Rendering Pipeline
Edsger uses a 3-stage Playwright pipeline to turn AI templates into store-ready images:
Stage 1 — Render template: The HTML template is rendered in a headless browser at base viewport (390x844 for phones, 1280x720 for desktop) with 2x device scale factor for crisp output.
Stage 2 — Device framing: The raw screenshot is wrapped in a realistic device frame:
- iPhone: iPhone 15 Pro with Dynamic Island, side buttons, home indicator
- MacBook: MacBook Pro chassis with camera notch and silver base
- Browser: Chrome-style window with traffic lights and address bar
Stage 3 — Store composition: The framed screenshot is composited onto the final image:
- Portrait (phones/tablets): Marketing text at top, device centered below
- Landscape (10" tablet): Text on left (40%), device on right (60%)
- Exact store-required dimensions with background gradient
Output files are saved to a temp directory and named <store>-<deviceType>-<NN>.png.
Step 6: Upload and Save
- Local backup: Screenshots copied to
~/.edsger/app-store-assets/<productId>/ - Cloud upload: PNGs uploaded to Supabase Storage (
app-store-assetsbucket) - Metadata saved: Listing content and screenshot URLs saved to the platform via MCP
Managing Store Assets
App Store Tab
Navigate to your product and click the App Store tab to see:
- Store configs: One card per store (Apple / Google), showing submission status, version, and locale/screenshot counts
- Listings: Browse and edit listing content per locale
- Screenshots: Thumbnail grid sorted by display order, with device type and caption overlays
- Configuration: App identifier and credential status
Editing Listings
Click "Edit" on any locale's listing to open the editor:
- All fields are editable with real-time character counters
- Character limits are enforced per field (30 for app name, 80 for short description, etc.)
- Changes save directly to the platform
Store Credentials
To publish directly to stores, you need to configure API credentials. Credentials are stored server-side only — the browser never reads or displays the original values.
Apple App Store Connect
You need three values from App Store Connect:
| Field | Description |
|---|---|
| Key ID | API key identifier, 10-character alphanumeric string |
| Issuer ID | Your team's issuer UUID, shared across all keys |
| Private Key | The .p8 file content (PEM format) |
How to obtain:
- Sign in to App Store Connect
- Navigate to Users and Access → Integrations → App Store Connect API
- If you don't have a key yet, click Generate API Key:
- Enter a name (e.g., "Edsger Publishing")
- Select the Admin role (required for submitting apps and uploading screenshots)
- Click Generate
- Copy the Key ID — shown in the key list
- Copy the Issuer ID — shown at the top of the page, above the key list
- Download the Private Key (
.p8file) — this is only available once immediately after generation. If you lose it, you must revoke the key and create a new one
The .p8 file content looks like:
-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg...
-----END PRIVATE KEY-----Paste the full content (including the BEGIN and END lines) into the Private Key field.
Google Play Console
You need a Service Account JSON file.
How to obtain:
- Open the Google Cloud Console
- Select or create a project linked to your Google Play app
- Navigate to IAM & Admin → Service Accounts
- Click Create Service Account:
- Name: e.g., "Edsger Publishing"
- Click Create and Continue
- Skip the optional role/access steps, click Done
- Click the newly created service account → Keys tab → Add Key → Create new key → JSON → Create
- A
.jsonfile will download — this is your credential file - Open Google Play Console → Settings → API access
- Find your service account and click Manage permissions
- Grant the following permissions:
- Release to production, exclude devices, and use Play App Signing
- Manage store presence
- Click Apply and wait a few minutes for permissions to propagate
Paste the full JSON content from the downloaded file into the Service Account JSON field.
Configuring in Edsger
- Navigate to your product → App Store tab
- Click on the store config card (Apple or Google)
- Click Configure Credentials
- Paste the values and save
Credentials are only transmitted once during save, stored encrypted on the server, and used exclusively by the server-side publish function. They are never sent back to the browser.
Publishing to Stores
The App Store tab provides four action buttons:
| Action | What It Does |
|---|---|
| Push Listings | Sends listing content to the store API for all configured locales |
| Push Screenshots | Uploads screenshot images to the store (replaces existing) |
| Submit for Review | Submits the app for store review (Apple) or production release (Google) |
| Check Status | Queries the store API for current review/release status |
Submission Status
| Status | Description |
|---|---|
none | No submission yet |
submitted | Submitted for review |
in_review | Under store review |
approved | Approved by store |
rejected | Rejected — check rejection_reason |
released | Live on the store |
Multi-Locale Support
Generate listings for multiple locales by running the command multiple times:
# English (default)
edsger app-store <product-id> --listings-only
# Japanese
edsger app-store <product-id> --listings-only --locale ja-JP
# Simplified Chinese
edsger app-store <product-id> --listings-only --locale zh-CNEach locale's listing is stored independently and can be edited separately in the UI. All locales are pushed to the store together when you click "Push Listings".
Requirements
| Tool | Purpose | Required For |
|---|---|---|
| Playwright + Chromium | Screenshot rendering | Screenshots |
| Node.js >= 18 | CLI runtime | All |
| Edsger MCP token | Platform API access | All |
| Store API credentials | Direct store publishing | Publishing only |
Screenshot generation requires Playwright:
npx playwright install chromiumStore publishing requires API credentials — but you can generate and review listings and screenshots without them.
Best Practices
- Connect your GitHub repo: The AI generates much more accurate content when it can read your actual codebase and UI code
- Generate both stores at once: Use
--store all(default) to create assets for both Apple and Google in a single run - Review and edit: AI-generated content is a strong starting point — review and refine before publishing
- Update with each release: Re-run after major features to keep listings and screenshots current
- Use locale support: Even if you only publish in English, consider generating Japanese and Chinese listings to expand your reach
- Configure credentials last: Generate and perfect your listings and screenshots first, then add store credentials for direct publishing
Growth Analysis
AI-powered growth marketing strategy and content generation for your product.
CLI Overview
Edsger CLI is an AI agent that automates the full software development lifecycle — from requirements analysis through code implementation, testing, and pull requests — while keeping your team in control.