Self-hosted · MIT licensed

Your forms. Your database.
Nobody in the middle.

FieldCraft is a schema-driven form engine for React. Describe a form once in JSON and it handles validation, conditional logic, multi-step navigation, drafts and submission.

It is a library, not a service. Responses go straight from the browser to infrastructure you control — there is no vendor in the path to trust, audit or pay.

MIT
TypeScript
React 18 & 19
Live
Revealed by showIf
Field types
Built-in validators
Condition operators
Tests passing
Core, gzipped
Where the data goes

Most form tools put themselves in the path.

Every hosted service receives your users’ answers before you do. That single architectural fact is what produces the paperwork, the audits and the breach exposure that follow it.

Hosted3 parties
FieldCraft1 party

Parties holding a copy of a submitted response.

Hosted form service4 hops
  1. 01Respondent’s browser
  2. 02Vendor’s serversreads it
  3. 03Vendor’s databasestores it
  4. 04You, via their API
FieldCraft3 hops
  1. 01Respondent’s browser
  2. 02Your API endpointyour code
  3. 03Your databasethe only copy
No step where we receive, store or proxy a response.
DPANo processor agreement

A vendor that never receives your data is not a data processor, so there is nothing to negotiate, sign or renew.

BAANo business associate agreement

Under HIPAA a BAA covers parties that handle protected health information. FieldCraft handles none of it.

VSRNo vendor security review

Procurement reviews the software you run, not a third party you send records to. The audit surface is your own stack.

IRNo breach of ours to report

A compromise on our side cannot expose your responses, because we never held a copy. The blast radius stops at your systems.

A property of the architecture, not a setting: you write the onSubmithandler, so the destination is yours by construction. The one call the packages can make to us is anonymous usage telemetry — structural counts, never field values — and it stays off unless you switch it on.

How to check

Don’t take the last section on faith.

Four places you can verify the claim yourself, without installing anything. Each one names the file or the flag.

No endpoint of ours in the package
Every network call the engine makes takes a URL you supply. There is no hardcoded destination to intercept, because there is no destination we own.
srccore/src/adapters/http-adapter.ts
Telemetry is off until you turn it on
Anonymous usage counts — field types, feature flags, versions — can be enabled with one option. No field values, ever, and nothing at all by default.
flagtelemetry: true
Encryption at the adapter, if you want it
The postgres adapter will AES-256-GCM your response payload before it is written, using a key that never leaves your environment.
aesadapters/src/postgres/encryption.ts
All of it readable, all of it forkable
Engine, renderer and adapters are MIT. If you need to verify any claim on this page, the code is the thing to read — not this page.
mitMIT · github.com/SquaredR98
How it works

Three steps, and no account anywhere.

Step 02 is the one that matters — the schema is the whole product.

01
Install
One package pulls the engine and the React renderer. The engine depends only on zod. The renderer adds Radix for the accessible primitives and dompurify for sanitising rich text — deliberately, so I’m not maintaining my own dropdown or writing my own sanitiser.
$ npm i @squaredr/fieldcraft-react
02
Describe the form
Sections, questions, conditions and validation are plain JSON — versionable, diffable, reviewable in a pull request.
const schema = {
id: "signup",
questions: [ … ]
}
03
Render
One component. Server-rendering safe, works in React 18 and 19, themeable from a preset or your own tokens.
<FormEngineRenderer
schema={schema}
onSubmit={save}/>
Batteries included

The parts you would otherwise write twice.

Four behaviours that are tedious to build and easy to get subtly wrong. Each one is a line of schema, and each card says what you would be writing instead.

01Draft persistenceOn unless disabled

Answers are written to local storage as they change and restored on the next visit. A long intake form survives a closed tab, a refresh, or a dead battery.

settings.allowDraftSave: true
autoSaveIntervalMs: 2000
Otherwise: serialise on change, debounce, restore on mount, expire stale drafts.
02Layered prefillFixed precedence

Initial values resolve in a fixed order — schema defaults, then URL parameters, then props — with explicit initial values merged last. Campaign links and personalised forms need no extra code.

question.config.defaultValue
settings.prefill: { fromUrl: true }
prefillValues: { … }
Otherwise: parse the query string, decide precedence, and re-resolve on navigation.
03Schema validation at bootFail fast

Duplicate question ids, conditions pointing at fields that do not exist, and malformed expressions are reported when the engine is created — in development, not in a user’s session.

