@ondeinference / klepon / commits / a4e67cc

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