# Todo

- [x] Prüfen, wo `links` noch `data.date` statt `data.publishDate` verwendet
- [x] Link-Seiten, RSS und Archiv auf `publishDate` umstellen
- [x] Verifikation laufen lassen und Ergebnis dokumentieren

## Current Task

- [x] `src/pages/imprint.md` auf aktuelle Rechtsbezüge und schlanke englische Fassung umstellen
- [x] redundante Datenschutzpassage aus dem Impressum entfernen und auf die separate Datenschutzseite verweisen
- [x] Ergebnis per Diff prüfen und in diesem Dokument kurz reviewen
- [ ] Obfuskierte Kontaktdaten in `src/pages/privacy-policy.md` konsistent halten
- [ ] Privacy-Link im Impressum auf den neuen Slug `/privacy-policy` korrigieren
- [ ] Änderung per Diff und Astro-Check verifizieren
- [x] Obfuskierte Kontaktdaten in `src/pages/privacy-policy.md` konsistent halten
- [x] Privacy-Link im Impressum auf den neuen Slug `/privacy-policy` korrigieren
- [x] Änderung per Diff und Astro-Check verifizieren

## Review

- `src/pages/links/index.astro`, `src/pages/links/[...slug].astro`, `src/pages/rss.xml.ts`, `src/pages/rss/links.xml.ts`, `src/pages/tags/[slug].astro` und `src/pages/archives/index.astro` lesen `links` jetzt konsistent über `data.publishDate`.
- `rg` findet keine verbleibenden `links`-Zugriffe mehr über `data.date`.
- `pnpm astro check` läuft auf dem aktuellen Stand komplett sauber durch: 0 Errors, 0 Warnings, 0 Hints.
- `src/pages/imprint.md` verweist jetzt korrekt auf `Section 5 DDG` statt auf das alte `TMG`, enthält obfuskierte direkte Kontaktangaben und hält den `MStV`-Block separat.
- Die redundante Datenschutzpassage wurde aus dem Impressum entfernt; stattdessen verweist die Seite knapp auf `src/pages/privacy-policy.md`.
- Der Diff für `src/pages/imprint.md` ist inhaltlich sauber und `pnpm astro check` läuft nach der Änderung weiter ohne Fehler.
- `src/pages/privacy-policy.md` nutzt für die E-Mail jetzt dieselbe Obfuskationslogik mit `data-obf` und `data-obf-href` wie die übrigen Kontaktstellen.
- `src/pages/imprint.md` verweist auf den tatsächlichen Privacy-Slug `/privacy-policy`, sodass der Link zur umbenannten Datei wieder stimmt.

## Current Task (2026-03-24)

- [x] Intro-Text in `src/pages/index.astro` und Copy in `src/pages/about.astro` auf Konsistenz prüfen
- [x] Grammatik, Rechtschreibung und Formulierungen in idiomatischem Englisch glätten
- [x] Änderungen per Diff prüfen und Review hier dokumentieren

## Review (2026-03-24)

- `src/pages/index.astro` klingt jetzt weniger generisch und passt sprachlich besser zur persönlicheren Stimme der About-Seite.
- `src/pages/about.astro` nutzt jetzt idiomatischeres Englisch, glattere Satzrhythmen und konsistente Wortwahl rund um web, photography und curiosity.
- Der Diff für beide Dateien ist inhaltlich eng begrenzt auf Copy-Änderungen.
- `pnpm astro check` läuft nach den Anpassungen sauber durch: 0 Errors, 0 Warnings, 0 Hints.

## Current Task (2026-03-24, Article Tables)

- [x] Tabellenlayout in `src/pages/articles/[...slug].astro` für Markdown-Content ergänzen
- [x] Tabellen-Workaround im Artikelcontent auf semantisches Markdown zurückführen
- [x] Diff und `pnpm astro check` prüfen und Review hier dokumentieren

## Review (2026-03-24, Article Tables)

- `src/pages/articles/[...slug].astro` deklariert jetzt ein eigenes Tabellenlayout für Markdown in `.prose`, inklusive Abständen, Linien, Zell-Padding und kontrolliertem Umbruch.
- Der vorherige `<br>`-Workaround in `src/content/articles/2026/03/23/obfuscating-contact-data-on-a-static-site.md` wurde wieder entfernt; der Artikel bleibt semantisch sauberes Markdown.
- Der Diff ist eng begrenzt auf die fehlenden Tabellen-Styles und die Projektdokumentation.
- `pnpm astro check` läuft nach der Änderung sauber durch: 0 Errors, 0 Warnings, 0 Hints.

