Skip to content

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 ​

AreaWhat you getGuide
DefinitionsPlain 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 VueFormRenderer with built-in fields, HeadlessFormRenderer and useFormEngineChoose a renderer
Multi-stepSteps, Back and Next, skip, welcome screen, lifecycle hooksMulti-Step Forms
Conditions and routesshow and showAny on fields, sections and steps, routes between branchesConditional Fields, Route between branches
GroupsRepeatable items with item count rules and per-item conditionsRepeatable Groups
MatrixA section drawn as a grid of radio or multiselect rowsMatrix
Scalesscale, NPS and ratingScale, Rating
Answer recall{{key}} tokens that show an earlier answer in later textsAnswer recall
i18nMessage and label catalogs, translation keys, overlaysTranslations
AccessibilityNative inputs, labels and hints tied by aria-describedby, aria-invalid, autocomplete tokens, error summary with focusAutofill, Error summary
Server validationvalidateSubmission() runs the same rules and type checks on the server as the browserServer-side Validation
Eventsform_viewed, step_completed, field_error, form_submitted and other lifecycle eventsForm events
Hidden fieldsValues from the URL, referrer, page, language, time zone, device or hostValue sources
FilesA File in the browser, a reference such as an upload id on the serverFile, Cloud files
CloudOptional hosted endpoint, hosted form page and file uploadsGet an Endpoint

Not covered ​

GapWorkaround
Calculated values or scoring inside the definitionAdd 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 groupsA 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 groupsA 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 fieldsThere 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 mapsWrite a custom field type and pass its component through components. See also custom components.
Offline drafts with syncSave 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 designReplace 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.