← Default view
A floodlit football stadium at night, full stands, seen from behind the terrace steps
React Forms League · Season 2026 · Table correct as of 13 July

The Form Table

Seven clubs. Every figure below was pulled from the npm registry and the GitHub API on 2026-07-13 — no vendor blogs, no survey percentages, no vibes. One champion, one genuine title challenger, and a side pulling 4.3 million a week that hasn't kicked a ball since 2020.

Full time
React Hook Form — Champions
Retains the title. Burden of proof is on anything else.
58.0M gate / week [2]
44.8k stars [3]
3 open issues [3]
175 commits / 6mo [3]
v8 in beta [5]
Matchday 13 · July 2026

League Table

Ordered by verdict, not by gate receipts — because the two disagree violently, and that disagreement is the whole story.

# Club Gate / wk kB Iss PR Com 6mo Last ball kicked Form Verdict
1
7.81.0 · 8.0.0-beta.3 [1]
58.0M[2] 44.8k[3] 12.87[29] 3 42 175[3] 2026-07-05 WWWWW Dominant, accelerating
2 2.0M[7] 6.6k[8] 17.84[30] 91 60 142[9] 2026-07-13 WWDWW Healthy, post-v1
3
1.19.4 [10]
241k[11] 2.6k[12] 10.61[31] 45 8 72[12] 2026-06-07 WDWDW Alive, bus-factor 1
4
8.1.3 [24]
31k[24] 972[24] 18 2026-07-04 WDDWD Tiny but current
5
1.0.0-rc.0 [108]
2.5k 1.0k[97] 6.39[97] 2026-06-23 ····W Too new to bet on
6 551k[20] 7.4k[21] 10.85[33] 360 15 24[21] 2026-05-05 LLDLL Maintenance limbo
7
2.4.9 [13]
4.3M[14] 34.3k[15] 13.12[32] 704 132 0[15] 2025-11-10 LLLLL Zombie
Champions — sign by default
Title challenger
Cup specialists — sign on condition
Relegation — do not sign

Gate = weekly npm downloads. kB = Bundlephobia min+gzip. Com 6mo = commits in the six months to 2026-07-13. Form is the one editorial column here — it is our read of each club's maintenance record over that window, not a metric anyone publishes. Every other cell is a figure from the npm registry or the GitHub API on 2026-07-13, cited in place.

RHF outweighs everything else combined by roughly 8×. Its 3-open-issue backlog at 44.8k stars is the standout maintenance signal in the set [3]. TanStack's 91-issue / 60-PR backlog against 6.6k stars is proportionally far worse — a small-team-under-load signal, and the thing to price in if you adopt it [8]. Its release cadence has slowed from ~8–9/month in 2025 to ~3 in 2026: post-v1 stabilisation, not decay, given 142 commits in H1 [9] [68].

VAR check — the table you were shown elsewhere

Do not quote the "State of React 2025" form-library percentages — the widely-repeated "TanStack Form 21% usage, up 8 positions" [27]. The primary survey has no form-library question at all: its library sections are UI, State Management, Data Loading, Back-End and Other Tools [26] [28]. The survey is real; those percentages are not attributable to it. That is why this table is built from npm and GitHub only.

A stadium scoreboard panel showing innings, runs and player numbers
The board doesn't lie. It just doesn't tell you everything.

Attendance is legacy, not form

Formik has the second-biggest gate in the league — 4.3M a week [14] — and zero commits between 2026-01-13 and 2026-07-13 [15]. Its last feature release was 2.4.0 in May 2023 [13]. The 2.4.8/2.4.9 pair were React-19 type patches published by the github-actions bot, not a human [16].

The repo is not archived and there is no official notice. The community issue "Is Formik no longer maintained?" (opened Aug 2022) is still open with no maintainer reply [17], as is its successor, literally titled "The best Form Library for react is abandoned?" [79].

4.3M weekly downloads is a crowd turning up out of habit — not a team on the pitch. Read the commit column, never the gate column.

Formik gate4.3M
Commits, 6 mo0
Open issues704
Also on the injury list

