Skip to content

What's in the box

Forms-Engine is one repository with four moving parts. You run two of them (the backend and the editor); your website loads a third (the renderer); the wrappers are optional sugar.

An Angular single-page app for the people who build questionnaires. It’s where you create the structure (steps, tabs, sections, questions), attach visibility and requirement rules, publish versions, browse and export responses, and configure embedding (allowed origins, submission policy). It talks to the backend’s management API and ships as a static bundle served by nginx in the Docker stack.

The editor has no authentication — anyone who can reach it can edit and read everything, so you put it behind your own network protection. See the security posture.

A Spring Boot (Java 21) API backed by MongoDB, with two cleanly separated surfaces:

  • Management API (/api/v1/**) — what the editor uses: questionnaire CRUD, drafts, publishing, version history, response browsing, CSV export, file downloads. Must be network-protected by you.
  • Public runtime API (/public/v1/**) — what embedded questionnaires use: fetch the live definition, create a response session, save answers, upload files, complete. Designed to be internet-facing: unguessable response ids, per-questionnaire allowed-origin enforcement, input size caps, per-IP rate limiting.

It also proxies address autocomplete through Photon and stores uploaded files in a pluggable storage backend (local filesystem or any S3-compatible service) — never in MongoDB itself.

@forms-engine/renderer — the <forms-engine> web component, built with Lit. This is what your pages embed. It renders the published questionnaire, runs the rule engine as the respondent types, saves progress per screen, resumes sessions across page refreshes, and emits events your page can react to. Styles are shadow-DOM encapsulated and themed via CSS custom properties.

It also ships as a single self-contained ES module (dist/forms-engine.esm.js) for plain <script type="module"> use with no build step.

  • @forms-engine/react — a thin React component (<FormsEngine>) that renders the web component and turns its events into callback props.
  • @forms-engine/angular — a thin standalone Angular component (<forms-engine-embed>) doing the same with signal inputs and outputs.

Both are conveniences over the same web component — there is one renderer, not three. See Embedding.

Responses land in your MongoDB as flat JSON keyed by question code, with typed values and a pinned questionnaire version, so they stay interpretable as the questionnaire evolves. Uploaded files live on your disk or in your bucket. There is no hosted service, no telemetry, and no phone-home.