Android-first golf training app for FlightScope Mevo+. It connects directly to the device over TCP, captures shot data in real time, stores everything locally in SQLite, and adds training-focused analysis on top: target ranges, session stats, dispersion, history, and trend charts.
The project is currently at the end of Phase 2 and preparing for Phase 3.
This app is built for structured range practice, not generic launch monitor viewing.
Core user flow today:
- Sign in with email/password.
- Create and manage clubs in Equipment.
- Connect to a Mevo+.
- Start a session and assign an active club.
- Capture shots live and save them locally.
- Evaluate shots against per-club target ranges.
- Review session stats, dispersion, history, and trends.
- Optionally sync local data to Supabase when online.
The current product focus comes from docs/user-journey-v1.md. The expansion path for video, cloud workflows, and advanced coaching features is described in docs/user-journey-v2.md and docs/user-journey-v3.md.
- Mevo+ direct connection over TCP (
port 5100) - Live shot capture and structured dashboard
- SQLite offline-first storage for clubs, sessions, margins, and shots
- Supabase Auth with persisted session
- Equipment management
- Per-club target ranges
- Session statistics
- Shot dispersion view
- Session history
- Trend charts
- Cross-metric trend overview
- Manual SQLite to Supabase sync from Settings
- Phase 3 video integration
- video recording linked to shot events
- shot detail video player
- annotations
- local clip storage and optional Supabase Storage upload
- Phase 4 follow-up work
- CSV export
- cloud download / multi-device sync
- Phase 5+ longer-term direction
- AI-assisted swing analysis
- richer coaching and training workflows
- verify protocol byte offsets on the real device, especially FIL fields
- define the shot-event timing offset as a constant
- verify the camera stream on
http://<mevo-ip>:8080 - confirm remaining protocol details with FlightScope support
- Expo SDK 54
- Expo Router
- TypeScript
- React Native
expo-sqlite- Supabase Auth + sync
victory-nativefor charts@shopify/react-native-skiafor graphicsexpo-videofor upcoming video workflows@bri-b-dev/gspro-connect-mevoplusfor Mevo+ communication
app/(auth)/ Login and registration
app/(app)/ Authenticated app screens
app/(app)/session/ Live training/session flows
app/(app)/history/ Session history, analysis, trends
app/(app)/equipment/ Club setup and management
app/(app)/settings/ Sync and account settings
components/ Reusable UI and chart components
lib/db/ SQLite setup and database access
lib/hooks/ App state, auth, Mevo, and data hooks
lib/supabase/ Supabase client and sync logic
lib/utils/ Unit and domain helpers
supabase/migrations/ Cloud schema and RLS history
Local-first storage is centered around:
usersclubslaunch_monitorssessionsshotsmargins
The shots table is designed to support later video workflows through video_path and video_url.
- direct TCP connection on
5100 - flow:
connect()->configure()->arm()-> receive shots - shot events arrive shortly after impact
- camera preview stream is expected on HTTP
8080and is not fully validated yet
Important shot fields include:
- ball data:
ballSpeedMph,verticalLaunchAngle,horizontalLaunchAngle,totalSpin,spinAxis,carryDistanceYards - club data when available:
clubSpeedMph,angleOfAttack,clubPath,faceToTarget,dynamicLoft,spinLoft - face impact data when available:
faceImpactX,faceImpactY
If isEstimatedSpin === true, spin should be treated as unreliable.
- Shot capture and analysis work against local SQLite storage.
- Sessions and shots survive app restarts.
- Cloud sync is manual from Settings.
- Supabase is additive, not required for the training loop once the user is authenticated.
- Node.js and npm
- Expo native development environment
- Android device or emulator for app builds
- FlightScope Mevo+ on the same network for real hardware testing
- Supabase project for auth and sync
Note: direct Mevo+ TCP communication is native-only. Browser/web builds cannot connect to the device.
Create a local .env file with:
EXPO_PUBLIC_SUPABASE_URL=...
EXPO_PUBLIC_SUPABASE_KEY=...Optional:
EXPO_PUBLIC_MOCK_MEVO=trueEXPO_PUBLIC_MOCK_MEVO=true enables a local mock shot flow for UI and data testing without real hardware.
npm installnpm run androidMock mode:
npm run android:mockOther useful scripts:
npm run start
npm run start:mock
npm run lintStable training foundation:
- auth
- equipment
- Mevo+ connection
- shot capture
- local persistence
- target ranges
- session analysis
- dispersion
- history
- trends
Measurement plus documentation:
- shot-linked video
- video playback and comparison
- annotations
- local/cloud video storage
- broader sync/export workflows
Interpretation and coaching:
- AI-assisted swing analysis
- guided training insights
- richer long-term progress workflows
Detailed status and planning live in:
- TypeScript strict
- no
any - functional React components
- explicit props interfaces
- database access in
lib/db/ - transactional writes for related entities
- internal units stay in
mph,yards, anddegrees - field names follow
ShotDataexactly
- Android-first product direction
- direct device connection requires a native build
- no simulator-based Mevo workflow
- video feature set is only partially prepared at schema/dependency level
- some hardware protocol details still need validation on a real device