@ondeinference / klepon / commits / d4b607e

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