A monorepo containing both the iOS app and the AI coaching backend server.
FlickClean/
├── app/ # Expo Router pages and screens
├── components/ # Reusable React Native components
├── hooks/ # Custom React hooks
├── lib/ # Utility libraries (pose estimation, etc.)
├── assets/ # Images, fonts, and static assets
├── server/ # Express + TypeScript AI coaching backend
│ ├── src/
│ │ ├── index.ts # Server entry point
│ │ ├── routes/
│ │ │ ├── ingest.ts # Session data ingestion endpoint
│ │ │ └── query.ts # AI coaching query endpoint
│ │ ├── lib/
│ │ │ └── serialize.ts # Markdown serializer
│ │ └── shared/
│ │ └── types.ts # Shared TypeScript types
│ ├── package.json
│ └── tsconfig.json
├── package.json # iOS app dependencies
└── app.json # Expo configuration
The mobile app captures shooting sessions using pose estimation and sends data to the coaching server.
# Install dependencies
npm install
# Start Expo development server
npx expo start- iOS Simulator: Press
iafter starting Expo - Physical Device: Scan QR code with Expo Go app
The backend handles session ingestion and AI-powered coaching queries via OpenAI.
cd server
# Install dependencies
npm install
# Copy environment template and add your keys
cp .env.example .env
# Edit .env with your OPENAI_API_KEY and VECTOR_STORE_ID
# Start development server
npm run dev| Endpoint | Method | Description |
|---|---|---|
/ingest |
POST | Ingest shooting session data |
/query |
POST | Query AI coach for feedback |
| Variable | Description |
|---|---|
OPENAI_API_KEY |
Your OpenAI API key |
VECTOR_STORE_ID |
OpenAI vector store ID for session storage |
PORT |
Server port (default: 5050) |
- Start the server:
cd server && npm run dev - Start the iOS app:
npx expo start - The app sends session data to
http://localhost:5050
See individual LICENSE files in each package.