Skip to content

biohackerellie/FlexForms

Repository files navigation

FlexForms

CI Go Report Card

example

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 and flexforms-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

Features

  • 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

Quick Start

1. Using Docker Compose

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"

2. Pulling Official Docker Image

# 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

3. Downloading Binaries

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.

4. Building from Source

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.

Configuration

Copy and edit the .env.example file to configure:

  • AUTH_PROVIDER, ENTRA_*, AUTH_SECRET, AUTH_SALT for authentication
  • EMAIL_HOST, EMAIL_USER, EMAIL_PASSWORD for email notifications
  • BASE_URL (application URL)
  • ENCRYPTION_KEY (32-byte key for data encryption)
  • DATABASE_URL for PostgreSQL (omit for SQLite)

Project Structure

.  
├── 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

Contributing

Contributions are welcome! Please open issues or pull requests on GitHub.

License

This project is licensed under the terms of the CNPLv7+ License.

About

Flexible Form builder made with Go and React

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors 3

  •  
  •  
  •