Ich baue Webanwendungenend-to-end: von der Idee bis in die Produktion.
Seit 2018 entwickle ich Websoftware, die in Produktion läuft: Angular, Vue, React und TypeScript. Auf dem Server: Java und Play mit MySQL in der aktuellen Stelle, davor eine TypeScript-API mit Node.js, dazu Hono, Workers und PostgreSQL in eigenen Projekten. Ich baue Komponentenbibliotheken und Designsysteme, bringe große Migrationen Schritt für Schritt ins Ziel, etabliere Testkulturen, an die sich Entwickler tatsächlich halten, und verantworte technische Entscheidungen, Code-Reviews und Planung für andere Entwickler. Neben dem Job baue ich LLM-Systeme.
Senior Fullstack Developer · Berlin
Deutsch und Englisch (C1) · Deutsche Aufenthalts- und Arbeitserlaubnis · Vor Ort in Berlin, hybrid oder remote
Bei einem Unternehmen für Krisenkommunikation: Meldemodul mit Angular und Java, Android-App für Fahrzeugbesatzungen über Funk, mehrsprachige Notfall-Web-App für die Bevölkerung im WLAN und ein öffentliches Anzeigesystem.
Ein betriebliches Sprachlernprodukt: eine Angular-Web-App für Lernende und Admins, eine Node.js-API, die auch die mobilen Apps versorgte, eine Statistikansicht und eine Modernisierung der Tests mit Jest.
Microfrontend-Admin-Konsole: Eine zonenlose Angular-21-Shell lädt drei getrennt deployte Apps (IAM, Feature Flags, Audit Logs) zur Laufzeit per Manifest; ein Edge-BFF prüft JWTs. Ohne LLM. Live: echter Login, Mock-Daten.
Die Kennzahlen aus meinen Stellen sind eigene Angaben und als solche gekennzeichnet; eigene Projekte sagen, ob sie live oder im Bau sind. Alle Case Studies, auch die ehrenamtliche Arbeit und die LLM-Projekte, stehen in der Projektübersicht.
Womit ich arbeite.
Technische Führung
In der aktuellen Stelle treffe ich technische Entscheidungen, mache Code-Reviews und plane die Arbeit der Entwickler, die an mich berichten. In einer früheren Stelle habe ich Code-Reviews gemacht und die Arbeit von Junior-Entwicklern geplant. An einer Universität habe ich die Migrationsstrategie für neun Institutswebsites geleitet.
Product Engineering
In der aktuellen Stelle habe ich alle Entscheidungen zur UI-Überarbeitung für Web und Android und zu einer öffentlichen Web-App getroffen und mir teils direkt Feedback von Kunden geholt. TruthBase, ein eigenes Projekt, ging von der Idee bis zur öffentlichen Live-Demo.
Angular
Tägliche Arbeit seit 2025: eine Komponentenbibliothek, die sich die Angular-Web-App und die Android-App teilen, und die schrittweise Migration der Web-App von Angular 10 auf 19. Davor Angular mit einem Node.js-Backend bei einem E-Learning-Unternehmen. Im eigenen Projekt eine zonenlose Angular-21-Shell auf Signals, die Microfrontends zur Laufzeit lädt, jedes Remote mit eigenem NgRx Signal Store.
Vue und React
Vue seit 2018: neun Institutswebsites einer Universität von Vue 2 auf Vue 3 migriert und ihre Barrierefreiheit auf WCAG-Konformität gebracht; bei einer E-Commerce-Plattform ein Designsystem mit Vue und Quasar gebaut. React und Next.js in einem ehrenamtlichen Datenschutzprojekt.
Designsysteme
Komponentenbibliotheken und Designsysteme, aufgebaut oder wiederbelebt an fast jeder Station. In der aktuellen Stelle Design-Tokens mit Theming über neue und bestehende Module hinweg; davor wiederverwendbare Komponenten nach Figma-Vorlagen.
Migrationen
Große Migrationen, schrittweise durchgeführt: Vue 2 auf 3, in einem parallelen Repository und erst live, als die Migration bewiesen war; Angular 10 auf 19 Schritt für Schritt; eine Android-App von Android 6 auf 13 samt vollständiger UI-Überarbeitung.
Testing und CI
Testkulturen, an die sich Entwickler halten: Jest in einer Angular-Codebasis und Cypress-Integrationstests eingeführt, ein veraltetes Vitest-Setup neu aufgesetzt, Playwright und axe in eigenen Projekten. CI/CD mit GitHub Actions.
Backend
Java und Play mit MySQL in der aktuellen Stelle: Live-Updates über WebSockets und sichere parallele Bearbeitung. Davor eine TypeScript-API mit Node.js hinter Web- und Mobil-Clients. In eigenen Projekten: Hono, Nitro und Cloudflare Workers mit Durable Objects, PostgreSQL und ein Edge-BFF, das JWTs prüft.
Neben dem Job: LLM-Systeme.
In eigenen Projekten baue ich das System rund um das Modell: Retrieval, Agenten, Evals und die Oberfläche darüber. Bei jedem Projekt steht, ob es live oder noch im Bau ist; seine Zahlen erscheinen erst, wenn sie gemessen sind. Ich baue auf Foundation-Modellen auf; ich trainiere sie nicht, und ich behaupte es auch nicht. Wie ich sie baue.
Durchsuchen Sie meine Case Studies und meinen Lebenslauf nach Bedeutung statt nach Stichwörtern. Die Embeddings laufen vollständig auf Ihrem Gerät; Ihre Suchanfragen verlassen den Browser nie.
Der Korpus ist klein, und das gehört dazugesagt: 137 Abschnitte aus 11 Dokumenten, den Case Studies und dem Lebenslauf, zur Bauzeit mit Xenova/multilingual-e5-small (q8) eingebettet. In Ihrem Browser bettet dasselbe Modell Ihre Anfrage ein und sortiert die Abschnitte nach Kosinus-Ähnlichkeit. Kein Server, keine Anfrage verlässt die Seite. Die Zahlen unten stammen aus einem eingecheckten Golden-Datensatz mit 77 Fragen, davon 39 % bewusste Umformulierungen, die die Worte des Korpus meiden.
Maßgeblich ist zuerst die Spalte Abschnitt. Auf diesem Golden-Datensatz erreicht zufälliges Sortieren über 11 Dokumente rund 0,30 bei recall@3 auf Dokumentebene; das richtige Dokument ist also die leichtere Hälfte. Den richtigen Abschnitt aus 137 zu treffen ist die Leistung, auf die es ankommt, und die Zahl, die auch bei wachsendem Korpus halten muss.
Retrieval-Qualität (gemessen)
Kennzahl
Dokument
Abschnitt
recall@1
0,82
0,74
recall@3
0,87
0,82
recall@5
0,88
0,84
MRR@10
0,85
0,79
Latenz auf dem Gerät (gemessen)
WASM
WebGPU
Modell laden (kalt)
4173,1 ms
4127 ms
Embedding der Anfrage p50
33,9 ms
82,2 ms
Embedding der Anfrage p95
42,8 ms
96,5 ms
137 Abschnitte sortieren
0,1 ms
0,1 ms
Gemessen auf Apple M5 MacBook, Chrome. Ihre Hardware kann abweichen. WebGPU ist auf dieser Hardware verfügbar und messbar langsamer. Bei 384 Dimensionen und einer kurzen Anfrage pro Aufruf kosten Dispatch und Puffertransfer mehr, als sie an Rechenzeit einsparen; der WASM-Pfad gewinnt.
Ein Score-Floor von 0,81 unterdrückt schwache Treffer, kann die Aufgabe aber nicht allein lösen. Auf diesem Korpus gemessen: Die schwächste berechtigte Frage erreicht 0,814, die stärkste Frage außerhalb der Domäne 0,825. Die Bereiche überlappen, also weist kein einzelner Schwellenwert jede fremde Frage ab, ohne zugleich echte Antworten zu unterdrücken. Der Floor schützt deshalb die echten Antworten. Fragen zu meiner Person statt zur Arbeit (Gehalt, Kündigungsfrist, Referenzen) liegen im selben Bereich wie berechtigte Fragen und liefern Treffer. Die Retrieval-Qualität ist in der CI abgesichert: Ein Pull Request, der recall@3 oder MRR@10 unter die eingecheckte Basislinie drückt, schlägt fehl.