Skip to main content

02 — React / React Native Form-Builder & Survey Libraries: Schemas, Builders, Licensing, Gaps

Research date: 2026-08-15. Scope: what to learn from (and how to differentiate against) SurveyJS, Form.io, react-jsonschema-form (RJSF), JSON Forms, Formily, uniforms, Formbricks, FormEngine, TanStack Form, react-hook-form + zod, Typeform/Tally-style UX, and the (thin) React Native form-builder landscape. All versions/prices were checked against npm registry metadata or vendor pages on 2026-08-15 unless marked "unverified".

Summary

  1. SurveyJS is the reference design for a JSON-driven survey engine: pages → elements (questions | panels), paneldynamic/matrix repeaters, a string expression language (visibleIf: "{age} >= 18"), triggers, calculatedValues, validators[], choicesByUrl, and per-string localization objects { "default": "...", "ar": "..." }. Form Library (survey-core 3.0.0, MIT) is free; Survey Creator (survey-creator-core 3.0.0, proprietary EULA) costs $569 (Basic) / $1,029 (PRO) per developer, perpetual, with $229/$409 yearly renewals for updates [1][2][3].
  2. SurveyJS has no React Native renderer — issue open since 2017 (#484) and a consolidated "native iOS/Android" request (#6713, opened 2023-08-15, still open). Community RN ports exist (react-native-survey-js-ui, GPL-3.0, v0.1.0, 1 star) but had to patch survey-core for window/document access [4][5][6].
  3. SurveyJS is heavy: survey.core.min.js 2.5.38 measures 1,426 KB minified / 303 KB gzip; survey-creator-core.min.js 1,359 KB / 331 KB gzip plus 468 KB CSS (measured from unpkg on 2026-08-15). Tree-shaking has been a decade-long complaint (#1362, #2731) [7][8].
  4. Form.io = MIT renderer/builder (@formio/js 5.5.1, @formio/react 6.2.1) + OSL-3.0 server + enterprise SaaS ($300/mo SaaS or $330/mo per self-hosted environment per third-party summary; vendor page only says "contact sales", 30-day evaluation). Its Offline Plugin (@formio/offline-plugin 5.5.1) requires a paid Library License key and uses PouchDB-over-IndexedDB with a FIFO submission queue — the closest existing analogue to Rasd's offline story. react-native-formio was archived 2023-05-11 [9][10][11][12].
  5. RJSF (@rjsf/core 6.8.0, Apache-2.0, React ≥18) is the standard for JSON Schema + uiSchema; the registry (widgets/fields/templates/formContext) is the best-designed override system in the space, but AJV nearly doubled its bundle (#869) and large oneOf/dependencies schemas are slow (#4203, #3692, #1961) [13][14][15].
  6. JSON Forms (@jsonforms/core 3.8.0, MIT) cleanly separates data schema from UI schema (Control + scope JSON pointers; VerticalLayout/HorizontalLayout/Group/Categorization), and its rule object (effect: HIDE|SHOW|ENABLE|DISABLE, condition: {scope, schema}) is a fully declarative, JSON-Schema-based condition model. Its official editor is an unmaintained proof-of-concept; no RN renderer set [16][17][18].
  7. Formily (@formily/core 2.3.7, MIT, 12.6k stars, last publish 2025-05) has the most expressive reactive linkage protocol (x-reactions with dependencies, when, fulfill/otherwise: {state|schema|run}, {{$deps[0] === '123'}} expressions) but is antd/China-centric; its builder "Designable" has been stuck at 1.0.0-beta.45 since 2022-02 [19][20].
  8. FormEngine (Optimajet) is the newest open-core competitor: @react-form-builder/core 10.1.0 (MIT) + @react-form-builder/designer (proprietary EULA), licensed per domain (1/3/unlimited) not per developer, perpetual $1,299 / $2,999 / $5,999 with 365 days of updates. Uses MobX, rsuite/MUI/shadcn/Mantine kits, Fluent.js localization; no RN, no offline [21][22][23].
  9. Formbricks is a full AGPLv3 platform (12.8k stars) with an EE folder; @formbricks/react-native 3.1.0 exists but is a hosted-survey display SDK (needs workspaceId + appUrl), and its offline support only covers link surveys in the browser (IndexedDB, 24 h staleness, no file uploads). Cloud: free 250 responses/mo, Pro $74/mo (2,000), Scale $325/mo (5,000) [24][25][26].
  10. Headless libraries (react-hook-form 7.85.0 — 13.5 KB gzip, @hookform/resolvers 5.8.0 with zod/standard-schema exports; TanStack Form 1.33.5 — 17.4 KB gzip, Standard Schema validators, asyncDebounceMs) are what RN developers actually use today; no mainstream library ships a DnD builder + JSON schema + RN renderer + offline sync in one package, which is Rasd Forms' opening [27][28][29].

1. SurveyJS (Form Library + Survey Creator)

1.1 Packages, versions, licensing (verified 2026-08-15)

PackageLatestPublishedLicense
survey-core3.0.0 (2.5.38 / 1.12.67 LTS lines still receiving patches)2026-08-11MIT
survey-react-ui3.0.02026-08-11MIT
survey-creator-core / survey-creator-react3.0.02026-08-11Commercial ("SEE LICENSE IN LICENSE")
survey-analytics (Dashboard), survey-pdf3.0.02026-08-11Commercial

Pricing (surveyjs.io/pricing, 2026-08-15): Essential free (Form Library only); Basic $569 / €499 per developer, perpetual (adds Survey Creator + white-labeling); PRO $1,029 / €899 (adds UI Preset Editor, Dashboard, PDF Generator); Enterprise from $2,299 / €1,998. Renewals for updates/support: $229 (Basic), $409 (PRO), from $919 (Enterprise) per year. Volume discount up to 35 % for 2+ seats; 90-day money-back [1]. Licenses are per developer who touches the SurveyJS API, not per end user/admin, cover all environments, and are royalty-free to distribute [2]. Without a key the Creator shows a persistent "developer license required" alert banner; keys are meant to live client-side (they recommend .env.local) [2]. The EULA (Devsoft Baltic OÜ) is per-developer for businesses/governments and forbids building "any tool ... that directly or indirectly competes" with SurveyJS — relevant: Rasd Forms must be clean-room, never a fork of Creator [3]. GitHub: surveyjs/survey-library 4.8k stars, MIT; monorepo of survey-core, survey-react-ui, survey-angular-ui, survey-vue3-ui, survey-js-ui [30].

v3.0 (shipped 2026-08-11 per npm) introduces a shared design-token/CSS-variable system across all products, "theme adapters" for Bootstrap, Material UI and shadcn/ui, a no-code UI Preset Editor for Creator (exports a reusable JSON preset), a state-object-driven Dashboard, and Chart.js replacing Plotly in PDF for smaller bundles. No RN, no offline, no license-enforcement change announced [31].

1.2 JSON schema structure (what to learn from)

Top level: { pages: [{ name, title, visibleIf, elements: [...] }], showProgressBar, progressBarLocation, firstPageIsStartPage, startSurveyText, completedHtml, showPreviewBeforeComplete, previewMode, checkErrorsMode, textUpdateMode, locale, triggers, calculatedValues }. Pages cannot nest; panel elements nest arbitrarily inside pages [32].

  • Question object: { type, name, title, description, isRequired, requiredIf, visibleIf, enableIf, setValueIf/setValueExpression, resetValueIf, defaultValue, defaultValueExpression, validators: [...], choices | choicesByUrl, ... }.
  • paneldynamic (repeating group): templateElements[], displayMode: list|carousel|tab, minPanelCount/maxPanelCount (default max 100), allowAddPanel/allowRemovePanel, addPanelText/removePanelText, confirmDelete, keyName (uniqueness → keyDuplicationError), templateVisibleIf, valueName; data stored as an array of objects [33]. Matrices: matrix (single choice per row), matrixdropdown (typed columns), matrixdynamic (add/remove rows) — same column/cell addressing {matrix.row.col} used by the expression engine [34].
  • Validators (validators[]): numeric{minValue,maxValue}, text{minLength,maxLength,allowDigits}, email, regex{regex}, expression{expression}, answercount{minCount,maxCount}, each with text (localizable) and notificationType: error|warning|info; timing via survey-level checkErrorsMode: onNextPage|onValueChanged|onComplete; async server validation via survey.onServerValidateQuestions [35].
  • choicesByUrl: { url: "https://.../{country}", path, valueName, titleName, imageLinkName, allowEmptyResponse }, with {questionName} placeholders in the URL; localized remote choices are objects {choiceId, choiceTitle: {en:..., de:...}}. Also choicesVisibleIf/choicesEnableIf (per-item {item} placeholder), choicesFromQuestion (+choicesFromQuestionMode: all|selected|unselected), choicesOrder: none|asc|desc|random, showOtherItem, showNoneItem [36].
  • Expression language (string-based, framework-neutral): {q} value refs; dotted/indexed paths {qid.itemid}, {matrix.row.col}, {panel[0].q}, {panel[-1].q} (last); operators = != < > <= >= empty notempty contains notcontains anyof allof noneof and/&& or/||; functions iif, age, today(offset), dateDiff, dateAdd, sum, avg, min, max, round, sumInArray, displayValue, isContainerReady; $ prefix for element metadata ({$question1.visible}, {$self...}, {$item.x} inside choice conditions); custom sync/async functions via registerFunction / FunctionFactory (async ones set isAsync: true); runtime survey.validateExpressions({variables, functions, semantics}) [34].
  • Triggers (triggers[]): complete, setvalue{setToName,setValue}, copyvalue{fromName,setToName}, skip{gotoName}, runexpression{runExpression,setToName} — each keyed on an expression [34].
  • calculatedValues: [{ name, expression, includeIntoResult }], referenced as {fullname} in titles/HTML [34].
  • Localization: any text property may be a locale map { "default": "...", "de": "...", "fr": "..." }; survey.locale = "ar"; UI dictionaries for 50+ languages, community-maintained with Azure AI Translator gap-fill; custom locales declare rtl: true via setupLocale({localeCode, rtl}) [37]. RTL rendering is CSS/dir driven (from general knowledge — the RTL example page returned 404 during this research; treat as unverified detail).
  • Themes: theme JSON { themeName, colorPalette: light|dark, isPanelless, cssVariables: {"--sjs-primary-backcolor": ...}, backgroundImage, header }, applied with survey.applyTheme(theme); 10 base themes × dark × panelless = 32 variants; visual Theme Editor tab in Creator; v3 moves to shared design tokens [38][31].
  • Creator: Designer (toolbox + property grid, DnD), Preview, Themes, Logic (visual rule builder over the same expression language), Translation (grid + machine translation), JSON Editor (Ace); creatorOptions (showLogicTab, showTranslationTab, showThemeTab, showJSONEditorTab, questionTypes), saveSurveyFunc, isAutoSave; custom question types via ComponentCollection and ReactQuestionFactory [39].
  • Offline: SurveyJS' "local-first form builder" post is a pattern the developer implements (localStorage/IndexedDB via saveSurveyFunc, saveThemeFunc, autoSaveEnabled); no shipped storage/sync layer [40].

1.3 React Native status

  • Issue #484 "React-Native support" opened 2017-07-05 (closed without a product) [4]; issue #6713 "Native iOS/Android mobile support" opened 2023-08-15, labelled enhancement, still open, references 20+ support tickets [5].
  • react-native-survey-js-ui (June 2025, GPL-3.0, v0.1.0, 1 star) ships a patched survey-core 2.1.1 ("resolution of window.addEventListener calls and document.head access issues"), supports basic types only, and locks to specific survey-core versions [6]. Other options are WebView wrappers (abolger/surveyjs-inside-react-native-webview, shiftsmartinc/surveyjs-react-native) — WebView means no native inputs, no native storage, poor low-end Android performance.

2. Form.io

  • Packages/licenses: @formio/js 5.5.1 (MIT, published 2026-08-11), @formio/react 6.2.1 (MIT), server formio/formio (OSL-3.0), @formio/offline-plugin 5.5.1 ("SEE LICENSE IN LICENSE", requires Library License key). Formio.js 5.x defaults to Bootstrap 5 templates and a new core validation engine [9][10][41]. formio.full.min.js 5.5.1 measures 1,643 KB minified / 470 KB gzip; formio.form.min.js 1,444 KB / 415 KB gzip (unpkg, 2026-08-15).
  • Schema: { components: [{ type, key, label, input, placeholder, validate: {required, custom, json}, conditional: {show, when, eq} | {json}, customConditional: "show = data.income < 45000 && ...", logic: [{ trigger: {type: simple|javascript|json|event}, actions: [{type: property|value|mergeComponentSchema|customAction}] }], calculateValue: "value = data.a + data.b" | JSONLogic }] }. Advanced conditions expose form, submission, data, row, component, instance, value, moment, _ (lodash), utils to arbitrary JS — powerful but unsafe/unportable to native and hard to statically analyse; JSON Logic is offered as the safer alternative [42].
  • Open source vs enterprise: OSS = renderer, builder, API server, Angular/React libs, 33 components. Enterprise-only: Developer Portal, PDF, Form Manager, submission revisions, premium components (file upload, wizard, signature, data tables), encrypted fields, RBAC/teams, SSO, environment promotion [43]. Third-party summary: no free commercial tier, 30-day trial, ~$300/mo SaaS or ~$330/mo per self-hosted environment (unverified against vendor page, which only says configuration-based pricing) [44].
  • Offline plugin (the most relevant prior art): intercepts Formio API calls via a Fetch plugin; PouchDB over IndexedDB; FIFO submission queue that flushes on next submission or offlinePlugin.dequeueSubmissions(); submissionQueueLength(); caches forms/submissions loaded while online (loadForm(), loadSubmissions()); server validation failure raises offline.formError and stops the queue until fixed; offline deletes are tombstoned (_deleted) with notToShowDeletedOfflineSubmissions; requires Formio.license = 'yourLibraryLicenseKey'. Browser-only (IndexedDB) [12].
  • React Native: formio/react-native-formio archived 2023-05-11 ("legacy and no longer supported", 17 stars) [11]; issue #4894 asks for RN offline with no solution.

3. react-jsonschema-form (RJSF)

  • @rjsf/core 6.8.0 (Apache-2.0, published 2026-08-14, peer react >=18), @rjsf/utils, @rjsf/validator-ajv8; theme packages incl. @rjsf/mui (MUI 7), @rjsf/shadcn (MIT), @rjsf/daisyui, antd, chakra-ui, fluentui-rc, react-bootstrap, primereact, semantic-ui [13][45].
  • Model: JSON Schema (data) + uiSchema (presentation) + formData. Overrides via registry = { widgets, fields, templates, formContext, rootSchema, schemaUtils }; ui:widget, ui:field, ui:options, templates (FieldTemplate, ObjectFieldTemplate, ArrayFieldTemplate, ErrorListTemplate, ButtonTemplates); themes = withTheme({widgets, fields, templates}) [14].
  • Conditional logic: JSON Schema dependencies (property + schema deps, oneOf branching), if/then/else, anyOf/oneOfdependencies is from an old draft, "not part of the latest JSON Schema spec" [46].
  • Pain points (GitHub): AJV "nearly doubles" bundle (#869); large dependencies/oneOf schemas are slow (#4203, #3692); AJV recompiles sub-schemas repeatedly, crashes with 100+ array items (#1961); json-schema-merge-allof size (#4774); request for Standard Schema validators (#4614) [15]. No DnD builder (third-party @ginkgo-bioworks/react-json-schema-form-builder 4.1.0, Apache-2.0, 2026-01), no RN.

4. JSON Forms (EclipseSource)

  • @jsonforms/core 3.8.0, @jsonforms/react 3.8.0, @jsonforms/material-renderers, @jsonforms/vanilla-renderers (all MIT, 2026-06-16); Angular Material, Vue Vanilla, Vue Vuetify (preview) [16][47].
  • UI schema = layout tree: VerticalLayout, HorizontalLayout, Group{label}, Categorization/Category, Control{scope:"#/properties/x", label, options} [17]. Rules: { effect: HIDE|SHOW|ENABLE|DISABLE, condition: { scope, schema: {const|enum|not|minimum|...}, failWhenUndefined } } — conditions are themselves JSON Schema fragments, so they are validator-portable and easy to render in a builder [18].
  • Renderer sets are lists of {tester: rankWith(n, predicate), renderer}; i18n via i18n={{locale, translate(key, default, ctx), translateError}} with keys defaulting to property paths (firstName.label, name.error.required, error.<keyword>) [48].
  • Gaps: official jsonforms-editor "is a proof of concept, is no longer maintained"; DnD only in the material tree renderer; no RN renderer set (community react-native-json-forms 1.1.12, last published 2020-11) [49].

5. Formily (Alibaba)

  • @formily/core, @formily/react, @formily/json-schema 2.3.7 (MIT, published 2025-05-15); UI adapters @formily/antd 2.3.7, @formily/antd-v5 1.2.4, @formily/next, Element, Vant, Semi. README claims "Support React/React Native/Vue 2/Vue 3" — RN support means the reactive core is renderer-agnostic, not that an RN component kit exists (no @formily/react-native on npm) [19].
  • Schema = JSON Schema + x-component, x-component-props, x-decorator, x-decorator-props, x-validator, x-visible, x-display, x-pattern, x-index, x-reactions. x-reactions = { dependencies: ["source" | ".sibling" | "field#modified"], when: "{{$deps[0] === '123'}}", target?, effects?: [onFieldValueChange...], fulfill: {state, schema, run}, otherwise: {...} }; expressions in {{ }} with $self, $form, $deps, $values, $target scope; passive (self) vs active (target) linkage [20].
  • Builder: "Designable" (@designable/core 1.0.0-beta.45, 2022-02-28) — effectively unmaintained.

6. FormEngine (Optimajet)

  • @react-form-builder/core 10.1.0 (MIT, 2026-07-29; peers mobx ^6.13, mobx-react ^9), @react-form-builder/components-rsuite (MIT, pins rsuite 5.83.4), components-material-ui, shadcn, Mantine; @react-form-builder/designer 10.1.0 (EULA) [21][23]. 213 GitHub stars.
  • Form JSON: component tree (type, props: {label: {value: ...}}, children), events → named actions, validations: [{key: required|email...}], computed "dynamic properties", localization via Fluent.js; validation adapters for Zod, Yup, AJV, Superstruct, Joi [23].
  • Pricing (formengine.io/pricing, 2026-08-15): FREE $0; StartUp $1,299 (1 domain, internal use); Business $2,999 (3 domains); Enterprise $5,999 (unlimited domains + wildcard subdomains, public SaaS); perpetual + 365 days of updates; licensed per domain — "your entire team can work with a single license". A componentsource listing mentions $899/year subscription — unverified on the vendor page [22]. Vendor bundle benchmark (Vite, gzip): FormEngine 220 KB vs SurveyJS 419 KB vs RJSF 167 KB vs Vueform 136 KB for a login form; only these four measured [50].

7. Formbricks

  • AGPLv3 core, apps/web/modules/ee under Enterprise License; 12.8k stars; full platform (no-code editor, targeting, integrations), not an embeddable builder library [24]. SDKs: @formbricks/js 5.0.0 (MIT, needs zod peer), @formbricks/react-native 3.1.0 (MIT, 2026-08-06) initialised with <Formbricks initConfig={{workspaceId, appUrl}} /> (Environment IDs deprecated in favour of Workspace IDs) [26]. Offline: link surveys only, ?offlineSupport=true, IndexedDB queue, auto-sync, status banner, no file uploads, unsynced data discarded after 24 h [25]. Cloud pricing: Hobby $0 (250 responses/mo), Pro $74/mo (2,000; unlocks mobile SDKs), Scale $325/mo (5,000); self-hosted enterprise "get in touch" [51].

8. Headless / code-first libraries (uniforms, TanStack Form, react-hook-form + zod)

  • uniforms 4.0.0 (MIT, 2025-02-28): "bridges" (JSON Schema, Zod, SimpleSchema, GraphQL) → AutoForm/AutoField; theme packages uniforms-antd, -bootstrap5, -mui, -semantic, -unstyled; no builder, no RN [52].
  • TanStack Form @tanstack/react-form 1.33.5 (MIT, 2026-08-11; 17.4 KB gzip; adapters for React, Vue, Angular, Solid, Svelte, Lit): headless, validators: {onChange, onBlur, onSubmit, onChangeAsync} accepting Standard Schema objects (Zod, Valibot, ArkType, Effect) directly, asyncDebounceMs, errorMap, canSubmit; no JSON schema rendering, no builder [28][29].
  • react-hook-form 7.85.0 (MIT, 44.8k stars, 13.5 KB gzip, zero deps, "Web + React Native"), @hookform/resolvers 5.8.0 exports zod, valibot, arktype, standard-schema, ajv, yup, ... [27][53]. zod 4.4.3 (60 KB gzip — bigger than RHF itself). Typical RN pattern: <Controller control name render={({field}) => <TextInput onChangeText={field.onChange} .../>}> + zodResolver(schema).
  • Typeform / Tally UX: Tally describes itself as "a new type of form builder that works like a doc" — you type / to insert blocks (inputs, pages, conditional logic, calculated fields, hidden fields); no drag palette [54]. Typeform popularised one-question-at-a-time, keyboard-driven (letter keys, Enter), piping/"Recall information", jump logic and a logic map (general knowledge; typeform.com help returned 403 in this session — unverified here).

9. React Native form builders — why the gap exists

Verified inventory: @coltorapps/builder + @coltorapps/builder-react 0.2.4 (MIT, 2025-07-08) — headless, zero-dependency "entities/attributes/interpreter" model that explicitly supports React and React Native, but ships no UI, no DnD (demo uses dnd-kit + shadcn), no offline [55]; react-native-simple-survey 3.1.2 (2020), react-native-json-forms 1.1.12 (2020), rhfa-react-native 1.2.0 (2022) — abandoned; react-native-survey-js-ui 0.1.0 (2025, GPL-3.0); Formbricks RN SDK (display-only). Reasons builders lack RN, evidenced above:

  1. Renderers are DOM-coupled: SurveyJS core touches window/document [6]; formio.js is a template/DOM engine (Bootstrap templates) [10]; theming is CSS-variable based [38][31], which RN cannot consume.
  2. Advanced logic often executes arbitrary JS strings with browser-only libs (moment, _, utils in Form.io) [42] — not sandboxable on device.
  3. Builders themselves depend on HTML5 DnD / dnd-kit and desktop property grids; vendors monetise the builder (SurveyJS, FormEngine, Form.io) so RN renderers are a cost centre without a licence to sell.
  4. Offline needs a storage abstraction (IndexedDB vs SQLite); the only shipped offline layer (Form.io) is PouchDB/IndexedDB browser-only and paywalled [12].

Comparison tables

A. Feature / licensing matrix (2026-08-15)

LibrarySchema styleDnD builderReact NativeOfflineTheming approachLicense / price
SurveyJSProprietary survey JSON (pages/elements, string expressions)Yes (Creator, paid)No (issues #484/#6713); community GPL portNo (DIY pattern)Theme JSON + CSS vars; v3 design tokens & Bootstrap/MUI/shadcn adaptersCore MIT; Creator $569–$1,029/dev perpetual + $229–$409/yr updates
Form.ioComponents array w/ conditional/logic/calculateValue (JS or JSONLogic)Yes (OSS builder)Archived 2023Paid Offline Plugin (PouchDB/IndexedDB, web only)Bootstrap 5 templates, custom templatesRenderer MIT, server OSL-3.0, enterprise ~$300+/mo (30-day trial)
RJSFJSON Schema + uiSchemaNo (3rd-party)NoNoTheme packages via withTheme registryApache-2.0
JSON FormsJSON Schema + UI schema (layouts, Control.scope, rule)POC editor unmaintainedNo (community 2020)NoRenderer sets (tester/renderer)MIT
FormilyJSON Schema + x-* (x-reactions)Designable (beta, 2022)Core is renderer-agnostic; no RN kitNoComponent adapters (antd, Fusion, Element, Vant, Semi)MIT
FormEngineComponent tree + actions + Fluent l10nYes (Designer, paid)NoNoPluggable UI kits (rsuite/MUI/shadcn/Mantine)Core MIT; Designer $1,299–$5,999 per domain, perpetual
FormbricksInternal survey model (platform)Yes (hosted no-code editor)Display SDK 3.1.0Link surveys onlyPlatform stylingAGPLv3 + EE; cloud $0/$74/$325 per mo
uniformsBridges (JSON Schema/Zod/SimpleSchema)NoNoNoTheme packagesMIT
TanStack FormCode (Standard Schema)NoHeadless (works)NoHeadlessMIT
react-hook-form + zodCode (resolvers)NoYes (Controller)NoHeadlessMIT
@coltorapps/builderEntities/attributesHeadless (bring dnd-kit)Yes (headless)NoHeadlessMIT

B. Conditional-logic representations

LibraryRepresentationPortable to native?Builder-friendly?
SurveyJSString DSL "{a} > 5 and {b} notempty", triggers[], calculatedValues[]Yes (own parser in survey-core)Yes (Logic tab round-trips)
Form.ioSimple {show, when, eq}; JSONLogic; raw JS stringsSimple/JSONLogic yes; JS noSimple yes; JS no
JSON Formsrule: {effect, condition: {scope, schema}} (JSON Schema as predicate)Yes (any JSON Schema validator)Yes, but limited effects (4)
RJSFJSON Schema dependencies/if-then-else/oneOfYes but AJV-heavyPoor (schema surgery)
Formilyx-reactions (dependencies, when {{js}}, fulfill/otherwise state/schema/run){{ }} is JS eval → sandbox neededMedium
FormEngineEvents → named actions, computed props (MobX)JS actions noYes

Implications & recommendations for Rasd Forms

  1. Adopt a SurveyJS-like shape (pages → elements → panels/repeat groups) but not its wire format. Field monitors and MEAL teams already think in pages/sections/repeat groups (also the ODK/XLSForm mental model), and SurveyJS proves this schema can drive a builder, a renderer, PDF and analytics from one JSON. Keep pages non-nesting, panels nesting, and a repeat element with template, min/max, keyField, addLabel/removeLabel, confirmDelete — mirror paneldynamic's proven property set.
  2. Ship one string expression language, parsed by our own tiny parser (no eval), running identically on web and RN. Copy SurveyJS' operator/function set (iif, today, dateDiff, age, sum, avg, count, anyof/allof/noneof, empty/notempty) plus {q}, {repeat[i].q}, {repeat[-1].q} and {$item} addressing, and expose registerFunction({name, func, isAsync}). This avoids Form.io's/Formily's arbitrary-JS problem (unsafe, unportable, unanalysable) while remaining friendlier than JSON Schema dependencies. Provide validateExpressions() for the builder and a JSON-Logic import/export shim for interop.
  3. Represent logic declaratively in three places, exactly like SurveyJS's proven trio: per-element visibleIf/enableIf/requiredIf/readOnlyIf/setValueIf + setValueExpression/resetValueIf, survey-level triggers[] (complete|setValue|copyValue|skip|runExpression), and calculatedValues[] (includeInResult). Add JSON Forms-style effects (hide/show/enable/disable) only as sugar in the builder UI.
  4. Localization as per-string locale maps with a default key (title: {default:"…", ar:"…", ku:"…"}), plus a top-level defaultLocale, locales[] and per-locale dir (rtl). Localize choices[].text, validator text, page titles, and completedHtml. Ship an Arabic UI dictionary and RTL layout from day one (SurveyJS only exposes rtl on custom locales; Arabic RTL is a first-class differentiator for UNRWA/WFP users). Support JSON Forms-style key-based translation as an alternative for teams with existing i18n catalogs.
  5. Separate data schema from layout/UI the way JSON Forms/RJSF do, but keep them in one document. Store fields (name, type, constraints, choices) and layout (pages, panels, order, widget hints, ui: options) in one payload with a stable schemaVersion; this lets the RN renderer ignore web-only hints and lets analytics/PDF/export consume fields alone. Reserve a x-/meta extension namespace for org-specific attributes (cluster, indicator codes).
  6. Validators as an array of typed objects (numeric, text, email, regex, expression, answerCount, date, geo/photo constraints) with severity: error|warning|info and text localizable, plus validationMode: onNext|onChange|onComplete. Warnings (non-blocking) matter for enumerator QA. Additionally accept a Standard Schema (Zod/Valibot) at field level for developer-defined checks so RHF/TanStack users feel at home.
  7. Choices: static choices[{value,text,visibleIf,enableIf, meta}], choicesFromQuestion, and a remote source with offline cache: choicesByUrl{url,path,valueName,titleName,cacheTtl,prefetch:true} that our sync layer pre-downloads and stores (IndexedDB/SQLite) — Form.io and SurveyJS both fetch live only. Cascading selects for admin1/admin2/admin3 are the #1 humanitarian requirement.
  8. Renderer registry à la RJSF (widgets, fields, templates, formContext) with two official renderer sets (web DOM, React Native) resolved by JSON Forms-style tester ranking; theming through design tokens (JSON) that compile to CSS variables on web and to a StyleSheet theme object on RN — SurveyJS v3 validates the token direction, but nobody yet maps tokens to RN.
  9. Bundle budget: target ≤ 60 KB gzip for core+renderer (RHF is 13.5 KB, TanStack 17 KB; SurveyJS core is 303 KB, formio 415–470 KB). Split locales, question types (matrix, signature, geo, photo) and the expression engine into lazily-loaded ESM entry points; never bundle AJV in the runtime (RJSF's #869 lesson).
  10. Offline/sync as a first-class, free-tier feature (unlike Form.io's paywalled plugin): storage adapter interface (IndexedDB via Dexie/idb on web, expo-sqlite/op-sqlite on native), FIFO outbox with per-item status, queueLength(), flush(), tombstoned deletes, onSyncError that pauses the queue on server validation errors (Form.io semantics), staleness policy configurable (Formbricks discards after 24 h — too aggressive for enumerators), attachment queue with resumable upload.
  11. Builder UX: DnD toolbox + property grid (SurveyJS/FormEngine) but also Tally-style / quick-insert and keyboard-first editing for laptop-less field offices; Logic tab that round-trips to the expression DSL; Translation grid with machine-translation hook; JSON tab; Preview that toggles web/RN-emulated widths, RTL and low-bandwidth mode. Builder must be clean-room given SurveyJS' non-compete EULA clause.
  12. Licensing UX: SurveyJS proves a client-side key with a non-blocking banner works; FormEngine's per-domain model and Form.io's key-gated offline plugin show what developers dislike. For Rasd: per-organization token validated with an offline grace period (fieldwork can be offline for weeks), renderer always free/MIT, builder + sync server behind the subscription, 7-day trial that degrades to a banner rather than a hard stop, and no per-developer counting (humanitarian teams rotate developers/consultants constantly).
  13. Interoperability: provide importers for SurveyJS JSON (large installed base of forms) and XLSForm/ODK (KoboToolbox is the incumbent in this sector), and exporters to SurveyJS-compatible JSON where lossless — this lowers switching cost more than any feature.

Sources

  1. SurveyJS Pricing — https://surveyjs.io/pricing (accessed 2026-08-15)
  2. SurveyJS Licensing FAQ — https://surveyjs.io/faq/licensing (accessed 2026-08-15)
  3. survey-creator LICENSE (Commercial Developer License) — https://github.com/surveyjs/survey-creator/blob/master/LICENSE (accessed 2026-08-15)
  4. survey-library issue #484 "React-Native support" (opened 2017-07-05) — https://github.com/surveyjs/survey-library/issues/484 (accessed 2026-08-15)
  5. survey-library issue #6713 "Native iOS/Android mobile support" (opened 2023-08-15, open) — https://github.com/surveyjs/survey-library/issues/6713 (accessed 2026-08-15)
  6. react-native-survey-js-ui (GPL-3.0, v0.1.0) — https://github.com/iotashan/react-native-survey-js-ui (accessed 2026-08-15)
  7. survey-library issue #1362 "Support tree shaking" — https://github.com/surveyjs/survey-library/issues/1362 (accessed 2026-08-15)
  8. survey-creator issue #2731 "Bundle size is too large when importing" — https://github.com/surveyjs/survey-creator/issues/2731 (accessed 2026-08-15)
  9. @formio/js on npm (5.5.1) — https://www.npmjs.com/package/@formio/js (registry metadata accessed 2026-08-15)
  10. formio/formio.js README — https://github.com/formio/formio.js/ (accessed 2026-08-15)
  11. formio/react-native-formio (archived 2023-05-11) — https://github.com/formio/react-native-formio (accessed 2026-08-15)
  12. Form.io Offline Mode docs — https://help.form.io/dev/offline-mode (accessed 2026-08-15)
  13. RJSF documentation (v6.8.0) — https://rjsf-team.github.io/react-jsonschema-form/docs/ (accessed 2026-08-15)
  14. RJSF Custom widgets and fields — https://rjsf-team.github.io/react-jsonschema-form/docs/advanced-customization/custom-widgets-fields (accessed 2026-08-15)
  15. RJSF issues #869 (ajv size), #4203, #3692, #1961, #4774, #4614 — https://github.com/rjsf-team/react-jsonschema-form/issues/869 , /issues/4203 , /issues/3692 , /issues/1961 (accessed 2026-08-15)
  16. JSON Forms renderer sets — https://jsonforms.io/docs/renderer-sets (accessed 2026-08-15)
  17. JSON Forms UI schema layouts — https://jsonforms.io/docs/uischema/layouts (accessed 2026-08-15)
  18. JSON Forms rules — https://jsonforms.io/docs/uischema/rules (accessed 2026-08-15)
  19. alibaba/formily README — https://github.com/alibaba/formily (accessed 2026-08-15)
  20. Formily Schema / x-reactions docs — https://raw.githubusercontent.com/alibaba/formily/formily_next/packages/react/docs/api/shared/Schema.md (accessed 2026-08-15)
  21. @react-form-builder/core, /designer, /components-rsuite npm metadata (10.1.0) — https://www.npmjs.com/package/@react-form-builder/core (registry accessed 2026-08-15)
  22. FormEngine pricing — https://formengine.io/pricing (accessed 2026-08-15)
  23. optimajet/formengine README — https://github.com/optimajet/formengine (accessed 2026-08-15)
  24. formbricks/formbricks README (AGPLv3 + EE) — https://github.com/formbricks/formbricks (accessed 2026-08-15)
  25. Formbricks Offline Support (link surveys) — https://formbricks.com/docs/surveys/link-surveys/offline-support (accessed 2026-08-15)
  26. Formbricks Framework Guides (React Native SDK) — https://formbricks.com/docs/surveys/website-app-surveys/framework-guides (accessed 2026-08-15)
  27. react-hook-form README — https://github.com/react-hook-form/react-hook-form (accessed 2026-08-15)
  28. TanStack Form overview — https://tanstack.com/form/latest/docs/overview (accessed 2026-08-15)
  29. TanStack Form validation guide — https://tanstack.com/form/latest/docs/framework/react/guides/validation (accessed 2026-08-15)
  30. surveyjs/survey-library README — https://github.com/surveyjs/survey-library (accessed 2026-08-15)
  31. SurveyJS v3.0 major update — https://surveyjs.io/stay-updated/major-updates/2025-2026 (accessed 2026-08-15)
  32. SurveyJS multi-page survey docs — https://surveyjs.io/form-library/documentation/design-survey/create-a-multi-page-survey (accessed 2026-08-15)
  33. SurveyJS Dynamic Panel API — https://surveyjs.io/form-library/documentation/api-reference/dynamic-panel-model (accessed 2026-08-15)
  34. SurveyJS conditional logic & expressions — https://surveyjs.io/form-library/documentation/design-survey/conditional-logic (accessed 2026-08-15)
  35. SurveyJS data validation — https://surveyjs.io/form-library/documentation/data-validation (accessed 2026-08-15)
  36. SurveyJS QuestionSelectBase (choicesByUrl etc.) — https://surveyjs.io/form-library/documentation/api-reference/questionselectbase (accessed 2026-08-15)
  37. SurveyJS localization — https://surveyjs.io/form-library/documentation/survey-localization (accessed 2026-08-15)
  38. SurveyJS themes & styles — https://surveyjs.io/form-library/documentation/manage-default-themes-and-styles (accessed 2026-08-15)
  39. Survey Creator overview — https://surveyjs.io/survey-creator/documentation/overview (accessed 2026-08-15)
  40. SurveyJS "local-first form builder" blog — https://surveyjs.io/stay-updated/blog/local-first-form-builder (accessed 2026-08-15)
  41. Form.io release notes / formio.js 5.0 — https://form.io/release-notes/ (accessed 2026-08-15)
  42. Form.io Logic and Conditions — https://help.form.io/form-building/logic-and-conditions (accessed 2026-08-15)
  43. Form.io Open Source Core vs Enterprise — https://form.io/form-io-open-source-core-vs-enterprise/ (accessed 2026-08-15)
  44. fomr.io "6 best open source form builders in 2026" (third-party pricing summary) — https://fomr.io/blog/best-open-source-form-builders (accessed 2026-08-15)
  45. @rjsf/core, @rjsf/mui, @rjsf/shadcn npm metadata (6.8.0) — https://www.npmjs.com/package/@rjsf/core (registry accessed 2026-08-15)
  46. RJSF dependencies docs — https://rjsf-team.github.io/react-jsonschema-form/docs/json-schema/dependencies (accessed 2026-08-15)
  47. @jsonforms/core, /react, /material-renderers npm metadata (3.8.0) — https://www.npmjs.com/package/@jsonforms/react (registry accessed 2026-08-15)
  48. JSON Forms i18n — https://jsonforms.io/docs/i18n (accessed 2026-08-15)
  49. eclipsesource/jsonforms-editor README (unmaintained POC) — https://github.com/eclipsesource/jsonforms-editor (accessed 2026-08-15)
  50. FormEngine bundle-size comparison (vendor) — https://formengine.io/documentation/bundle-size-comparison/ and https://formengine.io/comparison/react-jsonschema-form-alternative/ (accessed 2026-08-15)
  51. Formbricks pricing — https://formbricks.com/pricing (accessed 2026-08-15)
  52. vazco/uniforms README — https://github.com/vazco/uniforms (accessed 2026-08-15)
  53. @hookform/resolvers npm metadata (5.8.0, exports incl. ./standard-schema) — https://www.npmjs.com/package/@hookform/resolvers (registry accessed 2026-08-15)
  54. Tally help center ("works like a doc", / command) — https://tally.so/help (accessed 2026-08-15)
  55. @coltorapps/builder docs — https://builder.coltorapps.com/ (accessed 2026-08-15)
  56. Bundle measurements: unpkg builds of survey-core@2.5.38, survey-react-ui@2.5.38, survey-creator-core@2.5.38, @formio/js@5.5.1 (curl + gzip -9, 2026-08-15); bundlephobia API for react-hook-form@7.85.0, @tanstack/react-form@1.33.5, zod@4.4.3 — https://bundlephobia.com (accessed 2026-08-15)