storebound/skills/portfolio-originality/SKILL.md
CRT 41319562d8 Signing, builds, uploads and an originality check
apple signing status|ensure: bundle id capabilities, a distribution certificate from a key made locally (kept in .storebound/signing, never printed), App Store profiles installed for Xcode; Developer ID 403 explained.
apple build / apple upload: xcodebuild archive + export with a generated ExportOptions.plist, next build number, App Store Connect API build upload (or altool), processing wait. Native, Capacitor, React Native, Flutter, Unity projects.
play build / play upload: Gradle bundleRelease with the upload key passed through the environment, next versionCode read back from the AAB, testing tracks only.
originality: offline Guideline 4.3 check (name, listing text, icon and screenshot perceptual hashes, project structure).
New skill build-and-sign; zero new dependencies.
2026-10-11 23:42:48 +08:00

4 KiB

name description
portfolio-originality Originality gate for studios and developers that ship many similar mobile apps or games (templates, white-label apps, reskins) - measure listing text, icon, screenshot and project similarity offline with storebound originality, score a planned or finished app or game against your own catalogue (mechanic, content, art, metadata, screenshots), require a clear differentiator, and suggest merging thin ideas, to avoid App Store Guideline 4.3 (spam) and Play repetitive content rejections. Use before starting a new app or game, before submitting one, or after a 4.3 / "repetitive content" rejection.

Portfolio originality (Guideline 4.3 gate)

Apple 4.3 and Play's repetitive content policy reject apps that are near-copies of other apps, including your own. Studios with a template engine and white-label / reskinned apps hit this first. Run this gate twice: before building (idea stage) and before submitting.

Inputs

  • The new app or game: one-paragraph pitch, core loop or main task, controls or flows, progression or features, art direction, the planned listing (name, subtitle, short description, keywords, screenshot captions).
  • The catalogue: the same for every app or game you have published or submitted (store links are fine).

Measure first (offline)

storebound originality --against <folder> compares this app with your other apps: each folder with a storebound.config.ts, or a folder holding several (one level down); or list them once in originality.against. Per pair it reports a 0-100 % likeness for the name, the listing text (word frequency + copied 3-word phrases), the icon and the screenshots (perceptual hashes: dHash + DCT pHash of the icon and of the rendered screenshots of the first language, PNG decoded in TypeScript, JPEG / WebP through ffmpeg if installed), and the project structure (same file layout, byte-identical files; build output and dependencies left out), an overall score, why a pair is flagged (overall >= 70 % by default, --threshold, or one axis nearly identical) and what to change. --json for agents (MCP tool originality); exit 1 when a pair is flagged. It measures what reviewers see and what a template shares; it cannot judge the core mechanic or content. Feed its numbers into the scores below.

Score each pair (new app vs each catalogue app), 0 = identical, 2 = clearly different

axis 0 1 2
core mechanic or main task same verb, same rules same verb, new rule that changes decisions different verb / goal
content same levels / items reskinned new content, same structure different structure (modes, progression)
art and audio same assets / palette / UI kit same kit, new theme own visual identity
metadata same description pattern / keywords rewritten, same promises different promise and audience
screenshots same layout and captions same layout, new captions different scenes and message

Total 0-10 per pair. Below 6 against any catalogue app: stop. 6-7: ship only with a differentiator a user can see in the first screenshot. 8+: fine.

Differentiator test

Write one sentence: "Unlike , in the user ." If the sentence needs the words "theme", "skin", "colours" or "levels" to work, it is not a differentiator.

When the score is low

  • Merge the idea into the existing app as a mode, feature, world or event instead of a new app.
  • Deepen one axis until it scores 2 (usually mechanic or progression), not five axes a little.
  • Never vary only the name, icon and keywords: reviewers compare binaries and screenshots, and that is the pattern 4.3 describes.
  • After a 4.3 rejection: list the concrete differences in the reply (review-rejections); if there are none, merge.

Output for the owner

A table per catalogue app with the storebound originality likeness per axis, the five scores, the total, the differentiator sentence, and a recommendation: ship / ship after / merge into .