Struggled with React Hook Form, Formik, or TanStack Form? Youβre not alone. Itβs time to use something better. Forms shouldnβt be this hard!
Thatβs why we built Formengine Core β a JSON-first React Form Renderer and open-source form engine for React. Describe your form in JSON and render it across your apps. No hooks. No context. No boilerplate. No pain.
{
  "version": "1",
  "errorType": "RsErrorMessage",
  "form": {
    "key": "Screen",
    "type": "Screen",
    "props": {},
    "children": [
      {
        "key": "name",
        "type": "RsInput",
        "props": {
          "label": {
            "value": "Name"
          }
        }
      },
      {
        "key": "email",
        "type": "RsInput",
        "props": {
          "label": {
            "value": "Email"
          }
        },
        "schema": {
          "validations": [
            {
              "key": "email"
            }
          ]
        }
      },
      {
        "key": "submit",
        "type": "RsButton",
        "props": {
          "appearance": {
            "value": "primary"
          },
          "children": {
            "value": "Submit"
          }
        },
        "events": {
          "onClick": [
            {
              "name": "validate",
              "type": "common",
              "args": {
                "failOnError": true
              }
            },
            {
              "name": "onSubmit",
              "type": "custom"
            }
          ]
        }
      }
    ]
  },
  "localization": {},
  "languages": [
    {
      "code": "en",
      "dialect": "US",
      "name": "English",
      "description": "American English",
      "bidi": "ltr"
    }
  ],
  "defaultLanguage": "en-US"
}Click to see how you can define your entire form in JSON and render it with Formengine Core.
import {viewWithCss} from '@react-form-builder/components-rsuite'
import {FormViewer} from '@react-form-builder/core'
const simpleForm = {
  version: '1',
  errorType: 'RsErrorMessage',
  form: {
    key: 'Screen',
    type: 'Screen',
    props: {},
    children: [
      {
        key: 'name',
        type: 'RsInput',
        props: {
          label: {
            value: 'Name'
          }
        }
      },
      {
        key: 'email',
        type: 'RsInput',
        props: {
          label: {
            value: 'Email'
          }
        },
        schema: {
          validations: [
            {
              key: 'email'
            }
          ]
        }
      },
      {
        key: 'submit',
        type: 'RsButton',
        props: {
          appearance: {
            value: 'primary'
          },
          children: {
            value: 'Submit'
          }
        },
        events: {
          onClick: [
            {
              name: 'validate',
              type: 'common',
              args: {
                failOnError: true
              }
            },
            {
              name: 'onSubmit',
              type: 'custom'
            }
          ],
        }
      }
    ]
  },
  localization: {},
  languages: [
    {
      code: 'en',
      dialect: 'US',
      name: 'English',
      description: 'American English',
      bidi: 'ltr'
    }
  ],
  defaultLanguage: 'en-US'
}
export const App = () => (
  <FormViewer
    view={viewWithCss}
    getForm={() => JSON.stringify(simpleForm)}
    actions={{
      onSubmit: (e) => {
        alert('Form data: ' + JSON.stringify(e.data))
      },
    }}
  />
)Itβs time to use something better. Install the core package and RSuite free form components:
npm install @react-form-builder/core @react-form-builder/components-rsuite  - Open Source & Free Forever β No vendor lock-in, no nonsense.
 - Less Code, Fewer Bugs β Logic and UI stay separate.
 - JSON-First Architecture β Define, render, and validate without touching React internals.
 - UI-Agnostic Components β Works seamlessly with any UI library (MUI, Ant Design, shadcn/ui, and others).
 - Framework-Agnostic β Can also be used without any framework via CDN.
 - Multi-Database Support β Compatible with MySQL, PostgreSQL, MongoDB, SQLite, and more.
 - Built-in Validation with Zod β Pre-configured validation powered by Zod.
 - Extensible Validation Support β Works with Yup, AJV, Zod, Superstruct, Joi, and other libraries.
 - Responsive Layouts β Build forms that automatically adapt to all screen sizes.
 - Custom Actions β Enhance forms with interactive logic through custom JavaScript.
 - Dynamic Properties β Enable real-time component updates with MobX-powered reactivity.
 - Pre-Built RSuite Integration β Includes a ready-to-use component library: 
@react-form-builder/components-rsuite. - Flexible Storage Options
- Store complete form definitions as JSON.
 - Programmatically generate forms via code.
 
 
- Community: Formengine Core source code and examples for FormEngine Community (MIT license).
 - Premium: Examples for Premium On-Premise Drag-and-Drop React Form Builder (Commercial license). Premium On-Premise Drag-and-Drop React Form Builder
 - Source Code
 
- Built-in Validation with Zod β Pre-configured validation powered by Zod
 - Extensible Validation Support β Works with Yup, AJV, Zod, Superstruct, Joi, and other libraries
 
npm install @react-form-builder/components-rsuite  Component description consists of defining meta-information about the component - component name, component type, component properties. Meta-information on component properties in Formengine is called an annotation.
Well, let's describe some existing component from the popular MUI library. As an example, let's take a Button:
import {Button} from '@mui/material'
import {define, disabled, event, oneOf, string} from '@react-form-builder/core'
// Let's call our component matButton, using the prefix 'mat' to make it easy to understand
// from the name that the component belongs to the MUI library.
//
// Here we call the define function and pass it two parameters - the Button component
// and the unique name of the component type.
export const matButton = define(Button, 'MatButton')
 // component name displayed in the component panel in the designer
 .name('Button')
 // define the component properties that we want to edit in the designer
 .props({
   // button text
   children: string.named('Caption').default('Button'),
   // button color
   color: oneOf('inherit', 'primary', 'secondary', 'success', 'error', 'info', 'warning'),
   // button disable flag
   disabled: disabled,
   // callback fired when the button is clicked.
   onClick: event,
 })- Community Forum β Best for: help with building, discussion about React form best practices.
 - GitHub Issues β Best for: bugs and errors you encounter using Formengine.
 - Email Support β Best for: issues with Formengine libraries or environment.
 
A premium on-premise React Form Builder with drag-and-drop, built for SaaS and enterprise teams β backed by Optimajet Premium Support
A powerful commercial drag-and-drop form builder for React, built on top of the free, MIT-licensed FormEngine Core. Advanced form logic, UI controls, export, and integrations.
 npm install @react-form-builder/designerItβs time to use something better. Install the core package and RSuite free form components:
npm install @react-form-builder/core @react-form-builder/components-rsuite  


