An API framework for Node where the docs can't lie.
Docs · Hanko · Benchmarks · Changelog
An inkan (印鑑) is the seal a Japanese contract gets stamped with. Here every route carries one, written once: inkan checks what comes in, types your handler, trims what goes out, writes OpenAPI, serves the docs, runs your examples as tests and hands your frontend a typed client. The core has no dependencies.
import { inkan, t } from "@vxnsin/inkan";
inkan()
.get("/hello/:name", { params: t.object({ name: t.string() }) }, ({ params }) => ({ hello: params.name }))
.listen({ port: 3000 }); // docs on /docs, a live inspector on /_inkan| inkan | the framework: routes and contracts, docs, inkan check, jobs, websockets, a typed client |
| middleware | official plugins: auth, session, secure-headers, etag, idempotency, proxy, circuit-breaker, otel, and stores for Redis, Postgres, MongoDB and MySQL |
| integrations | inkan where you already are: Next.js, Vite, TanStack Query, uWebSockets.js |
| inkan.dev | the website and docs, itself an inkan app |
Everything that plugs into inkan, official or not, is listed on
Hanko. Publish a package with the npm keyword
inkan-plugin and it shows up there by itself.
npx @vxnsin/inkan learn # twelve quests in your terminal, offline
npx @vxnsin/inkan examples # six explained projects to start from
npx @vxnsin/inkan create plugin inkan-quota # a plugin package with tests, ready to publishQuestions, bugs and ideas go into issues, and pull requests are welcome. Since 0.8 the API is stable: renames keep working with a warning for at least two releases. MIT licensed.