Model or dataset
formkit/formkit avatar
formkit/formkit

FormKit puts validation on the field and the hard inputs behind a paywall

The form framework for coding agents

4,762 stars208 forksTypeScriptMIT

At a glance

What is it?
FormKit renders a whole field from one component with validation declared inline, and structures form data automatically through its node primitive. The open source tier covers native HTML inputs, and the complex inputs are a commercial product.
Who is it for?
FormKit suits a team on React 18 or 19 or Vue 3 where forms are a large part of the product, where one declaration per field beats maintaining markup and a separate validation schema, or where forms are generated from JSON at run time. It is the wrong fit when you already have a design system whose inputs are built, since the library would be rendering components you own, and it rules out Svelte, Angular and Solid entirely.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 55 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

A mature form library that repositioned itself around agents

FormKit describes itself now as the form framework for coding agents, and the claim deserves unpacking rather than accepting or dismissing. The library is not new. What is new is the argument that its existing design happens to suit code written by a model.

The argument runs like this. Forms are verbose in most frameworks: a field means an input, a label, a validation rule declared somewhere else, an error display, and wiring between them. That verbosity is where a generator goes wrong, because there are many places to be inconsistent. FormKit collapses a field to one component with its validation declared inline, so there is less surface on which to be wrong.

That is a real argument and it applies equally to people. A compact, consistent API is easier for anyone to produce correctly, and the agent framing is a marketing frame on a design decision that predates it. Nothing here is dishonest, and a reader should separate the positioning from the engineering underneath.

The node is the actual primitive

Underneath the component sits the piece the project considers its contribution. Every FormKit component owns a node, and nodes structure data across components at any depth automatically.

The practical effect is on nesting. A group type nests its children as an object and a list type nests them as an array, so the shape of your data mirrors the shape of your markup without mapping code between them. That removes the class of bug where the form state and the submitted payload drift apart, and it removes prop drilling and ad hoc stores for form state specifically.

This is the feature that makes the agent claim more than branding. A system where data shape follows component shape has one representation rather than two to keep synchronised, and it is inherently easier to reason about for a generator and a reviewer alike.

The architecture keeps the core framework agnostic, with separate packages for the node tree and schema compiler, the validation engine, the rules, internationalisation, input definitions and themes, and then thin bindings for React 18 and 19 and for Vue 3. The same validation rules and schemas work across both, which matters for a team running two front ends.

Setting up an agent, and the shape of a form

The project ships a command that configures a coding agent for working with the library, detecting your framework and installing documentation and conventions for it.

bash
npx formkit skill

The README lists support for several agent tools including Claude Code, Codex, Cursor, Cline, Gemini, OpenCode and Amp. Worth knowing before running it: this writes configuration into your project so your agent has the library's current guidance rather than whatever it recalls, which is a sensible answer to models producing outdated patterns for a library that has changed.

A form itself is the compact part. Each field is one component carrying its type, name, label and validation rules together.

js
<FormKit type="form" onSubmit={handleSubmit}>
  <FormKit type="text" name="email" label="Email" validation="required|email" />
  <FormKit type="password" name="password" label="Password" validation="required|length:8" />
</FormKit>

The README's claim for that snippet is that it produces a fully accessible form with labels, validation, error messages, loading state and submit handling. Rules are piped together as a string, and the library ships more than thirty of them built in, with accessibility attributes generated rather than written by hand. Forms can also be generated entirely from JSON through the schema system, with conditionals, loops and expressions, which is the serialisable path for anything building forms at run time.

What is free and what is not

The licensing sentence in the README is precise, and precision there is the thing to notice. FormKit supports its whole feature set for native HTML inputs, and it is MIT licensed, permanently.

Native HTML inputs means text, select, checkbox, textarea and their relatives. The inputs that make a complex interface complex are a separate commercial product: autocomplete, date picker, repeater, colour picker, drag and drop, mask, rating, slider, tag list and toggle. They are built on the same node and schema system, so they compose with everything else, and they are not part of the open source project.

