The Problem
Modern frontends rot from the inside out — analytics in buttons, observability in forms, vendors everywhere. Why it happens.
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 Web Caught Up
The platform you remember from 2014 is gone. What you can do natively now.
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.