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/bewerbungsplattform/Fullstack/Live/04/2026 → laufend/Alleinentwickler

Bewerbungsplattform

Diese Website selbst: pro Stelle eine eigene Bewerbungsseite, Lebenslauf und Anschreiben als PDF aus denselben Daten, Admin-CMS auf selbst betriebenem Supabase.

Läuft seit Mai 2026 unter tobiasjonas-ludwig.de und wird laufend weitergebaut — jede Bewerbung, die ich verschicke, geht über diese Plattform.

Live Demo

Repository ist privat — Code zeige ich auf Nachfrage.

Next.jsReactTypeScriptTailwind CSSshadcn/uiSupabasePostgreSQLRow-Level-SecurityDeno Edge FunctionsPlaywrightChromiumpdf-libThree.jsFramer MotionDockerCoolifyMCP
project dossier

Snapshot

bewerbungsplattform

Alleinentwickler

category

Fullstack

status

LIVE

stack

17 tech

code

278.390 Zeilen
Next.jsReactTypeScriptTailwind CSSshadcn/uiSupabasePostgreSQL
Live öffnen
ZahlenStoryFeaturesÜberMeine RolleArchitekturHerausforderungenVerlaufTechCodebasisVerwandt
01

Zahlen zum Projekt

Anwendungscode278.000Zeilen in 1.229 Dateien, ohne generierte Typen
Datenbankmigrationen239versionierte SQL-Dateien
Seitenrouten217Next.js-Seiten
MCP-Werkzeuge75geprüft, begrenzt, protokolliert
PDF-Vorlagen9Lebenslauf, Anschreiben, Mappe
Commits676seit 04/2026
02

Story

Problem

Eine Bewerbung besteht aus denselben Angaben in immer neuen Formen: Lebenslauf, Anschreiben, Portalformular, Online-Profil. Wer sie einzeln pflegt, hat nach zehn Bewerbungen zehn Stände — und in jedem einen anderen Fehler.

Lösung

Werdegang, Kenntnisse, Projekte und Nachweise liegen einmal in der Datenbank. Eine Bewerbung wählt daraus aus; Seite und PDFs sind zwei Darstellungen derselben Auswahl. Ändert sich eine Station, ändert sie sich überall.

Learnings

Der Aufwand steckt nicht in den Vorlagen, sondern im Seitenumbruch. react-pdf trennt deutsche Wörter nach englischen Regeln, schiebt einen Block, der nicht mehr aufs Blatt passt, komplett auf die nächste Seite statt ihn zu teilen, und lässt fixe Fußzeilen verschwinden, sobald ein Zeilenabstand auf der Seite steht. Dazu die Erkenntnis, dass nicht eingebettete Standardschriften bei jedem Empfänger anders aussehen — inklusive verschwundener Fettschnitte.

03

Key Features

features.md
  • →Pro Stelle eine eigene Bewerbungsseite. Zeugnisse und Foto liegen im privaten Bucket und werden nur mit gültigem Share-Key ausgeliefert.
  • →Abgleich gegen die Stellenanzeige: zu jeder Anforderung die Station, die sie belegt — Nachweise statt einer Prozentzahl.
  • →Lebenslauf, Anschreiben und Bewerbungsmappe als PDF aus denselben Daten. Neun Vorlagen mit eingebetteten Schriften, damit die Datei bei jedem Empfänger gleich aussieht.
  • →Unterschrift einmal im Admin mit der Maus gezeichnet, danach in jedem Anschreiben über dem Namen.
  • →MCP-Server mit 71 Werkzeugen: ein KI-Assistent pflegt Bewerbungen, Projekte und Leads — jeder Schreibzugriff geprüft, begrenzt und protokolliert.
  • →Self-hosted Supabase mit 229 versionierten Migrationen; Deploy läuft über Coolify bei jedem Push auf main.
04

Über das Projekt

README.md

Bewerbungsportal und Redaktionssystem in einem. Jede Bewerbung bekommt eine eigene Seite mit kuratierten Inhalten und einem Abgleich gegen die Anforderungen der Stellenanzeige, belegt mit Stationen aus dem Werdegang. Aus denselben Daten entstehen Lebenslauf, Anschreiben und die vollständige Bewerbungsmappe als PDF — kein Dokument wird doppelt gepflegt. Backend ist eine selbst betriebene Supabase-Instanz mit Row-Level-Security auf 77 Tabellen und sieben Edge Functions; das Frontend baut Coolify bei jedem Push neu. Ein eigener MCP-Server macht die Inhalte für einen KI-Assistenten schreibbar — mit Rechteprüfung, Rate-Limit und Audit-Log, damit ein Assistent nichts anrichten kann, was sich nicht nachvollziehen lässt.

