Add visionOS App Store metadata and update bundle ID
- Add visionOS metadata, screenshots folder, and submission notes - Update visionOS target to use main app bundle identifier - Switch visionOS app icon to solidimagestack format - Update release and TestFlight checklists for visionOS - Remove old AppIconVision.appiconset assets
Seto Elkahfi committed
May 15, 2026 at 13:12 UTC
d4b607e2afd3c3207354ecc9b689aad63c6cd791
35 files changed
+189
-21
AppStore/README.md
+3
@@ -6,12 +6,15 @@ This folder keeps the App Store-facing copy and planning docs for Klepon.
6
7
- `metadata/en-US/` — English metadata copy for the iPhone app
8
- `metadata-macos/en-US/` — English metadata copy for the macOS app
9
+- `metadata-visionos/en-US/` — English metadata copy for the visionOS app
10
- `screenshots/iphone/` — iPhone screenshot exports
11
- `screenshots/macos/` — macOS screenshot exports
12
+- `screenshots/visionos/` — visionOS screenshot exports
13
- `screenshots/watch/` — watchOS screenshot exports
14
- `screenshots/README.md` — screenshot shot list and titles
15
- `testflight-checklist.md` — pre-TestFlight checklist
16
- `release-checklist.md` — broader release checklist
17
- `macos-appstore-notes.md` — macOS-specific submission notes
18
+- `visionos-appstore-notes.md` — visionOS-specific submission notes
19
20
The screenshot folders are intentionally empty in Git until real exports are added.
AppStore/metadata-visionos/en-US/description.txt
new
+16
@@ -0,0 +1,16 @@
1
+Discover Indonesian food on Apple Vision Pro with warmth, clarity, and privacy.
2
+
3
+Klepon helps you explore dishes, ingredients, and food traditions from across Indonesia in a simple windowed app that feels calm, readable, and easy to browse.
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 device with an optional local 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-visionos/en-US/keywords.txt
new
+1
@@ -0,0 +1 @@
1
+indonesian food,dishes,ingredients,cuisine,guide,travel
AppStore/metadata-visionos/en-US/name.txt
new
+1
@@ -0,0 +1 @@
1
+Klepon: Taste of Indonesia
AppStore/metadata-visionos/en-US/promotional_text.txt
new
+1
@@ -0,0 +1 @@
1
+A calm windowed guide to Indonesian dishes, ingredients, and food traditions on Apple Vision Pro.
AppStore/metadata-visionos/en-US/review_notes.txt
new
+5
@@ -0,0 +1,5 @@
1
+This visionOS app is a simple windowed guide and is 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 visionOS target uses the same main app bundle identifier as the iPhone app and uses the shared app group container for local model storage when available.
AppStore/metadata-visionos/en-US/subtitle.txt
new
+1
@@ -0,0 +1 @@
1
+Indonesian food guide
AppStore/release-checklist.md
+4
@@ -4,6 +4,7 @@
4
5
- [ ] iPhone app builds cleanly
6
- [ ] macOS app builds cleanly
7
+- [ ] visionOS app builds cleanly
8
- [ ] watchOS companion builds cleanly
9
- [ ] README is current
10
- [ ] LICENSE files are present
@@ -17,12 +18,14 @@
18
- [ ] Ask flow works on device with acceptable latency
19
- [ ] Watch app content is readable and useful at a glance
20
- [ ] macOS window flows feel native and polished enough for v1
21
+- [ ] visionOS window flows feel polished enough for a simple v1
22
- [ ] No obvious sample-app copy remains
23
24
## Signing and distribution
25
26
- [ ] iPhone bundle identifier is correct
27
- [ ] macOS bundle identifier is correct
28
+- [ ] visionOS bundle identifier is correct
29
- [ ] watch bundle identifier is correct
30
- [ ] App Group entitlement is correct for the shipping account
31
- [ ] macOS App Sandbox entitlement is enabled for the shipping build
@@ -32,6 +35,7 @@
35
36
- [ ] TestFlight build installed on at least one real iPhone
37
- [ ] macOS archive validates cleanly for App Store submission
38
+- [ ] visionOS archive validates cleanly for App Store submission
39
- [ ] Watch companion installed and tested on at least one real Apple Watch
40
- [ ] Release notes are written
41
- [ ] Git status is clean before tagging
AppStore/screenshots/README.md
+9
@@ -24,6 +24,15 @@
24
3. `Ask privately on device`
25
- Show the ask flow with a grounded answer card and source chips.
26
27
+## visionOS screenshots
28
+
29
+1. `A calm guide in your space`
30
+ - Show the Discover screen in the visionOS window with the featured dish and collections visible.
31
+2. `Search and save dishes naturally`
32
+ - Show a readable Search or Saved view with a realistic shortlist.
33
+3. `Ask privately on device`
34
+ - Show the ask flow with a grounded answer card and source chips.
35
+
36
## Apple Watch screenshots
37
38
1. `Browse on your wrist`
AppStore/screenshots/visionos/.gitkeep
AppStore/testflight-checklist.md
+2
@@ -13,6 +13,7 @@
13
- [ ] iPhone target builds on simulator
14
- [ ] iPhone target runs on a real device
15
- [ ] macOS target builds on the release Xcode version
16
+- [ ] visionOS target builds on the release Xcode version
17
- [ ] Watch target builds on simulator
18
- [ ] Watch target runs with the paired iPhone app
19
- [ ] Private guide setup succeeds on a real device
@@ -38,3 +39,4 @@
39
- [ ] No local machine junk files are staged
40
- [ ] Bundle identifiers and App Group values are intentional for the release build
41
- [ ] macOS release signing uses the sandboxed entitlements file
42
+- [ ] visionOS release signing uses the shared app identifier and App Group entitlement
AppStore/visionos-appstore-notes.md
new
+62
@@ -0,0 +1,62 @@
1
+# visionOS App Store notes
2
+
3
+## Bundle identifier
4
+
5
+The visionOS target uses the same bundle identifier as the iPhone app:
6
+
7
+- `ai.splitfire.klepon`
8
+
9
+That keeps the main Apple-platform app identity aligned across iPhone, Mac, and visionOS. The watch companion still uses its own watch bundle identifier, which Apple requires for the companion app target.
10
+
11
+## App shape
12
+
13
+The current visionOS target is intentionally simple for v1.
14
+
15
+- It is a windowed SwiftUI app
16
+- It does not use immersive spaces
17
+- It reuses the shared browse-first Klepon experience
18
+
19
+This is deliberate. The goal is a clean, stable App Store MVP that showcases Onde on Apple Vision Pro without forcing a spatial-first redesign yet.
20
+
21
+## Required configuration
22
+
23
+The visionOS target uses:
24
+
25
+- `KleponVision/Info.plist`
26
+- `KleponVision/KleponVision.entitlements`
27
+
28
+Important settings:
29
+
30
+- `ITSAppUsesNonExemptEncryption = false`
31
+- `com.apple.security.application-groups = group.com.ondeinference.apps`
32
+
33
+The App Group keeps local model storage aligned with the other Apple targets.
34
+
35
+## Build and archive
36
+
37
+Generate the project:
38
+
39
+```/dev/null/sh#L1-1
40
+xcodegen generate
41
+```
42
+
43
+Build the visionOS target locally:
44
+
45
+```/dev/null/sh#L1-1
46
+xcodebuild build -project Klepon.xcodeproj -scheme 'Klepon Vision' -destination 'generic/platform=visionOS Simulator'
47
+```
48
+
49
+Archive the visionOS target:
50
+
51
+```/dev/null/sh#L1-1
52
+xcodebuild archive -project Klepon.xcodeproj -scheme 'Klepon Vision' -destination 'generic/platform=visionOS' -archivePath build/KleponVision.xcarchive
53
+```
54
+
55
+## Submission checklist
56
+
57
+Before upload, confirm:
58
+
59
+- the signing profile is for `ai.splitfire.klepon`
60
+- the App Group capability exists for the shipping team
61
+- the app opens as a clean windowed experience on Apple Vision Pro
62
+- visionOS screenshots and metadata are ready in `AppStore/screenshots/visionos/` and `AppStore/metadata-visionos/en-US/`
Klepon.xcodeproj/project.pbxproj
+2
-2
@@ -1324,7 +1324,7 @@
1324
"@executable_path/Frameworks",
1325
);
1326
MARKETING_VERSION = 1.0.0;
1327
- PRODUCT_BUNDLE_IDENTIFIER = ai.splitfire.klepon.vision;
1327
+ PRODUCT_BUNDLE_IDENTIFIER = ai.splitfire.klepon;
1328
PRODUCT_NAME = Klepon;
1329
SDKROOT = xros;
1330
SWIFT_OPTIMIZATION_LEVEL = "-O";
@@ -1489,7 +1489,7 @@
1489
"@executable_path/Frameworks",
1490
);
1491
MARKETING_VERSION = 1.0.0;
1492
- PRODUCT_BUNDLE_IDENTIFIER = ai.splitfire.klepon.vision;
1492
+ PRODUCT_BUNDLE_IDENTIFIER = ai.splitfire.klepon;
1493
PRODUCT_NAME = Klepon;
1494
SDKROOT = xros;
1495
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
Klepon/Assets.xcassets/AppIconVision.appiconset/Contents.json
deleted
-17
@@ -1,17 +0,0 @@
1
-{
2
- "images" : [
3
- { "idiom" : "iphone", "size" : "20x20", "scale" : "2x", "filename" : "Icon-20@2x.png" },
4
- { "idiom" : "iphone", "size" : "20x20", "scale" : "3x", "filename" : "Icon-20@3x.png" },
5
- { "idiom" : "iphone", "size" : "29x29", "scale" : "2x", "filename" : "Icon-29@2x.png" },
6
- { "idiom" : "iphone", "size" : "29x29", "scale" : "3x", "filename" : "Icon-29@3x.png" },
7
- { "idiom" : "iphone", "size" : "40x40", "scale" : "2x", "filename" : "Icon-40@2x.png" },
8
- { "idiom" : "iphone", "size" : "40x40", "scale" : "3x", "filename" : "Icon-40@3x.png" },
9
- { "idiom" : "iphone", "size" : "60x60", "scale" : "2x", "filename" : "Icon-60@2x.png" },
10
- { "idiom" : "iphone", "size" : "60x60", "scale" : "3x", "filename" : "Icon-60@3x.png" },
11
- { "idiom" : "ios-marketing", "size" : "1024x1024", "scale" : "1x", "filename" : "Icon-1024.png" }
12
- ],
13
- "info" : {
14
- "author" : "xcode",
15
- "version" : 1
16
- }
17
-}
Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-1024.png
Binary files a/Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-1024.png and /dev/null differ
Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-20@2x.png
Binary files a/Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-20@2x.png and /dev/null differ
Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-20@3x.png
Binary files a/Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-20@3x.png and /dev/null differ
Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-29@2x.png
Binary files a/Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-29@2x.png and /dev/null differ
Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-29@3x.png
Binary files a/Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-29@3x.png and /dev/null differ
Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-40@2x.png
Binary files a/Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-40@2x.png and /dev/null differ
Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-40@3x.png
Binary files a/Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-40@3x.png and /dev/null differ
Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-60@2x.png
Binary files a/Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-60@2x.png and /dev/null differ
Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-60@3x.png
Binary files a/Klepon/Assets.xcassets/AppIconVision.appiconset/Icon-60@3x.png and /dev/null differ
Klepon/Assets.xcassets/AppIconVision.solidimagestack/Back.solidimagestacklayer/Content.imageset/Back.png
Binary files /dev/null and b/Klepon/Assets.xcassets/AppIconVision.solidimagestack/Back.solidimagestacklayer/Content.imageset/Back.png differ
Klepon/Assets.xcassets/AppIconVision.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json
new
+13
@@ -0,0 +1,13 @@
1
+{
2
+ "images" : [
3
+ {
4
+ "filename" : "Back.png",
5
+ "idiom" : "vision",
6
+ "scale" : "2x"
7
+ }
8
+ ],
9
+ "info" : {
10
+ "author" : "xcode",
11
+ "version" : 1
12
+ }
13
+}
Klepon/Assets.xcassets/AppIconVision.solidimagestack/Back.solidimagestacklayer/Contents.json
new
+6
@@ -0,0 +1,6 @@
1
+{
2
+ "info" : {
3
+ "author" : "xcode",
4
+ "version" : 1
5
+ }
6
+}
Klepon/Assets.xcassets/AppIconVision.solidimagestack/Contents.json
new
+23
@@ -0,0 +1,23 @@
1
+{
2
+ "info" : {
3
+ "author" : "xcode",
4
+ "version" : 1
5
+ },
6
+ "layers" : [
7
+ {
8
+ "filename" : "Front.solidimagestacklayer"
9
+ },
10
+ {
11
+ "filename" : "Middle.solidimagestacklayer"
12
+ },
13
+ {
14
+ "filename" : "Back.solidimagestacklayer"
15
+ }
16
+ ],
17
+ "properties" : {
18
+ "canvasSize" : {
19
+ "height" : 512,
20
+ "width" : 512
21
+ }
22
+ }
23
+}
Klepon/Assets.xcassets/AppIconVision.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json
new
+13
@@ -0,0 +1,13 @@
1
+{
2
+ "images" : [
3
+ {
4
+ "filename" : "Front.png",
5
+ "idiom" : "vision",
6
+ "scale" : "2x"
7
+ }
8
+ ],
9
+ "info" : {
10
+ "author" : "xcode",
11
+ "version" : 1
12
+ }
13
+}
Klepon/Assets.xcassets/AppIconVision.solidimagestack/Front.solidimagestacklayer/Content.imageset/Front.png
Binary files /dev/null and b/Klepon/Assets.xcassets/AppIconVision.solidimagestack/Front.solidimagestacklayer/Content.imageset/Front.png differ
Klepon/Assets.xcassets/AppIconVision.solidimagestack/Front.solidimagestacklayer/Contents.json
new
+6
@@ -0,0 +1,6 @@
1
+{
2
+ "info" : {
3
+ "author" : "xcode",
4
+ "version" : 1
5
+ }
6
+}
Klepon/Assets.xcassets/AppIconVision.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json
new
+13
@@ -0,0 +1,13 @@
1
+{
2
+ "images" : [
3
+ {
4
+ "filename" : "Middle.png",
5
+ "idiom" : "vision",
6
+ "scale" : "2x"
7
+ }
8
+ ],
9
+ "info" : {
10
+ "author" : "xcode",
11
+ "version" : 1
12
+ }
13
+}
Klepon/Assets.xcassets/AppIconVision.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Middle.png
Binary files /dev/null and b/Klepon/Assets.xcassets/AppIconVision.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Middle.png differ
Klepon/Assets.xcassets/AppIconVision.solidimagestack/Middle.solidimagestacklayer/Contents.json
new
+6
@@ -0,0 +1,6 @@
1
+{
2
+ "info" : {
3
+ "author" : "xcode",
4
+ "version" : 1
5
+ }
6
+}
README.md
+1
-1
@@ -68,7 +68,7 @@ python3 Scripts/validate_content.py
68
69
If you run your own fork, change the bundle identifier and App Group to values you control.
70
71
-The macOS target uses the same main app bundle identifier as iPhone and a sandboxed entitlements file for App Store distribution.
71
+The macOS and visionOS targets use the same main app bundle identifier as iPhone. The macOS target also uses a sandboxed entitlements file for App Store distribution.
72
73
## License
74
project.yml
+1
-1
@@ -394,7 +394,7 @@ targets:
394
echo "Updated CFBundleVersion to ${BUNDLE_VERSION}"
395
settings:
396
base:
397
- PRODUCT_BUNDLE_IDENTIFIER: ai.splitfire.klepon.vision
397
+ PRODUCT_BUNDLE_IDENTIFIER: ai.splitfire.klepon
398
PRODUCT_NAME: Klepon
399
MARKETING_VERSION: "1.0.0"
400
CURRENT_PROJECT_VERSION: 1