This is a fair arrangement and it is the single most important thing to establish before adopting. A registration form or a settings page needs nothing beyond the free tier. Anything with a date field, and most business applications have one, meets the boundary immediately. The open source library is genuinely usable rather than a demonstration, and the shape of your forms decides whether you are looking at a free dependency or a purchase.

The project is also sponsor supported, with tiers listed in the README, which is a reasonable way to fund the part that stays free.

React Hook Form is the alternative, and the split is over rendering

In React the most common alternative is a library that manages form state and leaves the markup to you, usually paired with a separate schema validator.

The difference in approach decides most adoptions. A state-only library never renders anything: you write the input, the label and the error display yourself, and the library tracks values, touched state and errors, with validation supplied by a schema you define separately. You keep total control of markup and styling, you integrate with any component library, and you accept that accessibility, error display and layout are your work, repeated per field.

FormKit takes the opposite position. It renders the field, generates the accessibility attributes, displays errors and handles submit state, and in exchange you work within its component and its theming system. Validation lives on the field rather than in a separate schema, which is the co-location the agent argument rests on.

Choose the state-only route when you have an established design system and your inputs already exist as components, since FormKit would be rendering things you have already built. Choose FormKit when forms are a large share of the application, when you want one description of a field rather than two, or when you are generating forms from JSON at run time, which the state-only libraries do not address.

Release cadence, repository signals and the platform floor

FormKit is MIT licensed with copyright held by a company, which is the usual structure for an open core project and is worth knowing when weighing how the free and paid boundary might move.

The two most recent releases, 2.1.1 and 2.1.2, were both published on 2026-07-24, and both are bug fix releases. Their contents are mundane in the way healthy maintenance is: a node lifecycle fix during server side rendering, removal of parentless nodes, a guard against repeated configuration removal, and continuous integration changes pinning a publishing action and a supported runtime version. The last push was on 2026-07-24.

The repository is a monorepo using pnpm workspaces, with end to end tests under Playwright, unit tests under Vitest, commit linting and formatting configuration. It also carries agent configuration files of its own, so the team is using coding agents on the library that is being marketed to coding agents. Support covers React 18 and 19 and Vue 3, and nothing else, which rules it out for Svelte, Angular or Solid.

Internationalisation ships with more than thirty languages swappable at run time, which is unusual to find included rather than bolted on, and one fewer decision for teams shipping in several markets.

Editorial conclusion

FormKit suits a team on React 18 or 19 or Vue 3 where forms are a large part of the product, where one declaration per field beats maintaining markup and a separate validation schema, or where forms are generated from JSON at run time. It is the wrong fit when you already have a design system whose inputs are built, since the library would be rendering components you own, and it rules out Svelte, Angular and Solid entirely. Settle the tier question before writing any code: the MIT project covers the full feature set for native HTML inputs, while autocomplete, date picker, repeater, mask and slider belong to the commercial Pro product, so audit your field list for a date picker first.

Frequently asked questions

Is FormKit free to use?

The open source project is MIT licensed and supports its whole feature set for native HTML inputs such as text, select and checkbox. Complex inputs including autocomplete, date picker and repeater belong to FormKit Pro, a separate commercial product built on the same node and schema system.

Which frameworks does FormKit support?

The framework-agnostic core is paired with bindings for React 18 and 19 and for Vue 3. The same validation rules, schemas and plugins work across both, and no other framework bindings are listed.

What does npx formkit skill do?

It configures a coding agent to work with FormKit, detecting your framework and setting up the relevant documentation and conventions. The README lists support for tools including Claude Code, Codex, Cursor, Cline, Gemini, OpenCode and Amp.

How does FormKit structure submitted form data?

Every component owns a node, and nesting determines shape automatically: a group type nests its children as an object and a list type nests them as an array. The data shape mirrors the component shape without separate mapping code.

Official sources

  1. formkit/formkit on GitHub
  2. License: MIT
  3. Project website
  4. README
  5. Releases
Community notes

Community notes