tekir
Back to blog
ReleaseApril 14, 2026· kubilay

Introducing tekir: The full-stack TypeScript framework for Bun

We're excited to announce tekir v0.1, a full-stack TypeScript framework built from the ground up for Bun.

Why we built tekir

Building web applications in the JavaScript ecosystem has always felt like assembling furniture without instructions. You have all the pieces, but making them work together is the real challenge.

Every new Bun or Node.js project starts the same way: pick a router, pick an ORM, pick a validator, pick an auth library, pick a mailer, pick a test runner. Then spend days wiring them together, handling edge cases, and hoping the versions don't conflict.

You end up with 40 dependencies from 40 different authors, each with their own API style, error handling conventions, and breaking change schedules. Upgrading one package breaks three others. Your node_modules becomes a graveyard of peer dependency warnings.

Rails didn't win because Ruby is the best language. Laravel didn't win because PHP is elegant. They won because they made a simple promise: everything works together, out of the box. AdonisJS brought this philosophy to Node.js. But for Bun? Nothing, until now.

Standing on the shoulders of giants

tekir isn't trying to reinvent what already works. It borrows openly from the frameworks that got it right, and tries to be honest about where those ideas came from.

From Rails we took the idea that a web framework is a *full-stack opinion*, not a router with a router with a router bolted on. Directories have meaning. Generators exist. The happy path is paved so you can sprint on day one instead of spending a week wiring middleware.

From Laravel we took the developer ergonomics: expressive APIs that read like English, an IoC container that makes testing painless, first-class queues and mail and scheduling in the same codebase as the HTTP layer. Laravel proved that "batteries included" can still be elegant, and we care about that same craft.

From AdonisJS we took the decision to bring Rails/Laravel thinking into the JavaScript world with TypeScript as a first-class citizen, not an afterthought. Providers, a kernel, a structured start/ directory, typed config, ActiveRecord-style models. If you've shipped an AdonisJS app, tekir will feel familiar within minutes.

From Elysia we took the obsession with raw performance on Bun. Handlers that return plain values, a context object you destructure, a type system that infers your route params and body without extra ceremony. Elysia showed that you can stay close to Bun.serve without sacrificing developer experience, and our router is tuned in that same spirit.

What tekir adds on top is the glue: one container, one config, one release cadence, so the pieces you pick up from each of these worlds actually fit together without you maintaining the wiring.

Our design principles

1. One ecosystem, zero conflicts

All 45 tekir packages share a single DI container, a single configuration system, and a single versioning scheme. When you upgrade tekir, everything upgrades together. No peer dependency hell, ever.

2. Convention over configuration

A freshly scaffolded tekir project has a predictable structure. Controllers go in core/controllers/, models go in core/models/, routes are registered in start/routes.ts. If you've seen one tekir project, you can navigate any tekir project.

3. Type-safe from top to bottom

Every tekir API is fully typed. No any leaks, no escape hatches. Your IDE knows the shape of your route parameters, your request body, your database queries, and your config values. If it compiles, it probably works.

4. Optional complexity

You can build a tekir app in a single file with zero config. Or you can use the full structured project with decorators, providers, and middleware. The framework scales with your needs, so you're never forced into complexity you don't need yet.

5. Bun-first, but not Bun-only

tekir is built for Bun and uses Bun's native primitives (Bun.serve, bun:sqlite, bun:test). But through @tekir/runtime, every package also runs on Node.js 22+. You're not locked in.

What's included in v0.1

  • 45 first-party packages across 9 categories
  • 5,000+ tests ensuring everything works together
  • ActiveRecord ORM with SQLite, PostgreSQL, MySQL, and MongoDB
  • Guard-based authentication with JWT, sessions, and database tokens
  • Request validation with Zod, Yup, or Valibot
  • Background job queues with retry and delay
  • Email via SMTP, Sevk, Resend, Mailgun, and SES
  • Cron scheduler, event emitter, notifications
  • Vite and Next.js frontend integration
  • Optional decorators, everything works without them

Performance

tekir performs within 1% of raw Bun.serve in benchmarks. We achieve this through ahead-of-time route compilation and zero-overhead context creation. A full-stack framework doesn't have to be slow.

Most of the credit for that performance ceiling belongs to Elysia by saltyAom. Several pieces of @tekir/core are adapted from Elysia's source under the MIT license: the AOT route compiler that builds per-handler JavaScript, the charCodeAt(12) content-type dispatch in the body parser, the bit-flag query parser, the arrow-handler source separator, and the beforeHandle / afterHandle lifecycle hooks. We've kept the attribution in packages/tekir-core/NOTICE.md and as inline file headers so the credit travels with the code. Without Elysia's prior work, tekir wouldn't be sitting where it is on the benchmark chart.

The name

"tekir" (pronounced te-KEER) means "tabby cat" in Turkish. Agile, curious, and independent, just like the framework.

Get started

bash
bunx create-tekir-app my-app

Pick a template (minimal, api, fullstack, with-vite, or with-next) and you're ready to go.

Follow our roadmap and join the community to shape the future of tekir.

kubilay

kubilay

just a tech