- cli/lib/rt.ts: the runtime layer on node: modules (spawn / spawnSync with Bun's defaults, exit codes and "Executable not found", which with PATHEXT, sleep, serve, Glob, hasher, gunzip, stdin, SQLite, packageRoot, config imports with a type-stripping fallback for Node 20); every Bun.* use in cli/ goes through it - tools/gen-embedded.ts -> cli/lib/embedded.ts: templates/, cli/shots/*.html and Play's Data safety form embedded (replaces Bun text imports; the bundle and the compiled sidecar carry them), checked fresh by bun run ci - package.json: bin dist/storebound.mjs (Node ESM bundle, tools/build-node.ts, prepack), engines node >=20 - bun run ci: node bundle + node smoke (real node: --version, help, check same as Bun, scan, release plan --help, init, MCP handshake + tool call); Forgejo CI sets up Node 20; tests/node-compat.test.ts guards cli/ - install writes npx MCP commands when run with Node; bin/storebound falls back to Node - docs: npx storebound init (Node 20+) or bunx storebound init
13 KiB
storebound
Toolchain for taking mobile apps and games from nothing to "Submit for review" on Google Play and the App Store. Before a store task, open the matching skill file below and follow it step by step.
These rules apply to every AI tool that uses storebound (skills, MCP server or the CLI in a terminal).
First rule: do it, don't ask
storebound plus you, the AI agent, do the work. The owner is not your pair of hands.
- You do everything yourself: API calls, uploads, builds, template and CSV downloads and exports, every console navigation (open, Get Started, Edit, Next, Continue, Save draft), console forms, and the verification afterwards. Never tell the owner "run this yourself" or "click X yourself" for any of these.
- The owner keeps only the final public or irreversible buttons: Submit for review (App Review or Beta App
Review), releasing a version or completing / resuming a production rollout, App Privacy Publish, accepting legal
agreements; plus deleting store data, changing live prices, sending review replies and inviting or removing
testers. (Also the owner's: canceling a submission, starting or stopping a store experiment, a console form's final
Submit / Create that a console plan lists in
buttons.final, signing in and granting account permissions.) For these you prepare everything, show the dry run, and the owner presses one button or says yes. - Ask the owner only for facts that no code, config or doc can prove: compliance answers such as Data safety,
App Privacy, age rating, export compliance, partial data deletion. Collect ALL of them in ONE batch at the start
(
storebound checkandstorebound validatelist them), never one at a time during the run. Reuse answers that are already in the config. - Default loop: plan, then you drive (the API first, your browser tool for consoles without an API), then verify (read it back), then continue. No round trip to the owner in between.
- Catch rejections offline. Before a write,
storebound checkand--drymust catch what the store would refuse (live-shape fixtures, id and pair checks). A failure belongs in the dry run, not in a 400 at write time; when a store refuses something the dry run passed, fix the check (pitfalls), not just the data.
Every hour of "please click this" is an hour the owner did not want to spend. If you catch yourself writing "you need to ...", do it instead, unless it is one of the owner steps in point 2.
The other rules
Read skills/store-pitfalls/SKILL.md before any store task. It lists the mistakes already made in real releases
(store lists that lag after a create, dry runs without a plan, taken App Store names, byte limits, ...) and what to do.
- The owner presses only the owner steps (point 2 of the first rule). Prepare them completely, say what will happen, and let the owner press the button, or run the command only after a clear yes in chat. storebound's MCP server does not offer these at all. Everything else you run yourself.
- Dry run first, then run it yourself. Every write command has
--dry(MCP:dry_run, default true). Run the dry run, check and show it (the rows that change, not just a count), then run the real command yourself (--yeswhere it asks for a confirmation) and read the result back. Wait for the owner's yes only before an owner step. - Read before you write.
storebound scan(offline: rejection risks in the project itself),storebound check(offline) andstorebound validate(read-only, both stores) tell you what is missing and in which order to fix it. - Credentials only from the environment,
.storebound/in the project (gitignored) or a credential profile (~/.storebound/credentials/<profile>.json, named by--account <profile>or a workspace). Never ask for keys, passwords or tokens in chat, never print them, never write them into the config, docs or commits. The same goes for the App Review demo account (reviewDemoAccountin.storebound/credentials.json): the owner puts it there. - Never answer a compliance question you cannot know. Export compliance, Data safety, App Privacy, age rating, target audience: ask the owner when the code does not prove the answer, all such questions in one batch at the start (first rule, point 3), and write the answers into the config. A wrong "no" is worse than a slow "ask".
- Pick builds by explicit number. Use the build number / versionCode you just uploaded, never "the latest".
- Long uploads run in the background with a log (
storebound play images > .storebound/images.log 2>&1 &) and you report the progress lines, not guesses. - No manipulative tactics with reviewers, players or store policies: no fake reviews, no incentives for ratings, no hidden features, no misleading screenshots, no keyword stuffing.
- Personal data stays local. Tester lists, review reply drafts, health reports and analytics snapshots live in
.storebound/(gitignored). Never put tester emails, reviewer names or crash logs into issues, docs or commits, and never ask for tester emails in chat (storebound masks them in its output). - Console forms without an API: drive them yourself, agent-first.
storebound console plan <form> --json(MCPconsole_plan) gives the start URL, steps, the answer sheet, the buttons you must never press and the verified UI facts. Drive the page with your own browser tool, adapt to what it shows, run long flows as an in-page async loop that writeswindow.__log(one evaluate call times out around 45 s), stop only before the final button (Publish, Submit, Create, a final Save) and tell the owner exactly what to press, thenstorebound console verify <form>. Never sign in, accept an agreement or grant a permission (a service account's app access) for the owner.storebound console fillis the optional scripted fast path; it never blocks you.
Tools
- CLI:
storebound <command>(storebound help; outside the plugin:npx storeboundon Node 20+ orbunx storeboundon Bun); configstorebound.config.ts, credentials in env or.storebound/. - MCP:
storebound mcp(stdio). MCP 2026-07-28 + 2025-11-25. Write tools default todry_run: true; submit / release / cancel / delete / send are not exposed. - Readiness:
storebound scan(offline rejection risks in the project files),storebound check(offline),storebound validate(read-only, both stores). - Every endpoint:
storebound api apple|play <operationId>(skill store-api). GETs run; writes are dry unless the owner adds--yesin a terminal; MCP has the read-onlyapi_get.
Skills
skills/account-deletion/SKILL.md: Make account deletion pass App Store and Google Play review for an app with sign-up or sign-inskills/adhoc-distribution/SKILL.md: Get a test build of a mobile app or game onto specific devices without a store reviewskills/ads-levelplay-checks/SKILL.md: Renamed to ads-mediation-checks (AdMob, AppLovin MAX and Unity LevelPlay / ironSource). Kept so existing installs and links keep working. Use ads-mediation-checks for any ad mediation, app-ads.txt, SKAdNetwork or "no fill" questionskills/ads-mediation-checks/SKILL.md: Diagnose and verify ad mediation in a mobile app or game before and after store releaseskills/app-icons/SKILL.md: Generate every icon a mobile app or game needs from one artworkskills/app-previews/SKILL.md: Make App Store app preview videos and a Google Play promo video for a mobile app or game from real footage (gameplay or app flows)skills/app-store-promotion/SKILL.md: App Store promotion tools for a mobile app or game through the App Store Connect APIskills/apple-ads/SKILL.md: Read Apple Ads (formerly Apple Search Ads) results for a mobile app or game and make small, owner-approved bid, daily budget and pause changesskills/appstore-first-release/SKILL.md: Step-by-step first (and later) App Store release of a mobile app or gameskills/aso-basics/SKILL.md: App store optimization basics for a mobile app's or game's textskills/build-and-sign/SKILL.md: Sign, build and upload a mobile app or game from the terminalskills/console-autofill/SKILL.md: Fill App Store Connect and Google Play Console forms that have no API (New App, App Privacy, Play Create app, IARC content rating, every Play App content card, Play Store settings category, first production release countries and send-for-review). Agent-first by defaultskills/export-compliance/SKILL.md: Answer App Store export compliance (encryption) for a mobile app or game correctlyskills/listing-localization/SKILL.md: Translate the store listing of a mobile app or game into more languagesskills/migrate-from-fastlane/SKILL.md: Move a mobile app or game from fastlane (deliver, supply, snapshot / screengrab, Appfile, Deliverfile) to storebound withstorebound import fastlaneskills/play-first-release/SKILL.md: Step-by-step first (and later) Google Play release of a mobile app or gameskills/portfolio-originality/SKILL.md: Originality gate for studios and developers that ship many similar mobile apps or games (templates, white-label apps, reskins)skills/ppp-pricing/SKILL.md: Propose purchasing power parity (PPP) prices for a mobile app's or game's in-app products in every App Store territory and Google Play region withstorebound prices pppskills/privacy-manifest/SKILL.md: Add and check Apple privacy manifests (PrivacyInfo.xcprivacy) for an iOS app or gameskills/privacy-policy/SKILL.md: Write and host one studio-wide privacy policy page for all of a developer's mobile apps and gamesskills/release-flows/SKILL.md: Repo-local workflows for a mobile app or gameskills/release-management/SKILL.md: Ship updates safely after the first releaseskills/revenuecat-sync/SKILL.md: Optional adapter that keeps a RevenueCat project's catalog in step with the storebound configskills/review-access/SKILL.md: Give App Store and Google Play reviewers working access to an app behind a sign-inskills/review-rejections/SKILL.md: Triage and answer an App Store or Google Play rejection, policy warning or strike for a mobile app or gameskills/review-replies/SKILL.md: Reply to App Store and Google Play reviews of a mobile app or game the safe wayskills/store-analytics/SKILL.md: Take store analytics snapshots for a mobile app or game (App Store impressions, product page views, downloads and conversion through the Analytics Reports API; Google Play store listing visitors, acquisitions and installs from the Play reports bucket) and compare them with listing, screenshot and experiment changes from git; download App Store sales / finance reports and Play earnings / sales reports with a summary per product and currencyskills/store-api/SKILL.md: Call any App Store Connect API or Google Play Developer API operation that storebound's commands do not wrap, safelyskills/store-declarations/SKILL.md: Answer the store compliance forms for a mobile app or gameskills/store-health/SKILL.md: Watch a released mobile app's or game's crash and ANR health on both storesskills/store-iap-setup/SKILL.md: Create and price in-app purchases (consumables, non-consumables like "remove ads" or a Pro unlock, non-renewing passes, coin/gem packs, starter packs) on Google Play and App Store Connect from one product listskills/store-pitfalls/SKILL.md: Known pitfalls with App Store Connect, Google Play and storebound itself, learned from real releases, and what to do about eachskills/store-preflight/SKILL.md: Run and read the storebound readiness checks before submitting a mobile app or gameskills/store-screenshots/SKILL.md: Produce store screenshots and the Play feature graphic for a mobile app or game in every required size and many languagesskills/store-subscriptions/SKILL.md: Set up auto-renewable subscriptions on the App Store and Google Play from one configskills/testflight/SKILL.md: Run TestFlight for a mobile app or game through the App Store Connect APIskills/web-presence/SKILL.md: Set up the web side of a mobile app or gameskills/whats-new/SKILL.md: Write user-facing release notes ("What's new") for a mobile app or game update from the git log since the last tag
Working on storebound itself
- Bun + TypeScript strict, zero runtime dependencies.
bun run cimust pass (adapters fresh, tests, typecheck, scrub). - Inner loop:
bun run ci:quick(typecheck, the tests related to your change against origin/main, scrub; seconds). Before every push: the fullbun run ci(every check and test, in parallel shards), and check its exit code. - Skills are the single source: edit
skills/*/SKILL.mdordocs/agents-core.md, thenbun tools/gen-adapters.ts. - Never commit credentials, account / team / issuer / key / app ids or personal data; placeholders use example.com.