Skip to content

Build apps the browser already knows how to run.

Kitsune is a web-native application kit. Components describe meaning. Modules carry capability. The browser does the rest.

Kitsune is not a framework competing with React. It’s an architecture for the apps you ship after you stop fighting the browser. Custom elements. Native dialogs. Form-associated inputs. CSS layers. The platform finally has the parts; Kitsune is the glue you actually want to write.

A button does not import analytics. A form does not call Sentry. A page does not check feature flags. Components describe what happened. Boundaries describe where it happened. Modules — installable units of capability — decide what that means.

<kit-shell name="quill">
<kit-boundary surface="note-editor" entity-type="note" entity-id="42">
<kit-button meta-event="note.saved" meta-command="notification.show"
meta-prop-message="Saved">
Save
</kit-button>
</kit-boundary>
</kit-shell>

That button doesn’t know what analytics, audit, or storage exists. Add a module later, the button stays the same. Swap PostHog for Amplitude, the button stays the same. Drop it into a React app, the button stays the same. That’s the deal.

The Problem

Modern frontends rot from the inside out — analytics in buttons, observability in forms, vendors everywhere. Why it happens.

The Architecture

Shell, runtime, boundaries, modules, events, commands. Read the loop.

Build Quill

A real notes app. No React, no virtual DOM. Eleven chapters. Start chapter one.

React, comfortably

Already running React? Adopt Kitsune at the boundary, not all-or-nothing. How the adapter works.

Reference

Every element, every module, every diagnostic. Open the index.

You’ve seen “the browser is enough” arguments before. They usually mean avoid JavaScript — server-rendered HTML and a sprinkle of hx-*. Kitsune is the opposite case. The browser is enough for serious applications — design tools, dashboards, editors — if you stop replacing its primitives with your own.

Kitsune doesn’t ship a virtual DOM, a router, or a state container. You’ll find a <dialog> where most kits ship a div. You’ll find a real <button> inside <kit-button>. Forms validate themselves. CSS cascades the way it was designed to. The architecture sits a thin layer above all of that and gives you what the platform doesn’t: a way to say what an interaction means without coupling the UI to the systems that care.

The bet is simple: the web platform is the longest-lived runtime in our industry. Build for it directly and you’ll still be running in 2035 without a rewrite.

Feel it for yourself →