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.
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 |
1.33.2 [6]
|
2.0M[7] | 6.6k[8] | 17.84[30] | 91 | 60 | 142[9] | 2026-07-13 | WWDWW | Healthy, post-v1 |
| 3 | 241k[11] | 2.6k[12] | 10.61[31] | 45 | 8 | 72[12] | 2026-06-07 | WDWDW | Alive, bus-factor 1 | |
| 4 | 31k[24] | 972[24] | — | 18 | — | — | 2026-07-04 | WDDWD | Tiny but current | |
| 5 | 2.5k | 1.0k[97] | 6.39[97] | — | — | — | 2026-06-23 | ····W | Too new to bet on | |
| 6 |
7.0.1 [19]
|
551k[20] | 7.4k[21] | 10.85[33] | 360 | 15 | 24[21] | 2026-05-05 | LLDLL | Maintenance limbo |
| 7 | 4.3M[14] | 34.3k[15] | 13.12[32] | 704 | 132 | 0[15] | 2025-11-10 | LLLLL | Zombie |
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].
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.
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.
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].
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.
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].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.setState per keystroke; issue #3400 measures 3 renders on a single keystroke [49]. No escape hatch — architectural, and it multiplies with field count.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].
Blog numbers (the perennial "RHF is 8.5 kB") are stale. Bars below are Bundlephobia min+gzip, measured 2026-07-13.
Runtime deps tell a second story: RHF ships 0 [44]; TanStack 2 direct [42]; Formik ships 8 — including both lodash and lodash-es [43].
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.
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.
End-to-end schema → name → value inference. Conform ≥ TanStack Form > RHF ≫ Formik ≈ React Final Form.
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.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].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].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].
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].
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.
register passes the real ref; useFieldArray id→key, keyName removed; watch(callback) → subscribe(); setValue no longer overwrites field arrays → replace() [5].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].<Field>-render-prop + controlled-value models, so the shape survives: <Field name>→<form.Field name children={(field)=>…}>, values→field.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.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].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].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.final-form core with multiple bindings — but stagnant [18]. Architecturally frozen: no React 19, no Server Actions, no compiler story.<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].
⚠ 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."
"I would move on to React Hook Form if you're starting fresh."
"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."
"We started with react-hook-form and switched to TanStack Form."
"React Hook Form remains the default choice for most React applications in 2026."
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].
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].
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].
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].
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].
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].
No React 19 story, no compiler story, worst TS story, 360 stale issues [21]. Legacy-only.
This table is one angle in the Building forms in React in 2026 expedition.
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.