Use shared bundle identifier for macOS app
Seto Elkahfi committed
May 15, 2026 at 12:02 UTC
a4e67ccb96ca010716925b4fde51b96f17b755da
11 files changed
+96
-5
AppStore/README.md
+3
-1
@@ -4,12 +4,14 @@ This folder keeps the App Store-facing copy and planning docs for Klepon.
4
5
## Structure
6
7
-- `metadata/en-US/` — English metadata copy
7
+- `metadata/en-US/` — English metadata copy for the iPhone app
8
+- `metadata-macos/en-US/` — English metadata copy for the macOS app
9
- `screenshots/iphone/` — iPhone screenshot exports
10
- `screenshots/macos/` — macOS screenshot exports
11
- `screenshots/watch/` — watchOS screenshot exports
12
- `screenshots/README.md` — screenshot shot list and titles
13
- `testflight-checklist.md` — pre-TestFlight checklist
14
- `release-checklist.md` — broader release checklist
15
+- `macos-appstore-notes.md` — macOS-specific submission notes
16
17
The screenshot folders are intentionally empty in Git until real exports are added.
AppStore/macos-appstore-notes.md
new
+64
@@ -0,0 +1,64 @@
1
+# macOS App Store notes
2
+
3
+## Bundle identifier
4
+
5
+The macOS app now uses the same bundle identifier as the iPhone app:
6
+
7
+- `ai.splitfire.klepon`
8
+
9
+This keeps the main Apple-platform app identity aligned across iPhone and Mac. The watch companion still uses its own watch bundle identifier, which Apple requires for the companion app target.
10
+
11
+## Required entitlements
12
+
13
+The macOS target uses:
14
+
15
+- `KleponMac/KleponMac.entitlements`
16
+
17
+Required keys for the shipping App Store build:
18
+
19
+- `com.apple.security.app-sandbox = true`
20
+- `com.apple.security.network.client = true`
21
+- `com.apple.security.application-groups = group.com.ondeinference.apps`
22
+
23
+The sandbox entitlement is mandatory for App Store validation. The network entitlement is needed because Onde can download the optional on-device guide. The app group keeps local model storage aligned with the other Apple targets.
24
+
25
+## Xcode project notes
26
+
27
+The macOS target must not package the iPhone target's support files inside the app bundle.
28
+
29
+In `project.yml`, the macOS target excludes:
30
+
31
+- `Klepon/Info.plist`
32
+- `Klepon/Klepon.entitlements`
33
+
34
+Without those exclusions, Xcode can copy the iPhone plist into `Klepon.app/Contents/Resources/Info.plist`, which leads to App Store validation failures about invalid bundle identifiers, bad `CFBundleExecutable`, and duplicate bundle paths.
35
+
36
+## Build and archive
37
+
38
+Generate the project:
39
+
40
+```/dev/null/sh#L1-1
41
+xcodegen generate
42
+```
43
+
44
+Build the macOS target locally:
45
+
46
+```/dev/null/sh#L1-1
47
+xcodebuild build -project Klepon.xcodeproj -scheme 'Klepon Mac' -destination 'platform=macOS'
48
+```
49
+
50
+Archive the macOS target:
51
+
52
+```/dev/null/sh#L1-1
53
+xcodebuild archive -project Klepon.xcodeproj -scheme 'Klepon Mac' -destination 'generic/platform=macOS' -archivePath build/KleponMac.xcarchive
54
+```
55
+
56
+## Submission checklist
57
+
58
+Before upload, confirm:
59
+
60
+- the signing profile is for `ai.splitfire.klepon`
61
+- the archive contains `Klepon.app/Contents/Info.plist` and no extra `Contents/Resources/Info.plist`
62
+- App Sandbox is enabled in the signed app
63
+- the App Group capability exists for the shipping team
64
+- macOS screenshots and macOS metadata are ready in `AppStore/screenshots/macos/` and `AppStore/metadata-macos/en-US/`
AppStore/metadata-macos/en-US/description.txt
new
+16
@@ -0,0 +1,16 @@
1
+Discover Indonesian food on your Mac with warmth, clarity, and privacy.
2
+
3
+Klepon helps you explore dishes, ingredients, and food traditions from across Indonesia in a format that feels calm, visual, and easy to browse on a larger screen.
4
+
5
+Browse curated guides to iconic dishes, regional favorites, sweet treats, and essential ingredients. Learn what a dish is, what it tastes like, what usually goes into it, and what to try next.
6
+
7
+When you want a little more context, Klepon can answer short follow-up questions privately on your Mac with an optional on-device guide.
8
+
9
+What you can do in Klepon:
10
+- Explore curated Indonesian food guides
11
+- Learn dishes, ingredients, and traditions
12
+- Search quickly when you spot an unfamiliar name
13
+- Save dishes you want to remember
14
+- Ask short follow-up questions privately on device
15
+
16
+Klepon is for curious eaters, travelers, diaspora families, and anyone who wants a more thoughtful way to discover Indonesian food.
AppStore/metadata-macos/en-US/keywords.txt
new
+1
@@ -0,0 +1 @@
1
+indonesian food,dishes,ingredients,cuisine,guide,travel
AppStore/metadata-macos/en-US/name.txt
new
+1
@@ -0,0 +1 @@
1
+Klepon: Taste of Indonesia
AppStore/metadata-macos/en-US/promotional_text.txt
new
+1
@@ -0,0 +1 @@
1
+A calm desktop guide to Indonesian dishes, ingredients, and food traditions.
AppStore/metadata-macos/en-US/review_notes.txt
new
+5
@@ -0,0 +1,5 @@
1
+This macOS app is browse-first and fully usable without enabling the private guide.
2
+
3
+The private guide is optional. If the user chooses to enable it, the app downloads a local on-device model and uses it for short follow-up answers inside the guide.
4
+
5
+The macOS app is sandboxed and uses the app group container for local model storage when available.
AppStore/metadata-macos/en-US/subtitle.txt
new
+1
@@ -0,0 +1 @@
1
+Indonesian food guide
Klepon.xcodeproj/project.pbxproj
+2
-2
@@ -892,7 +892,7 @@
892
"@executable_path/../Frameworks",
893
);
894
MARKETING_VERSION = 1.0.0;
895
- PRODUCT_BUNDLE_IDENTIFIER = ai.splitfire.klepon.mac;
895
+ PRODUCT_BUNDLE_IDENTIFIER = ai.splitfire.klepon;
896
PRODUCT_NAME = Klepon;
897
SDKROOT = macosx;
898
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -917,7 +917,7 @@
917
"@executable_path/../Frameworks",
918
);
919
MARKETING_VERSION = 1.0.0;
920
- PRODUCT_BUNDLE_IDENTIFIER = ai.splitfire.klepon.mac;
920
+ PRODUCT_BUNDLE_IDENTIFIER = ai.splitfire.klepon;
921
PRODUCT_NAME = Klepon;
922
SDKROOT = macosx;
923
SWIFT_OPTIMIZATION_LEVEL = "-O";
README.md
+1
-1
@@ -54,7 +54,7 @@ python3 Scripts/validate_content.py
54
55
If you run your own fork, change the bundle identifier and App Group to values you control.
56
57
-The macOS target uses a separate bundle identifier and a sandboxed entitlements file for App Store distribution.
57
+The macOS target uses the same main app bundle identifier as iPhone and a sandboxed entitlements file for App Store distribution.
58
59
## License
60
project.yml
+1
-1
@@ -223,7 +223,7 @@ targets:
223
echo "Updated CFBundleVersion to ${BUNDLE_VERSION}"
224
settings:
225
base:
226
- PRODUCT_BUNDLE_IDENTIFIER: ai.splitfire.klepon.mac
226
+ PRODUCT_BUNDLE_IDENTIFIER: ai.splitfire.klepon
227
PRODUCT_NAME: Klepon
228
MARKETING_VERSION: "1.0.0"
229
CURRENT_PROJECT_VERSION: 1