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>
4.6 KiB
4.6 KiB
| 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 5–7 %) — 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.ReviewQueuefü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
ReviewQueuepersistiert, 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:
PencilKitfür Image- Occlusion. SwiftUI hat keinen Pencil-Picker, nicht-vermeidbar. - mana-auth via ManaCore. Eigene Auth-Implementierung verboten.
forest-Theme, lokal inCardsTheme.swiftausmana/packages/themes/src/variants/forest.cssgespiegelt. 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.