Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
98bda31
Prepare local-first App Store launch
jongan69 Jun 21, 2026
04e2696
Add local backup import export
jongan69 Jun 21, 2026
ad239d7
Document iOS signing blocker
jongan69 Jun 21, 2026
98fb476
Fix local iOS archive on Xcode 26
jongan69 Jun 22, 2026
0f865f2
Reduce Metro build workers
jongan69 Jun 22, 2026
663baaf
Fix HealthKit bundling for local archives
jongan69 Jun 22, 2026
57e0e83
Fix Swagger API route bundling
jongan69 Jun 22, 2026
0daec90
Apply fmt workaround after React Native pod setup
jongan69 Jun 22, 2026
b5c6db4
Use static web output for native archives
jongan69 Jun 22, 2026
efb51ed
Configure App Store submission metadata
jongan69 Jun 22, 2026
301e4f2
Add App Store screenshots
jongan69 Jun 22, 2026
24db730
Add App Store review submit helper
jongan69 Jun 22, 2026
d832f69
Document App Store review handoff
jongan69 Jun 22, 2026
7ac5145
Fix Clerk social sign in buttons
jongan69 Jun 22, 2026
019de34
Add app testing readiness checklist
jongan69 Jun 22, 2026
31b0a61
Add EAS main build profile
jongan69 Jun 22, 2026
e5f8d5a
Finish local-first health MVP and release guardrails
jongan69 Jun 22, 2026
ed9dfea
Update App Store release state for build 24
jongan69 Jun 22, 2026
840cb25
Update release docs for build 25
jongan69 Jun 22, 2026
f472e5e
Add local health insight and truthful dashboard data
jongan69 Jun 22, 2026
229533c
Remove mock app surfaces from meals and workouts
jongan69 Jun 22, 2026
7987f2c
Guard sensitive runtime logging in production
jongan69 Jun 22, 2026
27b7530
Harden production diagnostics and dependency hygiene
jongan69 Jun 22, 2026
35197d6
Enforce release readiness guardrails in CI
jongan69 Jun 22, 2026
95c0198
Block release builds with invalid production env
jongan69 Jun 22, 2026
146975c
Complete local supplement tracking flows
jongan69 Jun 22, 2026
0ed1ba0
Refresh brand assets and asset guardrails
jongan69 Jun 22, 2026
2f6aef1
Remove unused vector icon dependency
jongan69 Jun 22, 2026
5e88f4b
Remove dead scaffold and fake meal fallback
jongan69 Jun 22, 2026
d741354
Remove nonfunctional release-facing settings
jongan69 Jun 22, 2026
d1f4abd
Remove fake web marketing surfaces
jongan69 Jun 22, 2026
b0bdc8e
Harden web product guardrails
jongan69 Jun 22, 2026
c548e34
Remove backend AI and sync dependencies
jongan69 Jun 22, 2026
a0f078a
Remove Clerk test key fallback
jongan69 Jun 22, 2026
8395420
Wire Clerk SSO across auth screens
jongan69 Jun 22, 2026
27662dd
Harden local-first release env checks
jongan69 Jun 22, 2026
f9f6700
Add safe Clerk env release helper
jongan69 Jun 22, 2026
3f837a8
Persist real local meal and workout setup data
jongan69 Jun 22, 2026
c1c7862
Make workout tracker persist local sessions
jongan69 Jun 22, 2026
c85ddeb
Refresh brand assets and performance baselines
jongan69 Jun 22, 2026
355f146
Add startup and baseline CI guardrails
jongan69 Jun 22, 2026
8c0de38
Add performance budget artifacts
jongan69 Jun 22, 2026
99fa9d8
Clean native lazy-load warnings
jongan69 Jun 22, 2026
e2a675d
Add release startup diagnostics export
jongan69 Jun 22, 2026
bc78c3f
Add module work advisory report
jongan69 Jun 22, 2026
0cd40a3
Remove direct Reanimated UI usage
jongan69 Jun 22, 2026
6accd3a
Trim bundled Outfit font weights
jongan69 Jun 22, 2026
c156c7e
Prune unused generated assets
jongan69 Jun 22, 2026
5cfe157
Align storage copy with local-first MVP
jongan69 Jun 22, 2026
9f7afbe
Align AI claims with local MVP
jongan69 Jun 22, 2026
722e8cc
Tighten privacy and HealthKit disclosures
jongan69 Jun 22, 2026
29aa8aa
Scope App Store v1 to iPhone
jongan69 Jun 22, 2026
ed46802
Guard App Store metadata readiness
jongan69 Jun 22, 2026
1157459
Harden App Store preflight checks
jongan69 Jun 22, 2026
5cd8e92
Clean release export artifacts after readiness checks
jongan69 Jun 22, 2026
bbc2432
Remove import-time singleton work
jongan69 Jun 22, 2026
8ed0954
Add Atlas reporting and trim icon bundle
jongan69 Jun 22, 2026
c50c358
Trim ExecuTorch local AI bundle path
jongan69 Jun 22, 2026
f9dca1a
Block forbidden local AI bundle modules
jongan69 Jun 22, 2026
de7f2a4
Harden EAS Clerk release env checks
jongan69 Jun 22, 2026
b9aaf3f
Budget App Store screenshot assets
jongan69 Jun 22, 2026
3e4d9ae
Run full App Store gate before submit
jongan69 Jun 22, 2026
0b6da84
Enforce full dead-code audit in readiness
jongan69 Jun 22, 2026
03ce549
Guard native release optimization settings
jongan69 Jun 22, 2026
25a8f81
Budget web export performance baseline
jongan69 Jun 22, 2026
d886962
Budget Expo Atlas dependency graph
jongan69 Jun 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
21 changes: 6 additions & 15 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,21 +1,12 @@
# Authentication
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY=your_clerk_key_here
# Release CLI only. Do not prefix with EXPO_PUBLIC_ and do not expose as plaintext.
CLERK_SECRET_KEY=sk_live_or_sk_test_for_release_scripts

