Boba web & mobile
A Next.js trading app and Expo mobile app, built for live market data.
- Role
- Second-largest contributor (340+ commits)
- Stack
- Next.js 15React 19ExpoValtioTailwindRadixTradingViewTurnkeyviemHyperliquidSentry
- Links
- boba.xyz
Boba's frontend is a pnpm and Turborepo monorepo: a Next.js 15 web platform on React 19, an Expo React Native app, and a shared Tailwind and Radix UI package both of them build from.
I built much of it myself, especially the surfaces where live data meets the backend services I designed.
Decisions
Market data lives outside React
A trading screen updates many times a second, and routing every tick through React state would re-render the page just to keep up. So it doesn't. One multiplexed WebSocket and a thin REST client write straight into Valtio stores, and components subscribe to snapshots of only what they use. A price tick updates one number, not the page around it.
What I built
- The token trading page: chart order overlays, live holders, trades and top-traders tables, and holdings that update from PnL pushes.
- Hyperliquid perps: chart orders, liquidation, cancel-all and PnL tables.
- Limit, DCA and TWAP order flows on web and mobile.
- Moved all RPC through the gateway with balance and gas streams, and added recovery when a stream dies or a tab resumes.
- Migrated the app to a Turborepo and led a type-safety migration of the core token model with a test suite.
Architecture
Rendering. The web app runs on the Next.js App Router and is mostly client-rendered, since nearly everything on screen is live and specific to the user.
Data. One multiplexed WebSocket for all streaming data and a thin authenticated REST client, both feeding the Valtio stores.
Trading. Perps talk directly to Hyperliquid. Wallets and auth run on Turnkey, with viem for EVM chains and web3.js for Solana.
Charts. The TradingView Charting Library, with candle processing moved into a web worker so heavy chart data never blocks the interface.
Shipping. Installable as a PWA, with Sentry for error monitoring.