wordeck-native/devlog/2026-05-12/macher.md
Till JS c0b0c902bc devlog: 3 Tage geschrieben (v0.1.0 → v0.9.4)
Tag 1: β-0 bis β-7 Marathon (Skelett → App-Store-Vorbereitung).
Tag 2: Cardecky-Web-Look + alle 7 Card-Types + ManaAuthUI +
Guest-Mode + γ-1 bis γ-8 (AI/CSV-Import, Marketplace, PDF).
Tag 3: kleiner Style-Polish.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 22:22:29 +02:00

4.6 KiB
Raw Blame History

date day view weekday commits review
2026-05-12 1 macher Dienstag 10 written

Dienstag, 2026-05-12 — Tag 1 (Macher-Sicht)

Phasen β-0 bis β-7 aus dem Greenfield-Playbook in einer Marathon- Session. Skeleton → App-Store-Vorbereitung. Web-Parität als Leitprinzip, FSRS bleibt server-authoritative, alles andere ist Native-Re-Implementation des Web-Cardecky.

Stats

10 Commits, +6 964 / 326 LoC, 77 Files. 79× .swift. Session 17:29 → 01:56, 67 aktive Minuten, längster Fokus 67 Min. Top-Dirs sind sehr verteilt (alle 57 %) — Greenfield-Tag, der jeden Subsystem-Bereich anfasst.

Versions-Tags

  • v0.1.0 — β-0 Setup. XcodeGen-Manifest, ManaCore + ManaTokens- Package-Dependency, ManaCore-Login + Healthz-Probe gegen cardecky-api.mana.how.
  • v0.2.0 — β-1 Decks lesen. SwiftData-Cache, /api/v1/decks-Liste, Detail-View mit Karten-Anzahl, Stats-Sektion.
  • v0.3.0 — β-2 Study-Loop. Grading gegen POST /api/v1/reviews/ :cardId/:subIndex/grade. ReviewQueue für Offline-Grades, Replay bei Reconnect. SubIndex-Berechnung für Cloze bleibt server-side.
  • v0.4.0 — β-3 Editor. Basic, Cloze, Typing, Multiple-Choice als Editor-Surfaces. Content-Hash-Berechnung am Server.
  • v0.5.0 — β-4 Media + Advanced Card-Types. Image- und Audio-Front-Karten, Image-Occlusion-Mask via PencilKit (einzige UIKit-Bridge), mana-media-Upload-Pfad.
  • v0.6.0 — β-5 Marketplace. /api/v1/marketplace/*-Routen, Subscribe-Flow, Universal-Links für Deck-Slugs.
  • v0.7.0 — β-6 Native-Polish. WidgetKit (Due-Cards-Counter + Heute-Streak), Local-Notifications für Review-Reminder, Share- Extension „Save as Card".
  • chore: gitignore widget-generated Info.plist + entitlements. XcodeGen generiert die, sollen nicht im Git.
  • v0.8.0 — β-7 App-Store-Vorbereitung. PrivacyInfo.xcprivacy, AASA-Endpoint im Cards-API, Submission-Checkliste.
  • AASA-Endpoint als done markiert code-seitig — DNS-/Cloudflare- Roundtrip steht aus (gleiche Falle wie zitare-native).

Architektur-Entscheidungen

  • Server-authoritative FSRS. Grading-Calls immer an POST /api/v1/reviews/:cardId/:subIndex/grade. Kein lokaler ts-fsrs-Port. Vorteil: Algorithmen-Updates wirken sofort in Native, ohne App-Update. Nachteil: Grading ist online-bedingt (Offline-Queue löst das mit Round-Trip-Delay).
  • Offline-Read, Online-Write. Decks + Due-Cards via SwiftData gecacht (offline lesbar). Grades werden offline in einer ReviewQueue persistiert, beim Reconnect der Reihe nach abgesendet.
  • Cards-Domain-Logik bleibt am Server. SubIndex-Berechnung für Cloze, Image-Occlusion-Mask-Validation, Content-Hash — alles Server. Native zeigt nur, was vom Server kommt.
  • Pure SwiftUI, einzige UIKit-Bridge: PencilKit für Image- Occlusion. SwiftUI hat keinen Pencil-Picker, nicht-vermeidbar.
  • mana-auth via ManaCore. Eigene Auth-Implementierung verboten.
  • forest-Theme, lokal in CardsTheme.swift aus mana/packages/themes/src/variants/forest.css gespiegelt. Migration auf ManaTokens-Theme-Switch ist Phase ε.
  • Web gewinnt bei Konflikt. Eleganteres Native-Verhalten geht zuerst in Web, dann nach hier. Verhindert Drift.

Trade-offs

  • 67 Min Active für β-0 bis β-7 klingt absurd komprimiert. Realer Grund: jeder β-Schritt ist „Web-Funktion X als SwiftUI spiegeln" — die Domain-Arbeit (FSRS, Cloze, Content-Hash) ist alles Server-side bereits gelöst. Native = Wire-Format + Codable + View.
  • PencilKit-Bridge als einzige UIKit-Konzession. Beschränkt; Image-Occlusion kann sonst nicht ergonomisch sein.
  • Local-Notifications für Review-Reminder sind Best-Effort. iOS budgetiert hart; bei vielen Decks kann eine Erinnerung verschoben werden.
  • +6 638 LoC netto in einer Schicht — keine Architektur-Arbeit, reine Übersetzung. Wäre das nicht so identisch zum Web-Modell, wäre der Tag dreimal so lang.

Offene Punkte

  • AASA-DNS-Roundtrip für Universal-Links. Code da, DNS-Setup in Cloudflare offen.
  • TestFlight-Build mit allem an Bord — Apple-Submission Folge- Tag.
  • Endurance-Test auf echtem Gerät über mehrere Tage — Battery-Drain durch Notifications, ReviewQueue-Drift bei langem Offline, Widget-Refresh-Verhalten.
  • WebKit-Local-Cache für rich-content-Karten (HTML-Rich-Text) nicht implementiert — heute Plain-Text-Fallback.
  • Cards-Domain forest-Theme ist hartcodiert; ManaTokens- Theme-Switch kommt mit Plattform-Variants-Release.
  • ShareExtension vorbereitet, aber App-Group-Entitlement muss in Apple-Dev-Portal aktiviert werden.