Tobias Ludwig
Start
ServicesWeb, Apps, Backend und KIPlanerBausteine wählen, Preis sofort sehenBranchen-DemosBeispielseiten für Handwerk, Praxis, GastroReferenzenKundenprojekte mit ErgebnisMatch-CheckPasst das Vorhaben zu mir?Über michWer hinter der Seite steht
ProjekteEigene Software und Open SourceProdukteFertige Apps und WerkzeugeFlutterPlugins und PaketeBlogNotizen aus der Praxis
ToolsKleine Helfer im BrowserTech-WikiWerkzeuge und Stacks, kurz erklärtShowcaseDemos, Shader, Inszenierungen
Support & HilfeHilfe zu laufenden ProjektenMein KontoTickets und Zugänge
Erstgespräch
Erstgespräch buchenKostenloser Kennenlern-CallKontakt schreibenNachricht per Formular
$whoami
Tobias Ludwig
DevOps · Application Manager · Software Engineer
$ls /pages
tobias-ludwig/projekte/kontakt/kalender/impressum/datenschutz/
$git remote
github.com/nexas105
online·next.js 16·hono·postgresql
© 2026 tjl·stay curious_
Ambient OFF
Weiter so… ↓↓ ← → ← → B A
/projekte/dbfv-nrw-verbandsplattform/Fullstack/WIP/05/2026 → laufend/Alleiniger Entwickler und Betreiber der Plattform; im Verband zusätzlich ehrenamtlicher IT-Vorstand

DBFV NRW Verbandsplattform

Verbands- und Wettkampfplattform für den Bodybuilding-Landesverband NRW: Website, Event-Anmeldung, Tickets, digitales Kampfgericht, Ergebnisse und Urkunden in einem gemeinsamen Rollen- und Datenmodell.

für Nordrhein-Westfälischer Bodybuilding- und Kraftsportverband e. V. (DBFV NRW)

Im Aufbau. Sicherheit und Rollen, Zahlungen, Ergebnisprozess und Wertungsmodul stehen; CMS-Abnahme und Urkundenfluss laufen noch.

Privates Projekt

Code gehört dem Auftraggeber und ist nicht öffentlich.

Keine öffentliche Demo — die Plattform trägt echte Mitglieder- und Wettkampfdaten. Testzugänge gibt es auf Anfrage über den Verband.

Next.jsReactTypeScriptTailwind CSSshadcn/uiSupabasePostgreSQLRow-Level-SecurityStripe@react-pdf/rendererGSAPZodPlaywrightDockerCoolifyNodemailerIMAP
project dossier

Snapshot

dbfv-nrw-verbandsplattform

Alleiniger Entwickler und Betreiber der Plattform; im Verband zusätzlich ehrenamtlicher IT-Vorstand

category

Fullstack

status

WIP

stack

17 tech

code

199.534 Zeilen
Next.jsReactTypeScriptTailwind CSSshadcn/uiSupabasePostgreSQL
ZahlenStoryFeaturesÜberMeine RolleArchitekturHerausforderungenVerlaufTechCodebasisVerwandt
01

Zahlen zum Projekt

Anwendungscode (ohne generierte Typen)173.000Zeilen TS/TSX
Datenbankmigrationen122SQL-Dateien
SQL in Migrationen9.000Zeilen
Seitenrouten178Next.js-Seiten
API-Routen115Route Handler
Team1Entwickler
02

Story

Problem

Der Landesverband hatte eine klassische Vereins-Website, aber keinen digitalen Weg für den Wettkampfbetrieb. Anmeldungen von Athleten, Vereinen und Kampfrichtern, Startgelder, Zuschauertickets, Einlass, Wertung, Ergebnislisten und Urkunden liefen über Formulare, Mails, Tabellen und Papier — jede Stelle ein eigener Medienbruch und jede Auswertung Handarbeit.

Lösung

Eine Plattform, die den Ablauf eines Wettkampfs durchgehend abbildet: öffentliche Website mit eigenem CMS, Eventseiten mit Klassen und Zusatzoptionen, Anmeldung für Athleten, Vereine und Judges, zentraler Warenkorb mit einer Kasse für Startgeld, Tickets und Zusatzbuchungen über Stripe, Ticket-PDF mit QR-Code und Einlass-Scanner, digitales Kampfgericht mit Judge-, Head-Judge- und Broadcast-Sicht, Ergebnisfreigabe durch den Master Judge und daraus erzeugte Urkunden als PDF. Dahinter ein rollenbasiertes Datenmodell in selbst gehostetem Supabase mit Row-Level-Security, dazu Mitglieder-, Vereins- und Lizenzverwaltung, Newsletter, Kontakt-Tickets und ein Admin-Cockpit für den Verband.

