tekir
/teˈkiɾ/ (tabby cat in Turkish)
tekir is a full-stack TypeScript framework for Bun. 46 packages, 6,000+ tests, one ecosystem. Built by one developer who got tired of gluing libraries together.
The story
I started building tekir because I wanted to write TypeScript apps on Bun the same way I used to write PHP apps with Laravel. Everything in one place, everything typed, everything just working. The Bun ecosystem had routers and ORMs, but nothing that tied them together. Every project started with the same ritual: pick 20 libraries, wire them up, hope the types match, pray the versions don't conflict.
So I built one framework that handles all of it. Auth, ORM, validation, mail, queues, caching, cron, testing, file storage, i18n, logging, all designed as one unit. Same DI container, same config system, same conventions. You don't install 46 packages from 46 authors. You install one framework.
tekir uses Bun.serve directly, with an AOT route compiler adapted from Elysia. No abstraction layers, no compatibility shims. That's why it benchmarks within 1% of raw Bun, so you're not paying a tax for having a framework. It also runs on Node.js 22+ through @tekir/runtime, so you're not locked into one runtime.
What tekir is
- A framework, not a collection of libraries
- Built for Bun from scratch, not ported
- Opinionated where it saves you time
- Fully typed, no any leaks anywhere
- One upgrade, everything moves together
What tekir is not
- Not a wrapper around Express or Hono
- Not a minimal router with plugins
- Not trying to support every edge case
- Not venture-backed or growth-hacked
- Not afraid to have opinions
The name
tekir means tabby cat in Turkish. Cats don't waste energy. They see the target, they dive, they deliver. That's the idea: a framework that doesn't make you do unnecessary work.
Built by

Credits
tekir stands on the shoulders of Elysia by saltyAom. Several core ideas in @tekir/core are adapted from Elysia's source under the MIT license: the AOT route compiler that generates per-handler JavaScript, the charCodeAt(12) content-type dispatch, the bit-flag query parser, the arrow-handler source separator, and the beforeHandle / afterHandle lifecycle hook semantics. Inline file headers and NOTICE.md in the package call this out so the credit travels with the code.
The conventions outside the request hot path (provider lifecycle, controllers, validators, service container, migrations CLI) are shaped by Laravel, AdonisJS, and Rails. Thanks to all of them for the prior art.