Krishna Bhupathi

Fig. 2

Formwise

A drag-and-drop form builder.

A 90-second walkthrough with narration and captions. Sound plays only when you press play.

The problem

A simple intake form often means a heavy form tool or hand-written code. Formwise lets you drag questions onto a page, add show-if rules and publish a link, with no account. Or describe the form and edit Claude’s draft.

For small teams that need intake or sign-up forms, and for apps that embed them, like Slotwise.

The product

The Formwise builder: field types on the left, the form printed on green-bar paper in the middle with a yellow condition tag, and the properties panel on the right.
The builder. The yellow tag marks a question that depends on another answer.
A published Formwise form titled “Before your first lesson”, with numbered questions on green-bar paper and a Submit button.
A published form. Slotwise shows these same questions when a student books A-level Physics.

Hard problems

  • Edits that can’t break the form

    Moving or deleting a question can break a show-if rule that points at it. Every edit is a command run through one pure reducer. When an edit breaks a rule, the reducer removes it and the builder says which question lost it. A property test applies 300 random edits and checks the form is still valid after each.

  • One set of rules everywhere

    The builder preview, the public form, the API and Slotwise all check answers with the same two functions from one shared package. A form can’t pass in one place and fail in another. Each answer records the form version it was given against, so publishing a change never rejects someone who is halfway through.

  • AI output treated as untrusted input

    Claude fills a small draft format through structured outputs. The server turns the draft into a real form and validates it like any import. If that fails, the exact errors go back to the model once. Descriptions are length-limited and rate-limited per address, with a daily cap.

Measured

8 / 81
Descriptions that gave a valid form
4.45 s1
Median time from description to form
982
Lighthouse mobile performance, builder
140 + 163
Unit and API tests, plus browser test runs

How it’s built

  • Vite and React, Zustand, dnd-kit
  • Hono API on Vercel Functions
  • Postgres on Neon, Drizzle ORM
  • Zod schema, shared renderer package
  • Claude Opus 5.5 with structured outputs
  • Vitest with PGlite, Playwright
How Formwise is builtThe form owner uses the builder and the respondent uses the public form. Both call the Hono API, which stores forms and answers in Postgres and asks Claude for drafts. The builder, the public form, the API and Slotwise all import the same renderer package, and Slotwise fetches published forms from the API.Form ownerRespondentBuilderVite + React, dnd-kitPublic form /f/:idHono APIVercel FunctionPostgres (Neon)forms, versions, answersClaude Opus 5.5structured outputs@formwise/rendererschema, validation, <FormRenderer>Slotwiseintake questions
Solid arrows are requests; dashed arrows are code imports. Every part imports the same renderer package, so a form is checked the same way everywhere.

More decisions and their trade-offs are in the README.

Sources

  1. “Describe your form” on Claude Opus 5.5: 8 of 8 descriptions returned a valid form. End to end from India to the US region, median 4.45 s, range 2.91–7.67 s. Measured 15 Oct 2026. Source: formwise-builder/docs/measurements.
  2. Formwise builder, Lighthouse mobile: performance 98, accessibility 100, LCP 1.8 s. Median of 3 runs, Lighthouse 12.8.2, measured 14 Oct 2026 from India against production. Source: formwise-builder/docs/measurements.
  3. Formwise tests as of 15 Oct 2026: 140 Vitest tests and 16 Playwright runs (15 pass, 1 skipped by design on mobile), green in CI. Source: formwise-builder README.