Learnings

Der Wert lag weniger im einzelnen Feature als im gemeinsamen Rollen- und Datenmodell: Sobald Anmeldung, Zahlung, Einlass, Wertung und Ergebnis auf denselben Datensätzen arbeiten, verschwinden die Abgleiche von Hand. Zwei Dinge haben am meisten Zeit gekostet und am meisten gebracht — Zahlungen sauber zu Ende denken (Abbruch, Nachzahlung, Stornierung, nicht nur der glückliche Fall) und die Ergebnisse hinter ein Freigabe-Gate zu legen, statt sie direkt sichtbar zu machen. Fachliche Regeln des Wettkampfbetriebs habe ich mir vom Verband schriftlich geben lassen, bevor ich sie in Code gegossen habe.

03

Key Features

features.md
  • →Digitales Kampfgericht: Judge-Sessions, Live-Wertung, Head-Judge-Freigabe und eigene Zuschauer-/Broadcast-Ansichten statt Wertungszettel
  • →Eine Kasse für alles: Startgeld, Zuschauertickets und Zusatzbuchungen laufen über einen gemeinsamen Warenkorb mit Stripe-Zahlung; der Korb bleibt bei Abbruch erhalten und wird erst nach bestätigter Zahlung geleert
  • →Einlass ohne Liste: Ticket-PDF mit QR-Code, Scanner-Ansicht am Eingang, feste Plätze und Kontingente im Saalplan
  • →Ergebnisse mit Freigabe-Gate: erst nach Master-Judge-Freigabe entstehen offizielle Result-Sets und daraus Urkunden-PDFs
  • →Rollen und Rechte durchgängig in der Datenbank: Athlet, Verein, Vereinsadmin, Judge, Head Judge, Vorstand und Admin über Row-Level-Security getrennt
  • →CMS v2 mit Page Builder, damit der Verband Seiten, News, Downloads und Sponsorenbänder ohne Entwickler pflegt
  • →Eigener Betrieb: self-hosted Supabase, idempotente Migrationen, Seeds und Demo-Datenpool, Deploy über Coolify auf Push
  • →Betriebsdetails, die im Alltag hängen bleiben: Kür-Musik-Upload mit 60-Sekunden-Schnitt, Reminder-Mails, Lizenzanträge per IMAP-Import ins Register
04

Über das Projekt

README.md

Verbands- und Wettkampfplattform für den Bodybuilding-Landesverband NRW. Sie bildet den Ablauf eines Wettkampfs vollständig ab: Eventseite, Anmeldung von Athleten, Vereinen und Kampfrichtern, eine gemeinsame Kasse für Startgeld und Tickets, Einlass per QR-Scan, digitales Kampfgericht mit Live-Wertung, Ergebnisfreigabe durch den Master Judge und daraus erzeugte Urkunden. Daneben läuft der Verbandsalltag: Mitglieder- und Vereinsverwaltung, Lizenzen, Newsletter, Kontaktanfragen und ein CMS mit Page Builder, damit der Vorstand Seiten selbst pflegt. Alles liegt auf einem gemeinsamen Rollen- und Datenmodell in selbst betriebenem Supabase.

05

Meine Rolle

rolle
rolle:Alleiniger Entwickler und Betreiber der Plattform; im Verband zusätzlich ehrenamtlicher IT-Vorstand
team:1 Entwickler
auftraggeber:Nordrhein-Westfälischer Bodybuilding- und Kraftsportverband e. V. (DBFV NRW)
  • Alleiniger Entwickler: Datenmodell, Frontend, Backend, Betrieb
  • Rollen- und Rechtemodell über Row-Level-Security für sieben Rollen
  • Zahlungsstrecke mit Stripe inklusive Abbruch, Nachzahlung und Stornierung
  • Digitales Kampfgericht mit Judge-, Head-Judge- und Broadcast-Sicht
  • CMS v2 mit Page Builder, damit der Verband ohne Entwickler auskommt
  • Betrieb: self-hosted Supabase, Migrationen, Seeds, Deploy über Coolify
  • Fachliche Klärung mit dem Verband und Dokumentation der Wettkampfregeln
06

Architektur

architecture.md

Ein Next.js-Projekt, aufgeteilt nach Nutzergruppen — nicht nach technischen Schichten. Jede Gruppe bekommt einen eigenen Routenbereich mit eigener Navigation und eigenem Layout:

  • (landing) — die öffentliche Verbandswebsite, Inhalte aus dem CMS.
  • (verein) — Vereins- und Athletenbereich: Anmeldungen, Lizenzen, eigene Ergebnisse.
  • (judging) — das digitale Kampfgericht: Judge-Sicht, Head-Judge-Freigabe, Broadcast-Ansicht.
  • (kiosk) — Einlass und Anzeigen vor Ort, auf feste Geräte zugeschnitten.
  • (shop) — Warenkorb und Kasse für Startgeld, Tickets und Zusatzbuchungen.
  • (admin) — Cockpit des Verbands über alle Module.
  • (preview) — Vorschau für das CMS, bevor etwas veröffentlicht wird.

