Kylndocs

Why Kyln?

Kyln makes five bets, and every one of them is shipped and documented. Here's each one in practice, and why it matters.

No virtual DOM

Kyln's templates read signals, and a signal knows exactly which DOM nodes read it. When a value changes, those nodes update in place: no diffing, no re-render passes, no component tree to reconcile.

const count = signal(0);
html`<button @click=${() => count.set(count() + 1)}>${count()}</button>`;

Clicking updates that button's text node and nothing else. The work your app does is proportional to what actually changed, and there are no dependency arrays or memo hints to maintain along the way.

One project, whole app

Pages, API endpoints, services with dependency injection, and scheduled jobs live in one codebase, run on one runtime, and ship as one deploy. A page and the endpoint it calls are files in the same src/, injecting the same services; there's no second repository to keep in sync and no glue layer between "frontend" and "backend". Fewer moving parts means less to configure, less to version together, and less to break.

Ships as one folder

kyln bake compiles your app into a self-contained dist/ that runs with Bun and nothing else. No node_modules on the server, no install step at deploy time: copy the folder, run it. A production container is essentially Bun plus your dist/, which keeps images small and deploys boring.

Zero toolchain config

Kyln is Bun-native from the start: the dev server runs your TypeScript directly, so there is no bundler config to maintain and no transpile pipeline to keep in sync with your source. The one config file in a project, kyln.config.ts, configures the framework (ports, routing, builds), not the toolchain.

Batteries included

Scaffolds, guards, testing helpers, and a debugging story ship with the framework, designed to compose with each other rather than bolted on. One preheat command gives you a working app, and the same conventions carry through testing it, debugging it, and shipping it.

Next

The fastest way to judge any of this is to run it. Your first app takes you from install to a live-reloading project in under a minute.