br 5fff17531d
Formeleon Deployment Pipeline / Deploy to Dev Environment (push) Successful in 1m1s
Formeleon Deployment Pipeline / Deploy to Production Environment (push) Skipped
i18 drin
mail drin
fehlende routen drin
prod-reife erreicht.
TODOS:

Deine aktuellen offenen TODOs
1. Rate-Limiting (Spam-Schutz VOR dem reCAPTCHA)
Das reCAPTCHA hält zwar Bots ab, aber wenn jemand böswillig ein Script schreibt, das 1.000 POST-Requests pro Sekunde an /api/v1/submissions sendet, muss dein Backend jedes Mal Google kontaktieren und die Datenbank befragen. Das frisst Server-Ressourcen.

Todo: Einbinden von Flask-Limiter und Absichern der API-Route (z.B. max. 10 Submissions pro Minute pro IP-Adresse oder Tenant).
2. Billing & Feature-Enforcement (Limits pro Tenant durchsetzen)
Die Mandanten-Architektur und das config-Feld im JSON existieren bereits. Aber wir erzwingen diese Limits aktuell nicht im Backend.

Todo: Im Dashboard (templates/admin/tenants/view.html) UI-Controls einbauen, um Feature-Flags für einen Tenant festzulegen:
max_forms (z.B. 1 für Free-User, 10 für Pro-User).
allow_instant_mail (Dürfen E-Mails an den Tenant gesendet werden?).
allow_autoresponder (Darf der Autoresponder für Endkunden genutzt werden?).
Todo: Diese Limits hart im Backend (beim Erstellen von Forms und beim Mailversand) kontrollieren. (Der Mailer prüft das zwar schon halbwegs, das UI zum Pflegen fehlt aber noch komplett).
3. E-Mail Templates aufwerten (HTML statt Plain-Text)
Bisher versendet der Service E-Mails als reinen Text (plain). Für eine professionelle SaaS-Lösung sollten diese Mails ansprechend aussehen.

Todo: Im services/mailer.py den MIMEMultipart so erweitern, dass er saubere HTML-Mails aus einem Jinja2-Template (templates/emails/...) generiert, inklusive Branding/Logo deines Services.
4. Frontend-Snippet "Graceful Degradation"
Das embed.js arbeitet aktuell sehr gut. Aber was ist, wenn das Formeleon-Backend mal für 5 Minuten down ist?

Todo: Einen sauberen Timeout im fetch einbauen und dem Endkunden auf der Webseite eine schöne, fallback HTML-Meldung anzeigen ("Entschuldigung, das Formular ist momentan nicht erreichbar"), anstatt dass sich das Script lautlos in der Console mit einem CORS/Network-Error verabschiedet.
5. CI/CD Pipeline (Deployment)
Wenn der Code fertig ist, willst du ihn sicher nicht immer händisch per git pull auf deinen Produktionsserver schieben und dort docker compose up tippen.

Todo: Eine simple Pipeline (Github Actions / Gitea Actions) anlegen, die den Code testet und automatisch auf dem Zielserver ausrollt.
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00
2026-08-03 16:13:24 +02:00
2026-08-04 23:07:18 +02:00
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00
2026-08-03 13:38:11 +02:00
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00
2026-08-04 23:07:18 +02:00
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00
2026-08-04 23:07:18 +02:00
2026-09-29 05:16:01 +02:00
2026-08-03 13:38:11 +02:00
2026-08-03 13:38:11 +02:00
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00
2026-09-29 05:16:01 +02:00

Formeleon 🦎

Multi-tenant, highly flexible form generator with seamless website integration and built-in bot protection.

Diese Dokumentation auf Deutsch lesen: README.md


📋 Overview

Formeleon is a centrally hosted service (ChamäleonCloud) allowing multi-tenant clients to embed dynamic web forms into any website via a simple HTML/JavaScript snippet.

Key Features

  • Seamless Integration: Embed via lightweight JS snippet.
  • Flexible Schemas: Dynamic JSON payloads stored via SQLAlchemy.
  • Security First: OIDC authentication (Zitadel), Public-Key handshakes, Origin/Referer validation, and reCAPTCHA v3 integration.
  • UX & Anti-Bot: Interactive button state management (traffic light / spinner).
  • Export & Reporting: On-demand HTTP streaming exports (CSV/JSON/YAML) and automated email dumps.

🛠️ Tech Stack

  • Backend: Python 3.13, Flask (Blueprints), Flask-SQLAlchemy, Flask-Migrate
  • Frontend (Admin UI): Bootstrap 5, Mithril.js
  • Auth: OIDC / Zitadel
  • Deployment: Docker, Gunicorn, Gitea Actions

🌍 Internationalization (i18n) via Flask-Babel

Formeleon's admin dashboard supports multiple languages (currently English and German) using the industry standard Flask-Babel (gettext).

1. Marking Strings in Code

To mark a text for translation, it must be wrapped with the _() function in your Python or HTML code.

In HTML (Jinja2 Templates):

<!-- Before -->
<h1>Welcome to the Dashboard</h1>

<!-- After -->
<h1>{{ _('Welcome to the Dashboard') }}</h1>

In Python files:

from flask_babel import _

# Before
flash('Form saved successfully!', 'success')

# After
flash(_('Form saved successfully!'), 'success')

2. The Translation Workflow (CLI)

When new strings have been marked in the codebase, they must be extracted and the language files updated. Run the following commands within your active virtual environment (source venv/bin/activate):

# 1. Scans the code for marked strings and generates the master template (messages.pot)
pybabel extract -F babel.cfg -k _l -o messages.pot routes services templates utils

# 2. Merges the new template with existing translations (in the 'translations' folder) without overwriting your old translations
pybabel update -i messages.pot -d translations

# -> NOW open e.g. translations/de/LC_MESSAGES/messages.po in your text editor and provide your translations at the msgstr "" lines! <-

# 3. Compiles the raw .po text files into highly optimized .mo machine files for the web server
pybabel compile -d translations
S
Description
ChamäleonCloud Form Generator
Readme
270 KiB
0 Stars 5 Watchers 0 Forks
Languages
HTML 47.8%
Python 41.3%
JavaScript 7.6%
CSS 2%
Dockerfile 0.7%
Other 0.6%