# Database
DATABASE_URL=postgresql://username:password@localhost:5432/prepai_db

# External APIs
KROGER_CLIENT_ID=your_kroger_client_id
KROGER_CLIENT_SECRET=your_kroger_client_secret
EDAMAM_APP_ID=your_edamam_app_id
EDAMAM_APP_KEY=your_edamam_app_key
OPENAI_API_KEY=your_openai_api_key

# OpenAI Configuration
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-5.5
# Local AI
EXPO_PUBLIC_LOCAL_AI_ENABLED=true
EXPO_PUBLIC_LOCAL_AI_PROVIDER=executorch
EXPO_PUBLIC_CLOUD_AI_FALLBACK=false

# App Configuration
EXPO_PUBLIC_APP_ENV=development
EXPO_PUBLIC_API_BASE_URL=https://prepai.com
EXPO_PUBLIC_API_URL=https://prepai.com
2 changes: 2 additions & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ prisma/generated/

# Build outputs
dist/
dist-ios-check/
dist-web-check/
build/
74 changes: 42 additions & 32 deletions .github/actions/setup-node-environment/action.yaml
Original file line number Diff line number Diff line change
@@ -1,32 +1,42 @@
name: "Setup Node environment"
description: "Checkout, cache and bun install"

inputs:
node-version:
description: 'The Node.js version to use'
required: true
default: '18'
cache-path:
description: 'The path to cache node modules'
required: true
cache-key:
description: 'The key for caching'
required: true

runs:
using: 'composite'
steps:
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
- name: Install Bun
shell: bash
run: |
curl -fsSL https://bun.sh/install | bash
echo "$HOME/.bun/bin" >> $GITHUB_PATH
- name: Cache Node modules
uses: actions/cache@v4
with:
path: ${{ inputs.cache-path }}
key: ${{ inputs.cache-key }}
name: 'Setup Node environment'
description: 'Checkout, cache and bun install'

