docs: top-level-doku auf prerender-snapshot-stand

Aus dem code-review der etappe (2026-04-28):

- CLAUDE.md: snapshot/-verzeichnis in hauptarbeitsbereiche-tabelle
  ergaenzt; neue stolperfalle "snapshot-output muss vor npm run build
  da sein" eingefuegt.
- STATUS.md: kurzfassung um den prerender-stand erweitert; repo-baum
  zeigt snapshot/; erledigt-eintrag mit den sechs etappen.
- HANDOFF.md: stolperfalle "snapshot vor build" am anfang der liste —
  haeufigster fallstrick fuer naechste session.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jörg Lohrer 2026-04-28 09:29:36 +02:00
parent 47282f3c30
commit 3449042051
3 changed files with 50 additions and 6 deletions

View File

@ -79,7 +79,17 @@ mit `../content/posts/...`. Git-Diff liefert aber repo-root-relative
Pfade (`content/posts/...`). `changedPostDirs` normalisiert beides — Pfade (`content/posts/...`). `changedPostDirs` normalisiert beides —
wenn `posts=0` obwohl Änderungen vorliegen, ist das der Hotspot. wenn `posts=0` obwohl Änderungen vorliegen, ist das der Hotspot.
### 5. Publish-Pipeline erwartet `content/posts/<lang>/<slug>/` ### 5. Snapshot-Output muss vor `npm run build` da sein
SvelteKit prerendert `[...slug]/+page.{ts,svelte}` aus
`snapshot/output/`-JSONs (`index.json` + `posts/<slug>.json`). Lokal
buildst du nicht direkt mit `npm run build`, sondern via
`./scripts/deploy-svelte.sh` — das ruft vorher `deno task snapshot`
auf. Wer `cd app && npm run build` direkt nach dem Clone macht, ohne
vorher `cd snapshot && deno task snapshot` auszuführen, scheitert
mit `ENOENT snapshot/output/index.json`.
### 6. Publish-Pipeline erwartet `content/posts/<lang>/<slug>/`
Die Zwei-Ebenen-Struktur ist Teil der Traversierung. Wer einen Post Die Zwei-Ebenen-Struktur ist Teil der Traversierung. Wer einen Post
versehentlich in `content/posts/<slug>/` (ohne Sprach-Ordner) anlegt, versehentlich in `content/posts/<slug>/` (ohne Sprach-Ordner) anlegt,
@ -96,6 +106,9 @@ wird von der Pipeline ignoriert.
| `app/src/routes/` | SvelteKit-Routen (Layout, Home, Archiv, Post, Impressum) | | `app/src/routes/` | SvelteKit-Routen (Layout, Home, Archiv, Post, Impressum) |
| `publish/src/` | Deno-Publish-Pipeline (Deno-Tasks in `publish/deno.jsonc`) | | `publish/src/` | Deno-Publish-Pipeline (Deno-Tasks in `publish/deno.jsonc`) |
| `publish/tests/` | Deno-Tests für die Pipeline | | `publish/tests/` | Deno-Tests für die Pipeline |
| `snapshot/src/` | Deno-Snapshot-Tool (Relays → JSON für Prerender) |
| `snapshot/tests/` | Deno-Tests für den Snapshot |
| `snapshot/output/` | (gitignored) build-zeit-JSON, wird vom SvelteKit-Prerender konsumiert |
| `docs/superpowers/specs/` | Produktdesigns, Konventionen | | `docs/superpowers/specs/` | Produktdesigns, Konventionen |
| `docs/superpowers/plans/archive/` | Umgesetzte Implementierungspläne (Geschichte) | | `docs/superpowers/plans/archive/` | Umgesetzte Implementierungspläne (Geschichte) |
| `scripts/deploy-svelte.sh` | FTPS-Deploy | | `scripts/deploy-svelte.sh` | FTPS-Deploy |

View File

