MyPokerSeries
Live-poker companion SaaS · Web + iOS + Android · EN/FR · Nov 2025 to present
- lines in a monorepo
- ~ 165k
- commits since Nov 2025
- 2,756
- on both stores since 19 Sept 2026
- Web + iOS + Android
- in production with paying subscribers (Stripe + RevenueCat)
- Live
What it is. A companion app for live tournament players: a worldwide tournament schedule with structure ratings, trip and multi-currency bankroll tracking (140+ currencies), friends and crews with live status, and staking/swap tools.
My role. I'm the only engineer and I lead the product. My co-founder is non-technical. The first prototype was built on Lovable (Nov 2025 to Mar 2026). Since then I've run all development in Claude Code: specs, agent instruction files, reviews, debugging and releases.
Stack and scale
- ~165k lines in a monorepo: React/Vite/TypeScript web app, Expo/React Native apps (on both stores since 19 Sept 2026), shared package for business rules and types
- 2,756 commits since Nov 2025
- Supabase: 42 tables all under row-level security (115 policies), 131 SQL functions, 20 Deno Edge Functions, 7 pg_cron jobs, pgmq push queue, realtime
- Stripe (web) + RevenueCat (in-app) kept in sync through webhooks · native Google/Apple sign-in · EAS over-the-air updates · Sentry
Hard problems solved
- Silent OTA failure. Over-the-air updates downloaded but never applied. Device logs showed the build ignored local env vars, so the bundle crashed and rolled back without any error. I moved the vars to EAS environments and added a post-release manifest check.
- Multi-currency bankroll. Every transaction converts at the FX rate of its own date, across 140+ currencies. Trips, crews and stats roll up into one currency while each row keeps its native amount.
- Deals mirrored across two accounts. Each side of a swap, backing or staking deal has its own record: invite/accept, synced results, locked terms. This is enforced by RLS and security-definer RPCs, never by shared editing.
- Localized push pipeline. Trigger → pgmq queue → cron → Expo, sent in each recipient's language. I tracked down four failure modes that produced no error at all.
- Free tier that doesn't leak paid data. Deterministic daily sampling of ratings, and placeholder rows instead of blurred real data. The blur on React Native is done with SVG filters.