Drop Club
Weight-Loss-Challenge

Self-hosted · PHP · SQLite

Die Abnehm-Challenge,
die wir selbst hosten.

Wöchentliches Wiegen nach fester Regel, Wertung, Team-Rangliste und Aktivitätsminuten. Web-App auf PHP/SQLite – ohne Build-Pipeline, ohne Cloud, ohne Tracking. Läuft auf dem eigenen NAS.

0 npm-Pakete 0 Build-Schritte 1 Ordner Deploy 26 PHP-Dateien ~7.500 Zeilen Code DSGVO-konform

Das Herzstück

Die Freitags-Regel

Gewertet wird ein Wert pro Woche – deterministisch, nachvollziehbar, manipulationsarm. Der Algorithmus bildet aus rohen Messpunkten eine saubere Freitags-Zeitreihe. Interpolierte Werte werden im UI gestrichelt & grau markiert, damit nichts „verschwindet".

Absolute kg oder prozentualer Verlust – pro Season umschaltbar, damit Leicht- und Schwergewichte fair gegeneinander antreten.

1
Echte Freitagsmessung
Gibt es eine Messung am Freitagvormittag, zählt genau diese.
2
Wochen-Durchschnitt
Fehlt der Freitag, wird der Schnitt der Woche gebildet (Ø Woche).
3
Vorwert übernehmen
Gar keine Messung? Der letzte Freitagswert wird fortgeschrieben (übernommen).

Für Teilnehmer

Funktionen für Teilnehmer

Schnell-Erfassung

Gewicht & Aktivitätsminuten in zwei Taps – direkt vom Dashboard oder Profil, mit dem letzten Wert als Vorschlag. Plausibilitätswarnung bei unrealistischen Sprüngen.

Ziel pro Season

Beim Beitritt schlägt die App – passend zur Season-Dauer und zum Startgewicht – ein gesundes Ziel vor (antippbar, anpassbar, überspringbar). Ziel-Ring, Linien-Chart und Wochen-Balken zeigen den Fortschritt; interpolierte Werte sind klar markiert.

Insights & Prognose

Ø-Tempo (kg/Woche), voraussichtliches Zieldatum und „Im Plan / hinter Plan".

Aktivitätsminuten

Intensitätsminuten (mäßig ×1, intensiv ×2) gegen 150-Wochenziel. Der Apple-Watch-Ring schließt sich bei 100 % mit dezentem Glow.

Streak & Motivation

Mess-Serie in Folge, zufällige Motivationssprüche – am Wochenende mit Wiege-Reminder.

Team-Rangliste

Live-Standings (kg oder %). Sichtbar ist nur die Veränderung – nie das absolute Gewicht.

Profil & Avatar

Eigenes Verlaufs-Dashboard mit Ziellinie. Foto hochladen – oder automatische Geschlechts-Silhouette (♂ / ♀ / divers), wenn kein Bild gesetzt ist.

Login per Biometrie

Optional per Fingerabdruck, Face ID oder Windows Hello anmelden – zusätzlich zum Passwort, mit einem Tipp und ohne E-Mail-Eingabe. Die Biometrie verlässt das Gerät nie; gespeichert wird nur ein öffentlicher Schlüssel (WebAuthn/Passkey).

Gemeinsames Team-Ziel

Ein Fortschrittsbalken zeigt, wie viel der ganze Club zusammen abgenommen hat – mit Ziel-Marke (von der Orga setzbar, sonst automatisch).

Spieler:in der Woche & Rückblick

Der größte Drop der Woche wird gefeiert, und „Diese Woche im Club" sammelt geknackte Meilensteine und Streaks – alles live aus den Daten.

Meilensteine & Badges

−kg-Marken, Aufholjäger (starke Woche), Frühaufsteher (Freitag vor 9 Uhr) und Eiserne Konstanz – erscheinen automatisch auf dem Dashboard.

Dark Mode + Akzentfarben

7 Themes pro Nutzer – färben auch die Diagramme. Auswahl im Profil.

