Checked before it ships
Catch store limits, repeated words, wasted keyword space and policy issues before they go live.
Keep every locale in your repo, check store limits and ASO rules, measure keyword coverage, then push to App Store Connect and Google Play.
Open source · MIT · App Store + Google Play
Catch store limits, repeated words, wasted keyword space and policy issues before they go live.
See where the app shows up for every target search, how it moved, and the words still missing.
An agent proposes the change, the check runs on the pull request, a teammate approves it, CI ships it.

The listing for each store and language, the searches you want to rank for, and every release, as files in your repo. The ASO file shows what you rank for, what is missing and what competitors changed.
$ npx @appeeky/spec coverage --country us
COVERAGE app-store · us indexed from en-US + es-MX
✓ white noise #8 +4 name
✓ sleep sounds #12 +29 name
✓ rain sounds #21 +17 subtitle
✓ brown noise #34 new keywords · es-MX
✗ fan sounds — — missing “fan”
Covered 4/5 targets
Spare es-MX keywords, 37 characters left
The GitHub Action comments on every pull request that touches the listing: what changes, which searches it gains or loses, and whether the checks pass.
before
Sleep Sounds: White Noise
White Noise & Sleep Aid
rain sounds #38fan sounds —
after, day 7
Sleep Sounds: White Noise
Rain, Fan & Baby Sleep Aid
rain sounds #21fan sounds #27
| store | locale | field | before | after | length |
|---|---|---|---|---|---|
| App Store | en-US | subtitle | White Noise & Sleep Aid | Rain, Fan & Baby Sleep Aid | 27/30 |
| App Store | en-US | keywords | sleep,noise,rain,calm,relax | brown,ambient,lullaby,nap,calm,relax,storm,ocean | 49/100 |
| App Store | es-MX | keywords | sonidos,dormir,lluvia,bebe | sonidos,dormir,lluvia,bebe,brown noise,white,sleep | 63/100 |
Promotional text and descriptions unchanged. The subtitle change needs a new App Store version.
The spec is a folder of YAML and markdown, committed with your app. Your coding agent reads it, edits it and runs the checks the same way it works on your code, and the change comes back to you as a pull request.
Install the skills once per repo
skill appeeky-spec
you
The spec is a git repo. Your team works on the listing the way it works on the app: branches, pull requests, reviews and a history you can read.
mia · Appeeky Desktop
Edit the en-US promotional text
branch listing/us-fan
claude · agent
Add “fan” to the es-MX keywords
same branch
appeeky-spec · GitHub Action
Report on PR #43
0 errors · us coverage 4/5 → 5/5
deniz · code owner
Approved the listing change
required by CODEOWNERS
ci · on merge
appeeky-spec push --yes
App Store Connect · version 3.1.0
appeeky-spec · commit
releases/2026-11-03.yaml
note, before and after, ranks today
appeeky-spec · day 7
WON · fan sounds unranked → #27
playbook.md updated
Everyone edits the same files
In Desktop, with an agent or by hand. Changes come in as branches and pull requests.
Reviewed before it ships
The GitHub Action comments the report on every PR and fails it on check errors. CODEOWNERS can require an approval for listing changes.
History stays in git
Every push is committed under releases/: what changed, why, and what happened on day 7 and day 14. The playbook is shared in the repo too.
Keys stay with people
Store keys live on each person’s machine or in CI secrets, never in the repo. The .appeeky/ cache is gitignored.
Who can push
Only someone with store keys, or CI. Approval is your pull request review; the spec does not add its own approval step.

# .github/CODEOWNERS/appeeky/ @your-org/growth/appeeky.spec.yaml @your-org/growth
# .github/workflows/listing.ymlon: pull_request: push: branches: [main]jobs: listing: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: { fetch-depth: 0 } - uses: appeeky/appeeky-spec@v0 # report on PRs - if: github.event_name == 'push' # ship on merge run: npx @appeeky/spec push --yes --note "${{ github.event.head_commit.message }}" env: APPEEKY_API_KEY: ${{ secrets.APPEEKY_API_KEY }}
From the first pull to a measured release. Each step is one command, the same in your terminal, in CI and for your agent.
$ appeeky-spec pull
✓ app-store en-US, es-MX, de-DE, tr
✓ google-play en-US, tr-TR
from version 3.0.1 (prepare for submission)
Start with one locale or one field. Adopt the rest when you are ready.
