Building leadistro
leadistro is a social media marketing campaign app with unified lead management, built on the T3 stack with a web app and an Expo React Native mobile client. It's still under development.
Why I built it on the T3 stack
The core of the T3 stack is Next.js and TypeScript, usually with Tailwind, and tRPC, Prisma, and NextAuth.js when you need a backend. tRPC is the part that sold me: you get a typesafe server-to-client contract without the GraphQL boilerplate. It's a clever abuse of TypeScript and the dev experience is hard to give up once you've had it. So I wired the frontend and backend together over tRPC and got robust, readable data flow for free.
Turborepo and turbopack
I set the repo up with Turborepo. Turbo is an incremental bundler and build system for JavaScript and TypeScript, written in Rust, both fairly new from Vercel at the time. Webpack tends to be slow, and the prospect of a Rust-powered bundler cutting that pain is what caught my eye.
Radix UI for components
I used Radix UI for its set of unstyled primitives, which let me build a consistent interface across the platform without reinventing every component.
Expo Dev Client vs. plain React Native
This was the hardest part. I'd already built an alpha of the app with the bare React Native CLI, wiring up native Android and iOS modules directly. Taking it to production made me realize I wanted Expo for its plugin ecosystem and the friction it removes, so I switched — which took time. That's where I learned Expo Router, Expo's file-based router, and got more comfortable with NativeWind (Tailwind for React Native).
Implementing Firebase OAuth — against my better judgment
I integrated Firebase OAuth into both the Next.js web app and the Expo app so users could log in with existing credentials. Something about it nagged at me the whole time, and it turned out to be justified.
One Postgres database
The problem with choosing Firebase for Google OAuth was that I couldn't get Prisma to play with Firebase's NoSQL database. So I used Supabase for Postgres instead, which had a new extension I found genuinely useful: pgvector.
distroGPT
I started training distroGPT, a model meant to automate lead management tasks and surface insights and recommendations inside leadistro. It's the AI piece the rest of the app is built to lean on.
Where it's at
leadistro is still under development. distroGPT is still being trained and I'm still refining the component design, so it's not done — but the stack decisions above are the ones I'd make again.