Breaking down my current tech stack
Based on Theo - t3․gg's video on YouTube. If you like this content, support the original creators by watching, liking and subscribing to their content.
Convex has replaced most of the SQL + tRPC + React Query data/API flow, with tRPC retained mainly for gaps outside Convex’s capabilities.
Briefing
The core takeaway is that a modern TypeScript web stack is no longer a fixed “T3 stack” recipe—it’s a modular set of choices optimized for where static vs dynamic rendering happens, how much logic runs on the platform, and how aggressively teams want to avoid dashboard-driven configuration. After years built on the T3 stack, the current setup shifts away from SQL + tRPC-centric data access toward a Convex-first approach, while also rethinking the surrounding layers (auth, payments, analytics, security, and hosting) to reduce operational friction and keep code as the source of truth.
A major pivot is the database/API layer. Instead of PlanetScale + Prisma/Drizzle, then tRPC endpoints, plus separate live-update tooling and React Query, the stack now routes most data and API behavior through Convex. That means using Convex’s built-in useQuery/useMutation patterns and leaning on Convex’s optimistic update path for a smoother client experience. When something falls outside Convex’s model, tRPC still appears as a fallback, but it’s increasingly rare.
The “O layer” (auth) is handled differently depending on whether the goal is speed or enterprise readiness. For most projects, Clerk is the default because it bundles the practical pieces—sign-in, subscription-related flows, and user-facing UI components—so teams can get back to building. Work OS is positioned for enterprise sales where SAML/Octa-style integrations matter and where an admin portal becomes a requirement. A third option, Better Auth, is treated as a promising open-source-oriented path that can attach to an existing database, but without Convex-like hosting it shifts integration work back onto the developer.
Hosting and rendering choices also drive the stack’s shape. React remains the client foundation largely because the ecosystem—libraries, bundlers, tooling, and AI coding agents—still aligns around it. For the framework layer, the decision is framed less as “which init command” and more as “which router and rendering strategy.” Next.js is recommended when static pages and SEO matter (including patterns like a static marketing homepage plus a dynamic app), while Vite is favored for simpler apps where a static landing page isn’t critical. TanStack Start is watched as an emerging option, and React Router remains the practical routing layer in the Vite world.
On infrastructure, the stack stays on Vercel for preview environments and “fluid compute,” which the creator credits with cutting costs dramatically for long-running, low-compute workloads like AI inference. Cloudflare is acknowledged as strong for certain compute-wait patterns, but the integration friction—especially around Node compatibility and deployment complexity—pushes the choice back toward Vercel for full-stack apps.
Security and observability round out the picture. Bot protection is treated as distinct from DDoS protection, with the stack using Bot ID on Vercel and Arcjet as another programmable security layer option (rate limiting, bot detection, email validation, and token buckets). Analytics is split by purpose: PostHog for product analytics (feature flags, session replay) and Plausible for web analytics when sign-in isn’t available. Payments are anchored on Stripe, but the implementation philosophy is to keep payment state out of the application DB—using KV storage for subscription status and syncing via webhooks—while also evaluating newer abstractions like Autumn and Polar to reduce webhook and state-management pain.
Overall, the stack’s evolution is less about chasing new tools and more about enforcing modularity: swap components as needs change, keep behaviors in code, and minimize reliance on external dashboards that can drift from the repo. The result is a setup that’s “weird” compared with the original T3 approach, but designed to work smoothly with modern development workflows and AI-assisted coding.
Cornell Notes
The stack has shifted from a classic T3-style “SQL + Prisma/Drizzle + tRPC + React Query” flow to a Convex-first model where data access and API behavior live inside Convex. That change reduces glue code and leverages Convex’s optimistic updates and query/mutation primitives, with tRPC kept mainly as a fallback. Framework choices are driven by rendering needs: Next.js for static/SEO-friendly pages and mixed static+dynamic setups, Vite for simpler apps, and TanStack Start watched as it matures. Auth and payments follow a similar philosophy: Clerk for fast default auth/subscriptions, Work OS for enterprise SSO requirements, and Stripe as the payment backbone while keeping payment state out of the main application DB. The overarching goal is modularity and “code as the source of truth,” avoiding dashboard-driven configuration where possible.
What changed most in the data/API layer, and why does it matter for day-to-day development?
How does the stack decide between Next.js, Vite, and TanStack Start?
Why is the auth layer split between Clerk and Work OS, and where does Better Auth fit?
What’s the hosting logic behind staying on Vercel instead of Cloudflare?
How does the stack approach payments without polluting the main application database?
What’s the distinction between bot protection and DDoS protection, and which tools match each need?
Review Questions
- Which parts of the original T3 stack are still used as fallbacks, and which parts were replaced by Convex?
- What rendering requirement would push you toward Next.js instead of Vite in this stack philosophy?
- How does the stack keep payment-related data from becoming application data, and what mechanism keeps it synchronized?
Key Points
- 1
Convex has replaced most of the SQL + tRPC + React Query data/API flow, with tRPC retained mainly for gaps outside Convex’s capabilities.
- 2
Framework selection is driven by static/SEO needs: Next.js for static pages and mixed static+dynamic apps; Vite for simpler apps without heavy SEO requirements.
- 3
Auth defaults to Clerk for fast implementation, while Work OS targets enterprise SSO/admin portal requirements; Better Auth is promising but shifts integration work onto the developer due to lack of a hosted platform.
- 4
Vercel is favored over Cloudflare for full-stack DX (preview environments, fluid compute) despite Cloudflare’s potential cost advantages for long-running, low-compute requests.
- 5
Payments stay anchored on Stripe, but subscription/payment state is stored in KV and synced via webhooks to avoid mixing payment concerns into the main application DB.
- 6
Bot protection is applied to expensive endpoints (like message generation) and treated separately from DDoS protection; Bot ID and Arcjet are positioned as practical solutions.
- 7
The stack’s guiding principle is modularity and “code as the source of truth,” minimizing dashboard-driven configuration that can drift from the repo.