@ondeinference / klepon / commits / f3ad668

Prepare macOS target for App Store submission

Seto Elkahfi committed May 15, 2026 at 11:52 UTC f3ad668fe02f2cafb89fbbd2b134e7aa0f82be00
11 files changed +73 -15
AppStore/README.md
+1
@@ -6,6 +6,7 @@ This folder keeps the App Store-facing copy and planning docs for Klepon.
6
7 - `metadata/en-US/` — English metadata copy
8 - `screenshots/iphone/` — iPhone screenshot exports
9 +- `screenshots/macos/` — macOS screenshot exports
10 - `screenshots/watch/` — watchOS screenshot exports
11 - `screenshots/README.md` — screenshot shot list and titles
12 - `testflight-checklist.md` — pre-TestFlight checklist
AppStore/release-checklist.md
+5
@@ -3,6 +3,7 @@
3 ## Before tagging
4
5 - [ ] iPhone app builds cleanly
6 +- [ ] macOS app builds cleanly
7 - [ ] watchOS companion builds cleanly
8 - [ ] README is current
9 - [ ] LICENSE files are present
@@ -15,18 +16,22 @@
16 - [ ] Core browse flows feel polished
17 - [ ] Ask flow works on device with acceptable latency
18 - [ ] Watch app content is readable and useful at a glance
19 +- [ ] macOS window flows feel native and polished enough for v1
20 - [ ] No obvious sample-app copy remains
21
22 ## Signing and distribution
23
24 - [ ] iPhone bundle identifier is correct
25 +- [ ] macOS bundle identifier is correct
26 - [ ] watch bundle identifier is correct
27 - [ ] App Group entitlement is correct for the shipping account
28 +- [ ] macOS App Sandbox entitlement is enabled for the shipping build
29 - [ ] Provisioning profiles and signing identities are valid
30
31 ## Final gate
32
33 - [ ] TestFlight build installed on at least one real iPhone
34 +- [ ] macOS archive validates cleanly for App Store submission
35 - [ ] Watch companion installed and tested on at least one real Apple Watch
36 - [ ] Release notes are written
37 - [ ] Git status is clean before tagging
AppStore/screenshots/README.md
+9
@@ -15,6 +15,15 @@
15 6. `Save what you want to try next`
16 - Show the Saved screen with a short personal list.
17
18 +## macOS screenshots
19 +
20 +1. `A calm guide on your Mac`
21 + - Show the Discover screen in the desktop window with the featured card and collections visible.
22 +2. `Search and save dishes from one place`
23 + - Show a desktop-sized Search or Saved view with a realistic personal shortlist.
24 +3. `Ask privately on device`
25 + - Show the ask flow with a grounded answer card and source chips.
26 +
27 ## Apple Watch screenshots
28
29 1. `Browse on your wrist`
AppStore/screenshots/macos/.gitkeep
AppStore/testflight-checklist.md
+2
@@ -12,6 +12,7 @@
12
13 - [ ] iPhone target builds on simulator
14 - [ ] iPhone target runs on a real device
15 +- [ ] macOS target builds on the release Xcode version
16 - [ ] Watch target builds on simulator
17 - [ ] Watch target runs with the paired iPhone app
18 - [ ] Private guide setup succeeds on a real device
@@ -36,3 +37,4 @@
37 - [ ] No signing secrets or local credentials are in Git diff
38 - [ ] No local machine junk files are staged
39 - [ ] Bundle identifiers and App Group values are intentional for the release build
40 +- [ ] macOS release signing uses the sandboxed entitlements file
Klepon.xcodeproj/project.pbxproj
+2 -4
@@ -87,7 +87,6 @@
87 F0694A813D1CB57F0B5C0F65 /* FavoritesStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BC0C4C22A5134DB058E41F4 /* FavoritesStore.swift */; };
88 F1431179B54CEB23FFFCB2AE /* KleponApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEDE2A1E73EB15970A17A894 /* KleponApp.swift */; };
89 F2D905B433B0B76CE6B4001F /* OndeEnvironmentBootstrap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B499D3BF7AC80D31907D87F /* OndeEnvironmentBootstrap.swift */; };
90 - F46EB4EDFFF125ED88506D89 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6B67BCC5A459288FB240C6E7 /* Info.plist */; };
90 F5B35C6C771073CE32B4BFD1 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42E152344B39D1D77F1B3943 /* SettingsView.swift */; };
91 F87EF3C291B7D3FB9BE8E43A /* ContentRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2891A1AFBB59928FC5B1E66 /* ContentRepository.swift */; };
92 F88972525510344E63D2983C /* AppRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C82874C90A5FAA32D1B52EB7 /* AppRootView.swift */; };
@@ -605,7 +604,6 @@
604 buildActionMask = 2147483647;
605 files = (
606 889CBF2AF84AABF8012EE737 /* Assets.xcassets in Resources */,
608 - F46EB4EDFFF125ED88506D89 /* Info.plist in Resources */,
607 5692BBCE950885C5C1193DDF /* collections.json in Resources */,
608 B768150B02B19417B81FE651 /* guide_entries.json in Resources */,
609 );
@@ -882,7 +880,7 @@
880 buildSettings = {
881 ASSETCATALOG_COMPILER_APPICON_NAME = AppIconMac;
882 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
885 - CODE_SIGN_ENTITLEMENTS = "";
883 + CODE_SIGN_ENTITLEMENTS = KleponMac/KleponMac.entitlements;
884 COMBINE_HIDPI_IMAGES = YES;
885 CURRENT_PROJECT_VERSION = 1;
886 ENABLE_USER_SCRIPT_SANDBOXING = NO;
@@ -907,7 +905,7 @@
905 buildSettings = {
906 ASSETCATALOG_COMPILER_APPICON_NAME = AppIconMac;
907 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
910 - CODE_SIGN_ENTITLEMENTS = "";
908 + CODE_SIGN_ENTITLEMENTS = KleponMac/KleponMac.entitlements;
909 COMBINE_HIDPI_IMAGES = YES;
910 CURRENT_PROJECT_VERSION = 1;
911 ENABLE_USER_SCRIPT_SANDBOXING = NO;
Klepon.xcodeproj/xcshareddata/xcschemes/Klepon Mac.xcscheme
+13 -7
@@ -1,10 +1,11 @@
1 <?xml version="1.0" encoding="UTF-8"?>
2 <Scheme
3 LastUpgradeVersion = "2600"
4 - version = "1.3">
4 + version = "1.7">
5 <BuildAction
6 parallelizeBuildables = "YES"
7 - buildImplicitDependencies = "YES">
7 + buildImplicitDependencies = "YES"
8 + runPostActionsOnFailure = "NO">
9 <BuildActionEntries>
10 <BuildActionEntry
11 buildForTesting = "YES"
@@ -15,7 +16,7 @@
16 <BuildableReference
17 BuildableIdentifier = "primary"
18 BlueprintIdentifier = "676CA86C78E7DB801DEEAF12"
18 - BuildableName = "Klepon.app"
19 + BuildableName = "Klepon Mac.app"
20 BlueprintName = "Klepon Mac"
21 ReferencedContainer = "container:Klepon.xcodeproj">
22 </BuildableReference>
@@ -26,12 +27,13 @@
27 buildConfiguration = "Debug"
28 selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
29 selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29 - shouldUseLaunchSchemeArgsEnv = "YES">
30 + shouldUseLaunchSchemeArgsEnv = "YES"
31 + onlyGenerateCoverageForSpecifiedTargets = "NO">
32 <MacroExpansion>
33 <BuildableReference
34 BuildableIdentifier = "primary"
35 BlueprintIdentifier = "676CA86C78E7DB801DEEAF12"
34 - BuildableName = "Klepon.app"
36 + BuildableName = "Klepon Mac.app"
37 BlueprintName = "Klepon Mac"
38 ReferencedContainer = "container:Klepon.xcodeproj">
39 </BuildableReference>
@@ -54,11 +56,13 @@
56 <BuildableReference
57 BuildableIdentifier = "primary"
58 BlueprintIdentifier = "676CA86C78E7DB801DEEAF12"
57 - BuildableName = "Klepon.app"
59 + BuildableName = "Klepon Mac.app"
60 BlueprintName = "Klepon Mac"
61 ReferencedContainer = "container:Klepon.xcodeproj">
62 </BuildableReference>
63 </BuildableProductRunnable>
64 + <CommandLineArguments>
65 + </CommandLineArguments>
66 </LaunchAction>
67 <ProfileAction
68 buildConfiguration = "Release"
@@ -71,11 +75,13 @@
75 <BuildableReference
76 BuildableIdentifier = "primary"
77 BlueprintIdentifier = "676CA86C78E7DB801DEEAF12"
74 - BuildableName = "Klepon.app"
78 + BuildableName = "Klepon Mac.app"
79 BlueprintName = "Klepon Mac"
80 ReferencedContainer = "container:Klepon.xcodeproj">
81 </BuildableReference>
82 </BuildableProductRunnable>
83 + <CommandLineArguments>
84 + </CommandLineArguments>
85 </ProfileAction>
86 <AnalyzeAction
87 buildConfiguration = "Debug">
Klepon.xcodeproj/xcshareddata/xcschemes/Klepon Watch.xcscheme
+9 -3
@@ -1,10 +1,11 @@
1 <?xml version="1.0" encoding="UTF-8"?>
2 <Scheme
3 LastUpgradeVersion = "2600"
4 - version = "1.3">
4 + version = "1.7">
5 <BuildAction
6 parallelizeBuildables = "YES"
7 - buildImplicitDependencies = "YES">
7 + buildImplicitDependencies = "YES"
8 + runPostActionsOnFailure = "NO">
9 <BuildActionEntries>
10 <BuildActionEntry
11 buildForTesting = "YES"
@@ -26,7 +27,8 @@
27 buildConfiguration = "Debug"
28 selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
29 selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29 - shouldUseLaunchSchemeArgsEnv = "YES">
30 + shouldUseLaunchSchemeArgsEnv = "YES"
31 + onlyGenerateCoverageForSpecifiedTargets = "NO">
32 <MacroExpansion>
33 <BuildableReference
34 BuildableIdentifier = "primary"
@@ -59,6 +61,8 @@
61 ReferencedContainer = "container:Klepon.xcodeproj">
62 </BuildableReference>
63 </BuildableProductRunnable>
64 + <CommandLineArguments>
65 + </CommandLineArguments>
66 </LaunchAction>
67 <ProfileAction
68 buildConfiguration = "Release"
@@ -76,6 +80,8 @@
80 ReferencedContainer = "container:Klepon.xcodeproj">
81 </BuildableReference>
82 </BuildableProductRunnable>
83 + <CommandLineArguments>
84 + </CommandLineArguments>
85 </ProfileAction>
86 <AnalyzeAction
87 buildConfiguration = "Debug">
KleponMac/KleponMac.entitlements new
+14
@@ -0,0 +1,14 @@
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 +<plist version="1.0">
4 +<dict>
5 + <key>com.apple.security.app-sandbox</key>
6 + <true/>
7 + <key>com.apple.security.network.client</key>
8 + <true/>
9 + <key>com.apple.security.application-groups</key>
10 + <array>
11 + <string>group.com.ondeinference.apps</string>
12 + </array>
13 +</dict>
14 +</plist>
README.md
+8
@@ -16,6 +16,7 @@ Klepon is a small SwiftUI guide to Indonesian dishes, ingredients, and food trad
16 - curated local content
17 - private on-device follow-up answers with [Onde Inference](https://ondeinference.com)
18 - search, saved items, and recently viewed
19 +- native macOS app support
20 - watchOS companion support
21
22 ## Repo
@@ -34,6 +35,11 @@ iOS simulator:
35 xcodebuild -project Klepon.xcodeproj -scheme Klepon -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build
36 ```
37
38 +macOS:
39 +```/dev/null/sh#L1-1
40 +xcodebuild -project Klepon.xcodeproj -scheme 'Klepon Mac' -destination 'platform=macOS' CODE_SIGNING_ALLOWED=NO build
41 +```
42 +
43 watchOS simulator:
44 ```/dev/null/sh#L1-1
45 xcodebuild -project Klepon.xcodeproj -scheme 'Klepon Watch' -destination 'generic/platform=watchOS Simulator' CODE_SIGNING_ALLOWED=NO build
@@ -48,6 +54,8 @@ 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.
58 +
59 ## License
60
61 Dual-licensed under [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE).
project.yml
+10 -1
@@ -170,12 +170,22 @@ targets:
170 platform: macOS
171 sources:
172 - path: Klepon
173 + excludes:
174 + - Info.plist
175 + - Klepon.entitlements
176 info:
177 path: KleponMac/Info.plist
178 properties:
179 CFBundleShortVersionString: $(MARKETING_VERSION)
180 CFBundleVersion: $(CURRENT_PROJECT_VERSION)
181 LSApplicationCategoryType: public.app-category.food-and-drink
182 + entitlements:
183 + path: KleponMac/KleponMac.entitlements
184 + properties:
185 + com.apple.security.app-sandbox: true
186 + com.apple.security.network.client: true
187 + com.apple.security.application-groups:
188 + - group.com.ondeinference.apps
189 configFiles:
190 Debug: Configs/Signing.xcconfig
191 Release: Configs/Signing.xcconfig
@@ -220,7 +230,6 @@ targets:
230 ENABLE_USER_SCRIPT_SANDBOXING: NO
231 ASSETCATALOG_COMPILER_APPICON_NAME: AppIconMac
232 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor
223 - CODE_SIGN_ENTITLEMENTS: ""
233 INFOPLIST_KEY_NSHumanReadableCopyright: "Copyright © 2026 Splitfire AB"
234 "EXCLUDED_ARCHS[sdk=macosx*]": x86_64
235 configs: