Open Source UI Framework

Signals that bind
directly to the DOM

No virtual DOM. No diffing. Every update is O(1).
A signal changes, and exactly one text node updates. Nothing else runs.

$ npm create cellui@latest
import { signal, computed, view, mount } from '@cmj/cellui'

const App = () => {
  const count = signal(0)
  const doubled = computed(() => count.value * 2)

  return view`
    <h1>${count} × 2 = ${doubled}</h1>
    <button onclick="${() => count.value++}">+</button>
  `
}

mount('#app', () => App())
Live — try it
~5KB
gzipped
O(1)
updates
0
dependencies
101
tests

How it works

Most frameworks diff a virtual tree to find changes. CellUI skips the middleman.

1

Create a signal

A signal wraps a value and maintains a subscriber list via WeakRef.

const count = signal(0)
2

Bind to DOM

The view engine maps each interpolation to an exact text node or attribute.

view`<h1>${count}</h1>`
3

Update

When the signal changes, only that one DOM node updates. No tree walk. No diff.

count.value++ // one node

Everything you need

Computed Signals

Derived state with automatic dependency tracking. No useMemo, no dependency arrays.

Built-in Router

URL-synced routing with pattern matching, params, and browser history.

Portals

Render modals and tooltips outside the parent DOM tree with automatic cleanup.

SSR + Hydration

Server-render HTML with serverView(), hydrate on the client. This site does it.

Transitions

CSS enter/leave animations with automatic teardown timing.

Testing Utils

Built-in render() with getByText and getBySelector. No extra library needed.

WeakRef Cleanup

When a DOM node is garbage collected, its signal subscription dies automatically.

Error Boundaries

Shield catches render errors with fallback UI. Nine standardized error codes.

Performance

CellUI vs hand-written vanilla JS. Lower is better.

Signal updates 10K subscribers × 100 0.5× — 2× faster
Effect tracking 100 signals 0.7× — 1.4× faster
Fine-grained vs VDOM diff 1K nodes × 10K 0.02× — 49× faster
Text node binding 10K nodes 1.3× overhead
List reconciliation 1K shuffle 2.4× overhead

Start building

ISC licensed. 5KB. Zero dependencies.