React Final Form — limbo, not death. After a 3-year gap the final-form core shipped 5.0.0 (2025-06-07), converting Flow→TypeScript, and 5.0.1 (2026-05-05) was "a big batch of bug fixes that have accumulated" [23] [18]. Bursty, not sustained: react-final-form had 0 commits in H2-2025 and 24 in H1-2026, with 360 open issues nobody works [21]. 7.0.1 was published by an account named erikras-richard-agent, not Erik Rasmussen personally [19]. No React 19, no Server Actions, no compiler story. HouseForm — dead (last release 2024-02-23) [25].

Defensive record

Goals conceded, per keystroke

The axis that actually separates these clubs. Note the distinction the marketing blurs: "no re-render" always means no form-level re-render — it does not always mean no field-level re-render.

React Hook Form native input + register
0
Clean sheet. State lives on the DOM node and an internal object outside React state; the node is written directly and no component renders [45].
Conform FormData, on demand
0
Clean sheet. Inputs stay native and uncontrolled; renders happen on validation events (blur/submit), not on input [52].
TanStack Form external store + useSyncExternalStore
1
One <form.Field> subtree. Fields are controlled render-props [96] — the form component itself does not render [50].
React Hook Form ⚠ any Controller-wrapped field
1
The asterisk on the clean sheet. A Controller-wrapped field is controlled, so that field renders — and with MUI / AntD / Radix components that don't expose a native value/onChange contract, that is every field [48].
React Final Form default subscription
ALL
Depends on the subscription you declare, and the default is pessimistic: "If no subscription is provided, it will default to subscribing to all form state changes" [53]. An unconfigured RFF form gets Formik-grade renders.
Formik one controlled values object in context
3
The whole form. setState per keystroke; issue #3400 measures 3 renders on a single keystroke [49]. No escape hatch — architectural, and it multiplies with field count.
VAR check — "RHF is fastest" is unverified

There is no credible cross-library benchmark in 2025–2026. Every comparison post is qualitative [54] [55] [58]. RHF's own benchmark repo — the one its FAQ links — is bluebill1049/react-hook-form-performance-compare, ⭐ 33, measuring mount time under 6× throttle against a Redux Form straw man, with no TanStack or Conform entrant [46].

The perf conclusion that matters: at scale all three modern libraries are fast by default and slow by misuse, and the variable is subscription placement, not library choice. The RHF maintainer's guidance on the canonical blowup — a large form with a root-level watch plus Controller-wrapped AntD inputs — is "subscribe as deep down the tree as possible" [48]. Every one of these libraries has that same trap under a different name: RHF's watch() re-renders the whole form [47]; TanStack's useStore without a selector re-renders the host component on any state change [50].

Pre-match weigh-in

Bundle size — measured, not quoted

Blog numbers (the perennial "RHF is 8.5 kB") are stale. Bars below are Bundlephobia min+gzip, measured 2026-07-13.

@formisch/react@1.0.0-rc.0
6.39 kB[97]
@conform-to/react@1.19.4
10.61 kB[31]
react-final-form + final-form
10.85 kB[33][34]
react-hook-form@7.81.0
12.87 kB[29]
formik@2.4.9
13.12 kB[32]
@tanstack/react-form@1.33.2
17.84 kB[30]

Runtime deps tell a second story: RHF ships 0 [44]; TanStack 2 direct [42]; Formik ships 8 — including both lodash and lodash-es [43].

VAR check — the ranking above is contested

Two of the better 2026 comparison posts measure TanStack Form as smaller than RHF: splitforms (esbuild, May 2026) gives TanStack ~6 kB vs RHF ~9 kB [54], LogRocket gives 9.6 vs 10.7 kB [87] — the inverse of the bars above. Likely explanation: tree-shaking depth. @tanstack/form-core shakes hard on a narrow import surface, while Bundlephobia measures the whole published package. Read the spread, not the ranking.

And the size argument is dead anyway. @hookform/resolvers is 0.55 kB [35] while zod@4 is 61.79 kB untreeshaken [36] — the schema library is the same order of magnitude as, or larger than, the form library. Every modern option lands somewhere in 6–21 kB. Nobody should choose a form library on 5 kB.

Conform is the smallest complete option and, being FormData-first, can run the same schema server-side and ship no client validator at all — an option the client-state libraries don't structurally have [52] [57]. TanStack's createServerValidate also validates server-side [101], but it still ships the client form model.

