Skip to content

Start · Devlog

Tag 1 · Freitag, 15. Mai 2026

Freitag, 2026-05-15 — Tag 1

Spieler-Sicht

ManaMeme geht live. Ein Bild-Feed des Vereins — werbefrei, ohne Empfehlungs-Algorithmus, mit klarer Quellenangabe für jedes Bild.

Was du heute findest

  • 112 Bilder zum Start, kuratiert in fünf Themen: Karikaturen-Archiv (53), Karikaturen international (25), Wholesome (22), Bilderbogen (10), Programmierer-Humor (2). Alles gemeinfrei oder mit klarer Lizenz.
  • Jedes Bild zeigt, woher es kommt — Lizenz und Original-Urheber sind sichtbar. Wer den Verein als Importeur erkennt, sieht oben ein 🏛 Verein-Import-Label statt eines anonymen Bots.
  • Kein Algorithmus. Was du siehst, ist chronologisch und nach Thema gefiltert. Was du nicht sehen willst, kannst du wegklicken, nicht der Server für dich.
  • „AI-Slop"-Filter als Default-Schalter im Feed. Du entscheidest, was rein darf, nicht wir.

Was noch fehlt

  • Eigenes Hochladen funktioniert noch nicht produktiv. Heute waren alle Bilder Importe — Posten als angemeldeter Mensch kommt im nächsten Schritt.
  • Bilder kannst du anschauen, aber noch nicht zuschneiden oder bearbeiten beim Hochladen.

Hintergrund

Wir wollen einen Bild-Feed, der den Verein anständig repräsentiert: keine Werbung, keine Tracker, keine versteckte Sortier-Logik. Heute ist die Tür auf, der Raum eingerichtet, an den Wänden hängen die ersten 112 Bilder.

Macher-Sicht

Greenfield-Repo aus Initial-Commit zur Live-App in einer Session. Strategie D aus MANAMEME_GREENFIELD.md — eigenständige Peer-App, nicht Subprojekt von cards/mana. Phase 0 → Phase 9d an einem Tag, weil große Teile der Bild-Pipeline aus dem Verein-Stack (mana-media + mana-share + mana-auth) plus dem manaspur-Setup wiederverwendbar waren.

Stats

15 Commits, +10 570 / −40 LoC, 85 Files (51× .ts, 14× .svelte). Aktiv 122 Minuten in zwei Blöcken, längster Fokus 112 Min. Top-Dirs Routes/lib/db — also Wire-Format und Datenmodell waren der Schwerpunkt, nicht UI-Tinkerei.

Phasen-Schritte des Tages

  • Initial commit (Phase 0–8-prep) — Repo-Skeleton + Domain-Modell
    • Manifest-Route + Posts-CRUD. Auth, Schema, Drizzle-Migrationen, SvelteKit-Frontend, Docker-Compose alles in einem Wurf.
  • Phase 8 LIVE — STATUS.md mit Live-Cut-Chronik. Container healthy auf mana-server, DNS + Cloudflared-Tunnel up.
  • Phase 9aposts.attribution-Spalte + import-batch.ts CLI
    • erster Karikaturen-Archiv-Theme. Attribution sichtbar auf PostCard.
  • 9a Scale-Up — 22 Posts Karikaturen-Archiv live, kuratierter Wikimedia-Korpus.
  • 9b — Importer-Run für Busch / Struwwelpeter / Zille / Daumier / Nast+Tenniel. 57 Posts total.
  • Image-Loading-Fix — Stream-Proxy statt presigned URLs. Browser hatten CORP=same-origin als Default vom mana-media-Bucket bekommen; presigned-URL-Direct-Loading scheiterte daran. Server- seitiger Proxy schickt CORP: cross-origin mit.
  • UX-Pass — verein-bot wird zum 🏛 Verein-Import-Label, Attribution-Block auf Detail-Seite.
  • CORP-Header-Fix — gleiche Klasse, anderer Ort: Sharp-Thumbnails hatten den Header auch nicht.
  • Phase 9c — 7 Wikimedia-Batches mehr (Thöny/Heine/Kley/ Gillray/Cruikshank/Rowlandson/Jugend). Karikaturen international.
  • Phase 9d — 2 moderne Internet-Meme-Batches (This-is-fine, HYCAAA, Morgan-Freeman-Reaction, NASA-Ingenuity-Spirit-Last- Message). CC0 / freie Lizenzen geprüft.

Endstand: 112 Posts in 5 Themen.