05

Meine Rolle

rolle
rolle:Alleinentwickler
  • Datenmodell und Row-Level-Security für alle Tabellen
  • Bewerbungsansicht, Admin-CMS und öffentliche Website
  • PDF-Pipeline: HTML-Vorlagen, Chromium-Druck, Schriftreduktion
  • MCP-Server mit 75 Werkzeugen inklusive Rechteprüfung und Audit-Log
  • Betrieb: self-hosted Supabase im Docker-Stack, Deploy über Coolify bei jedem Push
  • Inhalte: Texte, Nachweise, Referenzen — die Plattform ist gleichzeitig ihr eigener Anwendungsfall
06

Architektur

architecture.md

Ein Next.js-Projekt mit vier klar getrennten Bereichen, dahinter eine selbst betriebene Supabase-Instanz.

  • app/(public) — die öffentliche Website: Landing, Projekte, Referenzen, Blog, Tools, Kalender.
  • app/bewerbung/[slug] — die individuelle Bewerbungsansicht. Kein eigener Datensatz, sondern eine Auswahl aus dem gemeinsamen Profil, aufgerufen über einen Share-Key.
  • app/(admin)/admin — das CMS für genau einen Nutzer. Alles, was auf der Website steht, wird hier gepflegt.
  • app/api/mcp — derselbe Datenbestand als MCP-Server, damit ein KI-Assistent schreiben kann, ohne an der Datenbank vorbeizugreifen.

Die Datenhaltung ist der Kern: Werdegang, Kenntnisse, Projekte, Referenzen und Nachweise liegen einmal in PostgreSQL. Eine Bewerbung ist eine Auswahl darauf plus ein paar Textfelder. Aus derselben Auswahl entstehen die Webansicht und alle PDF-Dokumente — es gibt keinen zweiten Stand, der auseinanderlaufen könnte.

Die PDFs kommen seit August 2026 aus Chromium: Die Vorlagen sind HTML und CSS, Playwright druckt sie, pdf-lib fasst die Mappe zusammen und reduziert die eingebetteten Schriften auf die tatsächlich benutzten Zeichen.

Zugriffsschutz liegt in der Datenbank, nicht in der Anwendung: Row-Level-Security auf allen Tabellen, Zeugnisse und Foto in einem privaten Bucket, der nur mit gültigem Share-Key ausliefert. Der Service-Role-Schlüssel existiert ausschließlich serverseitig.

Bewerbungsansicht

Pro Stelle eine eigene Seite: Motivation, Anforderungsabgleich mit Belegen, kuratierte Projekte, Nachweise und Terminöffnung — erreichbar über einen Share-Key.

Next.jsReactTailwind CSS

Admin-CMS

Ein Redaktionsbereich für genau einen Nutzer: Werdegang, Kenntnisse, Projekte, Referenzen, Blog, Produkte, Leads, Medien, Einstellungen.

Next.jsshadcn/uiSupabase

Dokumenten-Erzeugung

Lebenslauf, Anschreiben und die komplette Mappe als PDF. Vorlagen sind HTML und CSS, gedruckt über Chromium, zusammengeführt und schriftreduziert mit pdf-lib.

PlaywrightChromiumpdf-lib

MCP-Server

75 Werkzeuge auf demselben Datenbestand — Bewerbungen anlegen, Profile pflegen, Leads bearbeiten. Mit Bearer-Token, Rate-Limit, Bestätigung für destruktive Aufrufe und Audit-Log.

MCPTypeScript

Anforderungsabgleich

Zu jeder Anforderung aus der Stellenanzeige die Station, die sie belegt. Bewusst Belege statt einer Prozentzahl — eine Zahl beantwortet die Frage des Lesers nicht.

TypeScriptPostgreSQL

Leads und Demoseiten

Akquise-Seite für Kunden: Betriebe erfassen, Websites bewerten, datengetriebene Demoseiten aus einer Konfiguration in der Datenbank bauen.

Next.jsSupabase

Datenschicht

Self-hosted Supabase im Docker-Stack: PostgreSQL mit Row-Level-Security, acht Edge Functions, 239 versionierte Migrationen — eingespielt über SSH, weil kein CLI zur Verfügung steht.

SupabasePostgreSQLDeno Edge FunctionsDocker
07

Herausforderungen

Der Seitenumbruch, nicht die Vorlage
Problem

Die PDFs liefen zuerst über react-pdf. Deutsche Wörter wurden nach englischen Regeln getrennt, ein Block, der nicht mehr aufs Blatt passte, rutschte komplett auf die nächste Seite statt sich zu teilen, und fixe Fußzeilen verschwanden, sobald ein Zeilenabstand auf der Seite stand. Jede neue Vorlage brachte dieselben Kämpfe von vorn.