## Current Task (2026-03-24, Syndication Links)

- [x] Inkonsistenz der `syndication`-Links in `src/pages/articles/[...slug].astro` und `src/pages/notes/[...slug].astro` eingrenzen
- [x] Notes-Seite auf konsistente `syndication`-Darstellung und korrekten Datentyp umstellen
- [x] Diff und `pnpm astro check` prüfen und Review hier dokumentieren

## Review (2026-03-24, Syndication Links)

- `src/components/SyndicationLinks.astro` bündelt Rendering, Plattformnamen und Chip-Styling der `syndication`-Links jetzt an einer Stelle, sodass Artikel und Notizen dieselbe Darstellung verwenden.
- `src/pages/notes/[...slug].astro` normalisiert den optionalen einzelnen `syndication`-URL-Wert korrekt zu einem Array, statt einen String zu spreaden.
- `src/pages/articles/[...slug].astro` verwendet dieselbe Komponente wie die Notes-Seite; der Diff bleibt dadurch eng begrenzt und reduziert künftige Drift zwischen beiden Templates.
- `pnpm astro check` läuft nach der Änderung sauber durch: 0 Errors, 0 Warnings, 0 Hints.

## Current Task (2026-03-24, Mastodon Syndication)

- [x] `scripts/mastodon-syndicate.mjs` für RSS-basiertes Autoposting von Artikeln und Notes mit State-Datei implementieren
- [x] `scripts/publish-posts.sh` um Mastodon-Env, Script-Aufruf, State-Commit und Remote-Clean-Exclude erweitern
- [x] Artikel- und Notes-Seiten um `.mastodon-posted.json` für automatische Syndication-Links ergänzen
- [x] Änderungen per Diff, `node --check` und `pnpm astro check` verifizieren

## Review (2026-03-24, Mastodon Syndication)

- `scripts/mastodon-syndicate.mjs` postet neue RSS-Einträge aus Articles und Notes nach Mastodon, baut den Status als Titel + Teaser + Link, lädt OG-Bilder als Media hoch und persistiert erfolgreiche Posts in `.mastodon-posted.json`.
- `scripts/publish-posts.sh` behandelt `.mastodon-posted.json` jetzt wie `.bluesky-posted.json` (Clean-Exclude + Commit/Push bei Änderungen) und führt Mastodon-Syndication nur mit gesetzten `MASTODON_BASE_URL` und `MASTODON_ACCESS_TOKEN` aus.
- `src/pages/articles/[...slug].astro` und `src/pages/notes/[...slug].astro` lesen zusätzlich `.mastodon-posted.json`, sodass Mastodon-Status-URLs in `SyndicationLinks` erscheinen.
- `node --check scripts/mastodon-syndicate.mjs` und `pnpm astro check` laufen nach den Änderungen sauber durch.

## Current Task (2026-03-24, Mastodon Hardening)

- [x] Media-Upload in `scripts/mastodon-syndicate.mjs` um Retry/Backoff bei HTTP 429 ergänzen
- [x] Optionale `MASTODON_DRY_RUN`- und `MASTODON_LIMIT`-Steuerung im Script ergänzen
- [x] Optionale Mastodon-Flags in `scripts/publish-posts.sh` durchreichen
- [x] Änderungen mit `node --check`, `pnpm biome check` und `pnpm astro check` verifizieren

## Review (2026-03-24, Mastodon Hardening)

- `scripts/mastodon-syndicate.mjs` retried Media-Uploads jetzt bis zu 5-mal bei 429 mit `Retry-After`-Support und exponentiellem Backoff als Fallback.
- Das Script unterstützt jetzt `MASTODON_DRY_RUN` (simuliert Posts ohne Veröffentlichung) und `MASTODON_LIMIT` (begrenzt die Anzahl verarbeiteter Items).
- `scripts/publish-posts.sh` liest und übergibt die optionalen Variablen `MASTODON_DRY_RUN` und `MASTODON_LIMIT` an das Mastodon-Script.
- `node --check scripts/mastodon-syndicate.mjs`, `pnpm biome check scripts/mastodon-syndicate.mjs scripts/publish-posts.sh` und `pnpm astro check` laufen nach den Änderungen erfolgreich.

## Current Task (2026-03-24, Webmention Re-Validation)

