Forms and web services

Form Forge

A self-hosted form platform with an inspectable delivery pipeline. Run your own form service: publish versioned forms, collect responses in PostgreSQL, and deliver them to signed webhooks.

Release
v0.2.0, Oct 18, 2026
Runs on
Self-hosted: Node.js, PostgreSQL, Inngest; Docker Compose or Netlify
License
Apache-2.0

Open the public deployment: Requires signing in with GitHub, Google or GitLab. No service level is published for it.

What it looks like

Form Forge public deployment start page: the heading “Forms with an inspectable delivery pipeline”, buttons to open the workspace and view source, and three short feature panels.
Start page of the public deployment linked from the repository, before sign-in. Captured for this catalog. Open full size screenshot of Form Forge
pnpm install
cp apps/web/.env.example apps/web/.env
pnpm db:migrate
pnpm dev
Local development setup from the project’s getting-started guide. Requires PostgreSQL and a GitHub OAuth app; then open localhost:3000, sign in and publish a form.

What it does

Define a form as a schema, publish an immutable version, and collect responses through a hosted page, an embedded iframe or the public API. Every webhook delivery is signed and recorded with its attempts and errors, so you can see what happened to each response. Data stays in your PostgreSQL database.

Who it is for

  • Teams that want forms on their own infrastructure instead of a SaaS form builder.
  • Developers who need reliable webhook delivery with retries and diagnostics.

Limitations

  • Not a hosted SaaS: you operate PostgreSQL, the web app and the background-job server.
  • Sign-in uses GitHub, Google or GitLab OAuth; there are no email and password accounts.
  • Unfinished responses are not collected, and workspace packages are not published to npm.

Typical uses

Collect sign-ups on your site

Embed a published form with automatic height, or post to the idempotent submission API from your own frontend.

Feed another system

Each response goes to a signed webhook through a transactional outbox with automatic retries and manual recovery.

Close intake on time

Pause a form, set a closing time or an acceptance limit, and show a custom closed message.

Download

Latest stable release v0.2.0, published Oct 18, 2026. Release notes for v0.2.0. Release data checked Oct 31, 2026 from GitHub Releases.

Any platform

Available files (1)

Verify a download

SHA256SUMS lists SHA-256 hashes for the release files. A matching hash shows that your file is identical to the one uploaded with the release. It is a checksum, not a signature from the author: it does not prove who built the file.

shasum -a 256 -c --ignore-missing SHA256SUMS

First run

  1. Install Node.js (22.22.2+, 24.15.0+ or 26+), pnpm 12.10.1 and PostgreSQL, and create a GitHub OAuth app.

  2. Clone the repository, configure apps/web/.env, run the migrations and start the app:

    pnpm install
    pnpm db:migrate
    pnpm dev
  3. Start the local background-job server in another terminal:

    npx --ignore-scripts=false inngest-cli@latest dev -u http://localhost:3000/api/inngest
  4. Open localhost:3000, create a form, publish it and submit a test response.

Platforms and how they were checked

  • Self-hosted with Docker ComposeDeclared support, no recorded runtime check

    Production guide in deploy/README.md.

  • NetlifyVerified running

    The public deployment linked from the repository runs on Netlify.

  • RespondentsDeclared support, no recorded runtime check

    Hosted and embedded forms open in a modern web browser.

Questions and bug reports go to the project’s issue tracker. Report security problems as described in its security policy.