Schlanke Multi-Umfrage-App für Vereins- und Gruppen-Organisation, live unter umfrage.davidbidinger.de. Jede Umfrage bekommt einen eigenen teilbaren Link; Teilnehmer kreuzen an, was sie übernehmen (Kuchen spenden, Aufgaben, Zeitslots …) und geben nur ihren Namen an. Kernregel: öffentlich sichtbar ist ausschließlich das Aggregat je Aufgabe („Kuchen: 3 / 15, noch 12 offen") — wer zugesagt hat, sieht nur der Admin.
Bewusst schlanker Stack (FastAPI, SQLite, Jinja2, argon2id-Admin-Login) im non-root-Container hinter Caddy mit Auto-HTTPS. Pro Frage wählbare Typen — Ankreuzen, Ja/Nein, Auswahl, Zahl, Freitext, Zeitslot, Personen-Liste mit dynamisch klonbaren Zeilen — plus pro Umfrage Stichtag, anonymer Modus, Farb-Themes und Bild-Upload (Endungs-Whitelist, Zufalls-Dateiname, Größen-Cap). Alle Erweiterungen strikt additiv (Schema-Migrationen per ALTER), damit laufende Umfragen nie brechen; der Admin bekommt gruppierbare Auswertungen und Excel-tauglichen CSV-Export inklusive entschärfter Formel-Injection.
Lightweight multi-survey app for organizing club and group events, live at umfrage.davidbidinger.de. Each survey gets its own shareable link; participants tick what they will take care of (cake donations, tasks, time slots …) and provide only their name. Core rule: the public only ever sees the aggregate per task ("cakes: 3 / 15, 12 still open") — who signed up is visible to the admin alone.
Deliberately minimal stack (FastAPI, SQLite, Jinja2, argon2id admin login) running as a non-root container behind Caddy with automatic HTTPS. Per-question types — checkbox sign-up, yes/no, single choice, number, free text, time slot, and a roster type with dynamically cloneable rows — plus per-survey deadline, anonymous mode, color themes, and image upload (extension whitelist, randomized filename, size cap). All extensions are strictly additive (schema migrations via ALTER) so live surveys never break; the admin gets groupable result views and an Excel-friendly CSV export with formula-injection hardening.
Was alle sehen, was nur der Admin sieht — und warum das die ganze App prägtWhat everyone sees, what only the admin sees — and why that shapes the whole app
Ein Problem, das jeder Verein kennt
Fünfzehn Kuchen werden gebraucht. Die Frage geht per Messenger raus, und danach weiß niemand mehr, wer was zugesagt hat — außer der Person, die alle Nachrichten mitliest und mitschreibt.
Die App macht daraus einen Link. Wer draufklickt, sieht, was noch fehlt, kreuzt an und trägt seinen Namen ein. Fertig. Kein Konto, keine App, keine Anmeldung.
Die eine Regel, die alles andere bestimmt
Öffentlich sichtbar ist nur die Summe. „Kuchen: 3 von 15, noch 12 offen" — nie, wer zugesagt hat. Die Namen sieht ausschließlich der Admin.
Das klingt nach einem Detail und ist der Kern: Eine Liste mit Namen daneben erzeugt sofort sozialen Druck, und wer noch nichts eingetragen hat, steht sichtbar daneben. Genau das soll die App nicht tun. Aus dieser Regel folgt der Rest — welche Ansicht was lädt, was in den Export darf, was eine geteilte Adresse überhaupt preisgeben kann.
Erweitern, ohne Laufendes zu zerbrechen
Die App wächst in Schüben, und zwischen den Schüben laufen echte Umfragen mit echten Zusagen. Deshalb gilt: nur additiv. Neue Felder kommen dazu, bestehende ändern ihre Bedeutung nicht, und keine Migration darf eine offene Umfrage anfassen.
So sind nach und nach entstanden: sieben Fragearten (Ankreuzen, Ja/Nein, Auswahl, Zahl, Freitext, Terminfindung, Personen-Liste), Stichtag, anonymer Modus, Farbthemen, Bilder, Zugangscode, Duplizieren, QR-Code und eine Benachrichtigung aufs Handy bei neuen Zusagen.
Kleinigkeiten, die keine sind
Tabellen-Export mit entschärften Formeln. Ein Name, der mit = beginnt, ist in einer
Tabellenkalkulation kein Text mehr, sondern eine Formel. Der Export entschärft das.
Eine Falle im Formular, die für Menschen unsichtbar ist, plus eine Bremse pro Zeitfenster
— gegen automatisches Ausfüllen.
Bilder nur mit erlaubter Endung, zufälligem Dateinamen und Größenlimit.
Nichts davon ist aufregend. Zusammen ist es der Unterschied zwischen „läuft bei mir" und „läuft bei achtzig Leuten, die ich nicht kenne".
A problem every club knows
Fifteen cakes are needed. The question goes out over a messenger, and afterwards nobody knows who promised what — except the person reading every message and keeping a list.
The app turns that into a link. Whoever opens it sees what is still missing, ticks a box and types their name. Done. No account, no app, no sign-up.
The one rule that determines everything else
Only the total is public. "Cakes: 3 of 15, 12 still open" — never who signed up. The names are visible to the admin alone.
That sounds like a detail and is the core: a list with names next to it creates social pressure immediately, and whoever has not signed up yet stands there visibly. That is exactly what the app must not do. Everything else follows from this rule — what each view loads, what may go into the export, what a shared address can reveal at all.
Extending without breaking what's running
The app grows in bursts, and between the bursts real surveys with real sign-ups are live. Hence the rule: additive only. New fields are added, existing ones never change meaning, and no migration may touch an open survey.
That is how it gradually gained seven question types (sign-up, yes/no, choice, number, free text, date-finding, roster), deadlines, anonymous mode, colour themes, images, access codes, duplication, QR codes and a phone notification on new sign-ups.
Small things that aren't
Spreadsheet export with defused formulas. A name starting with = is no longer text in a
spreadsheet, it is a formula. The export defuses that.
A trap in the form invisible to humans, plus a per-time-window brake — against automated
filling.
Images only with an allowed extension, a randomised filename and a size limit.
None of it is exciting. Together it is the difference between "works for me" and "works for eighty people I don't know".
18
Cookies & Datenschutz
Cookies & Privacy
Diese Website verwendet einen Session-Cookie, um Mehrfachzählungen beim Besuchszähler zu vermeiden.
Es werden keine Daten an Dritte weitergegeben.
This site uses a session cookie to avoid counting your visit multiple times.
No data is shared with third parties.