agentleFS
saif-o99saif-o99/app-launch-skills/app-store-connect/SKILL.md

app-store-connect

Skill0 starsChanged 35 days agoMITView on GitHub

Read and change an app in App Store Connect through Apple's API with one script - list apps, create a version, enter names, subtitles, descriptions, keywords and release notes per locale, upload screenshots and creative assets, attach a build, set age rating, price, review contact, demo account and notes, attach files for the reviewer, check what is missing, and (only on the owner's word) submit for review or release. Use this whenever the user mentions App Store Connect, ASC, the store listing "in Apple", uploading screenshots, attaching a build, version status, "is it approved", submitting for review or releasing, and whenever another launch skill needs something entered in or read from Apple's side.

6 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

3 rules. 0 are common, 0 are distinctive, and 3 are very specific to this project.

  • 0

    Common

    Most of the 6 edited versions we read keep these.

  • 0

    Distinctive

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Before running info or text, the listing text must pass ../store-listing/scripts/check-copy.mjs, and the owner must have seen the whole …

    line 52
  2. Very specific:

    Release type: Default to MANUAL. It leaves a gap between approval and release to deploy a backend or pick a launch day.

    line 54
  3. Very specific:

    After shots, screenshots process for a minute or two.

    line 84

“Common” is measured: kept by at least 6 in 10 of the 6 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

App Store Connect

Nearly everything in App Store Connect can be done through its API, without a browser, in seconds, and repeatably. scripts/asc.mjs wraps the calls a release needs. Use it instead of clicking, and instead of writing one-off scripts per app.

node scripts/asc.mjs                 # prints every command

It reads two things:

  • The account key: ~/.appstoreconnect/config.json (keyId, issuerId) and the .p8 in ~/.appstoreconnect/private_keys/. If they are missing, see references/api-key.md; creating a key is an owner step.
  • The app's settings: store/asc.json in the app's repo (or --config <file>). Format in references/config.md.

Run it from the app's repository root, calling the script by its absolute path (scripts/asc.mjs here means this skill's folder). apps, bundle-id and review-contact need no settings file. On Windows, Git Bash rewrites an argument that starts with / into a Windows path; the script undoes that for raw, but quoting the path or using PowerShell avoids it.

The two things that need the owner's word, every time

asc.mjs submit sends a version to App Review. asc.mjs release puts an approved version on the store. Both refuse to run without --confirm <version>, and that flag is yours to add only after the owner has said, for this version, to submit or to release. A go-ahead from an earlier version, or "prepare everything", is not it. Owners want to choose the moment, and sometimes change their mind mid-task.

The same guard covers raw: a non-GET call to a submission or release resource is refused without --confirm. Do not look for another way around it.

Everything else the script does can be undone or overwritten and never reaches the public by itself, with one exception: on an app that is already live, promotional text, price and availability change in the store the moment they are saved. asc.mjs text writes promotional text. So for a live app the promotional text is part of what the owner approves before text is run, and price and availability are changed only when asked.

Order of work for a release

asc.mjs apps                         # find the app id (a brand-new app must be created in the web UI by the owner first)
asc.mjs bundle-id com.you.app        # new app: is the bundle identifier registered? (add "<name>" to register it)
asc.mjs review-contact <otherAppId>  # if the account has another app: the contact details and copyright used on it
asc.mjs status                       # what is there now
asc.mjs version                      # create the version, manual release, copyright
asc.mjs info                         # names, subtitles, privacy URL, categories, content rights
asc.mjs text                         # description, keywords, promo text, release notes, support and marketing URLs
asc.mjs shots                        # screenshots from store/screenshots/upload/<locale>/
asc.mjs creative place               # search-results image and header, if made
asc.mjs age                          # age rating answers
asc.mjs price                        # first release only: the price from "price" in asc.json (0 for free)
asc.mjs review                       # contact, demo account, notes
asc.mjs attach store/review/demo.mp4 # the owner's screen recording, if there is one
asc.mjs wait-build 28                # after the EAS upload: wait for Apple's processing
asc.mjs build 28                     # attach it
asc.mjs preflight                    # what is still missing

Each command is safe to run again; it looks at what exists first. Run status after the writes and read it: confirm the text lengths and screenshot counts are what you intended, per locale.

Before running info or text, the listing text must pass ../store-listing/scripts/check-copy.mjs, and the owner must have seen the whole proposal: get approval of the name, subtitle, keywords, category and locales first, then enter them.

Release type. Default to MANUAL. It leaves a gap between approval and release to deploy a backend or pick a launch day.

The first version of a new app has no release notes field, needs a price, and must include the first in-app purchases in the same submission (see ../revenuecat-setup/SKILL.md, step 6).

What the API cannot do

These need the web interface, in a browser the owner has signed in to. Reading or clicking there is a computer-use task; follow ../app-launch/references/computer-use.md (it covers who does the clicking, the sign-in rule, and what the browser agent cannot see).

  • Creating the app record.
  • Agreements, tax forms and banking.
  • EU trader status.
  • App privacy answers ("nutrition labels"): draft them from the code, the owner enters them.
  • Regulated medical device status.
  • App Analytics (impressions, conversion, sources) unless an analytics report request exists.
  • Device Preview of creative assets.
  • Reading the text of a rejection, and replying to App Review.

One thing sits in between: adding in-app purchases and subscriptions to a version's submission. The API has had a route for it since version 4.4.1 (references/api-notes.md, section 3), but it has not been run here, so the dependable way is still the web interface; either way, read the submission's items back afterwards.

asc.mjs preflight prints this reminder with its result, because a clean API check is not a complete one.

Things worth knowing

references/api-notes.md has the endpoints behind each command and the traps met so far. The short list:

  • Name, subtitle, keywords and category go live only with an approved new version. Promotional text is live the moment it is saved.
  • An app has two "app infos" while a version is in preparation: the live one and the editable one. The script picks the editable one.
  • A locale added in the web UI is pre-filled with the primary language's text. Overwrite every field; do not assume an added locale is empty or translated.
  • Locale codes are irregular (it, not it-IT; nl-NL, not nl). The list is in references/config.md.
  • Screenshot sets are recognised by pixel size. A size Apple does not accept fails with a clear message before anything is uploaded.
  • After shots, screenshots process for a minute or two; status shows COMPLETE when done. While a version is waiting for review, screenshots cannot be changed.
  • For anything the script lacks, asc.mjs raw GET "/v1/…" calls the API directly. Read before you write, and prefer adding a command to the script over a one-off. Review details hold the demo account's password; raw hides it in its output, and there is no reason to go looking for it.
  • bundle-id with a name and the attach command have not been run against a live account yet (October 2026). Check their result with a read the first time.

Reporting

Report in the owner's terms: which locales now have which text and how many screenshots, which build is attached, the version's state, and what is still missing. Say plainly whether anything was submitted. If a command failed halfway (an upload, a locale), say which parts are done; the commands can be re-run for just the rest (shots de-DE).

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.