Form Forge is a self-hosted, schema-first form platform. Define a form, publish an immutable version, collect responses, and deliver them to signed webhooks with inspectable attempts and retries.
Use the hosted form page, embed a form on your site, or submit responses through the public API. Your PostgreSQL database stores forms, responses and delivery history. Form Forge is free/libre software under Apache 2.0, with no product analytics, advertising trackers or usage reports to the project authors. Optional Sentry reporting is controlled by the deployment owner.
- Versioned forms: schema editor with live preview, conditional fields, immutable published versions, comparison and draft restoration.
- Flexible collection: hosted pages, iframe embedding with automatic height, and an idempotent public submission API.
- Intake controls: pause/resume, closing time, acceptance limits and custom closed messages across all published versions.
- Response management: date and answer search, selectable columns, new/processed status, CSV export and owner-confirmed deletion.
- Privacy controls: optional source metadata, disabled by default for new forms; no collection of unfinished responses.
- Reliable webhooks: signed payloads, transactional outbox, automatic retries, delivery diagnostics and manual recovery.
- Workspace access: owner, editor and viewer roles; GitHub, Google and GitLab sign-in with account linking.
- Integration contracts: OpenAPI and read-only MCP tools using existing workspace permissions.
For local development, you need PostgreSQL, a GitHub OAuth application, pnpm 12.10.1, and a Node.js version supported by package.json: 22.22.2+, 24.15.0+, or 26+. See Getting started for the complete setup, including a local PostgreSQL container and OAuth callback URLs.
From the repository root:
pnpm install
cp apps/web/.env.example apps/web/.envConfigure the database URL, application secrets and GitHub OAuth credentials in apps/web/.env using the environment instructions. Export the same database URL for migrations, then start the application:
export DATABASE_URL='postgresql://postgres:postgres@127.0.0.1:5432/form_forge'
pnpm db:migrate
pnpm devIn another terminal, start the local background-job server:
npx --ignore-scripts=false inngest-cli@latest dev \
-u http://localhost:3000/api/inngestOpen localhost:3000, sign in, create a form and publish it. Submit a response on its hosted page and inspect it in Submissions. Add a public HTTPS webhook endpoint to try background delivery. The Inngest dashboard is at localhost:8288.
For production, use the Docker Compose guide or Netlify guide. Local development credentials are not suitable for deployment.
- Getting started: requirements, environment, database, OAuth and your first form.
- User guide: account linking, roles, archives, intake, privacy and response management.
- Public API, OpenAPI and MCP: submission contracts, idempotency, quotas and authenticated integrations.
- Embedding: iframe setup, automatic height, lifecycle events and cleanup.
- Webhooks: signature verification, retries, outbox delivery and recovery.
- Architecture: workspace packages, data model and project scope.
- Development: commands, CI, database tests and Playwright.
- Dependency maintenance: Dependabot schedules, security fixes and monthly reviews.
- Deployment and operations: production configuration, upgrades, backups and monitoring.
Use the development guide to run the checks relevant to your change. Integration and browser tests require disposable databases and remove test data. Keep changes focused and include tests for meaningful behavior changes.
Report bugs and discuss changes through GitHub Issues.
Apache License 2.0. Workspace packages are internal and are not published to npm.