Die Trennung zählt nur im Frontend. Verbindlich sind die Rechte in der Datenbank: Athlet, Verein, Vereinsadmin, Judge, Head Judge, Vorstand und Admin sind über Row-Level-Security getrennt — wer eine Route umgeht, kommt trotzdem nicht an fremde Zeilen.

Das Backend ist eine selbst betriebene Supabase-Instanz. 122 idempotente Migrationen, dazu ein Schema-Snapshot, Seeds und ein Demo-Datenpool, damit ein frischer Stand ohne Handarbeit lauffähig ist. Zahlungen laufen über Stripe, Mails über Nodemailer, Lizenzanträge kommen per IMAP-Import aus dem Bundesverband ins Register.

Digitales Kampfgericht

Judge-Sessions, Live-Wertung, Freigabe durch den Head Judge, dazu eigene Zuschauer- und Broadcast-Ansichten. Ersetzt Wertungszettel.

Next.jsSupabaseRow-Level-Security

Anmeldung und Kasse

Athleten, Vereine und Kampfrichter melden sich über dieselbe Eventseite an. Startgeld, Zuschauertickets und Zusatzbuchungen landen in einem gemeinsamen Warenkorb mit Stripe-Zahlung.

StripePostgreSQLZod

Einlass

Ticket-PDF mit QR-Code, Scanner-Ansicht am Eingang, feste Plätze und Kontingente im Saalplan.

react-pdfNext.js

Ergebnisse und Urkunden

Erst nach Freigabe durch den Master Judge entstehen offizielle Result-Sets — und daraus Urkunden als PDF.

PostgreSQLreact-pdf

Mitglieder, Vereine, Lizenzen

Register für Mitglieder und Vereine, Aufnahmeanträge für Verein, Studio und Coach, Lizenzverwaltung mit Import der Antragsdaten aus dem Bundesverband.

SupabaseIMAP

CMS v2 mit Page Builder

Seiten, News, Downloads und Sponsorenbänder pflegt der Verband selbst — mit Vorschau vor der Veröffentlichung und Modulschaltern für sichtbare Bereiche.

Next.jsshadcn/uiGSAP

Verbandsalltag

Newsletter mit Versand und Tracking, Kontakt-Tickets, Hall of Fame als Erfolgsarchiv, Service-Partner je Zusatzleistung, Wartungsmodus.

NodemailerPostgreSQL

Betrieb

Self-hosted Supabase, 122 idempotente Migrationen, Seeds und Demo-Datenpool, Deploy über Coolify bei jedem Push.

DockerCoolifyPlaywright
07

Herausforderungen

Zahlungen bis zum Ende gedacht
Problem

Der glückliche Fall ist schnell gebaut: Warenkorb, Stripe, fertig. Der Alltag besteht aus Abbrüchen, Nachzahlungen, Stornierungen und doppelt gedrückten Buttons — und jede dieser Situationen erzeugt sonst einen Datensatz, den jemand von Hand geradezieht.

Lösung

Ein Warenkorb für Startgeld, Tickets und Zusatzbuchungen, der bei Abbruch erhalten bleibt und erst nach bestätigter Zahlung geleert wird. Anmeldung gilt erst als gültig, wenn die Zahlung bestätigt ist — nicht, wenn der Nutzer den Kaufen-Knopf gedrückt hat.

Ergebnisse hinter ein Freigabe-Gate
Problem

Während eines Wettkampfs ändern sich Wertungen laufend. Wären sie sofort sichtbar, würden Zwischenstände als Endergebnis gelesen — und jede Korrektur wäre eine öffentliche Richtigstellung.

Lösung

Live-Wertung und offizielles Ergebnis sind zwei verschiedene Dinge im Datenmodell. Erst die Freigabe durch den Master Judge erzeugt ein Result-Set; Urkunden entstehen ausschließlich daraus. Vorher gibt es keine veröffentlichte Zahl.

Sieben Rollen ohne Rechte-Wildwuchs
Problem

Athlet, Verein, Vereinsadmin, Judge, Head Judge, Vorstand und Admin sehen jeweils andere Ausschnitte derselben Daten. Das in der Anwendung zu prüfen hätte bedeutet, jede neue Seite erneut richtig abzusichern.

Lösung

