Product Engineering Case Study
Bunches. Chat Sports.
A mobile-first social app for sports communities with real-time chat, group discovery, direct messages, rewards, picks, native mobile flows, and REP-powered onchain interactions.
Overview
Bunches needed a community product where fans could join groups, chat in real time, share content, receive notifications, make picks, earn rewards, and use REP without being exposed to raw wallet or transaction complexity.
I was the primary engineer behind the Capacitor client app and REP ecosystem, connecting product surfaces to realtime messaging, typed GraphQL data, native mobile APIs, non-custodial wallet persistence, and gasless onchain flows.
Impact
- Led the Capacitor client from early Turborepo scaffolding into a production-grade mobile/web app, authoring 485 commits in the monorepo.
- Built real-time bunch chat with Phoenix channels, optimistic updates, message history, edits, deletes, reactions, threads, and Zod validation.
- Shaped the typed GraphQL and Apollo data layer with reusable fragments, generated TypeScript types, mutations, subscriptions, and targeted cache updates.
- Integrated native mobile flows through Capacitor, including Android delivery, push notifications, deep links, media, sharing, haptics, and cloud settings.
- Designed and implemented the REP token ecosystem, wallet UX, EIP-712 signing, meta-transactions, and gasless onchain interaction patterns.
Representative Product Areas
Representative panels show the major product surfaces without representing final Bunches screenshots.
Bunch Chat
Phoenix channels ยท optimistic state
Mobile Entry Points
GraphQL Data Layer
typed fragments
Generated types, subscriptions, cache updates, and optimistic UI for high-frequency social interactions.
REP Token UX
capped token supply
23B
EIP-712 signatures and gasless transaction flows
Tech & Constraints
- React / Next.js
- TypeScript
- Capacitor
- Apollo / GraphQL
- Phoenix channels
- Zustand
- Solidity / REP
- viem / wagmi / ethers
The key engineering challenge was coordinating native mobile behavior, web rendering, realtime messaging, GraphQL server state, local interaction state, wallet recovery, signed transactions, analytics, observability, and release workflows across a multi-package app.