@ -221,6 +221,14 @@ cd publish && deno task test # tests
## Bekannte Stolperfallen ## Bekannte Stolperfallen
- **Snapshot vor Build:** `app/build` braucht zur Build-Zeit
`snapshot/output/index.json` und `snapshot/output/posts/<slug>.json`.
`./scripts/deploy-svelte.sh` zieht den Snapshot automatisch vor dem
Build. Wer `cd app && npm run build` direkt aufruft, ohne vorher
`cd snapshot && deno task snapshot` auszuführen, scheitert mit
ENOENT auf `index.json`. Frische Posts erscheinen erst nach einem
Snapshot-Re-Run, weil die Detail-Route ausschließlich aus dem
Snapshot rendert (kein Runtime-Relay-Fetch mehr).
- **Amber-Bunker:** bei neuer Bunker-URL müssen die zwei Permissions - **Amber-Bunker:** bei neuer Bunker-URL müssen die zwei Permissions
(`get_public_key`, `sign_event`) in Amber auf „Allow + Always" gesetzt (`get_public_key`, `sign_event`) in Amber auf „Allow + Always" gesetzt
werden, bevor Publish-Requests verarbeitet werden. Siehe werden, bevor Publish-Requests verarbeitet werden. Siehe

View File

@ -3,7 +3,7 @@
> **Rolle dieses Dokuments:** Logbuch — aktueller Stand und Erledigt-Chronologie. > **Rolle dieses Dokuments:** Logbuch — aktueller Stand und Erledigt-Chronologie.
> Konventionen und Workflows stehen in [`HANDOFF.md`](HANDOFF.md). > Konventionen und Workflows stehen in [`HANDOFF.md`](HANDOFF.md).
**Stand:** 2026-04-21 (Mehrsprachigkeit live) **Stand:** 2026-04-28 (Prerender-Snapshot live auf svelte-subdomain)
## Kurzfassung ## Kurzfassung
@ -12,6 +12,14 @@ signierten Nostr-Events (NIP-23, `kind:30023`) auf 5 Public-Relays rendert.
Bilder liegen content-addressed auf 2 Blossom-Servern. Die Hugo-basierte Bilder liegen content-addressed auf 2 Blossom-Servern. Die Hugo-basierte
Altseite ist als `hugo-archive`-Branch eingefroren. Altseite ist als `hugo-archive`-Branch eingefroren.
**Seit 2026-04-28 prerender-snapshot:** Post-Detailseiten werden zur
Build-Zeit prerendered, mit vollen OG-/Twitter-/JSON-LD-Tags. Ein Deno-
Tool (`snapshot/`) liest die Events von den Relays und schreibt sie als
JSON-Artefakte; SvelteKit baut daraus `<slug>/index.html` mit korrekten
Meta-Tags. Crawler und Social-Media-Vorschauen sehen jetzt echte Titel,
Beschreibungen, Cover-Bilder. Live verifiziert auf `svelte.joerg-lohrer.de`,
prod-merge ausstehend.
**Seit 2026-04-21 multilingual:** UI-Chrome (Menü, Footer, Post-Meta) **Seit 2026-04-21 multilingual:** UI-Chrome (Menü, Footer, Post-Meta)
in Deutsch und Englisch via `svelte-i18n`, mit Browser-Locale-Default, in Deutsch und Englisch via `svelte-i18n`, mit Browser-Locale-Default,
`localStorage`-Persistenz und Header-Sprachswitcher. Inhalte pro Sprache `localStorage`-Persistenz und Header-Sprachswitcher. Inhalte pro Sprache
@ -59,9 +67,10 @@ joerglohrerde/
├── content/impressum.md # Statisches Impressum (wird von SPA geladen) ├── content/impressum.md # Statisches Impressum (wird von SPA geladen)
├── app/ ├── app/
│ ├── src/lib/i18n/ # svelte-i18n + activeLocale-Store + Messages │ ├── src/lib/i18n/ # svelte-i18n + activeLocale-Store + Messages
│ ├── src/lib/nostr/ # Relay-Loader, Translations-Resolving │ ├── src/lib/nostr/ # Relay-Loader (Listen, Replies, Reactions, Profile)
│ └── src/lib/components/ # u. a. LanguageSwitcher, LanguageAvailability │ └── src/lib/components/ # u. a. LanguageSwitcher, Reactions, ReplyComposer
├── publish/ # Deno-Publish-Pipeline (Blossom + Nostr) ├── publish/ # Deno-Publish-Pipeline (Blossom + Nostr)
├── snapshot/ # Deno-Snapshot-Tool (Relays → JSON für Prerender)
├── preview/spa-mini/ # Vanilla-HTML-Mini-Spike (historisch) ├── preview/spa-mini/ # Vanilla-HTML-Mini-Spike (historisch)
├── scripts/ ├── scripts/
│ └── deploy-svelte.sh # FTPS-Deploy, Targets: svelte/staging/prod │ └── deploy-svelte.sh # FTPS-Deploy, Targets: svelte/staging/prod
@ -73,9 +82,9 @@ joerglohrerde/
│ ├── wiki-draft-nostr-image-metadata.md │ ├── wiki-draft-nostr-image-metadata.md
│ ├── github-ci-setup.md │ ├── github-ci-setup.md
│ └── superpowers/ │ └── superpowers/
│ ├── specs/ # SPA, Publish-Pipeline, Bild-Metadaten, Multilingual, Prerender (Entwurf) │ ├── specs/ # SPA, Publish-Pipeline, Bild-Metadaten, Multilingual, Prerender, Docs-Cleanup
│ └── plans/ │ └── plans/
│ └── archive/ # Umgesetzte Pläne (Geschichte) + eingefrorener Prerender-Plan │ └── archive/ # Umgesetzte Pläne (Geschichte) + Prerender-Plan (durch 2026-04-28 ersetzt)
├── .github/workflows/ # publish.yml (Forgejo→GitHub Push-Mirror-Trigger) ├── .github/workflows/ # publish.yml (Forgejo→GitHub Push-Mirror-Trigger)
├── .claude/ ├── .claude/
│ ├── skills/ # Repo-spezifischer Claude-Skill │ ├── skills/ # Repo-spezifischer Claude-Skill
@ -117,6 +126,20 @@ Nach Priorität:
## Erledigt (chronologisch seit 2026-04-15) ## Erledigt (chronologisch seit 2026-04-15)
- ✅ **Prerender-Snapshot (2026-04-28)** — Post-Detailseiten werden zur
Build-Zeit prerendered, nicht mehr live aus Relays. Sechs Etappen:
- `renderMarkdown` auf `isomorphic-dompurify` (node-fähig).
- Neues `snapshot/`-Modul (Deno) mit 32 Tests, liest Events von
Relays und schreibt JSON-Artefakte (NIP-09-aware, Plausibilitäts-
Checks, Cover-Probe, Cache mit akkumulierten deletedCoords).
- GitHub-Action zieht Snapshot nach jedem Publish als Artifact.
- SvelteKit-Detail-Route auf `prerender=true` mit `<svelte:head>` für
OG/Twitter/JSON-LD/hreflang. `<html lang>` + `og:image:width/height`
pro Post korrekt gesetzt; `x-default` zeigt auf DE-Slug.
- Runtime-Relay-Fetch der Detail-Route entfernt.
- Deploy-Skript ruft Snapshot vor SvelteKit-Build auf.
- Toten Code aus Pre-Prerender-Ära entfernt (PostView, LanguageAvailability,
loadPost, loadTranslations, translations.ts).
- ✅ Content-Migration: alle 18 Posts haben strukturierte `images:`-Liste - ✅ Content-Migration: alle 18 Posts haben strukturierte `images:`-Liste
im Frontmatter (91 Bilder, mit Alt-Text, Lizenz, Autor:innen, ggf. im Frontmatter (91 Bilder, mit Alt-Text, Lizenz, Autor:innen, ggf.
Caption und Modifications). Caption und Modifications).