Back to Projects

iPokerPal

ipokerpal

An offline-capable poker session tracker for recording buy-ins, calculating settlements, and reviewing game history, with optional Firebase sync.

Role: Solo Developer / Product Engineer

Highlights

React NativeExpo SDK 54TypeScriptReact NavigationZustandSQLiteAsyncStorageFirebase AuthCloud FirestoreGoogle Sign-In
  • Built live session and quick-entry flows for players, buy-ins, chip counts, and settlements.
  • Kept core records local using SQLite, AsyncStorage, and persisted Zustand stores.
  • Centralised chip-to-cash conversion, profit, and ROI calculations in shared state actions.
  • Added guest access, authenticated cloud sync, and cached retries for failed uploads.

Problem

During a live poker session, buy-ins and chip counts change frequently. Notes and spreadsheets make it easy to lose the relationship between those changes and the final settlement.

Recording a game should remain possible without signing in or relying on a stable network connection.

Approach

Keep active session state and completed records on the device, with cloud synchronisation as an optional step.

Centralise settlement calculations so screens use the same normalised values.

Support full live-game tracking and a shorter Quick Record flow for cash-session entry.

Result

Built a mobile app for live sessions, quick records, local history, and optional authenticated cloud sync. The project includes an iOS App Store link and source repository.

Implementation

Session tracking and settlement

  • Built player, blind, buy-in, leave/return, and final chip-count flows in Expo and React Native.
  • Calculated chip-to-cash conversion, profit and loss, ROI, and player summaries through shared store actions.
  • Reconstructed game history from local action snapshots.

Local storage and recovery

  • Used SQLite for games, players, and action records, with AsyncStorage for settings and persisted state.
  • Added versioned Zustand persistence and rehydration handling for session restoration.
  • Stored completed session snapshots locally and cached failed Firebase uploads for retry.

Authentication and cloud sync

  • Integrated Google, Apple, and local guest sign-in flows.
  • Added Firestore writers for game records, player history, and user statistics, splitting large write batches.
  • Applied host-aware permissions to privileged cloud actions.

Settings and edge cases

  • Persisted language and currency settings with cached AUD/CNY exchange rates.
  • Handled cancelled sign-in, unavailable SQLite APIs, cloud permission failures, and zero chip conversion values.
  • Added local record deletion and sign-out cleanup flows.

Lessons

  • Settlement values need to be normalised and explainable before they are stored or displayed.
  • Offline support affects authentication, recovery, and the meaning of a successful save, not only the storage layer.
  • Cloud upload failure should leave the local session record intact.