EdsgerEdsger Docs

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:

  1. AI reads your codebase to understand exactly what your app does
  2. Generates optimized listings with real product details, within exact character limits
  3. Creates device-framed screenshots from AI-generated UI mockups at exact store dimensions
  4. Uploads everything to the platform for review and editing
  5. Submits directly to Apple App Store Connect and Google Play Console via their APIs

Supported Stores

Apple App Store

DeviceDimensionsOrientation
iPhone 6.7"1290 x 2796pxPortrait
iPhone 6.5"1284 x 2778pxPortrait
iPad 12.9"2048 x 2732pxPortrait

Google Play

DeviceDimensionsOrientation
Phone1080 x 1920pxPortrait
7" Tablet1200 x 1920pxPortrait
10" Tablet1920 x 1200pxLandscape

How It Works

Step 1: Run the CLI Command

edsger app-store <product-id>

Options:

FlagDescriptionDefault
--store <type>Target store: apple, google, or allall
--locale <locale>BCP 47 locale tag (e.g., en-US, ja-JP, zh-CN)en-US
--screenshots-onlySkip listing generation, only create screenshots
--listings-onlySkip screenshot generation, only create listing content
--verboseEnable 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-only

Step 2: AI Analyzes Your Product

The AI agent:

  1. Clones your repository (if a GitHub repo is connected) and explores it — README, landing pages, package.json, source files — to understand real product features
  2. Fetches product data from Edsger — name, description, features with statuses
  3. 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:

FieldLimitStore
App Name30 charsBoth
Subtitle30 charsApple only — punchy value proposition
Short Description80 charsGoogle only
Description4,000 charsBoth — feature bullets, benefits, social proof
Keywords100 charsApple only — comma-separated, no spaces after commas
What's NewunlimitedBoth — release notes
Primary CategoryBoth
Secondary CategoryBoth
Privacy Policy URLBoth
Support URLBoth
Marketing URLApple 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:

  1. HTML template: A complete, self-contained HTML page rendering a mock app UI for that feature
  2. Headline: Bold 2-5 word marketing text (e.g., "Track Everything")
  3. Subheadline: Optional supporting detail
  4. 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

  1. Local backup: Screenshots copied to ~/.edsger/app-store-assets/<productId>/
  2. Cloud upload: PNGs uploaded to Supabase Storage (app-store-assets bucket)
  3. 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:

FieldDescription
Key IDAPI key identifier, 10-character alphanumeric string
Issuer IDYour team's issuer UUID, shared across all keys
Private KeyThe .p8 file content (PEM format)

How to obtain:

  1. Sign in to App Store Connect
  2. Navigate to Users and AccessIntegrationsApp Store Connect API
  3. 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
  4. Copy the Key ID — shown in the key list
  5. Copy the Issuer ID — shown at the top of the page, above the key list
  6. Download the Private Key (.p8 file) — 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:

  1. Open the Google Cloud Console
  2. Select or create a project linked to your Google Play app
  3. Navigate to IAM & AdminService Accounts
  4. Click Create Service Account:
    • Name: e.g., "Edsger Publishing"
    • Click Create and Continue
    • Skip the optional role/access steps, click Done
  5. Click the newly created service account → Keys tab → Add KeyCreate new keyJSONCreate
  6. A .json file will download — this is your credential file
  7. Open Google Play ConsoleSettingsAPI access
  8. Find your service account and click Manage permissions
  9. Grant the following permissions:
    • Release to production, exclude devices, and use Play App Signing
    • Manage store presence
  10. 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

  1. Navigate to your product → App Store tab
  2. Click on the store config card (Apple or Google)
  3. Click Configure Credentials
  4. 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:

ActionWhat It Does
Push ListingsSends listing content to the store API for all configured locales
Push ScreenshotsUploads screenshot images to the store (replaces existing)
Submit for ReviewSubmits the app for store review (Apple) or production release (Google)
Check StatusQueries the store API for current review/release status

Submission Status

StatusDescription
noneNo submission yet
submittedSubmitted for review
in_reviewUnder store review
approvedApproved by store
rejectedRejected — check rejection_reason
releasedLive 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-CN

Each 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

ToolPurposeRequired For
Playwright + ChromiumScreenshot renderingScreenshots
Node.js >= 18CLI runtimeAll
Edsger MCP tokenPlatform API accessAll
Store API credentialsDirect store publishingPublishing only

Screenshot generation requires Playwright:

npx playwright install chromium

Store 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