Stack
Every dependency, in one matrix.
Side-by-side view of the libraries, runtimes and services that power each surface.
| Concern | Website | Web App | Mobile App |
|---|---|---|---|
| Framework | React 18 · Vite | Next.js 14 · App Router | Expo 53 · React Native 0.79 |
| Language | TypeScript | TypeScript (strict) | TypeScript (strict) |
| UI | Tailwind · Radix Tooltip | Tailwind · Radix Primitives | RN core · Reanimated · Gorhom Sheets |
| Server State | — | TanStack Query | TanStack Query + persist |
| Client State | Local | Recoil | Zustand |
| Forms | RHF + Zod | RHF + Zod | RHF + Zod |
| HTTP | fetch | Axios | Axios |
| Charts | — | Recharts | gifted-charts |
| Motion | Framer Motion | Framer Motion | Reanimated |
| Storage | — | Cookies / Session | MMKV · SecureStore |
| Auth | — | JWT + OTP | JWT + Biometrics |
| Exports | — | jsPDF · xlsx | Native share |
| KYC | — | @sumsub/websdk | Sumsub RN SDK |
| Invoicing | — | @team-monite/sdk-api | @team-monite/sdk-api |
| Push | — | — | OneSignal |
| Build | Vite | Next build | EAS Build |
| Hosting | Vercel | Vercel | App Store · Play · EAS Update |
Engineering standards
What ships, every time.
Strict TypeScript everywhere
Shared DTOs and Zod schemas eliminate drift between web, mobile and the BFF.
Query-first data layer
TanStack Query owns caching, retries and invalidation on both web and mobile.
BFF for every provider
No secret ever reaches the client. Providers are swappable behind typed services.
Design system parity
Tokens, type and motion are aligned across surfaces — same brand, native ergonomics.