Modyra · form engine for TypeScript

Every form library makes
you choose.
We measured the choice away.

Typed forms, arrays, async validation, drafts, undo/redo, injection prevention, one schema for client and server — in the smallest realistic bundle of any library we measured, across seven frameworks.

$ npm install @modyra/core @modyra/react
#1
realistic bundle size
7
framework adapters
0
runtime dependencies
01 — MODYRA

The bundle that matters

What a real form actually costs you

Not the whole-package worst case — the exports a typed form with array fields and validation actually imports, minified and gzipped, measured with both esbuild and rollup.

Modyra
10.6 KB
final-form stack
11.0 KB
react-hook-form
12.5 KB
vee-validate
12.7 KB
Formik
13.7 KB
TanStack Form
17.3 KB

esbuild gzip, measured 2026-07-21 against the published packages —the full methodology has the rollup numbers, exact versions and per-package breakdown. And Modyra's 10.6 KB already includes drafts, undo/redo and injection prevention — none of the others on this chart ship any of the three.

02 — BUNDLE

One engine, unique by default

The features you'd otherwise reach for a second library to get

✓ built in
Draft autosave
Debounced localStorage persistence, restored on load, cleared on a clean submit. Exclude sensitive fields by name.
✓ built in
Undo / redo
Real history, debounced so a burst of keystrokes is one step.form.mutate() coalesces programmatic bursts too.
✓ built in
Injection prevention
Sanitization at the engine's write choke point, length caps, structural checks on drafts and server payloads — on by default.
✓ built in
serverValidate()
One schema for the client and a forged-payload-proof server check — same error shape either side.
✓ built in
Typed field arrays
Repeatable rows with a compile error on a typo'd row path — not a stringly-keyed escape hatch.
✓ built in
Cancellable async validation
Debounce, timeout and AbortSignal wired through by default — last-wins, no stale server replies land on a field.
03 — FEATURES

The scoreboard

Six features. Nobody else ships any of them built in.

Draft autosave, undo/redo, wizard gating, injection prevention, dynamic/AI-declared forms, bundled UI — same six rows as the feature matrix above, counted per library. Not "fewer" — zero.

Modyra
6 / 6
TanStack Form
0 / 6*
vee-validate
0 / 6
react-hook-form
0 / 6
Formik
0 / 6
final-form
0 / 6
Angular Reactive Forms
0 / 6

* TanStack Form lists persistence APIs on its v1 roadmap, unshipped at time of writing — counted as not built-in. Full row-by-row matrix: the comparison doc.

04 — SCOREBOARD

Bring your framework

One engine. Seven native bindings.

Angular gets real signals. Solid gets real signals. Vue gets real reactivity. Everyone else gets vanillaReactivity()and a proper external-store bridge — never a second, competing reactive graph bolted onto the framework's own.

AngularReactVueLitSolidPreactSvelte
05 — FRAMEWORKS

Where we lose

The honest line, because we said we would draw it

We spent this cycle hardening the reactivity contract every adapter is tested against instead of defending a leaderboard number — and we're not hiding what that cost.

Whole-entry bundle regressed

Importing the entire package (not what a real consumer's bundler keeps) grew from 10.7 KB to 14.1 KB gzip after this cycle's reactivity work — real ownership scopes, typed errors and a hardened effect scheduler, not dead code. It cost us the #2 spot on that specific measurement.

The realistic surface — what you actually ship — only moved 9.4 → 10.6 KB, and still beats every library we measured. Two of the four bugs this hardening pass caught were already live in shipped code: a cross-runtime observation bug in the React/Preact stores, and a scheduler bug that could silently starve sibling effects. We'd rather publish that trade than a quieter number.

06 — HONESTY

Try it in one tab

No install. Real published packages.

Every framework starter below runs on @modyra/*@0.4.0 straight from npm — not a mocked demo.

07 — TRY IT