Your forms are software.

Define forms in JSX. Self-host with Docker. Get backend validation, autosave, and conditional logic — on infrastructure you control.

One component = UI + server validation + zero duplication.

onboarding.tsx
import { Form, Section, Question, Row } from '@formdsl/react'

export default function Onboarding() {
  return (
    <Form id="onboarding" version="2.1" autoSave>
      <Section title="Company">
        <Question id="name" type="text" required
          label="Legal Entity Name" />
        <Row>
          <Question id="ein" type="text" format="ein"
            required label="EIN" />
          <Question id="state" type="select"
            label="State" options={usStates} />
        </Row>
      </Section>

      <Section title="Contact">
        <Question id="email" type="email" required
          label="Work Email" />
        <Question id="phone" type="tel"
          format="phone" label="Phone" />
      </Section>
    </Form>
  )
}
Why self-host

Complete control. Zero vendor lock-in.

FormDSL runs on your servers with your database. No data leaves your network. No per-submission fees. No limits you didn't set yourself.

Data sovereignty

Submissions stay in your PostgreSQL. Your data, your jurisdiction. Upgrade to Pro for AES-256-GCM encryption at rest.

No usage limits

Unlimited forms, unlimited submissions. No per-submission fees. No metered billing. Scale on your terms.

Single Docker command

PostgreSQL + FormDSL in one docker-compose.yml. Auto-migration on startup. Health checks built in.

Network isolation

Run behind your firewall or VPN. No external service dependencies required. Only PostgreSQL is needed.

Full audit trail

Every keystroke captured in input logs. Session replay for compliance. All on disk you own.

Source available

Form engine is MIT-licensed. Server and dashboard are source-available under ELv2. Audit every line of code — including the encryption implementation.

The core idea

One source of truth. Three outputs.

Your JSX component is the single definition for your form. From it, we derive the client UI, the server validation contract, and the encryption schema. No duplication. No drift.

JSX Component

You write this

Client UI

Renders the form

Server Manifest

Validates submissions

Encrypted Storage

AES-256-GCM at rest (Pro)

React SolidJS Embed or hosted Git versioned Self-hostable Source available
Get started

Running in two minutes.

One Docker Compose file, a few env vars. FormDSL auto-migrates the database, creates your admin account, and starts serving.

  • Set ADMIN_EMAIL and ADMIN_PASSWORD
  • Auto-generated encryption key on first boot
  • Database migrations run automatically
  • Health check endpoint at /health
  • Optional: S3 for file attachments, OAuth for social login
Terminal
$ docker compose up -d

  Creating formdsl-db   ... done
  Creating formdsl-app  ... done

$ open http://localhost:3000

 Dashboard ready
 PostgreSQL connected
 Encryption key active
 Migrations applied

  FormDSL is running at http://localhost:3000
  Admin: admin@example.com
$ _
Built for real forms

Everything complex forms need. Already built.

The hard parts of forms — autosave, conditional logic, repeatable sections, file uploads — are handled by the engine. You declare intent.

Autosave

Saves from the first keystroke. Configurable debounce, per-field checkmarks or toast feedback.

Conditional logic

showIf, requiredIf, disabledIf — on fields and entire sections. Chain conditions naturally.

Repeatable sections

Card or table layout. Add, remove, reorder items. Nested repeats supported. Undo on removal.

File uploads

Drag-and-drop with progress, accept filters, size limits, and server-side storage via S3.

Input masking

SSN, EIN, phone, currency — built-in formats with visibility toggle for sensitive fields.

Calculated fields

Formula-driven values. Reference other fields with tokens. Line totals, running sums, invoice math.

Multi-section navigation

Sidebar, stepper, or tabs. Progress tracking, completion indicators, section-gated validation.

Review & remarks

Auto-generated review summary. Per-field comments and annotations for collaborative workflows.

Session replay

Full input log captured. Replay exactly what the user did — for debugging, audits, or support.

Zero duplication

Server validation, for free.

When you deploy, the CLI extracts a validation manifest from your JSX. Your server uses it to validate every submission — same rules, no separate schema, no drift between client and server.

  • Required, minLength, pattern, min/max
  • Conditional required (requiredIf)
  • Select options validated against manifest
  • Repeat item validation
  • Answers encrypted after validation passes (Pro)
what happens on submit
// You write the JSX
<Question id="email" type="email" required />
<Question id="amount" type="number" min={1} max={10000} />

