Questions + logic in, production form out

The form frameworkbuilt for agents.

Your agent writes the questions and logic. Open Form handles everything that makes them a form — validation, steps, submissions, storage and responses.

Get started

Live demo

localhost:3000/f/meetup

The real runtime: validation, conditions and steps all work. Themes

How it works

Three steps to live responses.

Scaffold once, prompt your agent, then ship one server. No builder, no backend to write.

  1. 01

    Spin up a workspace

    One command scaffolds forms/, themes/, the agent skills and Studio. No database to provision.

    $npm create open-form@latest my-forms
    ✓ studio on :3000
  2. 02

    Ask your agent

    It proposes three visual directions, then writes the questions and logic as one small file.

    ›/create-form RSVP for our meetup
    ClaudeCodexCursorGemini CLI...
  3. 03

    Share it, collect responses

    Build and start one Node server. Responses land in SQLite and show up in Studio.

    $pnpm build && pnpm start
    ✓ responses in sqlite
Features

Just React. And everything around it.

No builder, no schema to keep in sync. A form is a component in your repo — the runtime, the API, the database and the dashboard come with it.

Fields docs
forms/beta/index.tsx
import { defineForm, Email, Form, Select, Submit, Text } from '@open-form-build/core';
 
export const config = defineForm({ title: 'Join the beta' });
 
export default function Beta() {
return (
<Form>
<Text name="name" label="Name" required />
<Email name="email" label="Work email" required />
<Select name="team" label="Team size" options={sizes} />
<Submit>Request access</Submit>
</Form>
);
}
live form

Each field brings its label, validation and ARIA. Submit it empty: the browser shows the same errors the server would return.

A form is a file.

Fields, pages and conditions are components in one .tsx file. Open Form renders it once on the server to learn its fields, so the browser and the API enforce the same rules.

/create-forma meetup registration, 100 seats
ClaudeCodexCursorGemini CLI...

Prompt to form.

/create-form asks what it needs, proposes three visual directions for your audience, then writes and checks the form.

POST /api/forms/meetup/submissions201 Created
  1. same-origin · JSONok
  2. windowopen until Oct 30
  3. honeypotempty
  4. timing token4.2s ≥ 2s
  5. rate limit1 / 10 per 10m
  6. validate9 fields, 0 errors
  7. uniqueBy emailnew
  8. maxResponses48 / 100
.open-form/open-form.dbstored as response #48

The backend is included.

Server validation, honeypot, signed timing token, rate limits, response caps and one-per-email — stored in SQLite with no infrastructure to run.

Studio · meetup · Responsesxlsxcsvjson
#NameSubmitted
48Mei Chenjust now
47Kenji Mori2m ago
46Priya Shah9m ago
45Tom Becker21m ago

Responses, not a database.

Studio lists every response with search, detail and delete. Export to Excel, CSV or JSON, or send each one to a webhook.

forms/meetup/index.tsx
<Page title="About you">
<Text name="name" label="Name" required />
<Tel name="phone" label="Phone" description="Only if the venue changes." />
</Page>
AgentApplied · marker removed

Comment. The agent applies.

Select anything in Studio's Edit mode and leave a note. It lands in the source; /apply-comments makes the change.

  • classic
  • editorial
  • terminal
  • brutalist
  • conversational

Designed, not defaulted.

Five starters to start from. Each form keeps its own copy of its theme, so the look is yours to change. Or have /create-theme match your design system.

FAQ

Questions, answered.

Ship a form in the next minute.

One command, zero infrastructure. Free and open source under the MIT license. Your agent takes it from here.

Read the docs