Die Rechte liegen in der Datenbank: Row-Level-Security je Tabelle, die Anwendung stellt nur dar. Eine vergessene Prüfung im Frontend führt dann zu einer leeren Liste, nicht zu fremden Daten.

Fachregeln, die ich nicht selbst kenne
Problem

Wertungsregeln, Klasseneinteilungen und Lizenzabläufe im Wettkampfbetrieb sind Verbandsrecht, kein Entwicklerwissen. Aus dem Bauch implementiert hätte ich sie falsch implementiert.

Lösung

Die Regeln habe ich mir vom Verband schriftlich geben lassen und in der Projektdoku festgehalten, bevor Code entstand. Der digitale Ausrechner hat eine eigene Doku zur Rechen- und Regelkorrektheit — damit spätere Änderungen nachvollziehbar bleiben.

Details, die im Alltag hängen bleiben
Problem

Was ein Projekt aufhält, steht selten im Lastenheft: Kür-Musik muss auf 60 Sekunden geschnitten sein, Erinnerungsmails müssen rechtzeitig raus, Lizenzanträge kommen als Mail vom Bundesverband.

Lösung

Kür-Musik-Upload mit 60-Sekunden-Schnitt direkt in der Anmeldung, terminierte Reminder-Mails, IMAP-Import der Lizenzanträge ins Register. Jeder Punkt einzeln klein — zusammen der Unterschied zwischen Software und einem benutzbaren System.

08

Verlauf

  1. 05/2026

    Projektstart

    Datenmodell, Rollen und die öffentliche Verbandswebsite.

  2. 06/2026

    Sicherheit und Rollen

    Row-Level-Security für alle sieben Rollen, Test-Gates als Voraussetzung für weitere Phasen.

  3. 07/2026

    Zahlung und Event-Lebenszyklus

    Gemeinsamer Warenkorb, Stripe-Anbindung, Anmeldung erst nach bestätigter Zahlung.

  4. 07/2026

    Ergebnisprozess und Wertungsmodul

    Live-Wertung, Freigabe-Gate durch den Master Judge, offizielle Result-Sets.

  5. 08/2026

    CMS-Cutover

    Technischer Umzug auf CMS v2 mit Page Builder erfolgt; die fachliche Endabnahme läuft.

  6. 08/2026

    Wertung 2.0

    Mehrere Klassen-Segmente je Session mit Live-Umschaltung — auf Ansage des Betreibers wieder aufgenommen.

09

Technologie-Entscheidungen

Next.js

React-Framework mit App Router, RSC und Hybrid-Rendering.

framework
React

Komponenten-basierte UI-Library mit deklarativem Rendering.

library
TypeScript

Typsicheres Superset von JavaScript.

language
Tailwind CSS

Utility-First CSS-Framework mit Design-Token-Pipeline.

framework
shadcn/ui

Copy-paste-Komponenten auf Radix + Tailwind, kein klassischer Component-Lib-Lock.

library
Supabase

Open-Source Firebase-Alternative: Postgres, Auth, Storage, Edge-Functions.

platform
PostgreSQL

Objekt-relationale Open-Source-Datenbank mit JSONB, FTS und reicher Erweiterbarkeit.

database
Row-Level-Security

Projektabhängigkeit

Stripe

Projektabhängigkeit

@react-pdf/renderer

PDF-Rendering aus React-Komponenten, serverseitig oder im Browser.

library
GSAP

High-performance Animation-Engine für komplexe Timelines & ScrollTrigger.

library
Zod

Projektabhängigkeit

Playwright

Projektabhängigkeit

Docker

Container-Plattform für reproduzierbare Build-/Deploy-Pipelines.

infrastructure
Coolify

Self-hosted PaaS, Heroku-/Netlify-Alternative auf eigener Hardware.

infrastructure
Nodemailer

Projektabhängigkeit

IMAP

Projektabhängigkeit

10

Codebasis

codebase
Codezeilen199.534
Dateien1.397
Erster Commit05/2026
Sprachen
  • TypeScript/TSX87%
  • SQL13%
11

Verwandte Projekte

Bewerbungsplattform/projekte/bewerbungsplattform
project.json
slug:dbfv-nrw-verbandsplattform
category:Fullstack
rolle:Alleiniger Entwickler und Betreiber der Plattform; im Verband zusätzlich ehrenamtlicher IT-Vorstand
team:1
kunde:Nordrhein-Westfälischer Bodybuilding- und Kraftsportverband e. V. (DBFV NRW)
zeitraum:05/2026 → laufend
stack:17 tech
features:8
bausteine:8
codezeilen:199.534

Code gehört dem Auftraggeber und ist nicht öffentlich.

NächstesBewerbungsplattform