// CLI extracts this manifest
{
  fields: [
    { id: "email", type: "email",
      required: true },
    { id: "amount", type: "number",
      min: 1, max: 10000 }
  ]
}

// Your server validates every submission
// against this manifest automatically
// Then encrypts with AES-256-GCM
Platform

Infrastructure you don't have to build.

Encryption, environments, webhooks, exports, team management — the backend you'd spend months building. Self-host and run on your terms.

Encryption at rest PRO

Per-form AES-256-GCM. HKDF-derived keys. Your master key never leaves your server.

Environments

1 production environment free. Unlimited dev, staging, and custom environments with Pro.

API keys

Secret keys for server access. Publishable keys for client embeds. Scoped per environment.

Webhooks PRO

HMAC-signed payloads. Automatic retry with exponential backoff. Full delivery log.

CSV export PRO

RFC 4180 compliant. Handles nested data, repeats, and all field types cleanly.

Session replay PRO

Every keystroke, navigation event, and timing captured. Replay submissions for audits.

Team management PRO

Invite members, assign roles. Controlled registration — only invited users can join.

Identity verification PRO

JWT-based submitter identity. HMAC-SHA256 signing secrets per environment.

Developer experience

Deploy to your server with one command.

Point FORMDSL_URL at your instance. The CLI auto-discovers your form components, extracts validation manifests, and deploys. Works with React and SolidJS.

  • Auto-discovers *.tsx form components
  • Extracts manifest from JSX — no runtime needed
  • Deploys to your self-hosted server
  • --draft flag for staging without publishing
  • --hosted for server-rendered form pages
Terminal
$ export FORMDSL_URL=https://forms.yourcompany.com
$ npx formdsl deploy

  Discovering forms...
  Found 3 forms in ./src/forms/

 onboarding      v2.1  ·  14 fields  ·  3 sections
 kyc-business    v1.0  ·  22 fields  ·  5 sections
 support-ticket  v3.2  ·   8 fields  ·  2 sections

  Deployed to forms.yourcompany.com (production)

$ _
LLM-ready

Generate forms with AI. Review them like code.

The DSL is a constrained set of typed JSX components — exactly what LLMs are good at generating. Ask for a form, get inspectable code, deploy to your own server.

AI
"Generate a KYC onboarding form with legal name, EIN, state of incorporation, authorized signer, and a conditional section for non-US entities with country and tax ID."
Generated output — ready to review & commit
<Form id="kyc-onboarding" version="1.0">
  <Section title="Entity Information">
    <Question id="legal_name" type="text"
      required label="Legal Entity Name" />
    <Question id="ein" type="text"
      format="ein" required label="EIN" />
    <Question id="entity_type" type="select"
      required label="Entity Type"
      options={["LLC", "C-Corp", "Non-US"]} />
  </Section>

  <Section title="Non-US Details"
    showIf={{ entity_type: "Non-US" }}>
    <Question id="country" type="select"
      required label="Country" />
    <Question id="tax_id" type="text"
      required masked label="Tax ID" />
  </Section>
</Form>

Test locally, see it render instantly, then formdsl deploy. The LLM generates valid JSX. You review it like any other PR.

Compare editions

Choose the edition that fits your team.

Start free with Community. Upgrade to Pro when you need advanced features. Or wait for Cloud — same codebase, zero ops.

Capability Community (Free) Pro ($189) Cloud (Coming Soon)
Forms & submissions Unlimited Unlimited Plan-based
Autosave, conditions, repeats Yes Yes Yes
Masking, calculated fields Yes Yes Yes
Deploy CLI Yes Yes Yes
Hosted pages With badge No badge No badge
Templates 14 included 14 included 14 included
Environments 1 (production) Unlimited Unlimited
Admin users 1 Unlimited Plan-based
Encryption at rest AES-256-GCM Yes
Webhooks HMAC-signed + retry Yes
Session replay Full input log Yes
Identity verification JWT-based Yes
Team management & roles Yes Yes
CSV / JSON export Yes Yes
Prefill / series Yes Yes
Audit log Yes Yes
Data location Your infrastructure Your infrastructure Managed
Source code SDK: MIT SDK: MIT, Server: ELv2 N/A
Updates Community releases 1 year of updates Automatic
Support Community Priority (1 year) Included
Price Free $189 one-time TBD
Pricing

Start free. Upgrade when you need more.

