Keelv0.86.0
A house framework for Node.js

Every app
needs a keel.

A real service container, service providers, expressive routing, JSX views, and a code-generating console — on a modern TypeScript stack that runs on Node and the edge.

$ npm install @shaferllc/keel
FIG. 01SCALE 1:1BEAMWLDRAFTCONTAINERKEEL · v0.86.0
Hull cross-section · container-first architecture
Specification

Six parts. One vessel.

Productive ergonomics on a modern TypeScript stack — small enough to read in an afternoon.

01

Service containerPart · Backbone

bind · singleton · instance · make. Every service resolves through one registry — the structure that keeps apps testable.

02

Service providersPart · Frames

A register() → boot() lifecycle wires your app together in one place, in predictable order.

03

Expressive routingPart · Helm

Closures or [Controller, method] tuples resolved from the container, with full dependency injection.

04

JSX viewsPart · Deck

Type-safe Hono JSX with layouts. view(Page, props) renders in one call — the same code on Node and the edge.

05

The consolePart · Rigging

keel serve, keel routes, and make:controller / provider / middleware generators, living in your app.

06

Runs on the edgePart · Hull

No hard Node dependency, so a Keel app deploys to Cloudflare Workers. This page is one.

Request lifecycle

Socket to response, one clean pass.

  • 01 ROUTE — Hono matches the path
  • 02 CONTAINER — app bound to context
  • 03 MIDDLEWARE — global stack runs
  • 04 CONTROLLER — resolved with DI
  • 05 VIEW — component → HTML
  • 06 RESPONSE — sent to the client
REQUEST01 · ROUTEHono matches the path02 · CONTAINERapp bound to context03 · MIDDLEWAREglobal stack runs04 · CONTROLLERresolved with DI05 · VIEWcomponent → HTML06 · RESPONSEsent to the client
Reads clean

Routes, controllers, and DI — as you'd hope.

No magic you can't read. The whole framework is a few hundred lines.

app/Controllers/HomeController.tsTS
// routes/web.ts
router.get("/", [HomeController, "index"]);

// resolved from the container — full dependency injection
export class HomeController {
  index(c: Ctx) {
    return c.json({ app: config("app.name") });
  }

  welcome(c: Ctx) {
    return view(WelcomePage, { name: config("app.name") });
  }
}
Built for AI

An agent at the helm, charts included.

Keel is built to be written with an AI agent — the machine-facing surface is generated from the same source as these docs, so it never drifts.

MCP serverDocs · API · Generators

Exposes the guides, the full public API surface (380+ exports), the make:* generators, and Keel's conventions to any MCP client.

llms.txtMachine-readable docs

Every guide, indexed at /llms.txt and inlined at /llms-full.txt — served from this domain, always current.

Agent playbookAGENTS.md + guide

Conventions an agent can follow without hallucinating. Start at Building Keel apps with AI.

bash — connect the MCP server
# one line, in your app directory
$ curl -fsSL https://keeljs.com/install.sh | bash

# or with Cursor + Claude Code config too
$ curl -fsSL https://keeljs.com/install.sh | bash -s -- --all

⚓ wrote .mcp.json — your agent now knows Keel
$ curl -fsSL https://keeljs.com/install.sh | bash
Bill of materials

A framework, a starter, and this page.

Distributed like any real framework — a library you install, plus an app that builds on it.

P/N·1@shaferllc/keelThe framework library — container, routing, views, helpers.GitHub ↗
P/N·2keel-appClone-and-go starter. Depends on the library — npm update pulls core.Clone ↗
P/N·3keel-siteThis page — a Keel app running on Cloudflare Workers.Source ↗
Up in seconds

Clone the starter and go.

A working app with routing, views, config, and a console — ready to build on.

bash — my-app
# start from the official starter
$ git clone https://github.com/shaferllc/keel-app my-app
$ cd my-app && npm install
$ npm run dev

⚓ my-app listening on http://localhost:3000