What 4.3 actually says
Apple’s Guideline 4.3 (Spam) has two parts. 4.3(a) says don’t ship multiple Bundle IDs of the same app. 4.3(b) says don’t pile into a saturated category without a unique, high-quality experience. There’s a related rule, 4.2.6, about apps “created from a commercialized template or app generation service.” Reviewers don’t always cite the sub-letter. When they say “4.3,” they usually mean one of three things they noticed:- Your binary, listing, and screenshots look too similar to another app already on the store.
- Your product is functionally identical to a known template (same screens, same flows, same strings).
- The category is saturated and your app doesn’t show a clear reason to exist.
Shared architecture is fine. Undifferentiated product is not.
Thousands of apps share SwiftUI, RevenueCat, Supabase, and OpenRouter. Apple knows this. What gets flagged is when the product, listing, and binary fingerprint all look like a copy of something else. Shared architecture alone does not guarantee approval — differentiation is product + listing + binary. Your job before submitting:- Keep the architecture (it’s yours now anyway).
- Replace every user-visible string, asset, and flow that screams “boilerplate.”
- Lead your App Store listing with your hero feature, not a generic chat screen.
- Strip dead code that ships in the binary and exposes the boilerplate’s name.
What v2.2.0 ships to help you
v2.2.0 makes 4.3(a) hardening a first-class, automatable workflow instead of a manual grep:scripts/appstore-43-audit.sh
BrandConfig.appDisplayName, set production legal URLs, and rename the upstream bundle ID).template.manifest.json
docs/checklists/APP_STORE_4_3_HARDENING.md
docs/prompts/AppStore4_3Hardening.prompts.md
SwiftAI, Boilerplate, DesignSystem/SAI).The steps to take before you hit “Submit”
Run the automated Release audit first
Run a Release `strings` audit on the .ipa
.ipa can match boilerplate fingerprints.template.manifest.json under fingerprints.patterns. If the output contains the boilerplate’s product name, the SAI design-system prefix, dev-only client names, or stub strings, fix the source and rebuild. Don’t ship an .ipa whose strings give away its origin.Remove dead Swift files from the app target
Features/, Examples/, and any *Sample*.swift. Anything you don’t use, remove from the app target (you can keep the file on disk if you want it for reference).See the per-module removal notes in docs/checklists/APP_STORE_4_3_HARDENING.md in your distribution repo. Removing a module without pruning its couplings leaves orphaned code paths in the binary — see the module-coupling step below before deleting FeatureChat, AI, or Payments.Rebrand every user-visible string
SAI prefix (for example SAIGlass), which surfaces in the binary as DesignSystem/SAI. Rebrand the prefix with the bundled script — dry-run first, then apply after committing your work:Pick a hero archetype and lead with it, not the chat tab
template.manifest.json flags differentiation.archetypeRequired, and the repo ships hero recipes in docs/recipes/hero/ to rebuild the home screen around a distinct primary experience:DashboardGrid.md— metrics/cards homeFeedTimeline.md— scrolling feedMapCanvas.md— map-centric UIGuidedTaskFlow.md— step-by-step flowConversationalHome.md— chat-first (only if chat genuinely is your product)
Read the module removal notes before you delete anything
docs/checklists/APP_STORE_4_3_HARDENING.md. Pair it with the buyer-facing prompts in docs/prompts/AppStore4_3Hardening.prompts.md.Pre-submit checklist
Binary fingerprint
Binary fingerprint
-
bash scripts/appstore-43-audit.shreports PASS (no blocking app-owned hits) -
stringson the Release.ipareturns noswiftai,boilerplate,designsystem/sai, or stub matches - Bundle ID is yours, not the boilerplate’s
com.berkin.SwiftAIBoilerplatePro - No demo or sample files are in the app target’s Compile Sources
- Removed modules have their couplings pruned (see module table)
Branding and copy
Branding and copy
- Branding map applied: name, support email, URLs, paywall copy
- Onboarding pages reflect your product, not generic AI-chat copy
- Settings → About shows your company, your URLs, your version
- Push notifications and email templates use your wording
App Store listing
App Store listing
- First screenshot leads with your hero, not the chat screen
- App name and subtitle describe your product, not “AI chat”
- Description’s first line answers “what does this app do for me”
- Privacy policy and terms hosted at your domain (not boilerplate’s)
Review notes (App Store Connect → App Review Information)
Review notes (App Store Connect → App Review Information)
- You explain in plain language what the app does and who it’s for
- You credit the architecture honestly if asked, while making clear the product, content, and listing are yours
- Demo account credentials work and have realistic data
Example LLM cleanup prompt
Must-run starter fingerprint prompt
If the Release audit reportsSwiftAI, Boilerplate, or DesignSystem/SAI, run this first. These are starter fingerprints and should not remain in app-owned Release output.
main. It runs the heavy renaming pass and flags couplings before you submit.
If you already got a 4.3 rejection
Don’t panic, and don’t argue with the reviewer in the first reply.Read the rejection literally
Run the full pre-submit workflow again
bash scripts/appstore-43-audit.sh and walk every pre-submit step. Reviewers compare binaries; if one fingerprint matched, others probably did too.Reply in App Review with what changed
If you disagree, request a call
