You describe your routes once with a lightweight helper, then get a fully typed fetch wrapper. Params, query, body, and output are all inferred. Wrong shapes are compile errors. Zero dependencies, zero runtime magic.
``` // before const user = await fetch(`/users/${id}`).then(r => r.json()) // any
// after const user = await api.getUser({ params: { id } }) // User ```
Works with any framework (Express, Hono, Next.js, etc). Optional Zod integration if you want runtime validation from the same source of truth.