validateSchema(schema)
throws: FormEngineSchemaError
Otherwise: the first report of a broken condition is a confused user.
04Safe expressionsNo eval

Calculated fields run through a purpose-built parser — tokeniser, postfix conversion, then evaluation — supporting arithmetic, comparisons and a fixed function set. A schema is data, never executable code.

expression: "{qty} * {price}"
functions: round · min · max · if
Otherwise: eval on user-supplied strings, or a parser of your own.
Demos

Easier to show than to explain.

Four behaviours the engine handles for you, running here on this page — not screenshots. Fill them in, get them wrong, submit them.

enginefieldcraft-react
fields41
operators25
Multi-step forms

Sections become steps. Progress, forward and back navigation are built in. Each step can declare its own showIf condition so the flow adapts to previous answers.

Schema that does this
settings.showProgress: true
settings.progressStyle: "steps"
section.showIf: { … }
Multi-step forms· liveRunning
1 / 3

Contact

Try itFill a step, then press Continue
Architecture

Two layers, four packages.

The engine is plain TypeScript with no UI dependencies. The React renderer sits on top of it and adds the field components. Install whichever one you need.

Layer 02 · renderer · MITReact
@squaredr/fieldcraft-react
Pre-built, accessible React components for every field type. Themeable with CSS custom properties or Tailwind presets.
Layer 01 · engine · MITFramework-free
@squaredr/fieldcraft-core
Pure TypeScript engine — validation, conditions, navigation, drafts, and submission. Zero UI dependencies.
Built for React. Open to every framework.
The core engine is pure TypeScript with zero UI dependencies. React is the official renderer, but the engine API is designed for any framework. Vue, Svelte, Angular, Solid — community renderers are welcome and the architecture supports them out of the box.
Contribute on GitHub
Reading the diagram
Each box nests inside the one above it. The inner-most layer has no dependencies; each outer layer adds capability. Install only the outermost layer you need — its dependencies come along automatically.
@squaredr/fieldcraft-adapters
Plug-in adapters for loading schemas and submitting responses over HTTP, from localStorage, or from a custom source. Depends on core types only — no React.
@squaredr/fieldcraft-templates
Ready-made form schemas for common use cases — contact, feedback, onboarding, and more. Drop one into your project and customise.
Pick your entry point
CoreBring your own UI. You get the engine, validation, and state management.
ReactFull renderer with accessible, themeable components out of the box.
Form Builder

Visual form builder. Drag, drop, done.

Build forms visually with the FieldCraft Pro builder. Drag fields from the palette, configure properties, and export a clean JSON schema — ready to render anywhere.

See all Pro components

$199 one-time · includes FormBuilder, ResponseViewer & ThemeEditor.

Scope

Things you should know before you rely on it.

Better to find these here than three days into a project.

5 open gaps
Every one of these is on the roadmap or explicitly out of scope — none of them is an oversight. If one of them blocks you, say so in an issue and it moves up.
01
React only

The core is framework-free by design and ships no UI, but React is the only renderer that exists today. Another framework means writing that layer yourself.

02
Schemas are written, not drawn

A visual builder exists and ships in Pro. On the free tier, schemas are hand-written or started from one of the 16 templates.

03
Four adapters, not an ecosystem

http, supabase, postgres and webhook are included. Anywhere else is a small adapter you write — the interface is one method, but it is still work.

04
Docs cover the common path

Getting started and the field reference are complete. The deeper guides are thin, and some of the API is documented only by its TypeScript types.

05
Releases are irregular

This is one developer working evenings and weekends. Issues get read; timelines are not promised.

Status

Where it stands right now.

Stated plainly, and kept current — the release figure below comes from the changelog, not from this page.

Latest release
@squaredr/fieldcraft-core 1.7.0
Published 2026-08-27. Full history in the changelog.
What I’m doing next
Writing down how the engine actually works, so the next fix doesn’t start with an hour of reading my own code.
If you want to help
Use it and tell me what broke. Bug reports with a schema attached are the most useful thing I get.
Try it

Install it, write a schema, render a form.

Nothing to sign up for. It’s on npm, the source is on GitHub, and the licence is MIT.

The four packages
@squaredr/fieldcraft-core
Engine, types, validation, expressions
MIT
@squaredr/fieldcraft-react
Renderer, steps, drafts, themes
MIT
@squaredr/fieldcraft-adapters
HTTP, Supabase, Postgres, webhooks
MIT
@squaredr/fieldcraft-templates
Starter schemas for common forms
MIT