Production-oriented Expo + React Native app for a university poker strategy club. The app focuses on member signups, attendance, QR check-ins, engagement points, rewards, friendly tournaments, education, leaderboards, practice poker matches, and community retention.
This app is for poker strategy education, club engagement, and non-gambling competition only. No real-money wagering is supported.
The app does not include deposits, withdrawals, betting with money, cash-outs, casino wallets, real-money balances, or wagering. Points are club engagement points only and can be redeemed only for club-approved perks such as tournament entries, round boosts, gift cards, custom chips, merch, or recognition.
- React Native
- Expo
- TypeScript
- Expo Router
- Supabase Auth, Postgres, RLS, RPC functions, and Storage-ready profile fields
- React Native Paper
- Expo SecureStore
- Expo Camera / Barcode Scanner for QR attendance
- Expo Image Picker permission configuration for optional profile photos
- EAS Build and EAS Submit
npm install
cp .env.example .envFill in:
EXPO_PUBLIC_SUPABASE_URL=
EXPO_PUBLIC_SUPABASE_ANON_KEY=
EXPO_PUBLIC_INVITE_BASE_URL=https://qupoker.app
EXPO_PUBLIC_APP_STORE_URL=Do not place a Supabase service role key in this mobile app. Privileged operations should stay in Supabase RPC functions, database policies, or server-side/Edge Function code.
- Create a Supabase project.
- In SQL Editor, run the migration files in order:
supabase/migrations/001_initial_schema.sqlsupabase/migrations/002_functionality_hardening.sqlsupabase/migrations/003_event_qr_attendance_management.sqlsupabase/migrations/004_launch_readiness.sqlsupabase/migrations/005_poker_arena.sqlsupabase/migrations/006_poker_invite_links.sqlsupabase/migrations/007_public_member_profiles.sqlsupabase/migrations/008_tournament_center.sqlsupabase/migrations/009_tournament_registration_hardening.sqlsupabase/migrations/010_lifetime_and_spendable_points.sqlsupabase/migrations/011_tournament_registration_direct_spend.sqlsupabase/migrations/012_tournament_table_assignments.sqlsupabase/migrations/013_tournament_director_results.sqlsupabase/migrations/014_profile_avatars_storage.sqlsupabase/migrations/015_poker_live_realtime.sql
- Run
supabase/smoke-test.sqlto confirm key tables/functions exist. - Optionally run
supabase/seed/seed.sqlfor development seed data. - Enable email auth providers as needed.
- Add your project URL and anon key to
.env.
The schema includes:
profileseventsattendancepoints_ledgerrewardsreward_redemptionstournamentstournament_registrationstournament_resultsdaily_practice_claimspoker_friendshipspoker_match_queuepoker_matchespoker_match_players
Security features include RLS, admin role checks, duplicate QR check-in prevention, duplicate daily practice prevention, atomic point award/redemption functions, separate lifetime and spendable point balances, protected reward/tournament flows, required student ID profile completion, and non-gambling poker match records that store practice chips only.
npx expo startFor iOS:
npx expo start --iosFor a development build:
npx expo install expo-dev-client
eas build --profile development --platform iosThe app is configured with:
- App name:
QU Poker - Slug:
qu-poker - URL scheme:
qupoker - iOS bundle identifier:
com.qupoker.strategyclub - Camera permission copy:
Camera access is used to scan club event QR codes for attendance check-in.
Build for production:
eas build --profile production --platform iosAfter the production build finishes:
eas submit --profile production --platform iosIn App Store Connect, use compliance notes that clearly state:
- The app is a university club engagement and education app.
- It does not support real-money gambling.
- It does not support betting, deposits, withdrawals, or cash-outs.
- Points are non-cash engagement points only.
- Friendly tournaments are non-gambling competitions for recognition and club rewards only.
The Play tab can create an iMessage-friendly practice match invite link. In development, the app can open custom scheme links like:
qupoker://invite/INVITE_TOKEN
For App Store-style behavior, use a real HTTPS domain in EXPO_PUBLIC_INVITE_BASE_URL, for example:
https://qupoker.app/invite/INVITE_TOKEN
To make that link open the app when installed and show an App Store/download page when not installed:
- Replace the placeholder
applinks:qupoker.appinapp.jsonwith your real domain. - Host an Apple
apple-app-site-associationfile on that domain for/invite/*. - Make the web
/invite/:tokenpage show an App Store button usingEXPO_PUBLIC_APP_STORE_URL, and optionally a button that opensqupoker://invite/:token. - After the App Store listing exists, add the real App Store URL to
.env.
- Sign up in the app with the officer email.
- In Supabase SQL Editor, promote the user:
update public.profiles
set role = 'admin'
where email = 'officer@example.edu';- Log out and back in.
- Open Profile, then Officer Console.
- No payment or wallet features are present.
- Camera is requested only for QR attendance.
- Photo library permission is scoped to optional profile photo selection.
- Student ID is required for membership verification and should be used only by officers for club eligibility/admin purposes.
- The non-gambling disclaimer appears on welcome, dashboard, about/rules, event detail, and strategy trainer surfaces.
- Poker Arena practice chips have no cash value and are not tied to deposits, withdrawals, payouts, or club engagement point balances.
- Keep screenshots and metadata away from casino language, cash prizes, wagering terms, or anything that implies monetary gambling.
See also:
docs/privacy-policy.mddocs/app-store-readiness.mddocs/device-qa-checklist.md
app/ Expo Router screens
components/ Reusable mobile UI components
constants/ Theme and required disclaimer
lib/ Supabase client, service layer, poker evaluator
supabase/migrations/ Database schema, RLS, RPC functions
supabase/seed/ Development seed data
assets/ Placeholder icon and splash assets