Nonsense is a production-style mobile app for home poker tracking, built with Expo + React Native + Firebase. It handles the full session lifecycle: creating games, tracking buy-ins, cashing out, and surfacing per-player results with long-term personal analytics.
- Real-world product scope: Not a toy CRUD app; includes sessions, friends, groups, locations, stats, and profile management.
- Thoughtful data modeling: Firestore collections support live updates, session summaries, and historical analytics.
- Performance-minded UX: Incremental history pagination and batched aggregation for large datasets.
- Mobile-first experience: Native-feeling navigation, haptics, theme support, QR-powered sharing, and practical flows for live game nights.
- End-to-end ownership: App screens, state/data layer, Firestore rules/indexes, and deployment-ready configuration.
- Create new poker sessions with optional saved locations.
- Track live participants and buy-ins during active games.
- Run a dedicated cash-out flow and store final results.
- View read-only session summaries for easy recap and auditability.
- Send and receive friend requests.
- Search/sort friends and manage group membership.
- Leaderboards across friends and within groups.
- Share and connect via QR code.
- Session history with filters (location, date range, buy-in range, profit range).
- Multi-key sorting (date/time, buy-in, profit, duration).
- Pagination with pull-to-refresh for responsive history browsing.
- Full-history statistics including P/L, win rate, hourly rate, and participation/hosting trends.
- Tab-based information architecture with dedicated session stack flows.
- Light / dark / system theme support.
- Profile customization (display name + avatar emoji).
- Saved locations for faster repeat session setup.
| Layer | Technologies |
|---|---|
| Mobile app | Expo SDK 54, Expo Router |
| UI | React Native 0.81, React 19, TypeScript |
| Backend | Firebase Authentication (anonymous), Firestore |
| Native integrations | Camera, sharing, clipboard, haptics, QR generation/scanning |
| Tooling | ESLint, TypeScript, Expo lint tooling |
app/ Route-driven screens (tabs, auth, session, group, locations, qr)
lib/ Firebase + Firestore helpers, auth/theme providers, utilities
components/ Shared UI building blocks
types/ Shared TypeScript contracts
firestore.rules
firestore.indexes.json
- Node.js LTS
- Firebase project with:
- Authentication (Anonymous enabled)
- Firestore database
- Optional: Firebase CLI for deploying rules/indexes
npm install- Copy
.env.exampleto.env - Fill in all
EXPO_PUBLIC_FIREBASE_*variables - Start the app:
npm startThen run on Expo Go, iOS simulator, Android emulator, or web.
| Command | Purpose |
|---|---|
npm start |
Start Expo dev server |
npm run android |
Launch Android target |
npm run ios |
Launch iOS target |
npm run web |
Launch web target |
npm run lint |
Run lint checks |
- Security rules are in
firestore.rules. - Required composite indexes are in
firestore.indexes.json.
Deploy indexes:
firebase deploy --only firestore:indexesIf Firestore logs an "index required" URL, open it or add the recommended index fields to firestore.indexes.json.
- History and stats include finished sessions where the current user has a result document.
- History uses incremental loading; totals reflect currently loaded pages until more pages are fetched.
- Statistics computes full-history aggregates in batches for more complete long-range metrics.
- Push notifications for session events and friend requests.
- Better anti-cheat/tamper checks around result finalization.
- Optional cloud functions for heavier analytics workloads.
- Expanded visualization layer (profit trends, moving averages, session heatmaps).
Product and data model draft lives in doc/nonsense-app-spec.md. When details differ, this repository's source code is the source of truth.