Comparison

Formisch is one of several form libraries available for Angular. The most common alternatives are Angular's built-in Reactive Forms, the newer Signal Forms, ngx-formly, and TanStack Form. This page is meant as a quick reference for picking the right tool.

At a glance

FormischReactive FormsSignal FormsTanStack Form
Type sourceInferred from schemaDeclared manuallyInferred from model signalInferred from defaultValues
Validation locationDefined in schemaValidator functions per controlSchema function or Standard SchemaPer-validator config
Validation timingForm-wide validate / revalidatePer control (updateOn)Continuous, signal-drivenPer-validator trigger
Async validationBuilt-in via schemaAsync validatorsBuilt-in (validateAsync)Built-in isValidating
Reactivity scopePer signal subscriptionRxJS observablesPer signal subscriptionPer TanStack Store subscription
Schema librariesValibotStandard SchemaStandard Schema
UI approachHeadlessHeadlessHeadlessHeadless
Bundle size (min+gzip)From ~4.5 kBBundled with AngularBundled with Angular~15 kB
Framework supportAngular, React, Preact, Solid, Svelte, Vue, QwikAngularAngularReact, Vue, Solid, Svelte, Lit, Angular

The table is intentionally short. It only covers the dimensions that most often drive a library choice in practice. Other differences such as devtools, ecosystem maturity, and community size are real but tend to matter less than how each library handles types, validation, and reactivity.

Note that Signal Forms is Angular's newer, signal-based forms API. Check the Angular documentation for its current stability status before adopting it in production.

Why Formisch?

Three reasons to pick Formisch over the alternatives above:

One schema, no second source of truth. A single Valibot schema is everything the form needs: the runtime validator, the source of types, and the description of the form's structure — all at once. There is no FormGroup shape to declare next to an interface, no Validators list to keep aligned with your model, no resolver to configure. When the schema changes, every part of the form follows — at compile time and at runtime.

A small, tree-shakable bundle. A form with the directives and injectForm starts at ~4.5 kB min+gzip and grows only as you import additional methods like focus, getInput, and reset — methods you don't import don't end up in your bundle. Angular's built-in form libraries ship with the framework, but compared to other third-party form libraries Formisch is several times smaller.

Type safety that stays fast. Types flow from the schema through every API, including deeply nested paths and field arrays — and through your templates, since the structural directives declare a typed template context. With strictTemplates enabled, an invalid path or a mistyped field is a compile error. The inference is structured to keep TypeScript editor performance from degrading as schemas grow.

Which library should you use?

Reactive Forms is the battle-tested default that ships with Angular. It has the largest ecosystem, works in every Angular version, and integrates with everything. The trade-offs are that types are declared by hand rather than inferred, validation logic is spread across Validators on individual controls, and its state is RxJS-based rather than signal-based.

Signal Forms is Angular's signal-native successor to Reactive Forms, deriving a form from a model signal and supporting Standard Schema validation. It's a strong fit if you want to stay entirely within the framework and are comfortable adopting a newer API.

ngx-formly is schema-driven in a different sense: you describe your fields as JSON-like configuration and it renders the UI for you, with adapters for Material, PrimeNG, and others. Best when your forms are generated dynamically from server-side definitions rather than written by hand.

TanStack Form is a good fit when you need fine-grained control over validation timing and built-in async validation handling without building that infrastructure yourself. It is also the natural choice if your team already uses TanStack libraries and values a consistent mental model across data fetching, routing, and forms.

Formisch makes the most sense for new projects in TypeScript-heavy codebases, especially when you expect forms to grow in complexity, and when the same team also writes forms for other frameworks and wants one mental model across all of them. The schema-first design means there is a single source of truth for types, runtime validation, and form structure. Reactivity is fine-grained through signals, so it works naturally with OnPush and zoneless change detection. The main consideration is that Formisch currently supports only Valibot as the schema library.

Migrating to Formisch

Migrating to Formisch is not a drop-in replacement, but the libraries can coexist in the same application, so you can migrate one form at a time. The main work is consolidating validation rules into a single root Valibot schema and replacing the previous library's form and field APIs with Formisch's functions and directives.

We provide a dedicated migration guide for each library, with a side-by-side example, step-by-step instructions, and an API mapping table: migrate from Reactive Forms and migrate from TanStack Form.

Next steps

If you have decided that Formisch is a good fit, install it via the installation guide and start building by defining your form.

Contributors

Thanks to all the contributors who helped make this page better!

  • GitHub profile picture of @fabian-hiller

Partners

Thanks to our partners who support the project ideally and financially.

Sponsors

Thanks to our GitHub sponsors who support the project financially.

  • GitHub profile picture of @vasilii-kovalev
  • GitHub profile picture of @UpwayShop
  • GitHub profile picture of @ruiaraujo012
  • GitHub profile picture of @hyunbinseo
  • GitHub profile picture of @nickytonline
  • GitHub profile picture of @kibertoad
  • GitHub profile picture of @caegdeveloper
  • GitHub profile picture of @Thanaen
  • GitHub profile picture of @bmoyroud
  • GitHub profile picture of @ysknsid25
  • GitHub profile picture of @dslatkin