Community edition is free forever with core features. Pro unlocks advanced capabilities with a one-time purchase.

Community
$0
free forever
  • Unlimited forms & submissions
  • Autosave, conditions, repeats
  • Masking & calculated fields
  • Deploy CLI
  • Hosted pages (with badge)
  • 14 form templates
  • 1 environment (production)
  • 1 admin user
  • MIT-licensed form engine
  • Community support
FormDSL Cloud
Planned
managed hosting — zero ops
  • All Pro features, fully managed
  • Automatic updates & backups
  • Managed PostgreSQL
  • Uptime SLA
  • SSO / SAML (Enterprise)

Open source engine. Source-available server.

The form engine (@formdsl/core, @formdsl/react) is MIT-licensed — use it freely in any project. The server and dashboard are source-available under the Elastic License v2 (ELv2) — audit every line, including the encryption implementation. One-time purchase, no subscription: set FORMDSL_LICENSE_KEY to activate Pro features. The version you buy works forever — renewal ($79/yr) gives continued updates and priority support.

Deploy anywhere

Your infrastructure, your choice.

FormDSL runs anywhere Docker runs. Only PostgreSQL is required. All other services — S3, OAuth, email — are optional.

Docker Compose

Single docker-compose.yml with PostgreSQL. The simplest path. Perfect for small teams and VPS hosting.

Railway / Fly.io

One-click deploy templates. Managed PostgreSQL add-on. Auto-scaling and zero-downtime deploys.

Kubernetes

Helm chart for production clusters. Horizontal scaling, rolling updates, persistent volumes.

Bare metal

Single binary via Bun compile. Systemd service file included. Minimal resource footprint.

Minimal dependencies

FormDSL needs only PostgreSQL to run. File storage (S3/R2), email (Resend), and OAuth (GitHub/Google) are all optional and configured via environment variables. No Redis, no message queue, no external cache.

Templates

Ready-made forms for every industry.

Start with a production-ready template and customize it in JSX. Each template includes field validation, conditional logic, and proper data types out of the box. All 14 templates are free and open-source.

Starter templates

Contact Form

Name, email, message with validation. The simplest starting point for any project.

Email validation Required fields Textarea

Support & Feedback

Bug reports, feature requests, NPS surveys with conditional follow-up based on rating.

Rating field showIf logic Textarea

Event Registration

Conference signup, session selection, dietary preferences with repeatable attendee details.

Multi-check Repeatable guests Autosave

Enrollment & Registration

Student applications, course registration with multi-step stepper navigation and review summary.

Stepper nav Autosave Review summary

Simple Onboarding

Basic user or company onboarding. Multi-section with conditional logic and select fields.

Conditional logic Multi-section Select fields

Industry templates

KYC / AML Onboarding

Identity verification, beneficial ownership, document collection for financial compliance.

SSN masking EIN format File upload Identity JWT

Insurance Application

Multi-step policy applications with conditional coverage sections, risk assessment, and repeatable dependents.

Conditional sections Repeatable rows Calculated premiums

Patient Intake

Medical history, insurance details, consent forms. HIPAA-ready with encryption at rest and audit trail.

Encrypted at rest Consent checkbox Session replay

Employee Onboarding

Tax forms, emergency contacts, direct deposit, equipment requests. Prefill across annual reviews.

Prefill Series forms Masked SSN

Legal Intake

Client questionnaires, case assessment, conflict checks with conditional matter-type routing.

Conditional logic Remarks File attachments

Rental Application

Tenant screening, income verification, reference collection with repeatable prior addresses.

Repeatable sections Income calculation Document upload

Permit & License Application

Business permits, building approvals, license renewals with revision request workflow.

Revision requests Amendment flow Audit log

Grant Application

Funding requests, project budgets, organizational details with calculated budget totals.

Formulas Budget table Multi-section

Vendor Onboarding

W-9 collection, banking details, compliance certifications with conditional international sections.

Masked fields Conditional sections Webhooks

Every template is a plain JSX component. Fork it, customize it, version it in Git.
No drag-and-drop builder. No proprietary format. Just code you own.
All 14 templates are available in the templates directory on GitHub.

Stop rebuilding form infrastructure.

Start free with Community — unlimited forms, autosave, conditions, and server validation out of the box. Upgrade to Pro when you need encryption, webhooks, session replay, and team management. Define once in JSX, deploy to your own server.