Referee's report

Three goals chalked off

Claims repeated across 2026 write-ups that do not survive the check.

"State of React 2025 says RHF 74%, TanStack Form 21%."

The survey has no form-library question. Its library sections are UI, State Management, Data Loading, Back-End and Other Tools [26] [28]. Use npm and GitHub numbers.

"RHF is 3× smaller than Formik."

12.87 kB vs 13.12 kB in July 2026 [29] [32]. The 8.5-vs-15 kB figure comes from RHF's own FAQ, citing 2022 versions [45]. The real win over Formik is the render model, not the bundle.

"RHF has no React Compiler or SSR support."

Per TanStack's own comparison table [51] — read it as marketing. RHF v8 beta's headline feature is zero-config React Compiler support [5], and the repo pushed on 2026-07-12 [3]. Conversely "RHF is legacy" is also false: 175 commits in six months.

Technical rating

TypeScript inference

End-to-end schema → name → value inference. Conform ≥ TanStack Form > RHF ≫ Formik ≈ React Final Form.

★★★★★
The schema is the single source of truth (useForm<Schema, FormValue, FormError>). No string-path union at all: FieldName is a branded string carrying phantom types, so names are produced via getFieldset() / getFieldList() [75] [76]. Sidesteps TS-perf and depth limits entirely — at the cost of the FormData straitjacket.
★★★★
Best path machinery in the set: DeepKeysAndValues indexes array elements properly, handles tuples, distributes over unions, propagates parent nullability [70]. Types come from defaultValues, not the schema [67]. Optional/union fields need a defaultValue expressing their full range or inference is wrong [82].
★★★★★
Truth is the hand-written useForm<T> generic — not the resolver schema; nothing enforces they agree. Non-tuple arrays index as ArrayKey = number, so items.${number}.name is accepted with no index checking [60] [61]. FieldValues = Record<string, any> [59]useFormContext returns any errors; the maintainer calls it "a current limitation with V7, fixed in the next major" — and v8 is still not GA [62].
★★★★
Nothing. FieldProps<V = any, FormValues = any>, name: string [77]. No path inference, no schema inference, no field-array typing. The TS guide only ever shows manually-supplied generics [78].
★★★★
Worst TS story of the five. FieldProps has _FormValues as a phantom (unused) parameter, name: string, and an [key: string]: any index signature that swallows typos [80]. withTypes<FormValues>() types Form/FormSpy but not Field [81].
Two RHF footguns an expert will hit

1 · The stringly-typed contract breaks at runtime. A field typed number silently becomes a string when edited, and TS cannot catch it — maintainer-confirmed [93].

2 · Generic field wrappers broke under Zod v4. Constraining TSchema extends z.ZodType makes z.infer<TSchema> resolve to unknown"Type 'unknown' does not satisfy constraint 'FieldValues'"; the current workaround is to constrain to z.core.$ZodType<any, any> [63]. Transforming schemas also force useForm<z.input<S>, unknown, z.output<S>> [64].

VAR check — TanStack's "no generics" claim

It breaks the moment you factor out a reusable field component. TanStack's own docs concede "a common criticism of TanStack Form is that it is verbose out-of-the-box", warn that the context escape hatch "will not warn you when the types do not align. You risk runtime errors", and note that chaining AppForm extensions "can lead to decreases in TypeScript performance" [69]. Community: "I can't figure out how to properly type form or field… you have to pass 10 type arguments" [71]. The sanctioned createFormHook + withForm answer still pushes you toward AnyFormApi/AnyFieldApi, "where type safety is lost" [72].

For reusable generic field components all of them degrade — but not equally. TanStack is the least bad, because createFormHook/withForm is at least a sanctioned, documented path [69]. RHF has no equivalent, and its useFormContext type loss is a known v7 limitation deferred to a v8 that has not shipped [62].

Transfer window

What a move actually costs

The only automated tool in the whole market is @hookform/codemod — and it only does v6→v7, last released Aug 2021 [86]. Nothing else here has a codemod. Every migration is hand-work, priced per form.

