What Formhaus covers
What the definition format, the engine and the renderers do, what they leave to your app, and where another library fits better.
Covered
| Area | What you get | Guide |
|---|---|---|
| Definitions | Plain JSON with a JSON Schema. Agents generate and check it, apps store it in a database, and native renderers read the same file under the specification. | Specification, MCP server |
| React and Vue | FormRenderer with built-in fields, HeadlessFormRenderer and useFormEngine | Choose a renderer |
| Multi-step | Steps, Back and Next, skip, welcome screen, lifecycle hooks | Multi-Step Forms |
| Conditions and routes | show and showAny on fields, sections and steps, routes between branches | Conditional Fields, Route between branches |
| Groups | Repeatable items with item count rules and per-item conditions | Repeatable Groups |
| Matrix | A section drawn as a grid of radio or multiselect rows | Matrix |
| Scales | scale, NPS and rating | Scale, Rating |
| Answer recall | {{key}} tokens that show an earlier answer in later texts | Answer recall |
| i18n | Message and label catalogs, translation keys, overlays | Translations |
| Accessibility | Native inputs, labels and hints tied by aria-describedby, aria-invalid, autocomplete tokens, error summary with focus | Autofill, Error summary |
| Server validation | validateSubmission() runs the same rules and type checks on the server as the browser | Server-side Validation |
| Events | form_viewed, step_completed, field_error, form_submitted and other lifecycle events | Form events |
| Hidden fields | Values from the URL, referrer, page, language, time zone, device or host | Value sources |
| Files | A File in the browser, a reference such as an upload id on the server | File, Cloud files |
| Cloud | Optional hosted endpoint, hosted form page and file uploads | Get an Endpoint |
Not covered
| Gap | Workaround |
|---|---|
| Calculated values or scoring inside the definition | Add a hidden field and set it from app code with setValue. Compute it again on the server: validateSubmission() checks only its type and rules. See Derived values. |
| Nested groups | A group cannot contain a group or a section (invalid-nesting). Use two top-level groups, or a custom field type inside the item that holds the inner list. |
| Files inside groups | A group cannot contain a file or hidden field (invalid-nesting). Put the file field outside the group, or use a custom field type in the item that uploads the file and stores its reference as text. |
| Payment card fields | There is no card field type. Use the payment provider's own elements next to the form. Formhaus Cloud refuses hosted forms with cc-* autocomplete tokens. |
| Signatures, rich text, address autocomplete with maps | Write a custom field type and pass its component through components. See also custom components. |
| Offline drafts with sync | Save onValuesChange values in your own storage, pass them back as initialValues, and queue the submit in app code. FormhausForm keeps a draft in sessionStorage of the tab, with no sync. |
| Pixel-unique design | Replace field components through components, or use HeadlessFormRenderer or FormEngine with your own markup. |
When another library fits better
- One hand-written form with custom UI and no JSON definition: a form-state library such as React Hook Form is smaller. See vs react-hook-form.
- Large survey programs that need expressions, calculated values, result dashboards or a drag-and-drop editor for non-developers: a survey platform covers them. See vs SurveyJS.