Docs / Your forms. Your infrastructure.

FORM INTELLIGENCE, EXPLAINED.

Your forms. Your infrastructure.

Run FormLint on your own services, with PostgreSQL for persistence and a separate public website.

Keep the boundaries clear.

ServiceResponsibility
Public siteAstro serves marketing, docs and demos. No app database or authenticated app pages.
DashboardTanStack Start serves the application: workspaces, projects, members and configuration.
Control planeHono, Better Auth and PostgreSQL/Drizzle handle authentication, persistence, permissions and quota reservations.
Evaluation runtimeAuthenticates configuration access through the control plane and runs the configured evaluator. Provider credentials remain server-side.

Start with the prerequisites.

Use Node 24, pnpm 10.31.0 and real PostgreSQL. Copy .env.development.example to a private .env.local for local development, then set your PostgreSQL connection and bootstrap email. Use .env.example for a production Compose installation.

Set DATABASE_URL, APP_URL, BETTER_AUTH_URL, the auth secret and the internal server token. The site build needs explicit PUBLIC_APP_URL and PUBLIC_EVALUATION_URL. Dashboard builds also need VITE_API_URL, VITE_EVALUATION_URL and VITE_SITE_URL; the last points downloads and guides to your public site. For a full variable list and service commands, use docs/architecture.md and docs/deployment.md in the source distribution.

pnpm install --frozen-lockfile
# After creating and editing .env.local:
export FORMLINT_ENV_FILE=.env.local
pnpm run env dev pnpm --filter @formlint/control-plane db:migrate
pnpm run env dev pnpm build

# Run each service in its own terminal, with its environment:
pnpm run env dev pnpm --filter @formlint/control-plane start
pnpm run env dev pnpm --filter @formlint/server start
PORT=3200 HOST=127.0.0.1 pnpm run env dev pnpm --filter @formlint/dashboard start
pnpm run env dev pnpm --filter @formlint/site start

Run the commands from the repository root. Set FORMLINT_ENV_FILE=.env.local in each terminal. For development with hot reload, use pnpm dev after migrating instead of the four start commands. Migrations are tracked and repeatable. Back up PostgreSQL with its native tooling. Data from the original SQLite pilot remains in its pre-rebuild backup and is not automatically imported.

Give the app its own host.

Deploy the public site independently from the application. Route the app host’s /v1 paths to the control plane, with host-only secure cookies on the app hostname. The public marketing site does not need the app’s authentication cookies.

The evaluation endpoint has no session cookie. It uses a private server token for control-plane requests. Configure exact origins, HTTPS and service URLs for your own deployment. The repository includes Compose and Docker configuration; review it with the deployment guide before use.

Make live services an explicit choice.

Set FORMLINT_PROVIDER=jev and a server-only JEV_API_KEY on the evaluation service for live inference. Choose FORMLINT_PROVIDER=demo explicitly for local fixtures. The app’s Playground requires live mode to evaluate your own answers. Use the source distribution’s deployment guide for the full configuration. Missing credentials or provider failures return unavailable. Simulated mode uses labeled fixtures and never acts as a silent live fallback.

Configure production email transport for magic links and invitations. The captured-mail development workflow is for local testing. Self-hosting does not require a Stripe subscription; paid billing remains unavailable unless an operator configures its credentials.

Check what has actually been verified.Production inference, email delivery and real Stripe payments require verification in your deployment. See the source distribution’s verification records for the current acceptance results.

Source-available, with clear terms.

FormLint is distributed under Elastic License 2.0. Private and internal self-hosting is permitted; third-party hosted or managed offerings are restricted by the license. Consult LICENSE, NOTICE and docs/licensing.md in the source distribution for the exact terms and third-party notices.

More context, less guesswork.Open FormLint