End-to-end type safety
tRPC infers the API contract straight from the Drizzle schema. Rename a column and the compiler flags every component that reads it — no codegen, no drift.
const board = useQuery(trpc.board.byId.queryOptions({ boardId }));// board.data: { columns: { tasks: { number: number; priority: "urgent" | … }[] }[] }board.data.columns[0].tasks[0].prioirty// ✖ Property 'prioirty' does not exist. Did you mean 'priority'?