FlexForms is an easy-to-use form builder application with intuitive drag-and-drop form creation and management. The front end is built with React and DNDKit for drag-and-drop, then bundled and embedded into a Go binary, which serves the web UI and provides a secure API backend. This architecture makes the application lightweight, portable, and simple to deploy.
FlexForms includes secure authentication, end-to-end encryption of form data, and is designed for GDPR compliance.
Latest Releases:
Binaries: See the GitHub Releases page for pre-built
flexforms-sqlite
andflexforms-postgres
executables.Docker Images: Pull from GitHub Container Registry:
docker pull ghcr.io/biohackerellie/flexforms-sqlite:latest docker pull ghcr.io/biohackerellie/flexforms-postgres:latest
- Drag-and-drop form builder with live preview
- Single Go binary (+ embedded React) for zero-dependency deployment
- Supports SQLite or PostgreSQL backends
- Secure authentication
- End-to-end encrypted and GDPR-compliant data storage
- Built-in migrations, versioned API, and audit logging
Download or copy the Docker Compose file and example environment file from GitHub, configure, and start the app:
curl -Lo docker-compose.yml https://raw.githubusercontent.com/biohackerellie/FlexForms/main/docker-compose.yml
curl -Lo .env.example https://raw.githubusercontent.com/biohackerellie/FlexForms/main/.env.example
cp .env.example .env
docker-compose up -d
Edit .env
to configure your authentication provider, database URL (omit for SQLite), and other settings, then visit http://localhost:8080 to access FlexForms.
# docker-compose.yml
services:
flexForms:
image: ghcr.io/biohackerellie/flexforms-sqlite:latest # or ghcr.io/biohackerellie/flexforms-postgres:latest
env_file:
- .env
ports:
- "8080:8080"
volumes:
- ./data:/data
environment:
- UID=1000
- GID=1000
# Add Postgres database if using the Postgres image, or add an existing one to your .env file
# This is not required for SQLite
database:
image: postgres
environment:
- POSTGRES_USER=pguser
- POSTGRES_PASSWORD=pgpassword
- POSTGRES_DB=databaseName
ports:
- "5432:5432"
# add a volume for Postgres data if needed for persistence
volumes:
- /path/to/data:/var/lib/postgresql/data
# .env.example
# rename to .env, keep in the same location as docker-compose file
# All of these are reflecting their default values, except for auth provider, that is required
LOG_LEVEL="debug" # debug, info, warn, error
AUTH_PROVIDER="entra" # entra, github, google, email
# change the key ENTRA to match your selected auth provider. Not required for email provider
ENTRA_CLIENT_ID=""
ENTRA_CLIENT_SECRET=""
# required for entraID if using single tenant auth
ENTRA_TENANT_ID=""
AUTH_SECRET=""
AUTH_SALT=""
EMAIL_PASSWORD=""
# Required for email notifications to work
EMAIL_HOST="smtp.gmail.com"
EMAIL_USER="[email protected]"
BASE_URL="http://localhost:8080" # https://example.com
ENCRYPTION_KEY="some_32_byte_random_string" # must be 32 bytes, openssl rand -base64 32
# Not required if using sqlite
DATABASE_URL="postgres://pguser:pgpassword@localhost:5432/databaseName?sslmode=disable"
# Launch with SQLite (default)
docker run --rm -p 8080:8080 \
--env-file .env.example \
ghcr.io/biohackerellie/flexforms-sqlite:latest
# Or with PostgreSQL
docker run --rm -p 8080:8080 \
--env-file .env.example \
ghcr.io/biohackerellie/flexforms-postgres:latest
Fetch the appropriate binary from Releases, make it executable, and run:
chmod +x flexforms-sqlite
./flexforms-sqlite --env .env # you can keep the .env file where you like, as long as you pass it to the binary with --env
Use flexforms-postgres
similarly when using PostgreSQL.
Ensure Go (1.18+), Bun/Node (for web frontend), and goreleaser
are installed. Then:
# Build frontend and Go binary via goreleaser
goreleaser release --snapshot --skip-publish --rm-dist
Alternatively, use Taskfile:
task install
task build:sqlite
# or
task build:postgres
Read about installing Task here.
Copy and edit the .env.example
file to configure:
AUTH_PROVIDER
,ENTRA_*
,AUTH_SECRET
,AUTH_SALT
for authenticationEMAIL_HOST
,EMAIL_USER
,EMAIL_PASSWORD
for email notificationsBASE_URL
(application URL)ENCRYPTION_KEY
(32-byte key for data encryption)DATABASE_URL
for PostgreSQL (omit for SQLite)
.
├── cmd/ # Go application entrypoint
├── internal/ # Application internals (handlers, services, migrations)
├── pkg/ # Shared libraries and utilities
├── web/ # React frontend source
├── sqlite.Dockerfile
├── postgres.Dockerfile
├── manual.Dockerfile # for those who want to build the image manually, edit the build step to match sqlite or postgres
├── docker-compose.yml
└── .env.example
Contributions are welcome! Please open issues or pull requests on GitHub.
This project is licensed under the terms of the CNPLv7+ License.