@formisch/qwik Adapter#
@formisch/qwik is the Qwik-specific adapter for Formisch — a schema-first, headless form library with a framework-agnostic core . It manages form state and validation using Valibot schemas and is type-safe end-to-end.
Install:
npm install valibot @formisch/qwik
The adapter lives at frameworks/qwik/ in the monorepo. Its package.json declares the package as @formisch/qwik with entry point ./dist/index.qwik.js. The public API is re-exported from three sources via src/index.ts: shared types from @formisch/core/qwik, methods from @formisch/methods/qwik, and Qwik-specific components and hooks.
Signal-Based Reactivity#
Formisch achieves native reactivity without a runtime abstraction layer. Instead of wrapping framework signals, it swaps them in at build time via a rolldown plugin that redirects @formisch/core imports to the appropriate index.{framework}.ts file .
For Qwik, the bridge lives at packages/core/src/framework/index.qwik.ts. It simply re-exports createSignal and untrack from @qwik.dev/core , meaning form state runs on native Qwik signals with no overhead. Two additional details:
batchis a no-op in Qwik because Qwik handles batching natively .- A
framework: 'qwik'constant identifies the active framework at the module level .
Core API#
useForm$#
The primary entry point. It creates a reactive form store from a Valibot schema . The config is passed as a factory function QRL:
const loginForm = useForm$(() => ({ schema: LoginSchema }));
⚠️ Breaking change in v0.10.0: the config was changed from an object to a factory function. Update all calls from
useForm$({ ... })touseForm$(() => ({ ... })).
Internally, useFormQrl uses useConstant to create the store once and wraps boolean state as createComputed$ signals (isTouched, isEdited, isDirty, isValid) so Qwik's fine-grained reactivity kicks in at field level . The exported useForm$ is created via implicit$FirstArg to enable Qwik's QRL lazy-loading.
Other Hooks & Components#
| Export | Purpose | Source |
|---|---|---|
useField | Reactive store for a single field | |
useFieldArray | Reactive store for dynamic field arrays | |
<Form /> | Thin wrapper over <form> handling submit/validation | |
<Field /> | Connects an input to field state via render$ prop | |
<FieldArray /> | Renders dynamic array fields |
Methods from @formisch/methods (e.g., reset, validate, setInput, getErrors) are also re-exported and can be used with any form store .
Full API reference: formisch.dev/qwik/api
Peer Dependencies & Compatibility#
| Dependency | Required Version |
|---|---|
@qwik.dev/core | >= 2 (Qwik 2.0) |
valibot | ^1.4.1 |
typescript | >= 5 (optional) |
The package is developed against @qwik.dev/core@2.0.0-beta.5 . The Node.js engine constraint is ^18.17.0 || ^20.3.0 || >=21.0.0 .
For TypeScript users, enable "strict": true in tsconfig.json; minimum supported version is 5.0.2 .
Versioning#
@formisch/qwik uses framework-specific git tags of the form v{version}-qwik (e.g., v0.14.0-qwik, v1.0.0-rc.0-qwik). Each framework adapter in the monorepo has its own independent version progression — for example, on June 22, 2026, Qwik was at v0.14.0 while other adapters were at lower minor versions.
The current release is v1.0.0-rc.0 (June 23, 2026) . All adapter changelogs are maintained at frameworks/qwik/CHANGELOG.md.