wordeck/devlog/2026-05-13/macher.md
Till JS ac05afa93e
Some checks failed
CI / validate (push) Has been cancelled
devlog: 6 Tage geschrieben (Greenfield → Hardening + Cardecky-Native-Vorbereitung)
Tag 1: Phase 0–10c Marathon, Live-Cut auf cardecky.mana.how.
Tag 2: Marketplace-Restore (Phase 12 R0–R5 + G1–G4).
Tag 3: Karten-Typ-Vollausbau (Periodensystem, audio, typing,
multiple-choice, Vision-LLM-Deck-Generation).
Tag 4: Mobile-Nav + 5 Sprachen + CSV/PDF + Astro-Landing.
Tag 5: Security-Hardening (fail-secure, CSP, DSGVO-Audit,
rate-limit) + Leech-Detection + AASA.
Tag 6: Recovery + Undo + FSRS-Slider + Streak + Stats-Charts +
Blog + Marketplace-Report + Privacy/Help.

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

3.7 KiB
Raw Blame History

date day view weekday commits review
2026-05-13 6 macher Mittwoch 8 written

Mittwoch, 2026-05-13 — Tag 6 (Macher-Sicht)

App-Store-Submission-Vorbereitung für cards-native + Funktions- Erweiterungen: Recovery + Undo, FSRS-Slider, Streak, Stats-Charts, Blog, Marketplace-Report + Author-Block.

Stats

8 Commits, +6 347 / 35 LoC, 43 Files. Top-Dirs: api/db (22 %), web/routes (20 %), web/lib (17 %), landing/pages (15 %), api/routes (13 %). Tags: web, infra, cards, api, aasa. Session 11:17 → 00:04, 20 aktive Minuten in einem Block, längster Fokus 20 Min.

Schritte

  • feat(infra): PUBLIC_APPLE_TEAM_ID für AASA-Endpoint. Statt hardcoded jetzt Env-Var, damit dev/staging/prod unterschiedliche Teams nutzen können.
  • fix(web): AASA bundleId ev.mana.cardsev.mana.cardecky. Tag-1-Drift: Domain heißt cardecky, Bundle muss matchen.
  • feat(cards): recovery mode, undo, FSRS slider, streak header, stats charts, blog. Großer Sammel-Commit (+5 200 LoC):
    • Recovery-Mode: gelöschte Karten 30 Tage in deleted_at-Soft- Delete, Undo-Pfad in UI.
    • FSRS-Slider in Settings: desiredRetention 0.70.97.
    • Streak-Header: Daily-Streak-Counter aus Reviews.
    • Stats-Charts: Lern-Verlauf (Recharts).
    • Blog: Astro-Content-Collection in apps/landing/.
  • feat(web): /privacy + /help Stubs für App-Store-Submission.
  • fix(api): 0002_decks_archived_at — schließt Schema-Drift. Web nutzte decks.archived_at, Schema hatte das aber nicht. Migration nachgezogen.
  • feat(aasa): /auth/* in Universal-Link-Paths. Native-App öffnet Auth-Reset-Links direkt.
  • feat(web): /auth/reset + /auth/verify als Fallback-Pages. Falls Universal-Link in Browser landet, gibt's eine Web-Seite, die den Token annimmt.
  • feat(marketplace): Deck-Report + Author-Block + me/decks- Endpoints. Report-Reason-Picker, Block-Tabelle, /me/decks- Listing-API.

Architektur-Entscheidungen

  • Soft-Delete mit deleted_at statt Hard-Delete. 30 Tage Recovery-Frist. Nach 30 Tagen GC-Job. Conform mit DSGVO (recovery = User wollte's nicht).
  • FSRS-Slider als User-Setting, persistiert in user_settings. Server kennt's und passt Card-Reviews entsprechend an.
  • Blog als Astro-Content-Collection in apps/landing/. Cardecky- Web bleibt SvelteKit; Blog ist Marketing-Surface.
  • Stats-Charts mit Recharts (React-Lib). SvelteKit nutzt Recharts via Bridge — Trade-off Code-Größe vs. Eigen-Implementation.
  • Marketplace-Report mit Reason-Picker (URL-spam, Off-topic, Falschinformation, Anderes). Reports landen in marketplace_reports-Tabelle, Moderation-Surface.
  • Author-Block mit blocked_authors-Tabelle, Joins in Marketplace-Queries.

Trade-offs

  • +5 200 LoC in einem Commit ist Anti-Granular, aber alle 6 Features hängen am gleichen Stats-Page-Refactor. PR-Review wäre zäh, Solo-Commit OK.
  • Recharts in SvelteKit ist Hack — Tree-Shake-Overhead. Future: native Svelte-Charts oder eigene SVG-Renderer.
  • 30-Tage-Recovery-Frist ist großzügig — DSGVO-Auto-Delete müsste 7 Tage maximum. Akzeptiert mit Audit-Trail.
  • Soft-Delete-Pfad macht Queries komplexer (alle Queries brauchen deleted_at IS NULL).

Offene Punkte

  • CSP report-only → enforce Watch läuft noch (Tag 5 begonnen).
  • 30-Tage-Soft-Delete-GC-Job noch nicht implementiert.
  • Native-cards-App wartet auf TestFlight-Apple-Submission.
  • Recharts ersetzen durch native Svelte-Charts oder eigene SVG-Implementation (Code-Größe).
  • Blog-Content schreiben — heute nur Infrastruktur, keine Posts.
  • Marketplace-Report-Moderations-Surface für den Verein- Admin (heute nur Report-Submit).