PWA & installierbar

„Zum Homescreen", App-Icon, Offline-Fallback über einen Service Worker – kein App-Store nötig.

Eigene Daten

CSV-Export der Messwerte, JSON-Komplettexport, Konto-Selbstlöschung.

Für Admins

Funktionen für Admins

Mehrere Seasons

Anlegen, bearbeiten, archivieren – mit Überschneidungsschutz, sodass zu jeder Zeit genau eine Season läuft. Wertung pro Season: absolut oder prozentual.

Einladungslinks & Teilnehmer

Token-Links pro Season (regenerierbar), Teilnehmer per Klick zuordnen. Beitritt nach Login automatisch.

Bearbeitungs-Richtlinie

Pro Season festlegen, wie weit Nutzer rückwirkend ändern dürfen: nur laufende Woche, + Vorwoche oder alles. Gilt für Gewicht & Aktivität.

Werte verwalten + Audit-Log

Admins bearbeiten/löschen jeden Wert (season-gefiltert) – jeder Eingriff landet revisionssicher im Änderungs-Protokoll.

Backup & Restore

Download als .sqlite für 1-Klick-Restore oder als menschenlesbares .sql. Import per Upload. Profilbilder liegen in der Datenbank und sind im Backup enthalten.

Nutzer & Onboarding

Start-Passwort als merkbare Passphrase (hafen-tiger-47), erzwungener Wechsel beim ersten Login, schlanker 3-Schritt-Assistent (Geschlecht, Farbe, erstes Gewicht). Das persönliche Ziel wird passend zur Season-Dauer erst beim Beitritt gesetzt.

Plausibilitätsprüfung

Toleranz für unrealistische Gewichtssprünge global einstellbar (Grundtoleranz + Zuschlag pro Tag) – mit Live-Vorschau, gültig für alle Seasons.

Saison-Abschlussbericht

Druckbare Zusammenfassung jeder Season – Podium, Team-Summe, Auszeichnungen und Endstand. Direkt als PDF speicherbar, erreichbar über das Archiv.

Unter der Haube

Stack, Betrieb & Sicherheit

Kein Node, kein Bundler, kein Build-Schritt: 26 PHP-Dateien (~7.500 Zeilen Code), eine SQLite-Datei und zwei CDN-Skripte fürs Frontend. Deploy heißt Ordner kopieren; Schema-Migrationen laufen idempotent beim ersten Request.

Stack
PHP 8 SQLite + PDO WAL-Mode Vanilla JS Tailwind (CDN) Chart.js Service Worker nginx
Sicherheit
  • CSRF-Token auf allen Formularen
  • Login-Rate-Limit (Brute-Force-Schutz)
  • password_hash() / bcrypt, erzwungener Erst-Wechsel
  • Passkeys (WebAuthn): Login per Biometrie, nur öffentlicher Schlüssel gespeichert
  • .htaccess: DB nicht ausliefern, kein Code in Uploads
  • DSGVO: Export, Löschung, Datenschutzseite
deploy — nas
# Kompletter Deploy:
$ scp -r php-app/ nas:/web/dropclub
$ ls php-app/
index.php   profile.php   admin.php
einstellungen.php   changelog.php
admin_entries.php   archiv.php   media.php
login.php   onboarding.php   join.php   goal.php
report.php   db.php   helpers.php   layout.php
webauthn.php   passkey.php   passkey.js
manifest.webmanifest   sw.js   icons/

# Abhängigkeiten installieren:
$ — keine —

# Datenbank-Setup:
$ läuft automatisch beim 1. Request
  ↳ Schema + idempotente Migrationen
Datenmodell
users challenges challenge_participants weights activity_minutes avatars login_attempts audit_log webauthn_credentials app_meta

Season-Zuordnung der Messwerte ergibt sich aus dem Datum – Single Source of Truth, keine redundanten Fremdschlüssel.

Wer macht mit?

Account vom Admin holen, Einladungslink öffnen, Freitag wiegen. Der Rest ergibt sich.

Zur Anmeldung