Full-Stack TypeScript in 2025: What's Actually Worth Your Time
Every year I try to take stock of which new tools I actually kept after the initial excitement faded. Here's the 2025 version.
What Stuck
TanStack Router + TanStack Start — Type-safe routing with file-based conventions and a first-class server-functions story. After years of stitching together Next.js plus tRPC plus various loaders, having everything in one cohesive model is genuinely relaxing. Search params being type-safe is worth the price of admission alone.
Zod everywhere — Not new, but I've finally committed to it as the single source of truth for data shapes. Define once, validate at the boundary, infer the TypeScript type. The z.infer<> pattern eliminated an entire class of schema-drift bugs in the projects I touched this year.
Content Collections — For content-heavy sites (like this one), having frontmatter validated against a Zod schema at build time catches mistakes before they reach production. No more mysterious undefined title bugs on blog posts with a typo in the YAML.
What Didn't Stick
AI-generated component libraries — I spent too many hours trying to get AI tools to produce consistent, maintainable UI code. The output looks impressive in isolation but accumulates inconsistencies that make a codebase harder to own over time. Back to writing components by hand with a small, well-understood primitive library.
Micro-frontend experiments — The team I was on tried module federation for two months. Solved one deployment problem, created five tooling problems. Probably the right tool for a different scale; wrong for us.
The Boring Stuff Still Matters Most
Linting, CI, automated deploys, feature flags, good error messages. None of this is exciting, but it's what actually separates codebases that are pleasant to work in from ones that aren't. Shiny frameworks won't fix a broken feedback loop.
Back to building. More pizza posts coming soon.