Projekte
Engineering Case Studies.
Backend-Systeme, AWS-Architekturen, Voice-Plattformen und Integrationsframeworks, die ich entworfen, ausgeliefert und betrieben habe. Jede Case Study beschreibt Kontext, Ansatz und Ergebnis.
Homelab-Betrieb
Selbstgehosteter Stack hinter Traefik + Authentik
Mein lebendes Homelab: Docker Compose, Traefik v3, Step-CA für interne Zertifikate, Authentik Forward-Auth, 18+ Dienste. Ein Wochenendprojekt, das irgendwie zur Produktion für meinen Haushalt wurde.
Diese Seite — Portfolio als Produkt
Next.js 14 App mit einem RAG-Assistenten, LLM-i18n-Pipeline und mehrsprachigem PDF-Lebenslauf
## Problem Ein Lebenslauf behauptet Seniorität; er kann sie nicht demonstrieren. Ich wollte ein Portfolio, das selbst ein Produktionssystem ist – jede Funktion ein verifizierbares Arbeitsbeispiel, das ein Recruiter anklicken, lesen und hinterfragen kann. ## Meine Rolle Alles: Produkt, Design, Backend, Frontend und Betrieb – alles alleine entworfen, gebaut und betrieben. ## Einschränkungen - Die serverlose Bereitstellung darf die Postgres-Verbindungen nicht erschöpfen, und öffentliche Seiten müssen ISR-cachebar hinter strengen Sicherheitsheadern bleiben. - Inhalte werden in Englisch, Spanisch und Deutsch ausgeliefert, ohne jeden Beitrag dreifach zu erstellen. - Der KI-Assistent antwortet nur auf Basis meiner echten Inhalte, innerhalb eines täglichen Kostenbudgets, und muss gegen Prompt-Injection resistent sein. ## Architektur Next.js 14 App Router mit TypeScript und Prisma auf Postgres. Der Assistent ist retrieval-augmented: Die Site-Inhalte werden in Stücke zerlegt und in pgvector eingebettet, pro Frage abgerufen und mit OpenAI-Modellen beantwortet – mit Prompt-Injection-Schutz, IP-basierten Ratenlimits, einem täglichen Token-Budget und cron-gesteuertem Re-Indexing. Eine LLM-Übersetzungspipeline generiert die spanischen und deutschen Lokalisierungen mit hash-basierter Staleness-Erkennung. Die Admin-Oberfläche sitzt hinter NextAuth-Anmeldeinformationen plus WebAuthn-Passkeys unter einer nonce-basierten CSP. Das Lebenslauf-PDF wird serverseitig mit PDFKit in allen drei Sprachen gerendert. Die Blogsuchen verwenden die Volltextsuche von Postgres; jede Route gibt kanonische/hreflang-Metadaten, JSON-LD, pro Route Open Graph-Bilder, eine Sitemap, RSS und llms.txt aus. ## Ergebnis Die Site, die du gerade liest: mehrsprachiger Blog und Fallstudien, ein KI-Assistent, der auf meinem eigenen Schreiben basiert, und ein recruiter-bereites PDF-Lebenslauf – alles aus einem Codebase generiert und in der Produktion betrieben. ## Was ich anders machen würde Die i18n-Routing von Anfang an entwerfen – das Nachrüsten bedeutete, dass jede öffentliche Seite jetzt in zwei Routentrees existiert. Und Projektmetriken im Schema anstatt in Prosa unterbringen, damit sie als Highlight-Chips gerendert werden können.
Omnichannel-Integrationsframework — Fallstudie
Ein Factory Method-Rückgrat für Slack, Teams, Google Chat und Webex bei Espressive
## Problem Jeder Unternehmens-Chat-Kanal — Slack, Microsoft Teams, Google Chat, Webex — begann als maßgeschneiderte Integration. Wenn der Fulfillment-Code auf den Kanal verzweigt, wartest du N Produkte, die unter dem Druck von Fristen auseinanderdriften. ## Meine Rolle Ich habe das auf dem Factory Method-Pattern basierende Integrationsframework und die gemeinsamen Testwerkzeuge entworfen und implementiert, auf denen jeder Kanaladapter aufbaut. ## Einschränkungen - Die Kanäle unterscheiden sich in Authentifizierungsmodellen, Payload-Strukturen und Ratenlimits — die Unterschiede mussten innerhalb der Adapter bleiben. - Bestehende Live-Integrationen mussten weiterhin funktionieren, während das Framework sie im Hintergrund ersetzte. - Secure-by-default-Muster (Authentifizierung, MFA, Geheimnisverwaltung) waren für Unternehmenskunden unverzichtbar. ## Architektur Kanaladapter normalisieren jede eingehende Nachricht in ein gemeinsames Envelope; eine Factory Method instanziiert den richtigen Adapter pro Kanal; der Fulfillment-Code arbeitet an Intents und Entities und verzweigt niemals auf den Kanal. Gemeinsame Testwerkzeuge geben jedem neuen Adapter von Anfang an die gleiche Konformitätssuite. ## Ergebnis Slack, Microsoft Teams, Google Chat und Webex laufen alle auf einem gemeinsamen Backbone, und jeder neue Kanal kostet weniger als der vorherige. Über zwei Jahre hinweg wurden keine kritischen Sicherheitsanfälligkeiten in diesen Unternehmensintegrationen aufrechterhalten. ## Was ich anders machen würde Das gemeinsame Intent-Schema am ersten Tag definieren und wie eine API versionieren — divergente Intent-Definitionen später zusammenzuführen, ist der teure Weg. Den Adapter zuletzt bauen: zuerst das gemeinsame Envelope und die Testgeschichte richtig machen.
IVR-Sprachagent — Fallstudie
Integration von asynchronen Chatbot-Gesprächen in Amazon Connect IVR-Workflows bei Espressive
## Problem Der virtuelle Support-Agent von Espressive wurde für asynchrone Chats entwickelt, bei denen eine Antwortzeit von zwei Sekunden schnell wirkt. Ein Telefonanruf ist ein blockierender, Echtzeit-Kanal — Anrufer hören jede Verzögerung in der Pipeline als Stille. Die Plattform benötigte einen Sprachkanal, ohne das bestehende Chatbot-Backend neu zu schreiben. ## Meine Rolle Ich habe die Integration von Anfang bis Ende entworfen und geleitet: Intent-Routing, Orchestrierung von Sprach-zu-Text/Text-zu-Sprach über Amazon Connect, Amazon Lex, AWS Lambda und Polly sowie die Übergabe an die bestehende Erfüllung. ## Einschränkungen - Sprachlatenzbudgets sind unerbittlich — Anrufer bemerken Unterbrechungen von weniger als einer Sekunde, die Chat-Nutzer nie sehen. - Das asynchrone Erfüllungs-Backend war eine Produktionsinfrastruktur, die mit jedem Chat-Kanal geteilt wurde; es konnte nicht für Sprache abgezweigt werden. - Unternehmenssicherheitsanforderungen — Authentifizierung, Geheimnisverwaltung — galten für jeden neuen Schritt. ## Architektur Amazon Connect erfasst Audio und streamt es an Lex zur Intent-Resolution; eine Lambda-Brücke übersetzt zwischen dem synchronen IVR-Flow und dem asynchronen Chatbot-Backend, dann synthetisiert Polly die Antworten zurück in den Anruf. Nachgelagerte Abfragen beginnen spekulativ beim Start der Äußerung anstatt nach der Intent-Resolution, und die Reise eines Anrufers wird über Connect, Lex, Lambda und nachgelagerte APIs korreliert, sodass die Traces die Kanalgrenze überstehen. ## Ergebnis Wurde als Produktionskanal der Plattform des virtuellen Support-Agenten ausgeliefert, der dazu beigetragen hat, das Anrufvolumen des Helpdesks um 40–60 % zu reduzieren. ## Was ich anders machen würde Die cross-service Korrelation von Anfang an einplanen, anstatt sie während der Härtung hinzuzufügen — Traces, die an einer Kanalgrenze enden, sind keine Traces. Und frühzeitig für Barge-in-Abbruchsemantiken budgetieren: jede laufende Synthese wird abbruchbar, was die Idempotenzanforderungen nachgelagert ändert.