No description
  • TypeScript 95.8%
  • CSS 3.9%
  • Dockerfile 0.3%
Find a file
2026-04-07 20:03:07 +02:00
api patch vulns 2026-03-26 22:38:34 +01:00
db add email queue functionality with retry mechanism 2026-03-10 20:17:19 +01:00
frontend add manual scan 2026-04-07 20:03:07 +02:00
.gitignore add waitlist support 2026-01-08 15:56:00 +01:00
docker-compose.yml fix name 2026-03-10 13:24:00 +01:00
README.md Update README.md 2026-03-26 11:02:33 +01:00

BeeFormed

BeeFormed is a form system with:

  • A Next.js frontend for creating/editing forms, sharing public links, and viewing submissions
  • A Fastify API for forms, fields, permissions, and submissions
  • Postgres for persistent storage and an email queue (SMTP with retries)

What you can do

  1. Log in via Authentik (OAuth2).
  2. Create and manage forms (including field definitions and publication window).
  3. Share a public form link: GET /f/:slug
  4. Let users submit forms (anonymous submissions supported).
  5. Enforce limit + waitlist and optionally block multiple submissions per user.
  6. Receive confirmation emails for registered/waitlisted submissions (with QR code attachment for the submission).
  7. Scan submissions using QR codes in the admin UI and mark them as scanned.

Architecture

  • Frontend: frontend/ (Next.js)
  • API: api/ (Fastify + Postgres)
  • Database schema: db/init.sql

Docker Compose runs three services:

  • beeformed (Frontend)
  • beeformed_api (API)
  • beeformed_database (Postgres)

Local / Docker setup

1) Environment variables

Docker Compose expects a root .env file (used by both services).
Go to 1Pass to get the required variables (may need to be changed for local development).

The API validates the required variables at startup (api/src/constants.ts) and the frontend reads them from frontend/constants.ts.

2) Start with Docker Compose

From the repo root:

docker compose up --build

Then:

  • Frontend: http://localhost:8700
  • API: http://localhost:8701/api

Database schema

Defined in db/init.sql.

Email confirmations

On submission-related events, the API sends templated emails via SMTP (nodemailer). If SMTP fails, emails are queued in email_queue for retry; disable all sending/queueing with DISABLE_SMTP=true.