Lösung

Umstieg auf Chromium: Vorlagen sind seitdem HTML und CSS, gedruckt über Playwright mit `@page`-Rändern. Umbruch, Silbentrennung und Wiederholkopfzeilen macht die Druck-Engine des Browsers — also das Stück Software, das genau dafür gebaut ist. pdf-lib fügt die Mappe zusammen und reduziert die eingebetteten Schriften auf die benutzten Zeichen.

Nicht eingebettete Schriften sehen überall anders aus
Problem

Eine PDF-Datei mit Standardschriften sieht bei jedem Empfänger anders aus — inklusive Fettschnitten, die schlicht verschwinden. Beim Lebenslauf ist das kein Schönheitsfehler, sondern die erste Wirkung.

Lösung

Alle Schnitte werden eingebettet und beim Zusammenführen auf die tatsächlich vorkommenden Zeichen reduziert. Die Datei bleibt klein und sieht bei jedem gleich aus.

Ein Assistent mit Schreibrechten
Problem

Der Punkt am MCP-Server ist, dass eine KI Inhalte pflegen kann. Genau das ist auch das Risiko: Ein falscher Aufruf löscht Datensätze, und niemand weiß hinterher, wer was getan hat.

Lösung

Jeder Aufruf braucht ein Bearer-Token, optional eine IP-Freigabe und läuft gegen ein Rate-Limit. Destruktive Werkzeuge verlangen zusätzlich einen eigenen Bestätigungs-Header. Alles landet im Audit-Log, das im Admin einsehbar ist.

Kein CLI für das eigene Backend
Problem

Supabase läuft selbst gehostet im Docker-Stack. Das Supabase-CLI setzt eine verwaltete Instanz voraus — `db push` und die Typgenerierung fallen damit aus.

Lösung

Migrationen liegen versioniert im Repository und werden über SSH und `docker exec psql` eingespielt. Die TypeScript-Typen werden bei einzelnen Tabellen von Hand nachgezogen. Der Ablauf steht in der Projektdoku, damit er reproduzierbar bleibt.

08

Verlauf

  1. 04/2026

    Erste Fassung

    Landing und Bewerbungsansicht, Daten noch über Prisma. Kurz darauf ein eigener API-Dienst mit Hono und Drizzle.

  2. 05/2026

    Umzug auf Supabase, MCP-Server entsteht

    Prisma raus, self-hosted Supabase mit Row-Level-Security rein. Parallel der erste MCP-Server mit Audit-Log und Rate-Limit.

  3. 05/2026

    KI-Werkzeuge im Admin

    Stellenanzeige einlesen, Anschreiben-Coach als Chat, Quellenverwaltung mit eigenem Crawler, Blog mit strukturierten Daten.

  4. 08/2026

    Nachweise und Papiermappe

    Zeugnisse und Zertifikate eingepflegt, Bewerbungsfoto, Nachweise einzeln im PDF-Block, viertes CV-Layout.

  5. 08/2026

    MCP-Server zieht ins Frontend

    Der eigenständige Container hing nicht am Auto-Deploy. Seitdem läuft der Server als Route /api/mcp und wird mit der Website ausgerollt.

  6. 08/2026

    PDFs aus Chromium

    Ablösung von react-pdf: Vorlagen als HTML und CSS, gedruckt über Playwright, Mappe zusammengeführt mit pdf-lib.

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

Deno Edge Functions

Projektabhängigkeit

Playwright

Projektabhängigkeit

Chromium

Projektabhängigkeit

pdf-lib

Projektabhängigkeit

Three.js

WebGL-Library für 3D-Szenen, Kameras und Effekte im Browser.

library
Framer Motion

Production-grade Animationen für React (Spring, Layout, Gesten).

library
Docker

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

infrastructure
Coolify

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

infrastructure
MCP

Projektabhängigkeit

10

Codebasis

codebase
Codezeilen278.390
Dateien1.229
Commits676
Erster Commit04/2026
Letzter Commit08/2026
Sprachen
  • TypeScript/TSX87%
  • SQL13%
11

Verwandte Projekte

DBFV NRW Verbandsplattform/projekte/dbfv-nrw-verbandsplattformNextCMS/projekte/next-cms
project.json
slug:bewerbungsplattform
category:Fullstack
rolle:Alleinentwickler
zeitraum:04/2026 → laufend
stack:17 tech
sprache:TypeScript
features:6
bausteine:7
codezeilen:278.390
commits:676
links
Live Demo

Repository ist privat — Code zeige ich auf Nachfrage.

VorigesDBFV NRW VerbandsplattformNächstesNextCMS