inputs:
node-version:
description: 'The Node.js version to use'
required: false
default: ''
node-version-file:
description: 'The Node.js version file to use'
required: false
default: '.nvmrc'
cache-path:
description: 'The path to cache node modules'
required: true
cache-key:
description: 'The key for caching'
required: true

runs:
using: 'composite'
steps:
- name: Set up Node.js from explicit version
if: ${{ inputs.node-version != '' }}
uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
- name: Set up Node.js from version file
if: ${{ inputs.node-version == '' }}
uses: actions/setup-node@v4
with:
node-version-file: ${{ inputs.node-version-file }}
- name: Install Bun
shell: bash
run: |
curl -fsSL https://bun.sh/install | bash
echo "$HOME/.bun/bin" >> $GITHUB_PATH
- name: Cache Node modules
uses: actions/cache@v4
with:
path: ${{ inputs.cache-path }}
key: ${{ inputs.cache-key }}
63 changes: 56 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ jobs:

- uses: ./.github/actions/setup-node-environment
with:
node-version: '20'
cache-path: 'node_modules'
cache-key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}

Expand All @@ -30,18 +29,68 @@ jobs:
- name: Lint
run: bun run lint

- name: Startup module-work guard
run: bun run guard:startup

- name: Module work advisory report
env:
MODULE_WORK_REPORT_OUTPUT: dist/module-work-report.json
run: bun run report:module-work

- name: Upload module work report
if: always()
uses: actions/upload-artifact@v4
with:
name: module-work-report
path: dist/module-work-report.json
if-no-files-found: ignore

- name: Test
run: bun run test -- --runInBand

- name: Expo Doctor
run: bun run doctor

- name: Verify iOS export
run: |
bunx expo export --platform ios --output-dir dist-ios-check
rm -rf dist-ios-check
run: rm -f .expo/atlas.jsonl && EXPO_ATLAS=true NODE_ENV=production METRO_MAX_WORKERS=1 bunx expo export --platform ios --output-dir dist-ios-check

- name: Verify web export
run: |
bunx expo export --platform web --output-dir dist-web-check
rm -rf dist-web-check
run: METRO_MAX_WORKERS=1 bunx expo export --platform web --output-dir dist-web-check

- name: Production readiness guardrails
run: bun run verify:production

- name: Expo Atlas bundle report
env:
ATLAS_SUMMARY_OUTPUT: dist/atlas-summary.json
run: bun run report:atlas

- name: Upload Expo Atlas artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: expo-atlas
path: |
dist/atlas-summary.json
.expo/atlas.jsonl
if-no-files-found: ignore

- name: Performance baseline report
env:
PERFORMANCE_BASELINE_OUTPUT: dist/performance-baseline.json
run: bun run perf:baseline:report

- name: Upload performance baseline
if: always()
uses: actions/upload-artifact@v4
with:
name: performance-baseline
path: dist/performance-baseline.json
if-no-files-found: ignore

- name: Dead code and dependency audit
run: bun run knip:check

- name: Cleanup export artifacts
if: always()
run: rm -rf dist-ios-check dist-web-check
1 change: 0 additions & 1 deletion .github/workflows/release-dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ jobs:

- uses: ./.github/actions/setup-node-environment
with:
node-version: '20'
cache-path: 'node_modules'
cache-key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}

Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/release-ipa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ jobs:

- uses: ./.github/actions/setup-node-environment
with:
node-version: '20'
cache-path: 'node_modules'
cache-key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}

Expand All @@ -30,13 +29,14 @@ jobs:
- name: Install dependencies
run: bun install --frozen-lockfile

- name: Verify release candidate
run: bun run verify
- name: Verify EAS production environment
run: bun run verify:release-env

- name: Verify iOS bundle export
run: |
bunx expo export --platform ios --output-dir dist-ios-check
rm -rf dist-ios-check
- name: Verify App Store URLs
run: bun run verify:appstore-urls

- name: Verify App Store release candidate
run: bun run test:readiness