Architektur-Entscheidungen

  • Strategie D (eigene App, nicht cards-Subprojekt). Begründet in MANAMEME_GREENFIELD.md: Bild-Pipeline und Feed-Mechanik haben zu wenig Overlap mit Cards. Peer-App ist sauberer.
  • Server-authoritative MVP. Keine Dexie, kein Local-First. Web = HTTP-Client gegen manameme-api. Local-First via mana-sync später.
  • EXIF-Strip beim Upload Pflicht. Privacy vor Bequemlichkeit (CLAUDE.md Invariante 7). GPS/Kamera/Zeit raus, neuer Hash, Re-Upload als kanonisch.
  • content_hash via BLAKE3 für Dedupe. Repost wird sichtbar gemacht, nicht verhindert.
  • pgSchema('manameme') auf der geteilten Mana-Postgres-Instanz. Schema-Isolation statt eigener Cluster.
  • Stream-Proxy statt presigned URLs. Mana-media-Bucket setzt Cross-Origin-Resource-Policy auf same-origin als Default; Browser blocken Direct-Loading. Proxy ist hin/zurück ein zusätzlicher Hop, dafür kein Bucket-CORP-Reconfig.
  • Importer als CLI, nicht Admin-UI. import-batch.ts mit Wikimedia-Slugs in JSON. Schneller zu iterieren, einfacher zu kuratieren — die UX-Frage „wie wird ein normaler Mensch sowas bedienen" stellt sich beim Verein-Import noch nicht.

Trade-offs

  • 15 Commits in 3 Stunden ist messy-glücklich. Hätte ich Phase 9a-d zusammengefasst, wäre die Chronik schöner — aber die Probleme tauchten genau in der Reihenfolge auf, in der die Commits stehen. Linearität schlägt Kosmetik.
  • +10 530 netto in einer Session geht nur, weil das Domain- Modell aus manaspur (Post + Lineage + Attribution) und die Bild-Pipeline aus mana-media per Copy-Adapt kamen.
  • Stream-Proxy frisst CPU pro Bild-Request. Bei 100 Posts heute irrelevant, bei 10 000 muss CORP-Header am Bucket gefixt werden.

Offene Punkte

  • User-Uploads nicht produktiv. Posts-CRUD-Route da, aber Upload-Flow (signed-PUT zu mana-media → Probe → Strip → Thumbs) hat in der ersten Live-Session nur stub-getestet.
  • Crop-Tool fehlt. β-3-Block aus STATUS.md, vor User-Upload zwingend.
  • 5 Submit-Blocker offen (STATUS.md): u.a. AI-Label-Default, Repost-Flow, Moderation-Surface, Manifest-Self-Test.
  • Native-Schwester (manameme-native) parallel gestartet, Wire-Format-Drift muss überwacht werden — derzeit identisch.
  • CORP-Bucket-Setup als Bauanleitung in mana/docs/playbooks/ noch nicht abgelegt — der nächste Bild-Service stolpert sonst drüber.

Stats

16
Commits
+10570/-40
Zeilen
85
Files
2.0 h
Aktiv
Erster Commit
12:48 (Freitag)
Letzter Commit
20:21
Spannweite
7.5 Stunden
Aktiv (ohne Pausen > 30min)
2.0 Stunden
Pausen
2
Längster Fokus
1.9 Stunden

Wo wurde gearbeitet

  • 13% apps/api/src/routes
  • 11% apps/web/src/lib
  • 10% apps/api/src/db
  • 7% apps/web/src/routes
  • 6% STATUS.md

Commits (16)

Volle Liste aufklappen
  • d4c8cef Initial commit — ManaMeme Phase 0–8-prep
  • 3bfb23a Phase 8 LIVE — STATUS.md mit Live-Cut-Chronik
  • 82f951d STATUS: mission-check 🟢 + β-3 Crop + 5 Submit-Blocker
  • 0a5ac68 Phase 9a: posts.attribution + import-batch.ts + karikaturen-archiv-Theme
  • 33ed9bb UI: PostCard zeigt Attribution (📎 Lizenz · Original-Creator)
  • c7173b7 Importer: erweiterter Karikaturen-Korpus aus Wikimedia
  • c235393 STATUS: Phase 9a Scale-Up — 35 Posts live (22 Karikaturen-Archiv)
  • 6067f04 Importer: 5 weitere Batches — Busch, Struwwelpeter, Zille, Daumier, Nast+Tenniel
  • f291bc7 STATUS: Phase 9b — 57 Posts total, 3 Wikimedia-Themen kuratiert
  • 85b4a6c Fix: Bilder laden nicht — Stream-Proxy statt presigned URLs
  • 36207dc UX: verein-bot → 🏛 Verein-Import + Attribution-Block auf Detail
  • 9baa31f Fix: CORP-Header blockte Cross-Origin-Image-Loading
  • c81269d Importer: 7 weitere Wikimedia-Batches (Thöny/Heine/Kley/Gillray/Cruikshank/Rowlandson/Jugend)
  • c3c13c2 Importer: 2 moderne Internet-Meme-Batches (Wikimedia)
  • 861aac6 STATUS: Phase 9c (+44 Karikaturisten) + 9d (+11 moderne Memes) + UX-Fix-Pass
  • a217c33 devlog: 1 Tag geschrieben (LIVE + 112 Posts in 5 Themen)
Geschrieben mit Claude — Hand veredelt