diff --git a/packages/form/README.md b/packages/form/README.md
new file mode 100644
index 000000000..eec87b9f3
--- /dev/null
+++ b/packages/form/README.md
@@ -0,0 +1,560 @@
+
+
+
+
+# @solid-primitives/form
+
+[](https://bundlephobia.com/package/@solid-primitives/form)
+[](https://www.npmjs.com/package/@solid-primitives/form)
+[](https://github.com/solidjs-community/solid-primitives#contribution-process)
+
+Reactive form primitive for Solid.js. Tracks field values, validation errors, touched state, and submission status — all as fine-grained signals that compose naturally with the rest of the Solid reactive graph.
+
+Bring your own validation: validators are plain functions `(value) => string | null | Promise`, so any schema library (Zod, Valibot, Arktype, …) wires in with a one-line adapter. Async validators (uniqueness checks, server-side rules) are first-class.
+
+## Installation
+
+```
+npm install @solid-primitives/form
+# or
+yarn add @solid-primitives/form
+# or
+pnpm add @solid-primitives/form
+```
+
+## `createForm`
+
+Creates a reactive form with per-field signals, derived validity state, and helpers for binding fields to DOM inputs.
+
+```tsx
+import { createForm } from "@solid-primitives/form";
+
+function LoginForm() {
+ const form = createForm({
+ fields: {
+ email: { initial: "", validate: isEmail },
+ password: { initial: "", validate: [minLength(8), hasUppercase] },
+ },
+ onSubmit: async values => {
+ await api.login(values);
+ },
+ });
+
+ return (
+
+ );
+}
+```
+
+### Configuration
+
+`createForm` accepts a config object:
+
+| Property | Type | Description |
+|----------|------|-------------|
+| `fields` | `Record` | Field definitions (see below) |
+| `onSubmit` | `(values) => void \| Promise` | Called with all field values when the form submits and all fields are valid |
+| `validateOn` | `"change" \| "blur" \| "submit"` | Default display timing for field errors. Defaults to `"change"`. |
+
+**`FieldConfig`**
+
+| Property | Type | Description |
+|----------|------|-------------|
+| `initial` | `V` | Initial value for the field |
+| `validate` | `ValidatorFn \| ValidatorFn[]` | One or more validator functions. Validators run in order; the first failure is the error. |
+| `validateOn` | `"change" \| "blur" \| "submit"` | When to display this field's error in the UI. Overrides the form-level `validateOn`. |
+
+A **`ValidatorFn`** is any function with the signature `(value: V) => string | null | Promise` — returning an error message string on failure, `null` when valid, or a Promise that resolves to either.
+
+### Per-field API
+
+Each entry in `form.fields` exposes:
+
+| Member | Type | Description |
+|--------|------|-------------|
+| `value()` | `Accessor` | Current field value |
+| `error()` | `Accessor` | First validation error, or `null` if valid. Respects `validateOn`. |
+| `touched()` | `Accessor` | Whether the field has been blurred |
+| `pending()` | `Accessor` | `true` while an async validator is in flight for this field |
+| `setValue(v)` | `(v: V) => void` | Imperatively set the value |
+| `setTouched(v)` | `(v: boolean) => void` | Imperatively set the touched flag |
+| `setError(msg)` | `(error: string \| null) => void` | Inject an external error (e.g. from a server response). Cleared automatically when `setValue` is called. |
+| `reset()` | `() => void` | Reset this field to its initial value and clear touched |
+
+### Form-level API
+
+| Member | Type | Description |
+|--------|------|-------------|
+| `dirty()` | `Accessor` | `true` when any field differs from its initial value |
+| `valid()` | `Accessor` | `true` when all fields pass validation and no async validators are pending |
+| `pending()` | `Accessor` | `true` while any field has an async validator in flight |
+| `submitting()` | `Accessor` | `true` while `onSubmit` is in flight |
+| `submitted()` | `Accessor` | `true` after the first submit attempt; reset by `reset()` |
+| `values()` | `Accessor` | Plain object of all current field values |
+| `errors()` | `Accessor>>` | Object containing only **field-level** errors (always reflects true validity, regardless of `validateOn`). Cross-field errors registered via `validate()` are not included — access those through the accessor each `validate()` call returns. |
+| `bind(name)` | Ref directive factory | Wires an `` or `