Sucker! is a mobile-first, head-to-head dice game built with Expo and React Native. It uses a familiar five-dice scorecard structure, then adds Sucker Tokens for extra rolls, mulligans, attacks, blocks, and tactical category scratches.
The gameplay source of truth is docs/game-design-spec-v2.md.
- Expo SDK 57 with Expo Router and React Compiler
- React Native and React Native Web
- TypeScript
- Supabase for multiplayer state, database migrations, and Edge Functions
- Exceptionless for native and JavaScript error monitoring
- Node test runner for game-rule tests
- Playwright for web E2E coverage
Install dependencies:
npm installCopy the example environment file when working with multiplayer:
cp .env.example .envSet these values in .env for a Supabase-backed session:
EXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
EXPO_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
EXPO_PUBLIC_EXCEPTIONLESS_API_KEY=your-exceptionless-project-keyWithout Supabase configuration, the app can still run the local demo game.
For the GitHub Pages deployment, add these repository variables before running the deploy workflow:
EXPO_PUBLIC_SUPABASE_URLEXPO_PUBLIC_SUPABASE_ANON_KEY
The Pages workflow publishes play.sucker.games through dist/CNAME.
Start the Expo dev server:
npm startRun the web build locally:
npm run web -- --port 8081Platform shortcuts:
npm run ios
npm run androidCore checks:
npm run typecheck
npm run testSupabase Edge Function checks:
npm run typecheck:edge
npm run test:edgeWeb E2E checks:
npm run test:e2e:webFormatting and linting:
npm run lint
npm run format:checkProduction web budget:
npm run build:web
npm run check:bundle-sizeSee docs/release-quality.md for native builds, device smoke tests, accessibility, performance profiling, Exceptionless verification, offline recovery, and staged updates.
Computer strategy simulations:
npm run simulate:computer
npm run tournament:computer
npm run tournament:sucker-tokensSupabase integration test setup:
npm run prepare:e2e-env
npm run test:integration:supabase- App.tsx: main Expo app and game UI
- app/: Expo Router screens and universal navigation
- shared/: platform-neutral game rules and shared types
- src/multiplayer/: Supabase client-side multiplayer code
- supabase/migrations/: database migrations
- supabase/functions/: Supabase Edge Functions
- tests/: game-rule tests
- e2e/: browser E2E tests and snapshots
- assets/: game art and dice assets
- docs/: gameplay and UI reference documentation
- Two players per game
- One active turn at a time
- Five dice, up to four standard rolls per turn
- Sucker Tokens power extra rolls, mulligans, and chance-based Sucker Punch attempts
- Scratching a category awards one token
- Suckers do not award tokens
See the design spec for complete rules and balancing details.
Sucker! is licensed under the MIT License.