PUBLIC BETA0.1.0-beta.2 Published @zidomjs packages Release notes ↗
AN INDEPENDENT UI ENGINE / 001

Only what
changes.

When state changes, Zidom knows which DOM bindings depend on it. Those bindings update. Everything else stays where it is.

Looking for a starter?Start with create-zidom →
TypeScript first · MIT licensed · experimental beta
zidom / signal inspector● RUNNING LOCALLY

One change. Precise updates.

TRACE 001
const count = signal(1);
01 / SOURCE1count.value
02 / SUBSCRIBED BINDING
text node1
COMPUTED / COUNT²1
NOT SUBSCRIBEDunchanged

Change the signal above. Bound text changes; unrelated content stays put.

THE PRINCIPLE

The right node. The right time.
Nothing more to update.

How it works ↗
THE WORKBENCH / 01

Change something.
Watch the result.

These are not video demos or animated mockups. Each preview runs a real Zidom component and exposes its source.

All 13 examples ↗
Running in your browser
Live preview / Signals

Loading interactive demo…

Edit a number and watch just its bindings change.

View detailed example ↗
zidom / playgroundSOURCE
counter.tsx
src›demos›counter.tsx
counter.tsx
●  Zidom
import { signal, computed } from '@zidomjs/core';export default function CounterDemo() {  const count = signal(0);  const doubled = computed(() => count.value * 2);  return (    <div className="example-card">      <p>Click to update a single bound text node.</p>      <div className="demo-number">{count}</div>      <p>        Computed double: <strong>{doubled}</strong>      </p>      <div className="demo-actions">        <button onClick={() => count.value--}>−</button>        <button onClick={() => (count.value = 0)}>Reset</button>        <button onClick={() => count.value++}>+</button>      </div>    </div>  );}
● zidom / counterTSX · UTF-8 · Read-only
Published Zidom beta · Source mirrors the running examplesOpen full playground ↗
THE ENGINE / 02

Less repeated work.
More intention.

A reactive binding updates when its dependency changes. Zidom does not need to rerun a whole component setup for every value update. That is the architectural design; measured release sizes are shown separately.

Explore benchmarks and methodology ↗
0.1.0-BETA.2 · 31 OCT 2026 · MEASURED PUBLIC API
Core + DOM4,360 Bgzip · public APIs
Release matrix10/10maintainer checks

Minified ES2022 public-API measurement, not complete application downloads or a competitor ranking. Measurement scope ↗

01 / BINDINGS

Subscribe precisely

Signals notify the bindings that read them, not a whole virtual UI description.

02 / STRUCTURE

Keep what exists

Keyed lists can preserve DOM identity, focus and existing row nodes when reordered.

03 / MEASUREMENT

Test the actual work

Browser DOM correctness is checked in a 1,000-row harness; fair rankings require more application-level evidence.

THE PARTS / 03

Small ideas.
Powerful together.

Start with a minimal rendering core. Add routing, data, forms and shared state as your application needs them.

COMPONENTS / 04

Start from working code.

Buttons, inputs, forms and navigation with live previews and copyable TSX/CSS. No mysterious library of screenshots.

Open the component workshop ↗
FIRST LINES / 05

Write the state.
Bind the result.

Pass a signal straight into JSX. When its value changes, the bound DOM text updates without rerunning component setup.

Read the getting-started guide ↗
This source uses the published @zidomjs beta packages. Experimental APIs may change.
Counter.tsx
●  Zidom
import { signal } from '@zidomjs/core';import { mount } from '@zidomjs/dom';function Counter() {  const count = signal(0);  return <button onClick={() => count.value++}>    Count: {count}  </button>;}mount(() => <Counter />, document.querySelector('#app')!);
A PATH FOR DEVELOPERS / 06

Begin at the source.

Read the model, explore a working demo, then ship a component that is yours to keep.

THE NAME / 07

A personal name.
A deliberate idea.

Zi comes from Zidane. DOM is the Document Object Model. Zidom joins a personal dedication to a belief in more precise interfaces.

The story behind Zidom ↗