RHF v7 v8 (beta)
register passes the real ref; useFieldArray idkey, keyName removed; watch(callback)subscribe(); setValue no longer overwrites field arrays → replace() [5].
Free transfer~5 mechanical edits
Formik React Hook Form
Mental-model flip: controlled values → uncontrolled refs. <Formik>/useFormik()useForm(), <Field>register, useField()useController(). The two libs can coexist app-wide but not inside one form, so shared field components must be forked [85].
Moderatemechanical, form-by-form
Formik TanStack Form ◂ the surprise move
Not harder than Formik → RHF. Both are <Field>-render-prop + controlled-value models, so the shape survives: <Field name><form.Field name children={(field)=>…}>, valuesfield.state.value, Yup schema→validators (Standard Schema, no adapter) [96] [100]. If you're escaping Formik and were going to touch every field anyway, TanStack is not a bigger lift than RHF — it's a different one, and the usual "Formik→RHF is the obvious path" advice quietly assumes otherwise.
Moderatesame shape, new engine
React Final Form RHF
Closest exit from RFF. <Field> render-prop → register/useController; subscription objects → useWatch/useFormState. You gain a TS story RFF never had [80]. If you rely on the final-form core outside React, TanStack Form is the like-for-like target instead [18].
Moderateno codemod
RHF TanStack Form
A rewrite of the form layer. No official guide — TanStack ships only a comparison page [51]. register() string paths → <form.Field name validators children={(field) => …}> render props with manual field.state.value / field.handleChange. Every input component gets rewritten; validation moves from one resolver to per-field validators [96].
Club-record feerewrite the form layer
Anything Conform
Rewrite + server rework. You surrender client-owned form state. Needs a server action / Remix-style route action to submit to; in plain Vite + React "the ergonomics suffer because there's no server action equivalent" [92].
Club-record fee+ back-end work
Squad registration

Who can play in other competitions

