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: