# App Store metadata Local source-of-truth for the **IceGlass (macOS)** App Store listing. The appstore-publish skill's `asc-metadata.swift` (invoked in place from `../indie-skills`) reads this folder and pushes it to App Store Connect via the API; only files that are present get pushed. Then `asc-submit.swift` attaches the build and submits. ``` set -a; source .env.release; set +a; swift ../indie-skills/skills/appstore-publish/scripts/asc-metadata.swift --bundle dev.rzen.indie.IceGlass --version X.Y.Z --dry-run # preview set -a; source .env.release; set +a; swift ../indie-skills/skills/appstore-publish/scripts/asc-metadata.swift --bundle dev.rzen.indie.IceGlass --version X.Y.Z # push set -a; source .env.release; set +a; swift ../indie-skills/skills/appstore-publish/scripts/asc-submit.swift --bundle dev.rzen.indie.IceGlass --version X.Y.Z --submit # submit ``` **Note:** this metadata set is for the **macOS** app record only. IceGlass also ships an iOS companion (`IceGlass-iOS`, bundle ID `dev.rzen.indie.IceGlass.iOS`) that isn't wired into the release pipeline yet — when it's ready to publish, give it its own App Store Connect app record and its own sibling metadata directory (e.g. `Scripts/metadata-ios/`), since `asc-metadata.swift` currently queries the `IOS` platform filter when looking up versions, not `MAC_OS`. ## Layout & character limits | File | Field | Limit | API resource | |---|---|---|---| | `app//name.txt` | App name | 30 | `appInfoLocalizations` | | `app//subtitle.txt` | Subtitle | 30 | `appInfoLocalizations` | | `app//privacy_url.txt` | Privacy policy URL | — | `appInfoLocalizations` | | `app/categories.json` | Categories | — | `appInfos` | | `version//description.txt` | Description | 4000 | `appStoreVersionLocalizations` | | `version//keywords.txt` | Keywords (comma-sep) | 100 | `appStoreVersionLocalizations` | | `version//promotional_text.txt` | Promotional text | 170 | `appStoreVersionLocalizations` | | `version//whats_new.txt` | What's New | 4000 | `appStoreVersionLocalizations` | | `version//support_url.txt` | Support URL | — | `appStoreVersionLocalizations` | | `version/review.json` | Review contact / demo / notes | — | `appStoreReviewDetails` | | `screenshots///*.png` | Screenshots | — | `appScreenshotSets` | `name` + `subtitle` are **app-level**; `description` + `keywords` are **version-level**. `whats_new.txt` only applies after the first version — leave it out for 1.0. No `whats_new.txt` or `screenshots/` are checked in yet — screenshots still need to be captured (see the appstore-publish skill's "Step 3 — Screenshots" for the simulator-capture recipe; macOS screenshots are plain `screencapture`/window captures at the App Store's required pixel sizes, not simulator grabs). ## Screenshot display types (macOS) Common types: `APP_DESKTOP` (1280×800 or larger, 16:10). One folder per device class; filenames sort the order. The local set is authoritative — re-running replaces the remote set for any display type you provide. ## Not handled here (separate resource families) Age rating (`ageRatingDeclarations`), pricing/availability (`appPriceSchedules` / `appAvailabilities`), and App Privacy labels (`appDataUsages`). `asc-submit.swift --submit` (see the appstore-publish skill) reports any of these that block the submission.