2026-04-15 18:34:15 +02:00
|
|
|
# Handoff — Nächste Session
|
|
|
|
|
|
|
|
|
|
Du (Claude, nächste Session) oder ich (Jörg, später) kommen hier zurück.
|
|
|
|
|
Dieses Dokument sagt: was ist der Zustand, was wartet, wo liegen die Fäden.
|
|
|
|
|
|
2026-04-16 15:17:57 +02:00
|
|
|
## Zustand (Details in `STATUS.md`)
|
2026-04-15 18:34:15 +02:00
|
|
|
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
**Cutover + Reimport 2026-04-18, Mehrsprachigkeit live seit 2026-04-21.**
|
|
|
|
|
`joerg-lohrer.de` läuft als SvelteKit-SPA, rendert 27 Nostr-Langform-Posts
|
|
|
|
|
(26 DE + 1 EN) live aus 5 Relays, Bilder auf Blossom. UI-Chrome via
|
|
|
|
|
`svelte-i18n` in DE/EN, Header-Switcher, Listen-Filter nach aktivem Locale,
|
|
|
|
|
bidirektionale Sprach-Verlinkung der Posts via NIP-33 `a`-Tag mit Marker
|
|
|
|
|
`translation`. Repo ist alleinige Quelle der Wahrheit. Pipeline-
|
|
|
|
|
Subcommands `publish` + `delete` decken den kompletten Content-Lifecycle ab.
|
2026-04-18 18:10:27 +02:00
|
|
|
|
|
|
|
|
**Das inhaltliche Kernziel des Gesamtprojekts ist erreicht.** Der Rest
|
|
|
|
|
sind optionale Verbesserungen.
|
|
|
|
|
|
|
|
|
|
## Alltags-Workflow: neuen Post veröffentlichen
|
|
|
|
|
|
|
|
|
|
**Kompletter Happy-Path, kein manueller Publish nötig:**
|
|
|
|
|
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
1. Neuen Ordner anlegen: `content/posts/de/YYYY-MM-DD-<slug>/` (oder
|
|
|
|
|
`content/posts/en/<slug>/` für Englisch).
|
2026-04-18 18:10:27 +02:00
|
|
|
2. `index.md` schreiben mit Frontmatter (siehe Template unten).
|
|
|
|
|
3. Bilder in den Ordner legen und im Markdown als ``
|
|
|
|
|
referenzieren.
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
4. Lokal validieren: `cd publish && deno task validate-post ../content/posts/<lang>/<dir>/index.md`
|
2026-04-18 18:10:27 +02:00
|
|
|
5. Commit + `git push origin main` — fertig.
|
|
|
|
|
|
|
|
|
|
**Was automatisch passiert:**
|
|
|
|
|
- Forgejo-Push-Mirror synct nach GitHub.
|
|
|
|
|
- GitHub Actions triggert auf `content/posts/**`-Änderung.
|
|
|
|
|
- Workflow läuft diff-modus: nur geänderte/neue Posts werden publiziert.
|
|
|
|
|
- Pipeline hasht lokale Bilder → Upload auf beide Blossom-Server → URLs
|
|
|
|
|
im Event ersetzen.
|
|
|
|
|
- Event wird signiert (Amber-Bunker via `CLIENT_SECRET_HEX`) und auf alle
|
|
|
|
|
5 Write-Relays publiziert.
|
|
|
|
|
- SPA holt den neuen Post beim nächsten Besuch automatisch vom Relay.
|
|
|
|
|
|
|
|
|
|
**Vorbedingung:** Amber muss für den Client-Key (aus `CLIENT_SECRET_HEX`)
|
|
|
|
|
die Permissions `get_public_key` + `sign_event` auf „Allow + Always"
|
|
|
|
|
gesetzt haben. Das gilt so lange, bis der Client-Key rotiert wird.
|
|
|
|
|
|
|
|
|
|
**Minimal-Frontmatter für einen neuen Post:**
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
---
|
|
|
|
|
title: "Titel des Posts"
|
|
|
|
|
slug: "url-freundlicher-slug"
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
date: 2026-04-21
|
2026-04-18 18:10:27 +02:00
|
|
|
description: "Kurzbeschreibung für SEO und den summary-Tag im Event."
|
|
|
|
|
image: hauptbild.jpg
|
|
|
|
|
tags:
|
|
|
|
|
- Tag1
|
|
|
|
|
- Tag2
|
|
|
|
|
lang: de
|
|
|
|
|
license: https://creativecommons.org/publicdomain/zero/1.0/deed.de
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
# a:
|
|
|
|
|
# - "30023:4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41:<slug-der-anderssprachigen-variante>"
|
2026-04-18 18:10:27 +02:00
|
|
|
---
|
|
|
|
|
|
|
|
|
|
Body in Markdown…
|
|
|
|
|
```
|
|
|
|
|
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
Der auskommentierte `a:`-Block ist **Konvention für alle neuen Posts** — so
|
|
|
|
|
lässt sich später eine Übersetzung dazu verlinken, ohne das Template zu
|
|
|
|
|
suchen. Siehe Abschnitt „Wie man eine Übersetzung anlegt" weiter unten.
|
|
|
|
|
|
2026-04-18 18:10:27 +02:00
|
|
|
Bilder mit voller Attribution (NIP-standardisiert nach unserer Konvention,
|
|
|
|
|
siehe `docs/superpowers/specs/2026-04-16-image-metadata-convention.md`):
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
images:
|
|
|
|
|
- file: hauptbild.jpg
|
|
|
|
|
role: cover
|
|
|
|
|
alt: "Alt-Text für Barrierefreiheit"
|
|
|
|
|
caption: "Bildunterschrift (optional)"
|
|
|
|
|
license: https://creativecommons.org/licenses/by/4.0/deed.de
|
|
|
|
|
authors:
|
|
|
|
|
- name: "Autor:in"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Manuell publizieren** (falls CI aus ist oder einzelner Post nochmal):
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
cd publish
|
|
|
|
|
deno task publish --post <slug> # einzelner Post
|
|
|
|
|
deno task publish --dry-run # was würde der diff-modus publisht?
|
|
|
|
|
deno task publish # diff-modus real
|
|
|
|
|
deno task publish --force-all # alle 26 Posts neu
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Was optional als Nächstes ansteht
|
2026-04-18 16:27:53 +02:00
|
|
|
|
|
|
|
|
### Option B — SPA respektiert NIP-09-Deletion-Events
|
2026-04-15 18:34:15 +02:00
|
|
|
|
2026-04-18 14:30:37 +02:00
|
|
|
**Status:** aktuell filtert die SPA nicht nach NIP-09. Wenn ein Event per
|
2026-04-18 16:27:53 +02:00
|
|
|
`kind:5`-Referenz gelöscht wurde, zeigen Relays es meist nicht mehr aus —
|
2026-04-18 14:30:37 +02:00
|
|
|
aber die SPA würde es trotzdem rendern, falls ein Relay es doch liefert.
|
|
|
|
|
|
2026-04-18 16:27:53 +02:00
|
|
|
**Zu tun:** im `kind:30023`-Loader (`app/src/lib/nostr/…`) einen
|
2026-04-18 14:30:37 +02:00
|
|
|
Cross-Check auf `kind:5`-Events einbauen. Events, deren Addressable-Pointer
|
|
|
|
|
(`30023:pubkey:d-tag`) in einem `kind:5` referenziert ist, werden
|
|
|
|
|
gefiltert. Defensive Maßnahme für zukünftige Duplikate / Soft-Deletes.
|
|
|
|
|
|
2026-04-18 16:27:53 +02:00
|
|
|
### Option C — Postfach `webmaster@joerg-lohrer.de`
|
2026-04-18 14:30:37 +02:00
|
|
|
|
2026-04-18 16:27:53 +02:00
|
|
|
User-Task: im All-Inkl KAS als Weiterleitung anlegen. Der Link im
|
|
|
|
|
Footer und in den Social-Icons zeigt bereits darauf.
|
2026-04-18 14:30:37 +02:00
|
|
|
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
### Wie man eine Übersetzung anlegt (Konvention seit 2026-04-21)
|
|
|
|
|
|
|
|
|
|
**Kurz:** Pro Sprache ein eigener Unterordner unter `content/posts/<lang>/`,
|
|
|
|
|
pro Sprache ein eigenes `kind:30023`-Event mit eigenem Slug (= `d`-Tag).
|
|
|
|
|
Die Beziehung zwischen Sprach-Varianten kommt ausschließlich über
|
|
|
|
|
bidirektionale `a`-Tags im Frontmatter.
|
|
|
|
|
|
|
|
|
|
**Schritt für Schritt:**
|
|
|
|
|
|
|
|
|
|
1. Neuen Ordner für die Übersetzung anlegen, z. B.
|
|
|
|
|
`content/posts/en/<eigener-slug>/index.md`. **Der Slug muss global
|
|
|
|
|
eindeutig sein** — also *nicht* identisch mit dem deutschen Slug. Beispiel:
|
|
|
|
|
`bibel-selfies` (DE) ↔ `bible-selfies` (EN).
|
|
|
|
|
|
|
|
|
|
2. Frontmatter mit `lang: en` (oder jeweiliger Sprach-Code) und aktivem
|
|
|
|
|
`a:`-Verweis auf den Slug der anderen Sprach-Variante:
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
a:
|
|
|
|
|
- "30023:4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41:<slug-der-anderen-sprache>"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
3. **Bidirektional**: im Original-Post den bereits auskommentierten
|
|
|
|
|
`a:`-Platzhalter aktivieren (Kommentarzeichen entfernen, Slug einsetzen).
|
|
|
|
|
Beide Posts verweisen dann aufeinander.
|
2026-04-18 14:30:37 +02:00
|
|
|
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
4. Commit + Push — die Action re-publisht beide Events, `a`-Tags landen im
|
|
|
|
|
Nostr-Event als `['a', '<coord>', '', 'translation']`. Die SPA erkennt
|
|
|
|
|
die Beziehung automatisch und zeigt den Sprach-Switcher (`📖 DE | EN`)
|
|
|
|
|
unter dem Post-Titel.
|
2026-04-18 14:30:37 +02:00
|
|
|
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
**Was die SPA automatisch tut:**
|
|
|
|
|
- Listen-Seiten (Startseite + Archiv) filtern nach aktivem Locale — englische
|
|
|
|
|
Besucher:innen sehen nur englische Posts.
|
|
|
|
|
- Klick auf den anderen Sprachcode im Switcher setzt `activeLocale` global
|
|
|
|
|
und navigiert zum verknüpften Slug.
|
|
|
|
|
- UI-Chrome (Menü, Footer, Meta-Zeile, Datumsformat) wechselt mit.
|
2026-04-18 14:30:37 +02:00
|
|
|
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
**Details:** [`docs/superpowers/specs/2026-04-21-multilingual-posts-design.md`](superpowers/specs/2026-04-21-multilingual-posts-design.md).
|
2026-04-18 14:30:37 +02:00
|
|
|
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
### Option D — Pipeline weg von GitHub (self-hosted CI)
|
2026-04-15 18:34:15 +02:00
|
|
|
|
2026-04-18 07:27:48 +02:00
|
|
|
**Wann:** Wenn der Optiplex-Server steht und ein zentraler Ort für Dienste
|
|
|
|
|
existiert.
|
2026-04-16 15:17:57 +02:00
|
|
|
|
2026-04-18 07:27:48 +02:00
|
|
|
**Varianten:**
|
|
|
|
|
- **Cron / systemd-Timer** auf dem Optiplex, der alle X Minuten `git pull &&
|
|
|
|
|
deno task publish` macht. Einfach, minimaler Setup.
|
|
|
|
|
- **Woodpecker-CI** als Docker-Container neben Forgejo. Volle Push-getriggerte
|
|
|
|
|
Pipeline ohne GitHub.
|
2026-04-15 18:34:15 +02:00
|
|
|
|
2026-04-18 07:27:48 +02:00
|
|
|
Der Pipeline-Code selbst (`publish/src/**`) ist CI-agnostisch — nur die
|
|
|
|
|
Trigger-Konfiguration ändert sich.
|
2026-04-15 18:34:15 +02:00
|
|
|
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
### Option E — Design-Refinements
|
2026-04-18 16:27:53 +02:00
|
|
|
|
|
|
|
|
**Wann:** irgendwann, wenn Lust drauf ist.
|
|
|
|
|
|
2026-04-18 18:10:27 +02:00
|
|
|
- Parallax-Effekte, Animationen
|
|
|
|
|
- Dark-Mode-Toggle (aktuell nur `prefers-color-scheme`)
|
|
|
|
|
- Typografie-Experimente (Variable Fonts)
|
2026-04-18 16:27:53 +02:00
|
|
|
- Bildergalerie-Komponente für Posts mit vielen Bildern
|
|
|
|
|
|
|
|
|
|
Alles nicht-blockierend, die SPA funktioniert solide.
|
|
|
|
|
|
2026-04-15 18:34:15 +02:00
|
|
|
## Schnell-Orientierung für die nächste Claude-Session
|
|
|
|
|
|
|
|
|
|
Lies in dieser Reihenfolge:
|
|
|
|
|
1. `docs/STATUS.md` (5 min)
|
|
|
|
|
2. `docs/HANDOFF.md` (= dieses Dokument)
|
2026-04-18 07:27:48 +02:00
|
|
|
3. Für CI-Themen: `docs/github-ci-setup.md`
|
|
|
|
|
4. Für Pipeline-Fragen: `docs/superpowers/specs/2026-04-15-publish-pipeline-design.md`
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
## Dev-Kommandos
|
|
|
|
|
|
|
|
|
|
```sh
|
2026-04-18 07:27:48 +02:00
|
|
|
# SPA-Tests
|
2026-04-15 18:34:15 +02:00
|
|
|
cd app && npm run test:unit
|
|
|
|
|
cd app && npm run test:e2e
|
|
|
|
|
cd app && npm run check
|
|
|
|
|
cd app && npm run dev
|
|
|
|
|
|
2026-04-18 07:27:48 +02:00
|
|
|
# SPA-Build + Deploy
|
2026-04-18 16:27:53 +02:00
|
|
|
DEPLOY_TARGET=staging ./scripts/deploy-svelte.sh
|
|
|
|
|
DEPLOY_TARGET=prod ./scripts/deploy-svelte.sh
|
2026-04-15 18:34:15 +02:00
|
|
|
|
2026-04-18 07:27:48 +02:00
|
|
|
# Publish-Pipeline
|
|
|
|
|
cd publish && deno task check # pre-flight
|
|
|
|
|
cd publish && deno task publish --dry-run # diff-modus simulation
|
|
|
|
|
cd publish && deno task publish # diff-modus echt
|
|
|
|
|
cd publish && deno task publish --force-all # alle posts
|
|
|
|
|
cd publish && deno task publish --post <slug> # einen post
|
2026-04-18 18:10:27 +02:00
|
|
|
cd publish && deno task delete --event-id <hex> [--event-id <hex>] [--reason "text"]
|
|
|
|
|
cd publish && deno task validate-post ../content/posts/<dir>/index.md
|
2026-04-18 16:27:53 +02:00
|
|
|
cd publish && deno task test # tests
|
2026-04-15 18:34:15 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Bekannte Stolperfallen
|
|
|
|
|
|
2026-04-18 07:27:48 +02:00
|
|
|
- **Amber-Bunker:** bei neuer Bunker-URL müssen die zwei Permissions
|
|
|
|
|
(`get_public_key`, `sign_event`) in Amber auf „Allow + Always" gesetzt
|
|
|
|
|
werden, bevor Publish-Requests verarbeitet werden. Siehe
|
|
|
|
|
`docs/github-ci-setup.md` für Details.
|
|
|
|
|
- **`CLIENT_SECRET_HEX`** in `.env.local` identisch mit GitHub-Secret —
|
|
|
|
|
sorgt dafür, dass sich beide Umgebungen bei Amber mit derselben App
|
|
|
|
|
anmelden. Rotieren nur bei bewusstem Neu-Pairing in Amber.
|
|
|
|
|
- **`relay.damus.io`** bestätigt Events manchmal nicht mit `OK`. Bekanntes
|
|
|
|
|
Damus-Verhalten, wird toleriert (MIN_RELAY_ACKS=2, andere 4 Relays sind
|
|
|
|
|
zuverlässig).
|
|
|
|
|
- **Svelte 5 Runes:** `$props()`-Werte via `$derived()` in lokale Variablen.
|
|
|
|
|
- **Hugo-quotierte Dates:** `date: "2023-02-26"` ist ein YAML-String, nicht
|
|
|
|
|
ein Date-Objekt. `validatePost` coerced das automatisch; in neuen Posts
|
|
|
|
|
am besten ohne Quotes schreiben.
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
- **Deploy-Targets:** `svelte` (Default!) → Entwicklung, `staging` → Pre-Prod,
|
2026-04-18 16:27:53 +02:00
|
|
|
`prod` → `joerglohrer26/` (Produktion seit Cutover). Script parst
|
|
|
|
|
`.env.local` per awk (wegen Sonderzeichen in FTP-Passwörtern).
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
**Für Live-Deploy auf `joerg-lohrer.de` IMMER explizit `DEPLOY_TARGET=prod`
|
|
|
|
|
setzen** — der Default zielt auf `svelte.joerg-lohrer.de` (historischer
|
|
|
|
|
Cutover-Stand), ein stummer Fehler wenn man es vergisst.
|
2026-04-18 18:10:27 +02:00
|
|
|
- **Slug-Hygiene:** nur `[a-z0-9-]`, keine Umlaute/Emojis/Doppelpunkte.
|
|
|
|
|
Der Slug landet als `d`-Tag im Event und wird zur URL. Einmal
|
|
|
|
|
publiziert, ist Umbenennen nur über Delete + Re-Publish mit neuem Slug
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
möglich. **Sprach-Varianten brauchen eigene Slugs** (z. B. `bibel-selfies`
|
|
|
|
|
/ `bible-selfies`) — die Sprache kommt über den `l`-Tag, nicht über den
|
|
|
|
|
`d`-Tag.
|
2026-04-18 18:10:27 +02:00
|
|
|
- **Clients, die Markdown ignorieren:** Yakihonne/Habla kennen NIP-32
|
|
|
|
|
Sprach-Tags; kurzen Text in `description:` halten, damit die Vorschau
|
|
|
|
|
überall sinnvoll aussieht.
|
2026-04-16 15:17:57 +02:00
|
|
|
|
|
|
|
|
## Offene UNKNOWN-Einträge zur späteren Recherche
|
|
|
|
|
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
Im VR-Post (`content/posts/de/2021-08-15-virtual-reality/index.md`) sind
|
2026-04-18 07:27:48 +02:00
|
|
|
4 Bilder als `license: UNKNOWN / authors: UNKNOWN` markiert:
|
2026-04-16 15:17:57 +02:00
|
|
|
- `01-immersion-wikipedia.jpg` (Wikipedia-Screenshot)
|
|
|
|
|
- `02-mittelalterliche-kirche.jpg` (Sketchfab — Lizenz ist CC BY-NC, Fotograf fehlt)
|
|
|
|
|
- `03-avatare-erstellen.jpg` (Ready Player Me)
|
|
|
|
|
- `05-pupillendistanz.jpg` (EyeMeasure iOS App)
|
|
|
|
|
|
2026-04-18 07:27:48 +02:00
|
|
|
Pipeline loggt Warnungen, publisht aber trotzdem. Recherche-Notizen in
|
|
|
|
|
`docs/redaktion-bild-metadaten.md`.
|
|
|
|
|
|
|
|
|
|
## Session-Kontext
|
|
|
|
|
|
|
|
|
|
Hilfreich beim Wiedereinstieg mit Claude:
|
2026-04-18 16:27:53 +02:00
|
|
|
- Branch-Check: `git log --oneline -10 main`
|
|
|
|
|
- Live-Check: `curl -sI https://joerg-lohrer.de/`
|
|
|
|
|
- Event-Count Repo vs. Relays:
|
|
|
|
|
```sh
|
docs: status/handoff/readme/claude.md auf multilingual-stand
- README: neue plan-referenzen (3x multilingual), repo-struktur auf
content/posts/<lang>/<slug>/, svelte-i18n + translations im app-tree
- STATUS: event-count 27 (26 de + 1 en), kurzfassung um mehrsprachigkeit,
multilingual-abschnitt in „erledigt" (pipeline, spa, i18n + bugfixes)
- HANDOFF: option D entfernt (erledigt), neuer abschnitt „wie man eine
übersetzung anlegt", frontmatter-template um a:-platzhalter,
deploy-target-stolperfalle verschärft, vr-post-pfad aktualisiert
- Multilingual-spec: status von „noch nicht implementiert" auf „umgesetzt"
+ anmerkung zum post-switcher (📖 DE | EN statt text-hinweis)
- CLAUDE.md neu: knapper einstieg für agent-sessions mit commit-konvention,
deploy-falle, zsh-globbing, forgejo-mirror-timing
- workflow-skill generalüberholt: post-cutover-stand, multilingual,
publish-pipeline, activeLocale, 73 pipeline-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 16:31:16 +02:00
|
|
|
find content/posts -mindepth 3 -name index.md | wc -l
|
2026-04-18 18:10:27 +02:00
|
|
|
nak req -k 30023 -a 4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41 wss://relay.edufeed.org 2>/dev/null | jq -r '.tags[]|select(.[0]=="d")|.[1]' | sort -u | wc -l
|
2026-04-18 16:27:53 +02:00
|
|
|
```
|
|
|
|
|
- Pipeline-Tests: `cd publish && deno task test`
|
2026-04-16 15:17:57 +02:00
|
|
|
|
|
|
|
|
## Community-Wiki-Entwürfe
|
|
|
|
|
|
2026-04-18 07:27:48 +02:00
|
|
|
Liegen im Repo, noch nicht extern veröffentlicht:
|
2026-04-16 15:17:57 +02:00
|
|
|
- `docs/wiki-entwurf-nostr-bild-metadaten.md` — DE
|
|
|
|
|
- `docs/wiki-draft-nostr-image-metadata.md` — EN
|
|
|
|
|
|
2026-04-18 07:27:48 +02:00
|
|
|
Können als NIP-Proposal oder auf nostrbook.dev eingebracht werden, jetzt wo
|
|
|
|
|
die Konvention in der Praxis validiert ist.
|