Introduction
A schema-driven React form library. Hand it an array of question objects and it owns rendering, validation, conditional logic, multi-step wizards, and submission.
Easy Forms is a schema-driven React form library. You describe a form as data — an array of question objects — and the library owns the entire workflow: rendering, validation, conditional logic, dirty/touched tracking, multi-step wizard navigation, and submission.
It is a higher-level alternative to libraries like React Hook Form. There is no
useForm, register, or Controller to wire up. The schema is the source of truth.
The one-sentence mental model
You write a typed FormSchema. <Form> reads it, builds the state store, renders the
right control for each question, runs validation, evaluates dependencies, and hands you
the validated values on submit.
A first taste
The form below is live — it is the genuine @easy-forms/core engine rendering the
schema beside it, with the @easy-forms renderer registry.
Why teams choose Easy Forms
Less code, fewer bugs
No imperative wiring. The schema declares intent; the engine handles the mechanics.
Conditional logic built in
Show/hide fields, change options, derive values, and reset — all declaratively.
Accessible by default
The shadcn renderers are built on Radix primitives with proper labels and focus management.
Fast at scale
A topic-based store re-renders only the field you changed — not the whole form.
How it fits together
There's one published package plus the UI registry:
| Piece | Role |
|---|---|
@easy-forms/core (npm) | The headless engine: types, the form store, hooks, components, the dependency engine, the wizard, and plugins. Zero UI dependencies. |
@easy-forms shadcn registry | The default renderers + the pre-wired <EasyForm> wrapper + form chrome — added with shadcn add @easy-forms/* and copied into your repo, fully editable. |
Use the renderers as-is, edit them in place, or point a control at your own to match any design system — see Theming.