react-jsonschema-form
CLAUDE.md16k starsChanged 12 months agoApache-2.0View on GitHub
CI runs lint, knip, build, typecheck, and test in that order, so run those before pushing. Per-package tsc misses the test and playground projects; only the root typecheck covers them. Individual package builds run build:ts (tsc -b, emits lib/) and then bundle dist/ in three formats: build:cjs and build:esm via esbuild, build:umd via rollup. This is an pnpm workspaces + Nx monorepo. All packages live under packages/ and are scoped as @rjsf/*. The Registry object is the core extension point…
- Installs packages
We split this CLAUDE.md into the rules it gives an agent
6 rules. About 0 are common, 4 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 96
Every theme package follows the same structure:
- Very specific: line 111
When making a change to a widget or template, consider if the change should be generalized to all theme packages.
- Distinctive: line 139
Default to no comments. Write self-documenting code — clear names and structure — as the primary means of explanation.
- Distinctive: line 140
When a comment is warranted, explain the WHY (rationale, constraints, non-obvious tradeoffs), not the WHAT — well-named code already says …
- Distinctive: line 141
Don't leave "before/after" or diff-style commentary in code comments or in this file.
- Very specific: line 145
When adding an entry to CHANGELOG.md, append it as the last bullet under the relevant package's heading (e.g.
≈ “Common” is an estimate: at least 1 in 5 of the 25,680 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Commands
# Install dependencies
pnpm install
# Build all packages (parallel)
pnpm run build
# Build all packages (sequential, use if parallel causes issues)
pnpm run build-serial
# Run all tests
pnpm test
# Lint (oxlint, type-aware)
pnpm run lint
# Typecheck every package and its tests
pnpm run typecheck
# Dead code / unused dependency check
pnpm run knip
# Format check / format source files (oxfmt)
pnpm run cs-check
pnpm run cs-format
# Format check / format every file in the repo, including configs and markdown
pnpm run format-check
pnpm run format
# Run a single package's tests
cd packages/core && pnpm test
# Watch mode for a single package
cd packages/core && pnpm run test:watch
# Update snapshots
cd packages/snapshot-tests && pnpm run test:update
# Start the playground (interactive demo)
cd packages/playground && pnpm start
# Full sanity check (lint + knip + build + test)
pnpm run sanity-checkCI runs lint, knip, build, typecheck, and test in that order, so run those before pushing. Per-package tsc misses the test and playground projects; only the root typecheck covers them.
Individual package builds run build:ts (tsc -b, emits lib/) and then bundle dist/ in three formats: build:cjs and build:esm via esbuild, build:umd via rollup.
Architecture
This is an pnpm workspaces + Nx monorepo. All packages live under packages/ and are scoped as @rjsf/*.
Package roles
| Package | Role |
@rjsf/utils | Shared types, 80+ utility functions, schema helpers. No UI dependencies. |
@rjsf/core | Core Form component, Bootstrap 3 as default theme, withTheme() HOC. |
@rjsf/validator-ajv8 | AJV 8-based validator. Exported via customizeValidator(). |
@rjsf/snapshot-tests | Shared snapshot test suite consumed by all theme packages. |
Theme packages (@rjsf/mui, @rjsf/antd, @rjsf/chakra-ui, etc.) | UI-library-specific implementations of fields, widgets, and templates. |
@rjsf/playground | Vite app importing all themes, used for manual testing and demos. |
@rjsf/docs | Docusaurus documentation site. |
Registry pattern (the plugin system)
The Registry object is the core extension point passed to every field/widget/template:
Registry = {
fields, // Map of field type → Field component
widgets, // Map of widget name → Widget component
templates, // Layout/structural templates
rootSchema, // Root JSON Schema
formContext, // Arbitrary context object threaded to all components
schemaUtils, // Schema parsing & validation helpers
translateString,
globalFormOptions, // Form-level options available to every template, field, and widget
globalUiOptions, // Optional; global ui:options applied to every field
uiSchemaDefinitions, // Optional; uiSchema fragments keyed by $ref path, applied when that $ref resolves
};Override fields/widgets/templates per-form via props, or globally via withTheme().
Theme pattern
Every theme package follows the same structure:
- Imports
withThemefrom@rjsf/core - Defines custom
Templates,Widgets, and optionallyFields - Calls
withTheme({ templates, widgets, fields })to produce a themedForm - Exports:
Form(default),Theme,Templates,Widgets
Field → Widget → Template hierarchy
- Fields handle schema-level logic (ObjectField, ArrayField, MultiSchemaField for oneOf/anyOf, etc.)
- Widgets handle individual input rendering (TextWidget, SelectWidget, CheckboxWidget, etc.)
- Templates control structural/layout rendering (FieldTemplate, ArrayFieldTemplate, ButtonTemplates, etc.)
Fields select which widget to render based on schema type and ui:widget. Templates wrap the output for consistent styling.
When making a change to a widget or template, consider if the change should be generalized to all theme packages. If substantial logic is duplicated across themes, consider refactoring the logic to @rjsf/utils or @rjsf/core.
Form rendering flow
- Caller provides
schema,validator(required),formData, anduiSchema FormcreatesschemaUtilsfrom validator + schema- Schema is recursively decomposed into fields → widgets → templates
- On change/blur: callbacks fire with updated
formDataanderrorSchema - On submit: full validation runs, then
onSubmitfires (oronErrorif invalid)
Key @rjsf/utils exports to know
- Schema helpers:
findSchemaDefinition,mergeSchemas,getSchemaType,createSchemaUtils - Form data:
mergeDefaultsWithFormData,removeOptionalEmptyObjects - Error handling:
toErrorSchema,toErrorList - Enum helpers:
enumOptionsSelectValue,enumOptionsDeselectValue - React hooks:
useDeepCompareMemo,useFileWidgetProps,useAltDateWidgetProps
Code style
- TypeScript strict mode,
esnexttarget,verbatimModuleSyntax(type-only imports must beimport type), relative imports include the.ts/.tsxextension - oxfmt (
.oxfmtrc.json): single quotes, JSX single quotes, 120-char print width, sorted imports with React first - oxlint (
.oxlintrc.json): theairbnb-typescriptrule set translated to oxlint, plustypescript,react,jsx-a11y, andimportplugins; enforces curly braces, no-console, React rules of hooks - knip (
knip.jsonc): fails CI on unused files, exports, and dependencies - Pre-commit hook (Husky + lint-staged) runs
oxlint --fixandoxfmton staged files
Code comments
- Default to no comments. Write self-documenting code — clear names and structure — as the primary means of explanation.
- When a comment is warranted, explain the WHY (rationale, constraints, non-obvious tradeoffs), not the WHAT — well-named code already says what it does.
- Don't leave "before/after" or diff-style commentary in code comments or in this file. That belongs in commit messages and PR descriptions, not in code that has to keep reading true after the change ships.
Changelog
- When adding an entry to
CHANGELOG.md, append it as the last bullet under the relevant package's heading (e.g.## @rjsf/daisyui) — after the existing bullets, not inserted above or among them.
Testing
- Vitest, jsdom, Testing Library; shared config in
testing/vitest.base.mts, extended per package - Tests resolve
@rjsf/*imports to TypeScript source via the@rjsf/sourceexport condition, so no build is needed before running them @rjsf/utilsand the validator packages enforce 100% coverage- Snapshot tests in
@rjsf/snapshot-testsare shared across theme packages — runtest:updatethere when changing core rendering - Node >=20 required;
.nvmrcpins 24
Trending
Steady: 0 new projects took it in the last 4 weeks, none the 4 weeks before.thin data
Who's talking about rjsf-team/react-jsonschema-form
- argoproj/argo-cd“Use a form generator for parameters if json schema is provided”GitHub · Apr 22, 2021 · 9 reactions
- mui/toolpad“Add support for JSON form”GitHub · Oct 24, 2023 · 7 reactions
- vitejs/vite“Issue with tree-shaking in Vite 8.1.0 / rolldown >= 1.1.0 with complex module graph”GitHub · Jun 26, 2026 · 6 reactions
- Stack Overflow“how can i use react form builder 2 in react js project”Stack Overflow · Oct 28, 2020 · 4 votes
- mokkabonna/json-schema-compare“Package does not get transpiled when used with webpack/babel”GitHub · May 29, 2020 · 4 reactions
The biggest 5 of 68 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 68
Talked about on GitHub, Stack Overflow, the web, Hacker News and Bluesky (68 times).
On GitHub · 50
- Apr 22, 2021Use a form generator for parameters if json schema is provided — argoproj/argo-cd9 reactions
- Oct 24, 2023Add support for JSON form — mui/toolpad7 reactions · 2 comments
- Jun 26, 2026Issue with tree-shaking in Vite 8.1.0 / rolldown >= 1.1.0 with complex module graph — vitejs/vite6 reactions · 5 comments
- May 29, 2020Package does not get transpiled when used with webpack/babel — mokkabonna/json-schema-compare4 reactions
- Apr 10, 2026fix: add guard to handle null values in getRealHeight — ant-design/ant-design2 reactions · 7 comments
45 more on GitHub
- Oct 9, 2025[ENHANCEMENT]: Add input / output schemas & auto generated forms to datasets — Arize-ai/phoenix2 reactions · 3 comments
- May 14, 2020PyCon Mentored Sprints meta-issue — HypothesisWorks/hypothesis2 reactions · 21 comments
- Aug 18, 2026Pin RJSF Core to 6.7.0 and add comma-decimal E2E tests — Lundalogik/lime-elements1 reaction · 6 comments
- Jul 15, 2025Feature request: Custom Properties in Custom Widgets — gristlabs/grist-core1 reaction · 2 comments
- Dec 22, 2024[FEATURE-REQUEST] Use selectors in the configuration — Luligu/matterbridge-shelly1 reaction · 32 comments
- Nov 12, 2024Update @rjsf/* to 5.22.4 — bratislava/konto.bratislava.sk1 reaction · 1 comment
- Sep 25, 2024front: bump the all group across 1 directory with 102 updates — OpenRailAssociation/osrd1 reaction · 1 comment
- Aug 25, 2023🐛 Bug Report: Unexpected form behaviour when using custom field extension for dynamic fields — backstage/backstage1 reaction · 10 comments
- Jun 11, 2023[BUDI-7428] Dynamic form based on JSON Schema — Budibase/budibase1 reaction · 3 comments
- Feb 1, 2023Display validation errors in JSON schema form on change/blur of form fields — giantswarm/happa1 reaction · 3 comments
- Feb 1, 2023duplicate of https://github.com/rjsf-team/react-jsonschema-form — rhysv96/json-gui1 reaction
- Jun 23, 2021A story for hiding the submit button — commitd/components-rjsf1 reaction
- Dec 2, 2020Bug 1901531: Fix runtime error in create CR form — openshift/console1 reaction · 3 comments
- Sep 7, 2020Support advanced forms from json schema — holoviz/panel1 reaction · 2 comments
- May 9, 2020Consider to generalize building admin ui forms with jsonschema — birkir/prime1 reaction
- Apr 21, 2020Custom fields in schema forms — Lundalogik/lime-elements1 reaction · 4 comments
- Sep 10, 2019[@types/react-jsonschema-form] failed to import SchemaField — DefinitelyTyped/DefinitelyTyped1 reaction · 2 comments
- Oct 28, 2026Bump @rjsf/core from 5.24.1 to 6.11.0 in /superset-frontend — gnanaprakashn/supser-docker0 reactions · 1 comment
- Oct 26, 2026build(deps-dev): bump @rjsf/core from 5.24.13 to 6.11.0 in /spikes/backstage-adoption — texaryn/texaryn0 reactions
- Oct 20, 2026[form] Stop scoring recursive refs without data — x0k/svelte-jsonschema-form0 reactions · 1 comment
- Oct 20, 2026[form] Render non-object options with parent keywords — x0k/svelte-jsonschema-form0 reactions · 1 comment
- Oct 20, 2026[form] Harden StringEnumValueMapperBuilder — x0k/svelte-jsonschema-form0 reactions · 1 comment
- Oct 19, 2026Bump @rjsf/validator-ajv8 from 6.4.1 to 6.11.0 in /web — Omnisystechnology/traffic0 reactions
- Oct 6, 2026chore(deps): bump the rjsf group in /superset-frontend with 3 updates — EZE-YoBoi/ovyero-rt-sam-17910778670 reactions
- Oct 6, 2026chore(deps): bump the rjsf group in /superset-frontend with 3 updates — lilyvc/superset0 reactions · 1 comment
- Sep 26, 2026Bump @rjsf/validator-ajv8 from 5.24.12 to 6.10.1 in /superset-frontend — JJSolutions-lab/superset0 reactions · 1 comment
- Sep 24, 2026chore(deps): bump the rjsf group in /superset-frontend with 3 updates — danielsaisani/superset0 reactions · 1 comment
- Sep 23, 2026chore(deps): bump the rjsf group in /superset-frontend with 3 updates — zhaoyongjie/incubator-superset0 reactions · 2 comments
- Sep 23, 2026chore(deps): bump the rjsf group across 1 directory with 3 updates — jpribeiro1987/bi_superset0 reactions · 1 comment
- Sep 21, 2026Bump @rjsf/core from 4.2.3 to 6.10.1 in /src — ioBroker/ioBroker.ham0 reactions
- Sep 17, 2026chore(deps): bump the rjsf group in /superset-frontend with 3 updates — codev-workshops/bhaskar887-superset0 reactions · 1 comment
- Sep 13, 2026Bump @rjsf/validator-ajv8 from 5.23.2 to 6.10.0 in /frontend — meridian-analytics/maipl0 reactions
- Sep 8, 2026chore(deps): bump @rjsf/core from 5.24.13 to 6.8.0 in /superset-frontend — tungsfer512/superset0 reactions · 1 comment
- Sep 8, 2026chore(deps): bump @rjsf/validator-ajv8 from 5.24.13 to 6.8.0 in /superset-frontend — tungsfer512/superset0 reactions · 1 comment
- Sep 8, 2026Bump the rjsf group in /superset-frontend with 3 updates — gurusevak-debug/super-set0 reactions · 1 comment
- Aug 26, 2026chore(deps): bump the rjsf group across 1 directory with 3 updates — shadreckkhamba/superset-clone0 reactions · 1 comment
- Aug 24, 2026chore(deps): bump the rjsf group in /superset-frontend with 3 updates — nytai/superset0 reactions · 1 comment
- Aug 23, 2026chore(deps): bump the rjsf group across 1 directory with 3 updates — akhayyum22/superset0 reactions · 1 comment
- Aug 21, 2026chore(deps): bump the rjsf group in /superset-frontend with 3 updates — vaughnalec04-ui/demosuperset0 reactions · 1 comment
- Aug 21, 2026Bump the rjsf group across 1 directory with 3 updates — cuonvm-tlu/hust-pttk-capstone-project0 reactions · 1 comment
- Aug 13, 2026chore(deps-dev): bump @rjsf/utils from 6.6.2 to 6.7.1 — layer5io/sistent0 reactions
- Aug 13, 2026chore(deps-dev): bump @rjsf/core from 6.6.1 to 6.7.1 — layer5io/sistent0 reactions
- Aug 13, 2026build(deps): bump @rjsf/core from 5.24.13 to 6.8.0 in /superset-frontend — schahbod/SupersetPlugin0 reactions · 1 comment
- Aug 10, 2026chore(deps): bump @rjsf/validator-ajv8 from 5.24.2 to 6.7.1 — linode/apl-console0 reactions · 1 comment
- Aug 7, 2026Bump @rjsf/utils from 5.20.1 to 5.24.13 — usdoj/foia.gov0 reactions
On Stack Overflow · 12
- Oct 28, 2020how can i use react form builder 2 in react js project4 votes
- Jun 3, 2021How to invert dependencies in react-json-schema-form2 votes · 1 answer
- May 31, 2021how to build dynamic form builder with jquery2 votes
- Oct 28, 2023JSON Schema Form - min or max for date format1 vote
- Aug 7, 2023Best way to autogenerate React form from OpenAPI specification?1 vote
7 more on Stack Overflow
- Apr 12, 2022Error while using react-jsonschema-form with material in typescript project1 vote · 2 answers
- Oct 25, 2020Multi column support for react-jsonschema-form1 vote · 4 answers
- Oct 5, 2022react-jsonschema-form input box out of focus when ObjectFieldTemplate is used0 votes · 2 answers
- Aug 21, 2020react-jsonschema-form updown widget minimum registered but not enforced0 votes
- Jul 11, 2020How to display Form component in React app from react-jsonschema-form library? 'JSONSchemaForm' is not defined no-undef0 votes · 1 answer
- May 9, 2020Placement of conditional elements using JSON form schemas0 votes · 1 answer
- Sep 12, 2019Is it possible to define a jsonSchema for the jsonSchema specification?0 votes
On the web · 4
- Nov 27, 2019Validation of Pre-filled Form Information · Issue #1521 · rjsf- ... — google.com
- Sep 12, 2019react-jsonschema-form to generate a form itself · Issue #1465 — google.com
- Mar 15, 2019Support for generating JSON Schemas · Issue #1221 — google.com
- Jul 3, 2018Issue #968 · rjsf-team/react-jsonschema-form - Tabs — google.com
On Hacker News · 1
- Oct 26, 2026A React component for building Web forms from JSON Schema2 points
On Bluesky · 1
- Nov 7, 2025#reactjs github.com/rjsf-team/re... — @lloveras.info2 likes and reposts
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

