Open source · Zod & ArkType

Build typed forms from the schemas you already have.

FormAdapter turns your schema into a React form, keeps the original validation authoritative, and renders through DaisyUI or your own design system.

bun add @formadapter/react @formadapter/daisyui zod daisyui

React 19 · DaisyUI 5 · Next.js and TanStack Start · MIT licensed

signup-form.tsx

Create your workspace

This form is rendered directly from the schema.

Account type

Typed output

z.output
Submit the form to see its schema output.
  1. 01
    DefineZod or ArkType
  2. 02
    CustomizeLabels and widgets
  3. 03
    RenderDaisyUI or yours
  4. 04
    SubmitFully typed values

One schema, the whole form

Less form code without losing control.

FormAdapter handles the repetitive runtime work and leaves the data contract and interface in your hands.

The schema stays authoritative

Constraints, refinements, defaults, and transforms remain in Zod or ArkType instead of being copied into form code.

Schema support →

Set the UI once

Mount a DaisyUI provider at the root, extend it, or replace it with a complete adapter for your own design system.

Adapter scopes →

Hard form behavior is included

Conditional fields, wizards, drafts, async checks, arrays, files, focus management, and server errors share one runtime.

Form behavior →

Server errors

Errors return to the field that owns them.

The same result shape works with Next.js, TanStack Start, oRPC, and regular HTTP.Explore server integrations →
Rendered formServer field error
actions.tsServer Action
"use server";

import { createNextAction, fieldError } from "@formadapter/nextjs";

export const saveProfile = createNextAction(
  profileSchema,
  async (profile) => {
    if (await emailExists(profile.email)) {
      throw fieldError("email", "Already registered");
    }

    return save(profile);
  },
);

Bring a schema. Ship the form.

Start with DaisyUI today. Replace the UI when you need to.

Read the setup View on GitHub