TanStack Form
✓ The only real framework-agnostic core. @tanstack/form-core + 7 adapters; react / vue / solid / svelte / angular all at 1.33.2 — ⚠ preact lags at 1.30.2 and lit at 1.25.2 [73]. The cost is the render-prop <form.Field> scaffolding per field — the verbosity tax [69].
Conform
Fully headless, least markup opinion — but everything must be expressible as FormData, and non-native components (Radix/shadcn selects) bridge to a hidden native input via useControl [52]. @conform-to/dom exists but only a React adapter ships [10] — it couples upward to Remix/Next server actions instead [74].
React Hook Form
Fully headless, ✗ React-only. Uncontrolled/ref model; non-native components must go through Controller. No official React 19 position: the "React v19" discussion (#11832, opened Apr 2024) is still Unanswered in 2026 [103]. Its <Form action> + progressive: true POSTs to an HTTP endpoint, not a React Server Function [104]; bolted onto useActionState it needs hacks [105]. Best home: SPA / client-heavy.
React Final Form
Real final-form core with multiple bindings — but stagnant [18]. Architecturally frozen: no React 19, no Server Actions, no compiler story.
Formik
Only partly headless — ships <Field>, <Form>, <ErrorMessage> components. React-only. Yup-centric, no Standard Schema, no Server Functions.

Validation layer. Standard Schema is the common interface Zod / Valibot / ArkType / Effect now implement [109]. Only TanStack Form [100] and Conform [106] consume it with zero adapter code; RHF needs @hookform/resolvers [65] [102] — 0.55 kB, so this is ergonomics, not weight. TanStack has best-in-class Server-Function wiring (@tanstack/react-form-{nextjs,start,remix}, createServerValidate, a documented useActionState bridge) [101]; for Conform, server-first is the premise — the same schema runs in the server action and the client, so they cannot drift, and it works with JS off [52] [74].

Post-match panel

The pundits

⚠ Reddit blocks automated fetching, so this is Hacker News, GitHub discussions and blogs — not r/reactjs. Weight it accordingly.

"I haven't maintained Formik since 2020."
Jared Palmer, Formik's author, on X — the React-19 release was a Copilot dogfooding exercise [83]
"I would move on to React Hook Form if you're starting fresh."
johnrom, Formik collaborator [84]
"It's outdated and hasn't seen a real commit in years… its lack of updates have caused it to fall behind in terms of performance and new React features."
Practitioner stuck on Formik, Hacker News [89]
"We started with react-hook-form and switched to TanStack Form."
HN practitioner who made the move — but reports TanStack's dirty-tracking breaks when default state changes and type inference degrades on complex array types, forcing custom code [88]
"React Hook Form remains the default choice for most React applications in 2026."
The aggregator consensus — pkgpulse [95], splitforms [54], LogRocket [87] all land here; TanStack only for complex/nested forms or when already in its ecosystem
TanStack Form, sighted in production.
OpenAI's Codex desktop app ships @tanstack/react-form with React 19 [99]; small SaaS teams report it on Next + Zod for highly dynamic forms [98]
Manager's team talk

Who to sign

Sign by default

The burden of proof is on anything else. Pick it if you're building a SPA or a client-heavy app, you want the biggest ecosystem — 58M weekly downloads means every edge case is already answered on Stack Overflow [2] — and you can live with stringly-typed paths.

⚠ Plan for v8: public beta, breaking changes, no GA date [4] [5].

Sign on condition

Pick it if any of: (a) you ship the same form logic to more than one framework — it's the only library that genuinely delivers this [73]; (b) you have deeply nested / array-heavy forms where RHF's index-less ${number} paths hurt [70]; (c) you're already on TanStack Start; (d) you want first-party Server-Function wiring rather than community glue [101].

⚠ Budget for building a createFormHook wrapper layer on day one — the raw API is verbose by the maintainers' own admission [69]. The 91-issue / 60-PR backlog on a small team is the risk to price in [8].

Cup specialist

Pick it if progressive enhancement is a requirement (forms must work with JS disabled), or you're on Next App Router / React Router v7 and want one schema that provably cannot drift between client and server [52] [74].

⚠ Don't pick it for a multi-step wizard with cross-field live previews — there is no watch and no client value store to hang derived UI off [57]. Bus-factor 1, 241k weekly downloads: a thin ecosystem when you hit an edge [11].

No library at all
Play the academy

A real option for small forms — the Next-focused guides draw the line at roughly 1–5 fields [92] [54] — and it just got more legitimate: shadcn/ui went form-agnostic in Oct 2025, with a <Field> family supporting RHF, TanStack Form, React 19 useActionState and custom [90] [91].

One of the biggest structural reasons RHF was the default — "shadcn's <Form> is an RHF wrapper" — no longer holds. The critique that form libraries "re-create and manage the entire form's state in a separate JS object" instead of using FormData and ValidityState has more teeth now than it did in 2023 [94].

The option nobody names

Occupies Conform's progressive-enhancement niche with a more conventional API, ships current (8.1.3, 2026-07-04), and is the fallback if Conform's bus-factor-1 risk is disqualifying.

⚠ At 972 stars and 31k weekly downloads it trades one bus-factor problem for a smaller one [24].

Watch, don't bet

By Fabian Hiller (author of Valibot, co-author of Standard Schema). Signal-based, ~2.5 kB core, six frameworks, and the only library that derives types straight off the schema with no generic and no resolver — which it achieves by binding to Valibot only, rather than accepting any Standard Schema [107] [108].

⚠ Worth noticing: the Standard-Schema co-author's own form library does not consume Standard Schema — which tells you something about the ceiling on schema-derived inference through that interface. 1.0.0-rc.0, 2.5k weekly downloads: real, very early [97]. Its comparison blog is a competitor's vendor blog — directionally useful, adversarial by construction [55].

Never — for new work

Its author and its collaborator both say so [83] [84]. If you have it, the only question is migration budget — it is not a security or correctness emergency, so migrate opportunistically, form by form.

Only if you already have it

No React 19 story, no compiler story, worst TS story, 360 stale issues [21]. Legacy-only.

Official record

Where the numbers came from

Every figure in the table is a primary read of the npm registry or the GitHub API on 2026-07-13. These are the ledgers.

Scoreboard — a view of the canonical report. All figures pulled 2026-07-13 from the npm registry and the GitHub API; bundle sizes from Bundlephobia and bundlejs on the same date. Stars use the canonical's format (⭐ 44.8k). The Form column in the league table is editorial, not sourced; every other cell carries its citation. The full report carries all 109 citations and the reasoning behind each verdict.