# Changelog ## Unreleased - Desktop: custom context menus everywhere (apps, releases, art, reviews, checks, fields, products, accounts, folders) with keyboard navigation, Shift+F10 and submenus; the WebView2 browser menu and browser shortcuts are off. - Desktop: each app shows once again (a folder project no longer appears a second time as a store-only app); a store app with a folder's bundle id or package is never listed separately. - Desktop UX pass on every screen: app tabs fit the window, slim app header, secondary actions in "…" menus, Ctrl+K lists app actions, Alt+Up/Down switches apps, accounts and folders decluttered. - Play Console links open the app's own page: developer id per credential profile (`storebound accounts play-developer `, editable in Studios & accounts), one link builder for desktop, CLI and watch. - Checks: "Open guide" opens the matching skill for every finding. ## 0.8.38 · 2026-10-23 - Desktop: the app hero no longer shows a cropped second copy of the app icon. - `play build` passes the upload key (ANDROID_KEYSTORE, ...) to Gradle as injected signing properties (store file and alias as `-P` arguments, the passwords only through `ORG_GRADLE_PROJECT_*` environment variables, never on argv), so a build file that signs only from a local keystore.properties no longer gives an unsigned AAB in CI (pitfall 107). - `play build`, `play upload` and `play release` of a local AAB verify it is signed (META-INF entries, `jarsigner -verify` when a JDK exists) and fail with the fix before any upload. - `apple build --version` and `apple upload` refuse an IPA whose CFBundleShortVersionString is not the intended / editable App Store version; `--allow-version-mismatch` overrides (pitfall 108). - Play release notes that name iOS, iPhone or the App Store are caught by `storebound check` and `play build`, not only at release time (pitfall 109). ## 0.8.37 · 2026-10-22 - `storebound apps ignore|unignore [--store apple|play]`: hide dormant apps, or one store side of an app, from watch, reads and the desktop (MCP apps_ignore / apps_unignore). - Reviews: a store read that fails is an error, not an empty "no new reviews" list; the Reviews tab notes Apple API lag and Play's 7-day window (pitfall 106). - Desktop: live store thumbnails load right away, also in a hidden window. ## 0.8.36 · 2026-10-22 - `storebound watch`: a store-only App Store app added without a bundle id is no longer skipped; the bundle id is read from the API with the app's own key. ## 0.8.35 · 2026-10-22 - Desktop v2 ships (0.8.33 and 0.8.34 stopped at the desktop boot check, which still expected the old markup). ## 0.8.34 · 2026-10-22 - Desktop v2 ships (0.8.33 stopped at the desktop boot check, which still expected the old markup). ## 0.8.33 · 2026-10-22 - **Desktop v2**: every screen redesigned in one language: portfolio home, releases (store cards, stage stepper, rollout ring), submit checklist, TestFlight, listings as store pages with completeness, framed screenshots with issue badges, products and price matrix, health tiles, review feed with rating distribution, growth funnel, readiness score with fix-first, tools, settings, accounts, folders, dependencies and onboarding. - Desktop: tray with a context menu, autostart, silent auto-update and notifications by event kind (rejections too), also while the window is hidden. ## 0.8.32 · 2026-10-22 - Node: a `storebound.config.json` (and every store-only app) loads again; it needed an import attribute. Pitfall 105. ## 0.8.31 · 2026-10-22 - **`storebound watch`**: store events for every app on the machine (rejected, approved, live, rollout halted, crash threshold, low or unanswered reviews), sent to ntfy (phone), Telegram, a webhook or an OS notification; runs as a loop (`--every 15m`) or `--once`; a PM2 recipe for a server is in docs/watch.md. `storebound events` and the MCP tool `events_recent` let people and agents read what happened. - **Desktop notifications that arrive.** The app reads the stores in the background from the tray too (it skipped every read while hidden, so a rejection went unnoticed), every 15 minutes with backoff. Notifications by kind, each with a switch: rejected, approved, live, halted, crash / ANR, low-rated reviews; quiet hours and mute for an hour. Opening the window after a notification lands on that app. - **Tray:** Open, Read the stores now, an Apps menu with each app's state on both stores, Mute, Check for updates, Settings, Quit; a tooltip with what is in review and what needs you; a red dot on the icon after a rejection or halt. - `apple listing` refused by an approved version waiting for a manual release now names the way out: `storebound apple release --manual-release --version `. `play release --dry` shows the staged rollout share. ## 0.8.30 · 2026-10-22 - **Desktop: a new home.** Store-style app cards (your rendered screenshots, or the icon on its tint), a release pipeline per store (Build -> Testing -> Review -> Live -> Rollout), the crash curve and one next-step button per app; below, What changed and Fix first. The table view stays one switch away. ## 0.8.29 · 2026-10-22 - **Existing store items are compared with the config, field by field** (pitfall 104). The dry run shows every difference (old -> new); texts are sent, money and availability need a flag, fields Apple cannot edit are named. - `apple iap`: price (`--allow-price-changes`), localization names and descriptions, reference name, review note, family sharing (reported), territories. - `apple subscriptions`: prices in the dry run, localizations, group names, reference name, review note, level, territories; intro offers, period and family sharing reported. - `play subscriptions`: offer phases and prices, other-regions price, regions no longer sold (all price-gated), grace period, languages missing from the config kept unless `--prune-languages`. - `apple appinfo`: app price (`--allow-price-changes`) and territories (removals `--allow-availability-changes`); `apple review-details --dry` shows old -> new. - Offer-code and win-back campaigns that differ are named; in-app event attributes patched on drafts; a removed custom page deep link cleared; config languages without a version localization named. - `prices diff` (the `catalog diff` report). ## 0.8.28 · 2026-10-22 - Windows: no false "entitlements not referenced by CODE_SIGN_ENTITLEMENTS" warning (paths compared with forward slashes). Pitfall 103. - **`storebound apps relink`** after a machine move: every "folder not found" entry of the app folder list is pointed at the same app on this machine (by its path or its app name), ids kept so the desktop keeps its accounts and settings; `apps folders` says so when entries are missing. `apps add` names an app after its config's app name. ## 0.8.27 · 2026-10-21 - **Desktop: tray app that starts at logon and updates itself.** First run registers a logon entry (`--hidden`): the app starts silently in the tray; closing the window keeps it there, the tray menu quits. A signed update is checked a minute after start and every 30 minutes, installed silently, and the app restarts as it was. - **App Privacy console plan follows today's page** (verified 2026-10-22): on an app published before, Edit opens the Data Collection question first and the type list ends in Continue; each type's last step is Publish (it goes live, no draft). Publish stays the owner's unless bypass mode is on. - **A new Play language in one run.** `play listing` uploads the hi-res icon (and the feature graphic when rendered) for a language Play does not have yet, in the same edit (Play refused the commit with 403 otherwise). Pitfall 102. - Script traces skip test files (`*.test.*`, `*.spec.*`). - **CI-friendly Play output.** `storebound aab --json` reads packageName, versionCode, versionName, SDKs and sha256 offline (no config, no upload); `play release ... --json` prints {versionCode, sha256, name, tracks[{track, status, userFraction}]}. `play status --json` already lists each track's releases. - **`apple build` stops at once over SSH** (codesign fails there with errSecInternalComponent) and names how to run it in the logged-in session; relative `ASC_P8` / `PLAY_SERVICE_ACCOUNT` paths are read from the project folder and xcodebuild gets an absolute key path. Pitfall 101. ## 0.8.26 · 2026-10-21 - **Bypass mode (owner opt-in, default off).** `storebound settings bypass on` (or "y" in `storebound init`) lets the AI agent press the owner-only buttons too: MCP `owner_step` (submit, release, rollout, testers, replies, prices, ...; dry run first), owner-only `storebound api` operations with `--yes --confirm `, console plans' `buttons.final`. Every action is logged to `.storebound/owner-actions.log`; `bypass off` restores the old behaviour. docs/bypass.md. - **Build dependencies in `doctor` and the desktop Dependencies screen.** JDK (with the version the project needs from the Android Gradle plugin / jvmToolchain, "too old" when below it), Android SDK command-line tools, CocoaPods, Node.js, Bun and bundletool join ffmpeg, Chrome, Xcode, adb and git. `storebound doctor --install --yes` runs this OS's package-manager command (winget / brew); sudo and admin commands are printed, never run. - **A livelier terminal.** At a terminal, lines get colors and status emoji (✅ ⚠️ ❌ 📦 🚀 🧪) and every wait ("waiting for ...", uploads, downloads, progress) is one live spinner line with the elapsed time. Piped, CI, `NO_COLOR`, `TERM=dumb`, `--json` and MCP keep the plain lines exactly as before. - **MCP `console_verify` reads multi-line page text whole** (it kept only the first line on Windows), and long JSON output such as `console_plan` keeps its start and names a file with the whole output. Pitfall 100. - **Windows builds.** `play build` runs `gradlew.bat` through `cmd /c` (it was looked up on PATH only) and takes `C:/...` keystore paths as absolute. Pitfall 98. - **`check` verifies credential files.** Every credential path that does not exist on this machine and an upload keystore the stored password / alias do not open (keytool) are named by field. Pitfall 99. - `play build` / `apple build` write `/latest.json` with the AAB / IPA path for CI; CI install from a git clone documented. - **Scripts that call the store APIs themselves are named.** `androidpublisher.googleapis.com`, the googleapis androidpublisher client, `api.appstoreconnect.apple.com`, altool and Transporter in CI files and scripts: `check` and `release status` warn, `scan` reports `direct-store-api`, each with file:line and the storebound command. Pitfall 97. ## 0.8.25 · 2026-10-21 - **fastlane left in a project is named.** `check` and `release status` warn and `scan` reports `fastlane-upload` when a Fastfile / Appfile or a CI file or script still runs `fastlane supply`, `deliver` or `pilot`, with the file:line and the way over (`storebound import fastlane`). Pitfall 96. ## 0.8.24 · 2026-10-21 - **Windows: the MCP server starts.** `storebound install` writes `cmd /c npx -y storebound@ mcp` (or `bun /cli/index.ts mcp`) on Windows, where `npx.cmd` and the sh launcher cannot be spawned. Pitfall 94. - **`storebound desktop` no longer waits forever on a stalled download.** Progress every 10 %, and an error after 60 s without data. Pitfall 95. - Windows checkouts keep LF line endings (`.gitattributes`); README badges: live npm version, real skill count. ## 0.8.23 · 2026-10-21 - **`apple submit --yes` submits a draft prepared with `--no-submit`.** The second step of the two-step flow ended with "nothing to submit" when the draft already held the version and every item; it now sends the submit (same "not ready yet" retry). `iap-submit` the same for a draft that holds the asked-for items. Pitfall 90. ## 0.8.22 · 2026-10-20 - **`apple submit` / `resubmit` switch Game Center on first.** A build with the Game Center entitlement and an app without a Game Center detail was refused with 409 STATE_ERROR.BUILD_INDICATES_GAME_CENTER_ENABLED; submit, resubmit and `apple signing ensure` now create `gameCenterDetails` and the version's `gameCenterAppVersions` first (dry run shows it), and `validate` blocks while either is missing. Pitfall 89. - **`apple testflight distribute` creates missing configured groups first** (only the asked-for ones, never removes one); tester invites stay the owner's. - **Console plans follow the live pages (2026-10-21 run).** Play health: "My app does not have any health features" (verify accepts it, "Other" stays a fallback); Sign in details: "Is any part of your app restricted?" Yes / No and "Add details" (old labels kept as `altLabels`); finance: the boxes on step 1, step 2 information only; App Privacy: the "Additional Setup Required" OK that opens the first type's setup by itself is in the steps and UI facts. - **Save after every page.** Every Play plan step that answers a page with a Save next to Next now says Save, wait for "Your changes have been saved", then Next; the rule line says it too. - **IARC by exact labels.** "Purchases of digital goods" is ticked after Yes on "Digital purchases" (the loot-box and trading follow-ups show only then); the in-page helper matches exact labels and questions and refuses patterns, radios without their question and blanket group answers. - **`console verify` reads input states.** The Play declaration plans' `verify.capture` returns every radio / checkbox with aria-checked / checked / aria-selected as JSON; `console verify
--from ` takes it. - **`apple review-details` finds the contact** in parent folders' `.storebound/credentials.json` and the credential profile, under more key shapes, and lists every file and key checked when there is none. - **One-line errors for missing required values:** `apple listing` without `--version` says "--version is required (storebound apple status shows the editable version)"; the same for privacy-manifest `--ios`, adhoc export `--archive`, edit `--ops` and resubmit `--build`. A flag given without a value counts as missing. - **Every CLI command is reachable in the desktop app.** A new **More tools** tab gives each command without a screen of its own (play build / upload / share / app-id, apple build / upload / signing / adhoc, bundle, IAP review, Header and Search Results, custom product pages, in-app events, pre-orders, what's new, listing translate / check, ASO rank / competitors / suggest, captures, fonts, JPEG copies, triage, originality, privacy manifest, ads scan, Apple Ads reports, web, RevenueCat diff, PPP sheet, workflows, install for an AI tool) one typed form with the command's own options, built from the method's schema; never a free-text shell. Reads run there; writes show the dry run, then the native dialog, then run with the confirm token. Owner-only steps (offer codes, win-back, promoted enable, pre-order enable / end, custom page and event submit, TestFlight expire, Apple Ads changes, RevenueCat sync, shots login) are listed with their terminal command to copy. New desktop methods in `serve`: `play.build`, `play.upload`, `play.share`, `play.app_id`, `apple.build`, `apple.upload`, `apple.signing_ensure`, `apple.adhoc_register`, `apple.adhoc_export`, `shots.fonts`, `shots.jpeg`, `agent.install`. - **docs/desktop-coverage.md** (generated by `bun tools/gen-desktop-coverage.ts` from `cli/lib/desktop-coverage.ts`): every command with its window place and methods; 92 commands, 88 covered, 4 not for the desktop (`mcp`, `serve`, `desktop`, `api`). `tests/desktop-coverage.test.ts` fails when a command has no place, names a method the window never calls, or is marked not-for-desktop without being on the short list. - **Game Center and Play Games Services.** A `games` config section (switches per store and one shared list of leaderboards and achievements). `storebound apple game-center` switches Game Center on for the app and the version and upserts leaderboards, achievements and their localizations by vendor id; `apple signing ensure` adds the GAME_CENTER capability. `storebound play games` upserts the Play drafts through the Games Configuration API, and `console plan play-games-services` walks an agent through the games project, the Android credential with the app signing SHA-1, the web OAuth client and the owner's Publish. `scan`, `check` and `validate` compare the entitlement, the App ID and the config, the games_APP_ID resource with the Gradle dependency and the config, and remind the User ID declarations; `games status`, four MCP tools and a Game services card in the desktop's App info tab. Skill game-services, pitfall 88. ## 0.8.21 · 2026-10-20 - **`shots record --source web` films at device pixels.** Chromium's screencast always sent frames at the page's CSS size (430x932 for a 430x932 @2x frame), so a 1080x1920 preview was a 2.5x upscale. The recorder now takes `Page.captureScreenshot` frames with the clip scaled to the frame's dpr (860x1864 there; long side capped at 1920, the tallest store video), keeps 3 requests in flight (~45-55 frames/s) and joins them at their real timings as before. It warns when the first frame is smaller than asked or the rate drops under 20 frames/s. ## 0.8.20 · 2026-10-20 - **Tooling: the desktop updater signatures of the Linux and Windows installers are made on the VDS.** The release no longer downloads them to the Mac: the VDS fetches them from the Forgejo release, checks their SHA-256 against the candidate, signs them with its copy of the updater key and sends back only the .sig texts, which the Mac verifies against the app's public key before publishing. `desktop-release.ts vds-key` installs or rotates that key; `release.ts --sign-local` keeps the old path. ## 0.8.19 · 2026-10-20 - **`shots capture` / `render` find Playwright's chromium in a project's CommonJS playwright** whether it comes on the namespace or under `default`; when the module has no `chromium.launch`, the error names the resolved file and its exports (was "Cannot read properties of undefined (reading 'launch')"). - **Heavy app-style headlines again:** `shots fonts` downloads the weights the templates use (the full `wght` axis of a variable Google family, else the used range, else the static weights), so a family like Plus Jakarta Sans no longer falls back to its thin 400 instance. `shots fonts` warns about weights a family or a local file (`{ weight }`) lacks; `shots check` warns per image when a title was drawn at another weight (`font-weight`). - **palette.bg as a string:** one colour (flat) or a CSS gradient string now renders as given instead of a white background; anything else fails config validation ("palette.bg must be a colour, a gradient or an array of 2-3 colours"). `shots check` warns when the title ink has low contrast against the pixels behind it (`contrast`). - **Photo backgrounds:** `palette.image` (+ `overlay`) and `shots.feature.background` put a cover-cropped photo under a dark overlay (the Play feature graphic, optionally the screenshots); `shots check` checks the file and its size. ## 0.8.18 · 2026-10-20 - **No more "Reparsing as ES module" warning** for a `.ts` config in a CommonJS project (Node's MODULE_TYPELESS_PACKAGE_JSON); the app does not need `"type": "module"`. - **Capture sign-in keeps App Review's account apart:** the docs use `captureAuth` for a local demo sign-in, and `check` notes a capture against localhost that uses `reviewDemoAccount` (the account `apple review-details` sends). ## 0.8.17 · 2026-10-20 - `shots capture --source web` can sign in first: `shots.capture.auth` is a sign-in request (run once per browser context, cookies kept; body and headers use `${cred:NAME}` from `.storebound/credentials.json` or `${env:NAME}`, literal secrets are refused, a failed status stops with the status only) or a `storageState` file. `storebound shots login` opens a fresh visible browser for a demo sign-in by hand and saves `.storebound/auth.json` (0600, counts only). A shot that lands on a sign-in page warns "session expired? run storebound shots login again". Secrets and cookie values are masked in logs and the capture report. ## 0.8.16 · 2026-10-20 - `apps folders add []` adds the folder (it listed and added nothing); a template config is added with a note, a folder without a config is refused with the reason and the fix (pitfall 81). - MCP: the plugin's `.mcp.json` no longer spawns a plugin path that may be gone (ENOENT, CONNECTION_CLOSED): it falls back to `storebound` on PATH, then `npx -y storebound@latest`; `mcp` and `serve` skip the self-update (pitfall 82). - Store build minimums in one dated table (`cli/lib/store-minimums.ts`): `play upload` / `play release` refuse an AAB below Play's target API level (36 since 2026-08-31) and `apple upload` an IPA built below Xcode 26 / the 26 SDKs (since 2026-04-28), with the file to change; `scan` / `validate` report the same (`play-target-sdk`, `apple-min-sdk`) (pitfall 83). ## 0.8.15 · 2026-10-19 - **Mac App Store screenshots.** `apple.mac: true` adds the `mac` size (2880 x 1800; `shots check` takes exactly Apple's four 16:10 sizes, no alpha) and `apple screenshots --platform macos` uploads it as `APP_DESKTOP` to the macOS version. `validate` notes a macOS version without Mac screenshots. Art pull maps `APP_DESKTOP` to `mac/`. - **Landscape layout** in both templates: copy column plus the frame in a Mac window or bare (`shots.landscape`), for Mac, Play Chromebook (`play.chromebook`; no API type, `play images` links the console) and, with `shots.landscape.playTablets`, Play's 7" / 10" tablet slots. - **Safe margins:** text and logo keep 7 % of the width left / right and 5 % of the height at the top in every template (feature graphics too); `shots check` fails boxes under 6 % / 4 %, measured from the render's layout data. - **Contact sheet:** the `sheet.png` wait scales with the images, sizes and machine load, with a heartbeat, instead of a flat 30 s. - iPhone Duo skip message says plainly that the API has no Duo type and names the console page. ## 0.8.14 · 2026-10-19 - **Header and Search Results: upload, add for review, place once approved.** `storebound apple creative-assets` uploads each file once into the Asset Library (MD5 upsert: a rejected file or one that failed processing twice is not uploaded again, an archived copy is unarchived), and places it on the version as soon as Apple approved it: the version page's slots offer only approved assets. Until then every locale and placement says "uploaded , waiting for Apple's approval; run `storebound apple creative-assets` again later", and a re-run places it (an approved old asset stays shown meanwhile). `--add-for-review` adds the unreviewed assets to the app's draft review submission (never submits; Submit for Review stays the owner's); `--verify` (MCP `apple_creative_assets_verify`) reads every slot back read-only with the same waiting state, and `validate` / the report list waiting files. A live app without an editable version uses the live version; if App Store Connect refuses a placement there, the run says so, leaves the live page unchanged (the new placement goes first, the old one is removed only after Apple accepted it), links the live version page and does not retry the other live slots. Art without words needs no copy per locale: `/creative/header.png` / `search.*` fill every language without its own file, uploaded once and placed per locale (the dry run counts files, not slots). Pitfall 76 rewritten. - **iPhone Duo.** Apple's published App Store Connect API spec (re-checked: still the 2026-10-06 file) has no Duo screenshot or preview type, so `apple screenshots` keeps skipping the Duo sets with the console link; the check / validate note now says the console takes Duo and the API does not yet. - **macOS (tvOS, visionOS) versions are no longer invisible.** `apple status`, `listing`, `listing pull`, `resubmit`, `submit`, `release` and `screenshots` take `--platform ios|macos|tvos|visionos` (MCP tools and the desktop's owner actions: `platform`); without it they use the platform that has the version they need (a rejected one, an UNRESOLVED_ISSUES submission, an editable one) and refuse, naming both, when several platforms do. Every version and review submission lookup is per platform, so `resubmit` finds the macOS submission back from App Review and `listing --version 0.8.7` works on the rejected macOS 0.8.7 while the iOS 0.8.7 is live. `apple status`, `validate`, `release status`, the report and the desktop label every version with its platform; validate and release status warn about another platform's editable or rejected version. `whats-new apply --platform` names it in the push command. Pitfall 79. - **Other platforms in store text are refused (both stores).** One checker (`cli/lib/cross-store.ts`) finds Android, Google Play (Games), Play Store, Galaxy Store, Amazon Appstore, Steam, Microsoft Store, AppGallery (and localized forms) in App Store text (Guideline 2.3.10) and iOS, iPhone, iPad, App Store, Apple Arcade, Game Center, TestFlight in Play text (Metadata policy), per locale, field and line with a fix. `apple listing`, `play listing`, `play release` / `play upload` release notes, `listing set`, `whats-new check` / `apply`, `storebound edit` and the desktop editor refuse before anything is sent (dry runs show the hits); `check` and `validate` report blockers; `scan` reports `other-platforms` (2.3.10) and `play-other-platforms` (Play: Metadata). A functional mention stays only through the owner's `listing.allowPlatformMentions: [{ store, text, reason }]`. - **Per-store release notes.** Lines tagged `[apple]` / `[play]` (or a `[play]` line heading a block) in a shared notes source go only into that store's notes; the draft leaves untagged other-platform lines out of the wrong store and says so; each store's limit counts its own notes. - **`storebound api` writes piped or redirected are refused loudly.** `--yes` with stdout not a TTY now exits 1 with "refused: writes through `storebound api` need an interactive terminal ... Nothing was sent." on stderr instead of a silent dry run. ## 0.8.13 · 2026-10-18 - **iPhone Duo screenshots.** `apple.iphoneDuo: true` adds the foldable's outer (1398 x 2034) and inner (2007 x 2853) sets, portrait or landscape, to `shots render`, `shots check` (exact sizes, no alpha) and the gallery. App Store Connect API 4.5.1 has no Duo `ScreenshotDisplayType`, so `apple screenshots` skips them with a message and the deep link to the version page's App Previews and Screenshots tab (one constant, `IPHONE_DUO_DISPLAY`, takes the enum names once Apple adds them). `check` / `validate` note a missing Duo set: optional now, required from April 2027 for iOS 27.1 SDK builds (a warning after that date, never a blocker), and point Play to the tablet sets (no foldable slot). - **Required iPhone class follows the console.** `validate` now requires "iPhone with Dynamic Island (medium display)" (`APP_IPHONE_61`) per locale, met by a 6.9" or 6.5" set that App Store Connect scales down (an ok row, not a warning). Labels match the console: "iPhone with Dynamic Island (medium display)", "iPhone Duo", "iPad 13" display". - **App Store Header and Search Results.** `storebound apple creative-assets [--dry]` puts a product page header (3840 x 1646, 21:9) and a search results asset (3:2, 1920 x 1280 to 3840 x 2560), image or video (5-30 s, 30/60 fps), per locale from `//creative/`, or one universal 5244 x 2950 PNG, into the App Asset Library and selects them (`PRODUCT_PAGE_HEADER_ASSET`, `APP_STORE_SEARCH_RESULTS_ASSET`) once Apple approved them; MD5 upsert, read back. Local checks: size, no alpha, video length / fps / container (ffprobe, else skipped with a note). `check` and `validate` note when there is none (Play: the feature graphic and promo video are the counterparts). MCP `apple_creative_assets`; config `apple.creativeAssets`; pitfall 76. ## 0.8.12 · 2026-10-17 - **Shareable readiness report.** `storebound report` puts `scan`, `check` and `validate` into one self-contained HTML page (`.storebound/reports/readiness-.html`, inline CSS, no scripts, light / dark, print-friendly) and opens it in the browser: a verdict per store ("Ready to submit", "N blockers", "Not checked" with the reason when a store key is missing), findings per store by severity with guideline, evidence, fix and an Open in App Store Connect / Play Console button, and the questions only the owner can answer as a checklist. Credentials, key ids, emails and the review demo account are masked. `--md`, `--json`, `--no-open`, `--offline`, `--out`. The desktop's Checks tab has a Report button (same code path) and its Markdown export uses the same renderer; MCP gets a read-only `report` tool. - **Remote config and remote paywalls (App Review 2.3.1, Play Deceptive behavior).** `storebound scan` (and `validate`; `check` as a warning) reports `remote-features` for both stores when the app ships a remote config / feature flag SDK (Firebase Remote Config, Statsig, LaunchDarkly, GrowthBook, Optimizely, PostHog feature flags, Unleash, ConfigCat, Amplitude Experiment, Split) or a remote paywall (RevenueCat Paywalls, Superwall, Adapty, Qonversion, Purchasely, Apphud) and the review notes do not mention it. Warn only: storebound never writes the note; the config templates carry a commented example line. Code obfuscators are a low note, minify alone nothing (store-pitfalls 74). ## 0.8.11 · 2026-10-17 - **Guest-play apps rejected as a login wall (Play).** `reviewAccess.instructions` with `signInRequired: false` holds guest steps: `storebound check` warns when a Play app has a first-run gate (name entry, code / transfer entry) or in-app purchases and no steps, and the `play-sign-in-details` plan then declares one entry without credentials, the dialog's required full-access box as the owner's step (store-pitfalls 73). ## 0.8.10 · 2026-10-15 - **Neutral names only.** Docs, pitfalls, tests and comments use example names instead of the projects that reported issues; the history was rewritten the same way. Older npm versions are withdrawn. - **Releases:** a candidate whose build jobs were cancelled by a newer push says so and gives the tag move and `--resume` line. ## 0.8.9 · 2026-10-15 - **Play edits Play will not send for review are committed anyway.** After a rejection, with other pending changes or managed publishing, Play answers validate / commit with 400 "Changes cannot be sent for review automatically. Please set the query parameter changesNotSentForReview to true". storebound now commits the same edit again (edits.commit only: validate refuses the parameter with 400 "Unknown name") with that parameter (a dry run validates that way and says the real run will commit so), then prints "committed; Play did not send it for review: press Send changes for review in Publishing overview: " (the owner's button). `--not-sent-for-review` on `play release`, `upload`, `rollout`, `listing` and `images` (MCP / desktop `not_sent_for_review`) sets it from the start. The API cannot read that changes wait to be sent, so storebound records its commit in `.storebound/` and `play status` shows "changes committed