Maintaining separate REST types and frontend client types can be a lot of overhead in TypeScript-heavy teams. With tRPC, the API types flow directly to the client, which reduces duplication and keeps refactors safe. Runtime validation still matters, so I define input schemas (often with Zod) and enforce auth at the procedure boundary. I also keep routers small and group them by domain. The main gotcha is that tRPC is best for first-party clients; if you’re building a public API, OpenAPI/REST can still be the better fit. For internal apps where frontend and backend evolve together, tRPC can be a big productivity boost without sacrificing correctness.