appeeky spec

Give your app listing
a source of truth.

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

Checked before it ships

Catch store limits, repeated words, wasted keyword space and policy issues before they go live.

Keyword coverage, measured

See where the app shows up for every target search, how it moved, and the words still missing.

Built for agents and teams

An agent proposes the change, the check runs on the pull request, a teammate approves it, CI ships it.

Every app gets a spec folder

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.

sleep-sounds — ASO
ASO >app-storeus>covered4/5
1# ASO · App Store · United States
2Indexed from en-US and es-MX. Ranks from the last 7 days.
3
4| target | rank | 7d | pop | covered by |
5|------------------|------|------|-----|--------------------|
6| white noise | 8 | +4 | 71 | name |
7| sleep sounds | 12 | +29 | 62 | name |
8| rain sounds | 21 | +17 | 48 | subtitle |
9| brown noise | 34 | new | 39 | keywords · es-MX |
10| fan sounds | — | — | 33 | missing “fan” |
11
12## Worth adding
13- fan pop 33 · fits in es-MX keywords (37 left)
14- baby sleep pop 44 · persona new-parents
15
16## Competitor moves
17- Calm Sleep dropped “rain” from its subtitle on Oct 28
claude - agentsleep-sounds - zsh

$ 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

main · localaso · us · 4/5 targets covered · 2 worth adding

See what every change will do

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.

appeeky-specbotcommented on #42 · Rain and brown noise for US sleep searches

In App Store search

before

Sleep Sounds: White Noise

White Noise & Sleep Aid

rain sounds #38fan sounds —

Get

after, day 7

Sleep Sounds: White Noise

Rain, Fan & Baby Sleep Aid

rain sounds #21fan sounds #27

Get

Listing changes

storelocalefieldbeforeafterlength
App Storeen-USsubtitleWhite Noise & Sleep AidRain, Fan & Baby Sleep Aid27/30
App Storeen-USkeywordssleep,noise,rain,calm,relaxbrown,ambient,lullaby,nap,calm,relax,storm,ocean49/100
App Storees-MXkeywordssonidos,dormir,lluvia,bebesonidos,dormir,lluvia,bebe,brown noise,white,sleep63/100

Promotional text and descriptions unchanged. The subtitle change needs a new App Store version.

appeeky-spec check0 errors · 1 warning: “sleep” repeats in name and subtitle

What the spec checks

  • Store character limits and locale requirements.
  • Repeated words, wasted keyword space and title policy.
  • Coverage across storefronts and secondary locales.

What every push records

  • Before and after values for every managed field.
  • Search ranks before the listing changes.
  • The hypothesis and the day-7 and day-14 verdict.

Lives in your repo, next to your agents

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.

  • Claude Code
  • Codex
  • Cursor
  • Gemini CLI

Install the skills once per repo

appeeky-spec
Set up the spec, find gaps, edit, check and push
appeeky-spec-targets
Personas, keyword research, which searches to target
appeeky-spec-localize
A new language or country, spare keyword space
appeeky-spec-review
Day-7 and day-14 results, keep or revert, playbook
Read the agent guide
claude - sleep-sounds

skill appeeky-spec

you

The agent finds where a word fits, edits the listing file and proves it with a check.

Shared on GitHub, like code

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.

  1. mia · Appeeky Desktop

    Edit the en-US promotional text

    branch listing/us-fan

  2. claude · agent

    Add “fan” to the es-MX keywords

    same branch

  3. appeeky-spec · GitHub Action

    Report on PR #43

    0 errors · us coverage 4/5 → 5/5

  4. deniz · code owner

    Approved the listing change

    required by CODEOWNERS

  5. ci · on merge

    appeeky-spec push --yes

    App Store Connect · version 3.1.0

  6. appeeky-spec · commit

    releases/2026-11-03.yaml

    note, before and after, ranks today

  7. 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 }}
Set up the GitHub Action

One workflow, every listing

From the first pull to a measured release. Each step is one command, the same in your terminal, in CI and for your agent.

All commands
sleep-sounds - zsh

$ 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)

Every locale on both stores becomes a file you can read and diff.

Ship listing changes with confidence

Start with one locale or one field. Adopt the rest when you are ready.

View on GitHub