DEVLOG · Building in Public

Wie Anirova entsteht.

Jede Woche ein Update. Von der Matching-Engine bis zum Design-System — ich zeig dir den Code, die Entscheidungen, die Fehler. Bauen im Offenen.

Milestone ~4 min

Module 22: Matching-Engine geht live.

Nach 3 Wochen Implementierung und 2 Rewrites läuft die Genre-Vektor-Matching-Engine in der Codebase. Cosine-Similarity auf 11 Dimensionen.

Die Kernfrage: Wie matched man zwei Anime-Fans sinnvoll? Nicht nur "mag gleiche Genres", sondern wie sehr überschneidet sich ihr Taste-Profil.

Jeder User bekommt einen 11-dimensionalen Vektor aus seiner Watchlist. Jede Dimension = ein Genre-Cluster (Action, Romance, Slice-of-Life, Psychological, Fantasy, Sci-Fi, Comedy, Thriller, Horror, Sports, Music). Der Score ist die Cosine-Similarity zwischen zwei Vektoren.

  • Woche 1: Basis-Vektor aus completed-Liste + weighted scores
  • Woche 2: Recency-Weight — was du letzte Woche geschaut hast zählt 3× mehr
  • Woche 3: Edge-Case-Handling + Performance-Tuning (Sub-50ms auf Mittelwert)

Nächster Schritt: Manga-Vektoren + Cross-Media-Matching (Anime ↔ Manga).

Architektur ~3 min

Design System v2: DTCG-konforme Token-Architektur.

Alle Farben, Abstände, Typografie und Shadows laufen jetzt durch einheitliche Token. Exportierbar nach Kotlin, Swift und CSS.

V1 hatte Hardcoded-Werte in Compose-Theme.ons. Das war wartbar beim Start, aber bei 20+ Modulen wurde es chaotisch. V2 mapped alles auf DTCG-Design-Token (Design Tokens Community Group Standard).

Das System hat drei Ebenen:

  • Core Tokens: raw values (#050D1F Navy, 8px spacing, Inter Tight Font)
  • Alias Tokens: semantic mapping (color.surface.primary → #050D1F)
  • Component Tokens: component-spezifisch (card.background → color.surface.primary)

Der Token-Editor im Dashboard erlaubt Live-Export als Kotlin-Object, Swift-Enum und CSS-Custom-Properties. Preview aktualisiert in Echtzeit.

Sicherheit ~5 min

E2E Encryption: Warum X25519 + ChaCha20-Poly1305.

Warum nicht einfach Signal-Protokoll? Weil der Use-Case ein anderer ist. Wir bauen für Pair-Chats, nicht für Gruppen-Messenger.

Jeder Chat zwischen zwei Usern bekommt ein eigenes Schlüsselpaar. Der Public Key wird über Firestore geteilt (signiert vom Server). Der Private Key liegt nur auf dem Device — inklusive Key-Persistance über App-Neustarts via Android KeyStore / iOS Secure Enclave.

Cipher-Suite:

  • Key Exchange: X25519 (Curve25519) — schnell, sicher, moderne ECC
  • Symmetric Encryption: ChaCha20-Poly1305 — AES-Alternative, kein HW-Accelerator nötig, constant-time
  • Key Derivation: HKDF-SHA256 aus dem Shared-Secret

Warum nicht Signal? Signal ist für asynchrone Gruppen-Kommunikation und Forward-Secrecy auf Server-Ebene optimiert. Unser Use-Case ist 1:1-Chat mit synchrone Zustellung. Der Overhead von Signal (Pre-Key-Bundles, Ratchets) wäre nicht gerechtfertigt. X25519 + ChaCha20-Poly1305 ist auditiert, leichtgewichtig und erfüllt unsere Threat-Model-Anforderungen.

Performance ~4 min

KMP: Compose Performance auf iOS optimiert.

Von 8 FPS Ruckeln auf 60 FPS flüssig — was wir gelernt haben beim ersten iOS-Test der Rankings-Sheet.

Der erste iOS-Build zeigte ein massives Problem: das Rankings-Sheet ruckelte bei 200 Einträgen auf 8-12 FPS. Der gleiche Code auf Android lief butterweich. iOS hat eine andere Rendering-Pipeline.

Ursachen und Fixes:

  • LazyColumn ohne Key: Compose iOS braucht stabile Keys sonst rerendert alles — fixed
  • Image Loading: Coil/AsyncImage auf iOS hat keinen Disk-Cache — custom cache layer
  • Overdraw: Jede Karte hatte 3 verschachtelte Surfaces — auf 1 reduziert
  • Scroll Performance: 8px corner-radius auf iOS teurer als auf Android — reduced to min

Nach den Optimierungen: 60 FPS stabil auf iPhone 12 Mini (A14). Nächster Schritt: Benchmarking auf iPad + Captured-Effect-Check bei Transitions.

RSS Feed

👀 Neu hier? Features ansehen · Beta sichern

Beta sichern