zitare-native/devlog/2026-05-14/macher.md
Till JS 37840e6172 devlog: 2 Tage geschrieben (ζ-0 + ζ-1 + Launch-Flash-Fix)
Tag 1: Hybrid SwiftUI + WKWebView, ζ-0 + ζ-1 + Teile ζ-2.
Tag 2: dreilagiger weißer Flash beim App-Start gefixt.

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

101 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: 2026-05-14
day: 1
view: macher
weekday: Donnerstag
commits: 11
review: written
---
# Donnerstag, 2026-05-14 — Tag 1 (Macher-Sicht)
Sonderfall im Native-Stack: Hybrid SwiftUI + WKWebView. Zitare hat
keinen Hardware-USP gegenüber dem Browser — Native bringt nur
Widget, ShareExtension, Spotlight, Submit. Lesen bleibt im Web.
Phasen ζ-0 + ζ-1 + Teile von ζ-2 in einer Schicht.
## Stats
11 Commits, +3 130 / 226 LoC, 36 Files. 40× `.swift`, 7× `.yml`,
8× `.md`. Top-Dirs `Sources/Features/WebShell` (15 %),
Assets (9 %). Tags: `icon`, `dark-mode`. Session 10:15 → 21:45,
37 aktive Minuten in 3 Blöcken (Vormittag + Abend).
## Phasen
- **ζ-0 — Setup.** Repo-Skelett, `project.yml` (XcodeGen), ManaCore
+ ManaTokens als Package-Dependency, leerer Build im Simulator
grün, `/healthz`-Probe gegen `zitare-api.mana.how`.
- **ζ-1 — WebShellView.** `WKWebView` als `UIViewRepresentable`/
`NSViewRepresentable`-Bridge, Universal-Link-Routing, Cookie-SSO-
Bridge (`mana.access` auf `.mana.how`).
- **ζ-1 abgeschlossen** — `DeepLinkRouter` + Web-Header-Hide via
injizierter CSS. Header + Footer der Website werden in der App
ausgeblendet, weil App-Chrome reicht.
- **ζ-2 native** — `SwiftData`-Snapshot-Cache + `DailyQuoteWidget`
vorbereitet. Snapshot kommt von `https://zitare.com/index-min.json`,
App-Group `group.ev.mana.zitare` reicht es an Widget durch.
- **ζ-1 Polish** — robuster Header-Selektor (DOM-Drift-Tolerant),
`zitare.mana.how` als zweite UL-Domain.
- **Cloudflare-TODO + PLAN.md externe Blocker.**
`zitare.mana.how`-DNS-Record + CNAME-Cleanup nötig, sonst
AASA-Validation flapsig.
- **TestFlight-Validation grün** — Icon-Asset + `CFBundleIconName`
korrekt gesetzt. Erste Upload-Versuche scheiterten an iconAsset.
- **Icon-Platzhalter** — vereinfachte Anführungszeichen-Glyphe,
Pixel-Render. Echtes Icon kommt vor Submit.
- **Mac-Window + Konto-Header** nach erstem TestFlight-Build.
- **CFBundleVersion 2** für nächsten Upload-Roundtrip.
- **Dark-Mode-Fix** — WebView folgt System-`prefers-color-scheme`
statt zitare.com-localStorage-Toggle. Vorher hat man im App-Modus
unbeabsichtigt den Web-Schalter umgestellt.
## Architektur-Entscheidungen
- **Hybrid ausnahmsweise.** Lese-Surfaces via `WKWebView`, Native-
Surfaces (Widget, ShareExt, Submit, Spotlight) pure SwiftUI.
Trennung ist fest — keine schleichende Native-Re-Implementation
von Read-Routes (CLAUDE.md Invariante 1, „Don't do").
- **AASA-Domain `zitare.com`**, nicht `zitare.mana.how`. Public-URL
trägt die App, mana.how ist API/Backstage.
- **Cookie-SSO-Bridge** statt JWT-Header in WebView. Domain
`.mana.how` setzt Cookie, WebView lädt `zitare.mana.how` mit
Cookie automatisch.
- **Snapshot lokal für Widget + Spotlight**, nicht für WebView.
WebView lädt live, Widget/Spotlight können nicht live laden
(Background-Refresh-Budget).
- **Header-Hide via injizierter CSS**, statt eigene App-Routes.
Selektor robust gegen DOM-Drift; bricht im worst case lautlos,
zeigt aber dann Header — kein Crash.
- **Theme: `paper`-Variant** aus `@mana/themes/paper`, lokal in
`ZitareTheme.swift` nachgebaut. Match zur Website.
## Trade-offs
- **WebView-Hybrid** spart Native-Read-Surface-Aufwand komplett,
aber: WebView-DOM ist nicht App-DOM. Selektor-Drift, Cookie-
Sync-Edge-Cases, Performance-Regressions im JS sind Web-Sorgen,
nicht App-Sorgen — und wir merken sie hier später.
- **`zitare.com` als AASA-Domain + `zitare.mana.how` als zweite**:
doppelte Universal-Link-Logik. Wenn Web-Routing sich ändert,
muss App + AASA + Web nachziehen.
- **Snapshot-Pull bei Launch** macht App schneller-startend gegen
Widget-Daten, kostet aber bei jedem Cold-Start 11+ Quotes
Bandbreite. Bei 50 k Quotes-Korpus später Schmerz; heute
irrelevant.
- **TestFlight-Roundtrip** kostet Iterationen — `CFBundleIconName`
fehlte, `Icon`-Asset hatte falsche Größe, dadurch zwei Failed-
Validations. Standard für native App-Erstbuilds.
## Offene Punkte
- **DNS-CNAME für `zitare.mana.how`** in Cloudflare setzen, alter
CNAME entfernen.
- **Echtes AppIcon** statt vereinfachter Anführungszeichen-Glyphe.
- **ζ-3 Submit-View** in SwiftUI mit ManaAuthGate (Action-Level-
Login-Eskalation). Pending.
- **ζ-4 Spotlight + ShareExtension + App Intents.** Pending.
- **ζ-5 Polish** — iPad-Split-Layout, Accessibility.
- **ζ-6 App-Store-Submission** — Bundle `ev.mana.zitare`, Team
registriert.
- **DailyQuoteWidget auf echtem Gerät** testen — Simulator zeigt's,
echtes iPhone-Widget-Behavior ist gelegentlich anders.