# Feature Ideas Stand: 2026-05-12. Korrektur-Pass nach Code-Review gegen den aktuellen Cardecky-Stand. Items, die zwischen Erst-Erstellung (2026-05-11) und heute bereits implementiert wurden, sind unten in **„Seit letzter Liste gebaut"** geführt, damit der Diff nachvollziehbar bleibt, und aus den Themen-Sektionen entfernt. --- ## 🔴 Akute Sicherheitslücke — Live verifiziert 2026-05-12 **Dev-Stub-Auth-Bypass ist auf Production aktiv.** `curl -H "X-User-Id: " https://cardecky-api.mana.how/api/v1/decks` liefert **200 OK** (ohne Header: 401), und Dev-Stub-User bekommen `founder`-Tier (`auth.ts:90`). ### Repo-Patch — gebaut 2026-05-12, noch nicht deployed 1. `apps/api/src/middleware/auth.ts:39` auf **opt-in** geflippt: `ALLOW_DEV_STUB = process.env.CARDS_AUTH_DEV_STUB === 'true'`. Vergessene env-var ⇒ Bypass AUS. 2. `infrastructure/docker-compose.production.yml`: Default flipped auf `:-false`, plus `NODE_ENV: production` für cards-api ergänzt (fehlte zuvor — nur cards-web hatte es). 3. `infrastructure/.env.production.example`: `CARDS_AUTH_DEV_STUB=false` als Pflichtzeile mit Kommentar. 4. `apps/api/vitest.config.ts` + `apps/api/tests/setup.ts` angelegt, damit die Test-Suiten (5 Files mit `X-User-Id`-Auth) den Stub automatisch aktivieren. **Verifikation:** `pnpm test` → 16 Files, 100 Tests grün. ### Verbleibend bei dir (Mac Mini + Deploy) 1. `git pull` / Rebase auf der Prod-Box, dann `docker compose -f infrastructure/docker-compose.production.yml \ up -d --build cards-api`. 2. Verifizieren mit `curl -i -H "X-User-Id: probe" https://cardecky-api.mana.how/api/v1/decks` → erwartet **401** (vorher 200). 3. Optional: `.env.production` auf dem Mac Mini um die explizite `CARDS_AUTH_DEV_STUB=false`-Zeile ergänzen (jetzt nur noch Doku-Konsistenz — der Compose-Default ist schon fail-secure). 4. Forensik: `cards.decks.user_id` und `cards.cards.user_id` gegen `mana_auth.users` joinen — IDs ohne Match wären Indizien für ausgenutzten Bypass. --- ## Seit letzter Liste gebaut (Stand-Korrektur) Diese Punkte standen in der 2026-05-11-Fassung noch als Ideen, sind aber im Code längst gelandet: - **`audio-front` / `typing` / `multiple-choice`** — komplette Renderer + Editor-Forms + Integration im Study-Flow (`AudioFrontView.svelte`, `TypingView.svelte`, `MultipleChoiceView.svelte`, Edit-Routen unter `cards/[id]/edit/+page.svelte`). - **Keyboard Shortcuts im Study-Mode** — `1/2/3/4` = Rating, `Space`/`Enter` = Reveal bzw. `good` (`routes/study/[deckId]/+page.svelte:170-180`). - **Daily Streaks (Backend + Anzeige)** — `me.ts:106-156` berechnet `streak_days`, Stats-Dashboard zeigt es an. Streak-Freeze, Streak im Header und Streak-Push fehlen noch (siehe Gamification unten). - **CSV-Import + CSV-Export** — `lib/csv/{parse,import,export}.ts` + `CsvImport.svelte`. - **Quizlet-Import** — `lib/quizlet/parse.ts` + `QuizletImport.svelte`. - **Marketplace-Smart-Merge-Pull-UI** — `updateAvailable`-Banner und `pullUpdate(deckId)` im Deck-Edit (`routes/decks/[id]/edit/+page.svelte:39,113,275`). - **Lizenz-Feld auf Marketplace-Decks** — `marketplace/decks.ts:73` hat `license` mit Default `Cardecky-Personal-Use-1.0`; Constraint bindet Preis an Lizenz-Typ. --- ## Lern-Erlebnis ### Scheduler-Verbesserungen - **FSRS-Parameter pro User optimieren** — `ts-fsrs` liefert `computeParameters()` aus Review-History; Schema (`decks.fsrs_settings`) und Per-Deck-Override sind vorbereitet, aber kein Endpoint und kein UI. Größter messbarer Retention-Gewinn pro Aufwand. - **Leech-Detection** — `reviews.lapses` zählt bereits; Auto-Markierung + UI-Vorschlag „aufteilen / suspendieren" für Karten oberhalb eines Schwellwerts. - **Undo letzte Bewertung** — wichtiger UX-Reflex; aktuell muss man das Review händisch zurückbauen. - **Card Burial / Suspension** — Karten temporär deaktivieren ohne Löschen; häufig angefragtes Anki-Feature. - **Geschwister-Burial** — Cloze-Cluster und basic-reverse-Seiten nicht am selben Tag wiederholen. - **Custom Study Sessions** — gefilterte Sitzungen: nur neue Karten, nur Fehler der letzten Woche, nach Tag filtern. Tag-Filter im `reviews`-Endpoint fehlt aktuell ganz. - **Session-Mix-Algorithmus** — heute wird `due ≤ now` linear abgearbeitet; Optionen „Neue Karten zuerst", „durchmischt", „nur Fehler" als saubere Filter im Queue-Loader. - **Subdeck-Unterstützung** — hierarchische Deck-Struktur (z. B. Vokabeln → Nomen / Verben). - **Cloze-Hint-Anzeige** — `{{c1::answer::hint}}` wird aktuell beim Rendern fallen gelassen; Hint-Anzeige steht in `STATUS.md` als verbleibender Phase-9-Punkt. ### Kartentypen, Schema vorhanden / vorbereitet - **Bild-Front / Bild-Back** — als generischer Type mit `media_ref` in `fields`. MinIO-Storage + `media_files`-Pfad ist seit Sprint 9k da, also rein UI-Frage. - **Speech-In** (Audio-Antwort vom User) — Whisper via `mana-stt` ist im Plattform-Stack vorhanden; Schema müsste `expected` + Audio- Vergleichs-Strategie definieren. --- ## Gamification & Motivation - **Streak-Freeze-Token** — ein Streak-Schutztag pro Woche, optional durch Credits kaufbar. - **Streak im Header** — heute nur im Stats-Dashboard sichtbar; Header-Glyph mit Zahl wäre Mikro-Aufwand, sichtbare Wirkung. - **XP + Badges** — Meilensteine (erstes Deck, 100 Karten, 30-Tage- Streak). - **Tages-Ziele** — „Heute: 20 Karten" mit Progress-Bar im Dashboard. - **Push/Email-Reminders** — „Du hast heute noch 15 fällige Karten" via `mana-notify`. Aktuell wird `mana-notify` von Cards noch nicht benutzt (siehe `marketplace/pull-requests.ts:41` — „Notify-Calls ausgelassen — eigene Welle"). - **Estimated Mastery Date** — „Dieses Deck beherrschst du voraussichtlich in 3 Wochen" (aus FSRS-Stability ableitbar). --- ## KI-Features - **Auto-Cloze-Generator** — Text markieren → `{{c1::...}}` automatisch einfügen. - **Card-Split-Vorschlag** — KI erkennt informationsreiche Karten und schlägt Aufteilung vor. - **Erklär-Modus** — Nach falscher Antwort: KI erklärt den Zusammenhang (opt-in). - **Auto-Tagging** — Karten beim Erstellen / Importieren semantisch taggen. - **Duplicate Detection** — semantische Ähnlichkeit über Decks hinweg erkennen. - **Card Quality Score** — Hinweis „Diese Karte hat zu viel Text" + Verbesserungsvorschlag. --- ## Analytics & Insights - **Vergessenskurven-Visualisierung** — pro Deck und Tag, aus FSRS-State ableitbar. - **Retention-Rate** — aufgeschlüsselt nach Kategorie und Sprache. - **Lernzeit-Tracking** — Minuten pro Session, Wochentrend. - **Karten-Schwierigkeits-Heatmap** — welche Karten kosten die meiste Review-Zeit. - **Wöchentliche Zusammenfassung** — In-App oder per Email via `mana-notify`. - **Algorithmus-Transparenz pro Karte** — kleines „Wieso wurde ich befragt?"-Tooltip mit Stability/Difficulty/letztem Rating. Macht FSRS sichtbar (Mission-Wert „Souveränität"). --- ## Import / Export - **PDF-Export** — druckbare Karteikarten (A6-Format, vorder-/rückseitig). Print-Route existiert schon (`decks/[id]/print/`), aber als HTML-Print, nicht generiert-PDF. - **`.apkg`-Export** — Round-Trip mit dem Anki-Parser (Parser ist schon da). Stärkste „du kannst jederzeit weggehen"-Geste, Mission-Argument. - **Web Clipper** (Browser-Extension) — markierter Text → sofort neue Karte; eigenes Projekt, eigener Scope. - **SuperMemo XML** — für Power-User aus dem SM-Ecosystem. - **FSRS-State-Export** — Lernstand als JSON exportieren für Backup und Migration (über DSGVO-Export hinaus, in interop-tauglichem Format). --- ## Zusammenarbeit & Community - **Study Spaces** — gemeinsame Decks für Schulklassen und Lerngruppen (braucht Gruppen-Konzept in `mana-auth`, das noch nicht existiert; `decks.visibility = 'space'` ist im Schema vorgesehen, aber ohne Spaces-Backend wirkungslos). - **Deck-Ratings & Kommentare** — Qualitätssicherung im Marketplace durch Community. `marketplace/discussions.ts`-Schema existiert, UI-Anbindung müsste geprüft werden. - **Study Challenges** — mit Freunden auf demselben Deck messen. - **Kreator-Analytics** — für Marketplace-Publisher: Views, Forks, Abonnenten-Retention. - **Collaborative Decks** — Team-Editing mit Rollen (Maintainer / Contributor). --- ## Marketplace (eigener Themenblock) Marketplace-Schema + Pull-Update-UI sind da, aber drumherum klafft einiges: - **Pull-Request-UI** — Backend (`marketplace/pull-requests.ts`) und API-Client (`lib/api/marketplace.ts`) existieren; eine Surface, wo ein Fork-Maintainer Änderungen *an* das Original *vorschlagen* kann, fehlt im Web. - **Versions-Diff zwischen Fork und Upstream** — Voraussetzung, damit Smart-Merge-Pull nicht „trust me"-Klick ist. - **Moderations-Queue-Surface** — `marketplace/moderation.ts` im Schema vorhanden; Report-Funktion auf Decks/Karten im UI fehlt. - **Lizenz-Auswahl bei Publish** — `decks.license` hat Default `Cardecky-Personal-Use-1.0`; Standard-Lizenzen (CC-BY-SA, CC-0, CC-BY-NC) als Optionen im Publish-Flow. - **Lizenz-Anzeige beim Studieren** geforkter Decks — wer das Deck veröffentlicht hat, welche Lizenz greift; transparent unten in der Study-View. --- ## UX / Plattform - **PWA Offline-Read-Only** als Zwischenschritt zur vollen PWA: Service-Worker cached die letzte Queue, Bewertungen werden gepuffert. Bricht die Server-authoritative-Invariante nicht (Puffer ist transient). - **Dark Mode / Theme-Switcher** — `data-theme="forest"` ist in `app.html` fest verdrahtet; In-App-Auswahl fehlt. Bei der laufenden 12-Token-Theming-Strategie ohnehin geplant. - **Bulk-Operationen** — mehrere Karten auswählen, verschieben, taggen, löschen. - **Dynamic Decks / Smart Playlists** — automatisch gefiltert: z. B. „alle Karten mit Tag 'Grammatik' aus 3 Decks". - **Card History** — Lernverlauf pro Karte: wann wie bewertet. --- ## A11y (konkret aufs UI bezogen) - **`prefers-reduced-motion` respektieren** in `DeckFan.svelte` und `DeckStack.svelte` (animationslastige Komponenten). - **Screen-Reader-Live-Region** im Study-View für das Reveal-Event („Antwort eingeblendet"). - **Touch-Targets ≥ 44 px** für die Rating-Buttons; Mobile-Review ist der Haupt-Use-Case und Code zeigt keine explizite Min-Höhe. - **Fokus-Reihenfolge nach Reveal** — Cursor sollte auf den Rating- Buttons landen, nicht am Body-Anfang. - **Tastatur-Hilfe-Overlay** im Study-Mode (`?`-Taste): zeigt die bestehenden Shortcuts an. Heute sind sie undokumentiert in der UI. --- ## Security (eigener Block, weil Live-App) - **Dev-Stub-Default ist `opt-out`, nicht `opt-in`** — siehe akute Sicherheitslücke oben. Fix-Anweisung dort, dieser Eintrag bleibt als Erinnerung, dass die Middleware-Logik in `auth.ts:39` auf opt-in geflippt gehört (`=== 'true'` statt `!== 'false'`). - **JWT in `localStorage`** — `dev-stub.svelte.ts:13` speichert das Access-Token unter `cards.auth.accessToken`. Anfällig für XSS- Token-Diebstahl. Mitigation: DOMPurify sanitisiert Markdown (gut), aber HttpOnly-Cookie wäre der robustere Ansatz, sobald der SSO- Cookie-Pfad ohnehin schon da ist. - **SVG-Upload erlaubt** — `media.ts:13` whitelistet `image/`- Prefix; `image/svg+xml` ist im Extension-Map (`media.ts:28`). SVG kann eingebettetes JavaScript enthalten. Wenn SVG-Medien per `` gerendert werden, ist es harmlos; bei ``/`