Immobilienplattform im Team
BrickUp
Eine Plattform für Immobilien-Vermittlung, an der ich als Softwareentwickler im Team gearbeitet habe.
Anstellung 06/2025 bis 02/2026
Wer darf was?
Wähle eine Aktion und eine Rolle.
- Login
AuthGuard - Rolle
CaslGuard - Filter
accessibleBy
- Neuer Treffer
- Kunde hat reagiert
- Neuer Leadfremd
Teilweise erlaubt. Makler sehen nur ihre eigenen, fremde bleiben in der Datenbank.
Vereinfachtes Beispiel: Der Ablauf entspricht meinem Setup mit eigenen NestJS-Guards und CASL, Rollen und Daten sind erfunden.
Kernkompetenzen
- Sicherheit und Datenschutz
- Integrationen
- Infrastruktur und Betrieb
- Frontend
- Backend und APIs
- KI-gestützte Entwicklung
Tech-Stack
- Expo
- React Native Web
- NativeWind
- TanStack Query
- Zustand
- Leaflet
- NestJS
- Prisma
- PostgreSQL
- CASL
- Socket.IO
- AWS SES
- S3
- Lambda
- Pulumi
- HubSpot
- PriceHubble
- ThinkImmo
- Heyflow
- ImmoScout24
Das Schwierigste
Wenn die einzige Schnittstelle eine E-Mail ist
Ein Prototyp kann den Ablauf beweisen, bevor man sich auf die Infrastruktur festlegt.
Die ganze Geschichte
Was man sah
Fragt jemand auf ImmoScout24 ein Objekt an, kommt nur eine Mail an. Die Daten stecken in einem XML-Anhang, dessen Format nirgends dokumentiert ist. Trotzdem soll daraus automatisch ein Kontakt im CRM werden, ohne Dubletten.
Was wirklich los war
Die erste Version las ein Gmail-Postfach und startete per Windows-Skript. Das bewies den Ablauf, aber darauf kann kein Betrieb laufen.
Die Lösung
Das Format per Reverse Engineering entschlüsselt. Mails landen jetzt über AWS SES in S3, eine Lambda-Funktion zieht die Daten heraus und schickt sie ans Backend, das sich um den Kontakt in HubSpot kümmert.
- 112
- Commits von mir bis 01/2026, von 547 insgesamt
- ~28,9k
- hinzugefügte Zeilen von mir, 24 % des Projekts
- ~7.200
- Zeilen in fünf Aufräum-Commits entfernt
In einfachen Worten
Makler gleichen Suchaufträge von Käufern mit Angeboten ab, Kunden bewerten die Treffer in ihrem eigenen Dashboard, und Anfragen landen automatisch im CRM. Ich habe in allen Phasen mitgearbeitet, vor allem an Infrastruktur, Oberflächen, Berechtigungen und Lead-Prozessen.
Das ist mein Teamprojekt in einer echten Fachdomäne: von der Portal-Anfrage über Lead und Suchauftrag bis zum Exposé, geliefert über Tickets und Pull Requests.
So funktioniert es
Schritt 1 von 5
Portal
Ein Interessent fragt auf ImmoScout24 an. Die Anfrage kommt als Mail mit einem XML-Anhang.
Was gebaut wurde
- Autorisierung für die Plattform auf Basis von CASL: hierarchisches Rollenmodell, zentrale AbilityFactory und deklarative NestJS-Decorators (laut Arbeitszeugnis)
- ImmoScout24-Pipeline auf AWS: Mail über SES und S3 zu Lambda, undokumentiertes XML, Backend-Logik mit CRM-Sync, Duplikatmanagement und Exposé-Versand
- Kunden-Dashboard mit eigener Rolle: Suchaufträge, Treffer, Bewertung mit Feedback und Maklernotizen
- Benachrichtigungen mit Glocke und ungelesenen Zählern. Die Reaktion eines Kunden findet über HubSpot den zuständigen Makler
- Heyflow-Webhook für Leads, öffentliche Projektseiten mit Filtern und ein Admin-Schalter, der Adressen verbirgt
- Rund 7.200 Zeilen Features sauber wieder entfernt
Wie die Kompetenzen eingesetzt wurden
- Sicherheit und Datenschutz
- Rollen und attributbasierte Prüfungen mit CASL über die Kernmodule (RBAC und ABAC)
- Integrationen
- HubSpot mit Kontakten, Leads, Notizen und Duplikaten, dazu PriceHubble, ThinkImmo, Heyflow und ImmoScout24
- Infrastruktur und Betrieb
- Ereignisgetriebene Mailverarbeitung mit AWS SES, S3 und Lambda, als Infrastruktur-Code in Pulumi
- Frontend
- Dashboard, Benachrichtigungen mit Optimistic Updates und Projektseiten mit Expo, React Native Web und TanStack Query
- Backend und APIs
- NestJS-Module für Webhooks und Benachrichtigungen, Prisma Migrate im Team
- KI-gestützte Entwicklung
- KI-Werkzeuge in Codebasis und Abläufe integriert, inklusive interner Automatisierungen (laut Arbeitszeugnis)
Meine Rolle
Softwareentwickler im Team, der die Architektur mit aufgebaut und Features end to end übernommen hat, von der Konzeption bis zur produktiven Einführung.



