Pairfect
Eine App für zwei: gemeinsames Erinnerungsalbum, eine Karte der Orte, an denen ihr wart, Pläne und kleine tägliche Rituale. Allein gebaut, neben Vollzeitstudium und Job.







Auf einen Blick
- Rolle
- allein, Architektur bis Release-Pipeline
- Zeitraum
- 10/2025 bis 07/2026, neun Monate
- Zeilen Dart
- rund 78.200 in 266 Dateien
- Feature-Module
- 11
- Cloud Functions
- 24 Dateien, rund 3.450 Zeilen
- Commits
- 493
Meine Rolle
Alles, allein
Das Problem
Paare verteilen das, was sie teilen, ohnehin schon auf fünf Orte: Fotos in einer App, Pläne in der nächsten, die wichtigen Daten in einer dritten und das Gespräch selbst noch woanders. Nichts davon ist für genau zwei Menschen gebaut, und deshalb verhält sich auch nichts davon so, als wären die beiden ein Konto.
Wie es funktioniert
- Clean Architecture pro Feature, jedes Modul getrennt in data, domain und presentation. Die Abhängigkeiten zeigen nach innen, die Geschäftsregeln eines Features wissen also nicht, dass es Firestore gibt.
- Ein serverloses Backend auf Firebase mit Auth, Firestore, Storage, Messaging, App Check und Cloud Functions in TypeScript.
- Plattformarbeit, die über Screens hinausgeht: Homescreen-Widgets unter iOS via WidgetKit, Offline-Kartendownloads und ein Journey-Player auf Mapbox, und Abos über RevenueCat, wobei die Berechtigung für beide zugleich gilt.
- DSGVO-Datenexport und atomares Löschen des Kontos als Cloud Functions, eine biometrische App-Sperre, serverseitig geprüfte Einmal-Pairing-Tokens, Rate Limiting und Speicherkontingente.
Stack
Flutter, Dart, Firebase, TypeScript Cloud Functions, RevenueCat, Mapbox, WidgetKit, GitHub Actions.
Was ich mitnehme
Zwei Entscheidungen, die ich verteidigen würde. Fotos werden vor dem Upload immer von Metadaten befreit, weil EXIF-GPS die Wohnadresse ist und der Dateikopf die App überlebt. Diese Komponente ist inzwischen Open Source, als exif_scrubber. Und die App-Sperre ist eine reine Oberflächensperre, was auch so in der Dokumentation steht: Sie tauscht den Widget-Baum und verlangt Biometrie zum Zurückkehren, verschlüsselt aber nichts und schützt nicht gegen ein gerootetes Gerät oder forensischen Zugriff. Diese Grenze in den Codekommentar zu schreiben war mir wichtiger, als das Feature stärker klingen zu lassen, als es ist.
Ergebnis
In neun Monaten allein gebaut, von der Architektur über Oberfläche und Backend bis zur automatisierten Release-Pipeline, neben einem Vollzeitstudium und einem Job.