Pure code, zero magic

Modern framework
built on old ideas.

Built for fast, simple server-driven apps.
No runtime dependencies.

deno create jsr:@cookingpot/dashi
01

JSX to plain old HTML

JSX is precompiled and transformed into plain HTML strings, no hydration, no abstraction. Just hypertext.

component.tsx

export function Hello() {
  return (
    <div className="greeting">
      <h1>Hello, World</h1>
    </div>
  );
}

output.html

<div class="greeting">
  <h1>Hello, World</h1>
</div>
02

Pages are just handlers

A page is a GET handler that returns Response, same as JSON, one helper seals HTML.

page.tsx

export function getPage({ html }): Response {
  return html(
    <main>
      <PageContent />
    </main>
  );
}

jsonEndpoint.ts

export function getJson(): Response {
  return Response.json({ ok: true });
}
03

Slots

Pages leave slots pointing at other routes, for separate cache or expensive work.

user_page.tsx

export async function UserProfile({ ctx, html }) {
  const user = await service.getUser(ctx);
  return html(
    <User userData={user} />
  );
}

home.tsx

<User userData={user} />
<RouteSlot src="/users/USER_ID" fetchWhen="visible" />
04

Patches

A patch is HTML aimed at an element. A form POST can return several, and the page updates in place.

postTodo.tsx

export async function addTodo({ ctx, patches }) {
  const { todo } = ctx.state;
  const count = await service.addTodo(todo);
  return patches([
    patch.append("#todos", <Todo data={todo} />),
    patch.update("#count", <Count c={count} />),
  ]);
}
1/2
05

Client

Progressive enhancement by design. Add client-side logic only where needed using TS and standard Web APIs.

page.tsx

const HeartButton = client.element("heart-button", new URL(...));
export function Page() {
...
  <HeartButton />
...
}

heart_client.ts

// Native custom elements!
customElements.define(
  "heart-button",
  class extends HTMLElement {
    constructor() {
      super();
      this.addEventListener("click", shootHearts);
    }
  },
);
Small

Small API with no runtime dependencies

Caching

Each page and slot is cached on its own

Navigation

Soft navigation with in-place document swaps

SSR

HTML first, for SEO, LCP, and link previews

Standards

Built on web standards, not a parallel stack

Layouts

Wrap paths with layouts and middleware

If you made it this far, you must be interested.