wordeck/devlog/2026-05-08/data.json
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

513 lines
12 KiB
JSON

{
"date": "2026-05-08",
"day_number": 1,
"weekday": "Freitag",
"commits": 45,
"authors": [
{
"name": "Till JS",
"count": 38
},
{
"name": "Till",
"count": 7
}
],
"additions": 15371,
"deletions": 1122,
"net_lines": 14249,
"files_changed": 134,
"new_files": 0,
"deleted_files": 0,
"session": {
"first_commit_at": "2026-05-08T12:08:41.000Z",
"last_commit_at": "2026-05-08T20:10:52.000Z",
"total_span_minutes": 482,
"active_minutes": 244,
"pauses": [
{
"from": "14:41",
"to": "16:43",
"minutes": 122
},
{
"from": "18:52",
"to": "20:09",
"minutes": 77
},
{
"from": "21:11",
"to": "21:50",
"minutes": 39
}
],
"longest_focus_minutes": 130
},
"top_dirs": [
{
"path": "apps/web/src/lib",
"pct": 20
},
{
"path": "apps/web/src/routes",
"pct": 14
},
{
"path": "packages/cards-domain/src",
"pct": 12
},
{
"path": "apps/api/src/routes",
"pct": 8
},
{
"path": "apps/api/src/db",
"pct": 4
}
],
"top_extensions": [
{
"ext": ".ts",
"count": 159
},
{
"ext": ".svelte",
"count": 59
},
{
"ext": ".json",
"count": 23
},
{
"ext": ".md",
"count": 14
},
{
"ext": ".yml",
"count": 10
},
{
"ext": ".yaml",
"count": 7
}
],
"tags": [
"prod-compose",
"dockerfiles",
"api Dockerfile",
"prod",
"auth"
],
"commits_list": [
{
"hash": "8605b1b",
"short": "Phase 0+1: Repo-Skelett für Cards-Greenfield",
"type": null,
"scope": null,
"additions": 1197,
"deletions": 0,
"timestamp": "2026-05-08T14:08:41+02:00"
},
{
"hash": "45a47e0",
"short": "Phase 3: Domain-Modell + Decks/Cards/Reviews-CRUD",
"type": null,
"scope": null,
"additions": 1897,
"deletions": 106,
"timestamp": "2026-05-08T14:21:54+02:00"
},
{
"hash": "5f67bd9",
"short": "Phase 3 follow-up: type-check + tests grün, ts-fsrs v5 API",
"type": null,
"scope": null,
"additions": 2345,
"deletions": 35,
"timestamp": "2026-05-08T14:41:04+02:00"
},
{
"hash": "e3b3a2b",
"short": "docs: SMOKE_TEST.md — verifizierter E2E-Lauf gegen lokale Postgres",
"type": null,
"scope": null,
"additions": 111,
"deletions": 0,
"timestamp": "2026-05-08T16:43:07+02:00"
},
{
"hash": "89a7a92",
"short": "Phase 4: Frontend-Core MVP — Decks, Cards, Study mit FSRS-Loop",
"type": null,
"scope": null,
"additions": 1582,
"deletions": 58,
"timestamp": "2026-05-08T16:52:31+02:00"
},
{
"hash": "0328caa",
"short": "Phase 5: Föderations-Endpunkte — Cards ist föderierter Peer",
"type": null,
"scope": null,
"additions": 1371,
"deletions": 0,
"timestamp": "2026-05-08T17:10:35+02:00"
},
{
"hash": "2bed282",
"short": "docs: STATUS.md als Single Source of Truth für Cards-Onboarding",
"type": null,
"scope": null,
"additions": 336,
"deletions": 0,
"timestamp": "2026-05-08T17:18:16+02:00"
},
{
"hash": "553a78d",
"short": "Phase 8a: Cloze als MVP-Card-Type, Cluster-Counter",
"type": null,
"scope": null,
"additions": 248,
"deletions": 13,
"timestamp": "2026-05-08T17:35:39+02:00"
},
{
"hash": "0b609c4",
"short": "Phase 8b: Cloze-Render im Study-View",
"type": null,
"scope": null,
"additions": 18,
"deletions": 1,
"timestamp": "2026-05-08T17:37:53+02:00"
},
{
"hash": "2ca09fe",
"short": "Phase 8c: Anki-Import via portiertem Parser",
"type": null,
"scope": null,
"additions": 916,
"deletions": 3,
"timestamp": "2026-05-08T17:43:12+02:00"
},
{
"hash": "9da10b3",
"short": "Phase 8d: STATUS.md auf Phase-8-Stand aktualisiert",
"type": null,
"scope": null,
"additions": 78,
"deletions": 20,
"timestamp": "2026-05-08T17:46:33+02:00"
},
{
"hash": "0a40367",
"short": "Phase 9a: Card-Edit-Page für alle 3 CardTypes",
"type": null,
"scope": null,
"additions": 247,
"deletions": 4,
"timestamp": "2026-05-08T17:51:42+02:00"
},
{
"hash": "35366ed",
"short": "Phase 9b: Cloze-Editor in /cards/new",
"type": null,
"scope": null,
"additions": 113,
"deletions": 38,
"timestamp": "2026-05-08T17:52:55+02:00"
},
{
"hash": "47419b3",
"short": "Phase 9c: Inbox-Banner auf /decks und /study",
"type": null,
"scope": null,
"additions": 63,
"deletions": 0,
"timestamp": "2026-05-08T17:54:19+02:00"
},
{
"hash": "aff4d95",
"short": "Phase 9d: Pre-Flight — Protocol-Mirror durch upstream ersetzt",
"type": null,
"scope": null,
"additions": 83,
"deletions": 175,
"timestamp": "2026-05-08T18:00:56+02:00"
},
{
"hash": "03117d5",
"short": "Phase 9e: Account-Page mit DSGVO-Self-Service",
"type": null,
"scope": null,
"additions": 316,
"deletions": 52,
"timestamp": "2026-05-08T18:03:41+02:00"
},
{
"hash": "6db6dc3",
"short": "Phase 9f: Statistik-Dashboard",
"type": null,
"scope": null,
"additions": 238,
"deletions": 2,
"timestamp": "2026-05-08T18:06:13+02:00"
},
{
"hash": "a640594",
"short": "docs: STATUS.md auf Phase-9-Polish-Stand",
"type": null,
"scope": null,
"additions": 60,
"deletions": 26,
"timestamp": "2026-05-08T18:07:53+02:00"
},
{
"hash": "c25c1d0",
"short": "Phase 9g: i18n DE/EN über alle Routes",
"type": null,
"scope": null,
"additions": 826,
"deletions": 270,
"timestamp": "2026-05-08T18:22:00+02:00"
},
{
"hash": "fd86d96",
"short": "Phase 9h: A11y-Pass",
"type": null,
"scope": null,
"additions": 87,
"deletions": 7,
"timestamp": "2026-05-08T18:24:33+02:00"
},
{
"hash": "4b451f1",
"short": "Phase 9i: Cloze-Hint-Anzeige",
"type": null,
"scope": null,
"additions": 60,
"deletions": 12,
"timestamp": "2026-05-08T18:26:00+02:00"
},
{
"hash": "593d447",
"short": "Phase 9j: Anki-Re-Import-Dedupe via content_hash",
"type": null,
"scope": null,
"additions": 176,
"deletions": 8,
"timestamp": "2026-05-08T18:29:56+02:00"
},
{
"hash": "e7ae93d",
"short": "docs: STATUS.md auf Phase-9-Welle-2-Stand",
"type": null,
"scope": null,
"additions": 42,
"deletions": 15,
"timestamp": "2026-05-08T18:31:57+02:00"
},
{
"hash": "c9eb0a6",
"short": "Phase 9k: Media-Upload via MinIO-Container",
"type": null,
"scope": null,
"additions": 886,
"deletions": 78,
"timestamp": "2026-05-08T18:42:56+02:00"
},
{
"hash": "39b1791",
"short": "Phase 9l: Image-Occlusion als 4. MVP-CardType",
"type": null,
"scope": null,
"additions": 681,
"deletions": 33,
"timestamp": "2026-05-08T18:50:45+02:00"
},
{
"hash": "04c48ed",
"short": "docs: STATUS.md auf Phase-9-Welle-3-Stand",
"type": null,
"scope": null,
"additions": 59,
"deletions": 21,
"timestamp": "2026-05-08T18:52:49+02:00"
},
{
"hash": "045903b",
"short": "Phase 10a: Production-Deploy-Stack (Mac Mini)",
"type": null,
"scope": null,
"additions": 203,
"deletions": 0,
"timestamp": "2026-05-08T20:09:19+02:00"
},
{
"hash": "a993cc2",
"short": "fix(prod-compose): cards-api needs NPM_AUTH_TOKEN build-arg",
"type": "fix",
"scope": "prod-compose",
"additions": 2,
"deletions": 0,
"timestamp": "2026-05-08T20:10:39+02:00"
},
{
"hash": "cfdc582",
"short": "fix(dockerfiles): copy tsconfig.base.json into build context",
"type": "fix",
"scope": "dockerfiles",
"additions": 2,
"deletions": 2,
"timestamp": "2026-05-08T20:12:01+02:00"
},
{
"hash": "464aee1",
"short": "fix(prod-compose): cards-minio port 9110→9210 (cadvisor belegt 9110)",
"type": "fix",
"scope": "prod-compose",
"additions": 4,
"deletions": 4,
"timestamp": "2026-05-08T20:13:06+02:00"
},
{
"hash": "78a6c8f",
"short": "fix(prod-compose): cards-api port 3091→3191 (3091 belegt)",
"type": "fix",
"scope": "prod-compose",
"additions": 2,
"deletions": 2,
"timestamp": "2026-05-08T20:13:46+02:00"
},
{
"hash": "f9d7a16",
"short": "fix(api Dockerfile): COPY app-manifest.json (runtime-import)",
"type": "fix",
"scope": "api Dockerfile",
"additions": 4,
"deletions": 0,
"timestamp": "2026-05-08T20:14:20+02:00"
},
{
"hash": "0dff798",
"short": "fix(prod): public URLs auf cardecky.* (war cards.* — bookmarks via nginx-301)",
"type": "fix",
"scope": "prod",
"additions": 7,
"deletions": 6,
"timestamp": "2026-05-08T20:18:10+02:00"
},
{
"hash": "6ea96dd",
"short": "docs: Phase 10 LIVE — cardecky.mana.how + cardecky-api.mana.how",
"type": null,
"scope": null,
"additions": 8,
"deletions": 2,
"timestamp": "2026-05-08T20:19:59+02:00"
},
{
"hash": "506aec3",
"short": "Phase 2a: Cards-API JWT-Verify (additiv zum Dev-Stub)",
"type": null,
"scope": null,
"additions": 73,
"deletions": 11,
"timestamp": "2026-05-08T20:41:09+02:00"
},
{
"hash": "76d4e92",
"short": "Phase 6: Tier-Awareness + mana-credits-Client (Plumbing)",
"type": null,
"scope": null,
"additions": 147,
"deletions": 10,
"timestamp": "2026-05-08T20:45:08+02:00"
},
{
"hash": "5b6d096",
"short": "fix(prod-compose): pass MANA_AUTH_URL/MANA_CREDITS_URL/SERVICE_KEY/DEV_STUB into cards-api container",
"type": "fix",
"scope": "prod-compose",
"additions": 4,
"deletions": 0,
"timestamp": "2026-05-08T20:45:55+02:00"
},
{
"hash": "d7c7c97",
"short": "Phase 7a: cards.create-Tool für Cloze + Image-Occlusion + content_hash",
"type": null,
"scope": null,
"additions": 36,
"deletions": 4,
"timestamp": "2026-05-08T20:48:39+02:00"
},
{
"hash": "a960d09",
"short": "docs: STATUS auf Phase 2/6/7/11 ✅",
"type": null,
"scope": null,
"additions": 4,
"deletions": 4,
"timestamp": "2026-05-08T20:49:43+02:00"
},
{
"hash": "7119756",
"short": "Phase 10c: Cards-Web SSO-Login gegen mana-auth",
"type": null,
"scope": null,
"additions": 236,
"deletions": 55,
"timestamp": "2026-05-08T21:08:06+02:00"
},
{
"hash": "f1622e9",
"short": "docs: Phase 7 LIVE — mana-share + mana-mcp deployed",
"type": null,
"scope": null,
"additions": 1,
"deletions": 1,
"timestamp": "2026-05-08T21:11:31+02:00"
},
{
"hash": "1b840a9",
"short": "Phase 10d: Token-Refresh + 401-Retry im Cards-Web",
"type": null,
"scope": null,
"additions": 118,
"deletions": 15,
"timestamp": "2026-05-08T21:50:12+02:00"
},
{
"hash": "3b74583",
"short": "fix(auth): two-step Login (Better-Auth-native + /refresh) für SSO-Cookie",
"type": "fix",
"scope": "auth",
"additions": 30,
"deletions": 15,
"timestamp": "2026-05-08T21:52:46+02:00"
},
{
"hash": "87a7a31",
"short": "fix(web): SvelteKit-env via \\$env/dynamic/public statt import.meta.env",
"type": "fix",
"scope": "web",
"additions": 17,
"deletions": 8,
"timestamp": "2026-05-08T22:03:35+02:00"
},
{
"hash": "f11df63",
"short": "Phase 9m: KI-Deck-Generation via mana-llm",
"type": null,
"scope": null,
"additions": 437,
"deletions": 6,
"timestamp": "2026-05-08T22:10:52+02:00"
}
],
"review_state": "auto",
"llm": {
"model": null,
"generated_at": null
}
}