Skip to content

Why another framework?

The TypeScript backend landscape is crowded — and still leaves real gaps:

GapEvidence
Type inference collapses at scaleHono issues #2399, #3869; chained route builders force one giant expression per app
No architecture in lightweight frameworksHono issue #4121
Extractors don't exist in TSOnly Rust's Axum gets handler input right
OpenAPI is a bolt-onEvery TS framework translates its own schema DSL to JSON Schema at runtime or via codegen
AI-native toolchainOne framework ships an MCP server; the window is closing

tzin's answer

Declare a contract once, get everything else for free.

  • Handler input is extracted, not guessed: { params } exists because you declared it; add query, body, headers or cookies to the contract and they appear, fully typed and validated per request.
  • The compiler enforces your responses: returning a shape that doesn't match the declared 200 body is a type error. Thrown HttpErrors map to their status.
  • OpenAPI 3.1 is free: contracts are JSON Schema (TypeBox), so generateOpenApi(routes) needs no translation layer.
  • Realtime and AI are primitives, not plugins.

tzin — from Nahuatl -tzin, an honorific suffix for what is valued and beloved. A pact between client and server, declared once.

Released under the MIT License.