The rules, in one place
An appId has to satisfy Apple, Android and the Capacitor CLI at the same time:
| Rule | Why |
|---|---|
At least two parts separated by dots (com.studio.myapp) | Android requires two or more segments |
| Each part starts with a letter | Android package names cannot start a segment with a digit |
| Letters and numbers only | Apple rejects underscores; Android and npx cap add reject hyphens |
No Java keyword as a part (new, class, public…) | Android generates Java code in that package, which then fails to compile |
Not a starter id (io.ionic.starter, com.example.app) | It is probably taken, and the id is permanent once registered |
Sources: Apple’s CFBundleIdentifier reference and Android’s application ID rules.
appId vs appName
- appId —
com.studio.harbor. The machine id. Permanent once the store records exist. - appName —
Harbor. The label under the icon. Home screens cut it at about 12 characters, and you can change it anytime.
The names on the App Store and Google Play listings are separate again — you set them in App Store Connect and Play Console.
webDir and server.url
- webDir is the folder
npm run buildwrites:distfor Vite,buildfor Create React App,outfor a Next.js static export. Pointing it atsrcgives a blank app. - server.url makes the app load a live website instead of that folder. Handy for live reload while developing; in a store build it is the classic Guideline 4.2 “website in an app” pattern.
Next steps
Run the full project check with the Lovable, Bolt or Base44 checker, or open CapWrapp to ship it.
