Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,17 @@ on:
- feature/**

jobs:
content-validation:
name: Validate bundled content
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Validate bundled content
run: python3 Scripts/validate_content.py

snapshot-tests:
name: Snapshot tests
runs-on: macos-26
Expand Down Expand Up @@ -58,3 +69,78 @@ jobs:
-scheme 'Klepon Mac' \
-destination 'platform=macOS' \
CODE_SIGNING_ALLOWED=NO

tvos-build:
name: tvOS app build
runs-on: macos-26

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Install XcodeGen
run: brew install xcodegen

- name: Generate project
run: xcodegen generate

- name: Resolve Swift packages
run: xcodebuild -project Klepon.xcodeproj -scheme 'Klepon TV' -resolvePackageDependencies

- name: Build tvOS app
run: |
xcodebuild build \
-project Klepon.xcodeproj \
-scheme 'Klepon TV' \
-destination 'generic/platform=tvOS Simulator' \
CODE_SIGNING_ALLOWED=NO

visionos-build:
name: visionOS app build
runs-on: macos-26

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Install XcodeGen
run: brew install xcodegen

- name: Generate project
run: xcodegen generate

- name: Resolve Swift packages
run: xcodebuild -project Klepon.xcodeproj -scheme 'Klepon Vision' -resolvePackageDependencies

- name: Build visionOS app
run: |
xcodebuild build \
-project Klepon.xcodeproj \
-scheme 'Klepon Vision' \
-destination 'generic/platform=visionOS Simulator' \
CODE_SIGNING_ALLOWED=NO

watchos-build:
name: watchOS app build
runs-on: macos-26

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Install XcodeGen
run: brew install xcodegen

- name: Generate project
run: xcodegen generate

- name: Resolve Swift packages
run: xcodebuild -project Klepon.xcodeproj -scheme 'Klepon Watch' -resolvePackageDependencies

- name: Build watchOS app
run: |
xcodebuild build \
-project Klepon.xcodeproj \
-scheme 'Klepon Watch' \
-destination 'generic/platform=watchOS Simulator' \
CODE_SIGNING_ALLOWED=NO
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
# Xcode build artifacts
build/
DerivedData/
.worktrees/
*.moved-aside
*.xccheckout
*.xcscmblueprint
Expand Down
6 changes: 6 additions & 0 deletions AppStore/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,18 @@ This folder keeps the App Store-facing copy and planning docs for Klepon.

- `metadata/en-US/` — English metadata copy for the iPhone app
- `metadata-macos/en-US/` — English metadata copy for the macOS app
- `metadata-tvos/en-US/` — English metadata copy for the tvOS app
- `metadata-visionos/en-US/` — English metadata copy for the visionOS app
- `screenshots/iphone/` — iPhone screenshot exports
- `screenshots/macos/` — macOS screenshot exports
- `screenshots/tvos/` — tvOS screenshot exports
- `screenshots/visionos/` — visionOS screenshot exports
- `screenshots/watch/` — watchOS screenshot exports
- `screenshots/README.md` — screenshot shot list and titles
- `testflight-checklist.md` — pre-TestFlight checklist
- `release-checklist.md` — broader release checklist
- `macos-appstore-notes.md` — macOS-specific submission notes
- `tvos-appstore-notes.md` — tvOS-specific submission notes
- `visionos-appstore-notes.md` — visionOS-specific submission notes

The screenshot folders are intentionally empty in Git until real exports are added.
3 changes: 2 additions & 1 deletion AppStore/macos-appstore-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ Required keys for the shipping App Store build:
- `com.apple.security.app-sandbox = true`
- `com.apple.security.network.client = true`
- `com.apple.security.application-groups = group.com.ondeinference.apps`
- `ITSAppUsesNonExemptEncryption = false` in `KleponMac/Info.plist`

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.
The sandbox entitlement is mandatory for App Store validation. The network entitlement is needed because Onde can download the optional on-device guide. `ITSAppUsesNonExemptEncryption` is an Info.plist declaration, not an entitlement. The app group keeps local model storage aligned with the other Apple targets.

## Xcode project notes

Expand Down
16 changes: 16 additions & 0 deletions AppStore/metadata-tvos/en-US/description.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Discover Indonesian food on Apple TV with warmth, clarity, and privacy.

Klepon helps you explore dishes, ingredients, and food traditions from across Indonesia in a simple living-room experience that feels calm, readable, and easy to browse.

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.

When you want a little more context, Klepon can answer short follow-up questions privately on device with an optional local guide.

What you can do in Klepon:
- Explore curated Indonesian food guides
- Learn dishes, ingredients, and traditions
- Search quickly when you spot an unfamiliar name
- Save dishes you want to remember
- Ask short follow-up questions privately on device

Klepon is for curious eaters, travelers, diaspora families, and anyone who wants a more thoughtful way to discover Indonesian food.
1 change: 1 addition & 0 deletions AppStore/metadata-tvos/en-US/keywords.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
indonesian food,dishes,ingredients,cuisine,guide,travel
1 change: 1 addition & 0 deletions AppStore/metadata-tvos/en-US/name.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Klepon: Taste of Indonesia
1 change: 1 addition & 0 deletions AppStore/metadata-tvos/en-US/promotional_text.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
A calm Apple TV guide to Indonesian dishes, ingredients, and food traditions.
5 changes: 5 additions & 0 deletions AppStore/metadata-tvos/en-US/review_notes.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
This tvOS app is a browse-first guide and is fully usable without enabling the private guide.

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.

The tvOS 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.
1 change: 1 addition & 0 deletions AppStore/metadata-tvos/en-US/subtitle.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Indonesian food guide
16 changes: 16 additions & 0 deletions AppStore/metadata-visionos/en-US/description.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Discover Indonesian food on Apple Vision Pro with warmth, clarity, and privacy.

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.

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.

When you want a little more context, Klepon can answer short follow-up questions privately on device with an optional local guide.

What you can do in Klepon:
- Explore curated Indonesian food guides
- Learn dishes, ingredients, and traditions
- Search quickly when you spot an unfamiliar name
- Save dishes you want to remember
- Ask short follow-up questions privately on device

Klepon is for curious eaters, travelers, diaspora families, and anyone who wants a more thoughtful way to discover Indonesian food.
1 change: 1 addition & 0 deletions AppStore/metadata-visionos/en-US/keywords.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
indonesian food,dishes,ingredients,cuisine,guide,travel
1 change: 1 addition & 0 deletions AppStore/metadata-visionos/en-US/name.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Klepon: Taste of Indonesia
1 change: 1 addition & 0 deletions AppStore/metadata-visionos/en-US/promotional_text.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
A calm windowed guide to Indonesian dishes, ingredients, and food traditions on Apple Vision Pro.
5 changes: 5 additions & 0 deletions AppStore/metadata-visionos/en-US/review_notes.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
This visionOS app is a simple windowed guide and is fully usable without enabling the private guide.

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.

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.
1 change: 1 addition & 0 deletions AppStore/metadata-visionos/en-US/subtitle.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Indonesian food guide
9 changes: 9 additions & 0 deletions AppStore/release-checklist.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

- [ ] iPhone app builds cleanly
- [ ] macOS app builds cleanly
- [ ] tvOS app builds cleanly
- [ ] visionOS app builds cleanly
- [ ] watchOS companion builds cleanly
- [ ] README is current
- [ ] LICENSE files are present
Expand All @@ -17,21 +19,28 @@
- [ ] Ask flow works on device with acceptable latency
- [ ] Watch app content is readable and useful at a glance
- [ ] macOS window flows feel native and polished enough for v1
- [ ] tvOS focus and remote navigation feel polished enough for v1
- [ ] visionOS window flows feel polished enough for a simple v1
- [ ] No obvious sample-app copy remains

## Signing and distribution

- [ ] iPhone bundle identifier is correct
- [ ] macOS bundle identifier is correct
- [ ] tvOS bundle identifier is correct
- [ ] visionOS bundle identifier is correct
- [ ] watch bundle identifier is correct
- [ ] App Group entitlement is correct for the shipping account
- [ ] macOS App Sandbox entitlement is enabled for the shipping build
- [ ] Apple platform Info.plists set `ITSAppUsesNonExemptEncryption = false`
- [ ] Provisioning profiles and signing identities are valid

## Final gate

- [ ] TestFlight build installed on at least one real iPhone
- [ ] macOS archive validates cleanly for App Store submission
- [ ] tvOS archive validates cleanly for App Store submission
- [ ] visionOS archive validates cleanly for App Store submission
- [ ] Watch companion installed and tested on at least one real Apple Watch
- [ ] Release notes are written
- [ ] Git status is clean before tagging
18 changes: 18 additions & 0 deletions AppStore/screenshots/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,24 @@
3. `Ask privately on device`
- Show the ask flow with a grounded answer card and source chips.

## tvOS screenshots

1. `A calm guide on Apple TV`
- Show the Discover screen with focus on the featured dish and one visible collection rail.
2. `Browse and save from the couch`
- Show a readable Search or Saved view with a realistic shortlist.
3. `Ask privately on device`
- Show the ask flow with a grounded answer card and focus-friendly suggestions.

## visionOS screenshots

1. `A calm guide in your space`
- Show the Discover screen in the visionOS window with the featured dish and collections visible.
2. `Search and save dishes naturally`
- Show a readable Search or Saved view with a realistic shortlist.
3. `Ask privately on device`
- Show the ask flow with a grounded answer card and source chips.

## Apple Watch screenshots

1. `Browse on your wrist`
Expand Down
Empty file.
Empty file.
4 changes: 4 additions & 0 deletions AppStore/testflight-checklist.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
- [ ] iPhone target builds on simulator
- [ ] iPhone target runs on a real device
- [ ] macOS target builds on the release Xcode version
- [ ] tvOS target builds on the release Xcode version
- [ ] visionOS target builds on the release Xcode version
- [ ] Watch target builds on simulator
- [ ] Watch target runs with the paired iPhone app
- [ ] Private guide setup succeeds on a real device
Expand All @@ -38,3 +40,5 @@
- [ ] No local machine junk files are staged
- [ ] Bundle identifiers and App Group values are intentional for the release build
- [ ] macOS release signing uses the sandboxed entitlements file
- [ ] tvOS release signing uses the shared app identifier and App Group entitlement
- [ ] visionOS release signing uses the shared app identifier and App Group entitlement
62 changes: 62 additions & 0 deletions AppStore/tvos-appstore-notes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# tvOS App Store notes

## Bundle identifier

The tvOS target uses the same bundle identifier as the iPhone app:

- `ai.splitfire.klepon`

That keeps the main Apple-platform app identity aligned across iPhone, Apple TV, Mac, and visionOS. The watch companion still uses its own watch bundle identifier, which Apple requires for the companion app target.

## App shape

The current tvOS target is intentionally simple for v1.

- It is a focus-friendly SwiftUI app
- It uses tabs and navigation stacks
- It keeps the private guide inside the existing browse-first experience

This is deliberate. The goal is a clean, stable App Store MVP for Apple TV without overbuilding the first release.

## Required configuration

The tvOS target uses:

- `KleponTV/Info.plist`
- `KleponTV/KleponTV.entitlements`

Important settings:

- `ITSAppUsesNonExemptEncryption = false`
- `com.apple.security.application-groups = group.com.ondeinference.apps`

`ITSAppUsesNonExemptEncryption` is an Info.plist declaration, not an entitlement. The App Group entitlement keeps local model storage aligned with the other Apple targets.

## Build and archive

Generate the project:

```/dev/null/sh#L1-1
xcodegen generate
```

Build the tvOS target locally:

```/dev/null/sh#L1-1
xcodebuild build -project Klepon.xcodeproj -scheme 'Klepon TV' -destination 'generic/platform=tvOS Simulator'
```

Archive the tvOS target:

```/dev/null/sh#L1-1
xcodebuild archive -project Klepon.xcodeproj -scheme 'Klepon TV' -destination 'generic/platform=tvOS' -archivePath build/KleponTV.xcarchive
```

## Submission checklist

Before upload, confirm:

- the signing profile is for `ai.splitfire.klepon`
- the App Group capability exists for the shipping team
- the app feels clean and navigable with the Siri Remote focus model
- tvOS screenshots and metadata are ready in `AppStore/screenshots/tvos/` and `AppStore/metadata-tvos/en-US/`
Loading