- [x] Serverseitige Webmention-Fetch/Filter-Lib für Bluesky-/Mastodon-Quellen ergänzen
- [x] API-Endpoint `api/webmentions.json` für gefilterte Mentions bereitstellen
- [x] `WebMentions.astro` auf gefilterte Datenquelle für SSR und Client-Refresh umstellen
- [x] Änderungen mit `pnpm biome check` und `pnpm astro check` verifizieren

## Review (2026-03-24, Webmention Re-Validation)

- `src/lib/webmentions.ts` filtert eingehende Mentions jetzt serverseitig und prüft Social-Reaktionen auf Interaktionsebene:
  - Mastodon `#favorited-by-...`/`#reblogged-by-...` wird über die jeweiligen Status-Listen (`favourited_by`/`reblogged_by`) validiert.
  - Bluesky `#liked_by_did:...`/`#reposted_by_did:...` wird über die Public-API (`getLikes`/`getRepostedBy`) validiert.
  - Fallback bleibt eine Existenzprüfung der Quell-URL (404/410/Tombstone), wenn keine Interaktionssignatur erkannt wird.
- `src/pages/api/webmentions.json.ts` liefert gefilterte Mentions als JSON und wird nicht prerendered, damit die Prüfung live auf dem Server stattfindet.
- `src/components/WebMentions.astro` nutzt die Filter-Lib für das initiale Rendering und ruft clientseitig statt `webmention.io` jetzt den lokalen Endpoint auf, damit beide Pfade konsistent sind.
- `pnpm biome check src/lib/webmentions.ts src/pages/api/webmentions.json.ts src/components/WebMentions.astro` und `pnpm astro check` laufen nach der Änderung sauber durch.

## Current Task (2026-03-24, Mastodon Articles)

- [x] Artikel zur Mastodon-Implementierung in `src/content/articles` erstellen
- [x] Artikel zum Troubleshooting von Backfeed/Stale Webmentions in `src/content/articles` erstellen
- [x] Frontmatter und Content-Struktur gegen bestehende Artikelkonventionen verifizieren

## Review (2026-03-24, Mastodon Articles)

- Neuer Implementierungsartikel: `src/content/articles/2026/03/24/posse-to-mastodon-with-state-and-media.md`
- Neuer Troubleshooting-Artikel: `src/content/articles/2026/03/24/troubleshooting-mastodon-backfeed-and-stale-webmentions.md`
- Beide Artikel verwenden konsistentes Frontmatter (`title`, `description`, `publishDate`, `tags`) und orientieren sich in Struktur, Ton und technischer Tiefe an den bestehenden Engineering-Posts.

## Current Task (2026-03-24, Remove Bluesky)

- [x] Bluesky-Syndication in `scripts/publish-posts.sh` und `scripts/bluesky-syndicate.mjs` vollständig entfernen
- [x] Bluesky-State (`.bluesky-posted.json`) und Seiten-Imports in Artikel-/Notes-Templates entfernen
- [x] Bluesky-Links in `src/components/Footer.astro`, `src/layouts/BaseLayout.astro` und Label-Mapping bereinigen
- [x] Webmention-Filter in `src/lib/webmentions.ts` von Bluesky-Pfaden auf Mastodon-only zurückbauen
- [x] Änderungen per Diff, `pnpm biome check` und `pnpm astro check` verifizieren und Review dokumentieren

## Review (2026-03-24, Remove Bluesky)

- `scripts/publish-posts.sh` enthält keinen Bluesky-Block mehr und nutzt im Remote-Clean nur noch die Mastodon-State-Ausnahme; `scripts/bluesky-syndicate.mjs` wurde entfernt.
- `.bluesky-posted.json` wurde entfernt und die Artikel-/Notes-Templates lesen nur noch `.mastodon-posted.json` für automatische Syndication-Links.
- Bluesky-Profile/Verweise wurden aus `src/components/Footer.astro`, `src/layouts/BaseLayout.astro` und dem Host-Label-Mapping in `src/components/SyndicationLinks.astro` entfernt.
- `src/lib/webmentions.ts` prüft Social-Interaktionen jetzt Mastodon-only; alle Bluesky-spezifischen Resolver/Checks sind entfernt.
- Verifikation: `pnpm biome check scripts/publish-posts.sh src/components/Footer.astro src/components/SyndicationLinks.astro src/layouts/BaseLayout.astro src/lib/webmentions.ts src/pages/articles/[...slug].astro src/pages/notes/[...slug].astro` und `pnpm astro check` laufen erfolgreich (0 Errors, 0 Warnings, 0 Hints).