- name: Build production iOS app
run: eas build --platform ios --profile production --non-interactive --wait
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ node_modules/
# Expo
.expo/
dist/
dist-*-check/
web-build/
android
builds/

# Native
*.orig.*
Expand Down
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
20.19.3
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -906,10 +906,10 @@ bun run test -- src/components/Button.test.tsx

```bash
# Validate production readiness
bunx expo-doctor
./node_modules/.bin/tsc --noEmit --pretty false
bun run lint
bun run test -- --runInBand
bun run test:readiness

# Inspect the production iOS bundle graph with Expo Atlas
bun run analyze:atlas

# Deploy web
bun run deploy:web:prod
Expand All @@ -919,7 +919,7 @@ eas build --platform ios --profile production --non-interactive
eas submit --platform ios --latest
```

See [docs/ios-app-store-release.md](docs/ios-app-store-release.md) for the iOS App Store checklist, required production secrets, HealthKit review notes, and the required $4.99 App Store Connect price.
See [docs/ios-app-store-release.md](docs/ios-app-store-release.md) for the iOS App Store checklist, required production secrets, HealthKit review notes, and the required $4.99 App Store Connect price. See [docs/production-performance.md](docs/production-performance.md) for the release profiling and guardrail workflow.

## 🤝 Contributing

Expand Down
35 changes: 25 additions & 10 deletions app.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,27 @@
"expo-secure-store",
"expo-asset",
"expo-background-task",
[
"expo-build-properties",
{
"android": {
"enableProguardInReleaseBuilds": true,
"enableShrinkResourcesInReleaseBuilds": true,
"networkInspector": false
},
"ios": {
"deploymentTarget": "16.4",
"networkInspector": false
}
}
],
"./plugins/with-fmt-xcode26-fix",
[
"@kingstinct/react-native-healthkit",
{
"NSHealthShareUsageDescription": "PrepAI imports activity, workouts, sleep, hydration, and body measurements from Apple Health to personalize your nutrition and fitness plan.",
"NSHealthUpdateUsageDescription": "PrepAI can save health and fitness updates you explicitly choose to sync.",
"background": true
"NSHealthUpdateUsageDescription": false,
"background": false
}
]
],
Expand All @@ -44,19 +59,20 @@
"resizeMode": "contain",
"backgroundColor": "#000000"
},
"assetBundlePatterns": ["**/*"],
"assetBundlePatterns": [
"**/*"
],
"web": {
"bundler": "metro",
"output": "server",
"output": "static",
"favicon": "./src/assets/favicon.png"
},
"ios": {
"supportsTablet": true,
"supportsTablet": false,
"bundleIdentifier": "com.jongan69.prepai",
"infoPlist": {
"ITSAppUsesNonExemptEncryption": false,
"NSHealthShareUsageDescription": "PrepAI imports activity, workouts, sleep, hydration, and body measurements from Apple Health to personalize your nutrition and fitness plan.",
"NSHealthUpdateUsageDescription": "PrepAI can save health and fitness updates you explicitly choose to sync."
"NSHealthShareUsageDescription": "PrepAI imports activity, workouts, sleep, hydration, and body measurements from Apple Health to personalize your nutrition and fitness plan."
}
},
"android": {
Expand All @@ -72,11 +88,10 @@
"eas": {
"projectId": "30d0bb01-8e31-4a5f-8de4-549fd39256b9"
},
"apiBaseUrl": "https://prepai.com",
"appInfo": {
"name": "PrepAI",
"tagline": "Transform Your Fitness Journey with AI",
"description": "PrepAI combines artificial intelligence with personalized nutrition and workout planning to help you achieve your health goals faster and more effectively.",
"tagline": "Local-first health intelligence",
"description": "PrepAI keeps nutrition, workouts, hydration, sleep, body metrics, supplement logs, and Apple Health imports organized in a private local-first health tracker.",
"version": "1.0.0",
"socialMedia": {
"twitter": "https://twitter.com/prepai",
Expand Down
Loading
Loading