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.
54 lines
4 KiB
Markdown
54 lines
4 KiB
Markdown
---
|
|
name: portfolio-originality
|
|
description: 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 <our other app>, in <new app> the user <does something they cannot do there>."
|
|
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 <change> / merge into <app>.
|