7.1 KiB
7.1 KiB
Projekt-Status: joerg-lohrer.de → Nostr-basierte SPA
Stand: 2026-04-18 (Cutover abgeschlossen)
Kurzfassung
joerg-lohrer.de läuft als SvelteKit-SPA, die Blog-Posts live aus
signierten Nostr-Events (NIP-23, kind:30023) auf 5 Public-Relays rendert.
Bilder liegen content-addressed auf 2 Blossom-Servern. Die Hugo-basierte
Altseite ist als hugo-archive-Branch eingefroren.
Das inhaltliche Kernziel des Gesamtprojekts ist erreicht.
Live-URLs
| URL | Status | Rolle |
|---|---|---|
https://joerg-lohrer.de/ |
live | Produktion, SvelteKit-SPA (Cutover 2026-04-18) |
https://staging.joerg-lohrer.de/ |
live | Staging, letzter Pre-Prod-Build |
https://svelte.joerg-lohrer.de/ |
live | Entwicklung, Deploy-Target der Pipeline |
https://spa.joerg-lohrer.de/ |
live | Historisch, Vanilla-HTML-Mini-Spike |
Was auf Nostr liegt
- Autoren-Pubkey:
npub1f7jar3qnu269uyx5p0e4v24hqxjnxysxudvujza2ur5ehltvdeqsly2fx9(hex:4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41) - NIP-05:
joerglohrer@joerg-lohrer.de(via/.well-known/nostr.json) - Publizierte Events: 26 Langform-Posts (
kind:30023), alle mit sauberen ASCII-slugs, alle aus dem Repo publiziert. 18 Alt-Posts aus der Hugo-Migration plus 8 re-importierte Client-Posts (Habla/Yakihonne), die mit bereinigten d-tags neu publiziert und alte Duplikate per NIP-09 gelöscht wurden (Commit7186c32). - NIP-32-Sprach-Tags: Alle Events tragen
['L', 'ISO-639-1']+['l', 'de', 'ISO-639-1']. Grundlage für spätere Mehrsprachigkeit. - Relay-Liste (
kind:10002):relay.damus.io,nos.lol,relay.primal.net,relay.tchncs.de,relay.edufeed.org - Blossom-Server (
kind:10063):blossom.edufeed.org,blossom.primal.net - 91 Bilder auf beiden Blossom-Servern, alle Events enthalten hash-basierte Blossom-URLs.
Repo-Struktur
joerglohrerde/
├── content/posts/ # 18 Markdown-Posts, alle mit strukturierten images:
├── content/impressum.md # Statisches Impressum (wird von SPA geladen)
├── app/ # SvelteKit-SPA (Laufzeit-Renderer)
├── publish/ # Deno-Publish-Pipeline (Blossom + Nostr)
├── preview/spa-mini/ # Vanilla-HTML-Mini-Spike (historisch)
├── scripts/
│ └── deploy-svelte.sh # FTPS-Deploy, Targets: svelte/staging/prod
├── docs/
│ ├── STATUS.md # Dieses Dokument
│ ├── HANDOFF.md # Wie man hier weitermacht
│ ├── redaktion-bild-metadaten.md
│ ├── wiki-entwurf-nostr-bild-metadaten.md
│ ├── wiki-draft-nostr-image-metadata.md
│ ├── github-ci-setup.md
│ └── superpowers/
│ ├── specs/ # SPA + Publish-Pipeline + Bild-Metadaten-Konvention
│ └── plans/
│ ├── 2026-04-15-spa-sveltekit.md # erledigt
│ └── 2026-04-16-publish-pipeline.md # erledigt
├── .github/workflows/ # publish.yml (Forgejo→GitHub Push-Mirror-Trigger)
├── .claude/
│ ├── skills/ # Repo-spezifischer Claude-Skill
│ └── settings.local.json # Claude-Session-State (gitignored)
└── .env.local # Gitignored: FTP-Creds, Bunker-URL, Publish-Pipeline-Keys
Branch-Layout (Git)
main— kanonischer Zweig, Produktions-Quelle seit Cutover.spa— historischer SvelteKit-Arbeitszweig, gemerged.hugo-archive— Orphan-Branch mit Hugo-Zustand, eingefroren.
Setup-Zustand
Einmalig manuell erledigt (gitignored in .env.local):
- ✅ Amber-Bunker-URL als
BUNKER_URL - ✅ FTP-Creds für alle Targets (SVELTE/STAGING/PROD)
- ✅
AUTHOR_PUBKEY_HEXundBOOTSTRAP_RELAY=wss://relay.primal.net - ✅
CLIENT_SECRET_HEX(identisch mit GitHub-Secret für stabile App-ID in Amber) - ✅
kind:10002-Event publiziert (Relay-Liste) - ✅
kind:10063-Event publiziert (Blossom-Server) - ✅ Subdomains mit TLS + HSTS
- ✅ Staging → Webroot
joerglohrer26/ - ✅ Prod → Webroot
joerglohrer26/(Cutover 2026-04-18) - ✅ NIP-05-JSON mit CORS-Header via
.htaccess
Offene Punkte (Details in HANDOFF.md)
Nach Priorität:
- Postfach
webmaster@joerg-lohrer.deals Weiterleitung in KAS anlegen. - SPA respektiert NIP-09-Deletion-Events (defensiver kind:5-Filter).
- Mehrsprachigkeit — parallele
lang:en-Versionen bei Bedarf anlegen, pera-Tag alstranslation_ofverlinken (NIP-32-Grundlage steht). - Self-hosted CI (Woodpecker / Cron auf Optiplex), weg von GitHub.
- 5 UNKNOWN-Einträge im VR-Post zur späteren Recherche.
Erledigt (chronologisch seit 2026-04-15)
- ✅ Content-Migration: alle 18 Posts haben strukturierte
images:-Liste im Frontmatter (91 Bilder, mit Alt-Text, Lizenz, Autor:innen, ggf. Caption und Modifications). - ✅ Spec, Plan und Bild-Metadaten-Konvention geschrieben.
- ✅ Community-Wiki-Entwürfe (DE + EN) für Nostr-Bildattribution.
- ✅ Publish-Pipeline komplett implementiert (24 Tasks, 59 Tests grün).
- ✅ Alle 18 Altposts publiziert als
kind:30023-Events. - ✅ 91 Bilder auf beiden Blossom-Servern.
- ✅ GitHub-Actions-Workflow + Forgejo→GitHub Push-Mirror + Secrets.
- ✅ Duplikat-Event via NIP-09 gelöscht (
bibel-selfiesUnix-Timestamp-dup). - ✅ Staging-Deploy-Infrastruktur mit
__SITE_URL__-Templating. - ✅ Homepage mit Hero, Profilbild, Social-Icons (Nostr/Mastodon/ Bluesky/LinkedIn/ORCID/Mail), Latest-Posts.
- ✅ Archiv-Seite, Impressum-Seite, Menü-Navigation im Layout.
- ✅ CC0-Footer-Badge (Heart+Zero inline SVG, monochrom).
- ✅ Impressum auf CC0 umgestellt (mit freundlichem Namensnennungs-Hinweis).
- ✅ Cutover 2026-04-18 —
joerg-lohrer.devon Hugo (joerglohrer24/) auf SvelteKit-SPA (joerglohrer26/) umgehängt. - ✅ Nostr-Reimport 2026-04-18 — 8 direkt-auf-Nostr erstellte Posts
(Habla/Yakihonne) mit sauberen ASCII-slugs ins Repo geholt und neu
publiziert, alte Events per NIP-09 gelöscht. 26
kind:30023-Events aktuell publiziert. - ✅ Delete-Subcommand in der Pipeline (
deno task delete --event-id …), nutzt stabile Bunker-Identität viaCLIENT_SECRET_HEX. - ✅ NIP-32 Sprach-Tags in
buildKind30023(Defaultde, überlang:-Frontmatter überschreibbar).
Live-Verifikation
curl -sI https://joerg-lohrer.de/ | head -3
curl -sI https://staging.joerg-lohrer.de/ | head -3
curl -s https://joerg-lohrer.de/.well-known/nostr.json | jq .
Pipeline-Quick-Check
# Event-Count pro Relay
for r in wss://relay.damus.io wss://nos.lol wss://relay.primal.net wss://relay.tchncs.de wss://relay.edufeed.org; do
echo -n "$r: "; nak req -k 30023 -a 4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41 $r 2>/dev/null | wc -l
done
Design-Referenzen
docs/superpowers/specs/2026-04-15-nostr-page-design.md(SPA)docs/superpowers/specs/2026-04-15-publish-pipeline-design.md(Publish, Blossom-only)docs/superpowers/specs/2026-04-16-image-metadata-convention.md(Bild-Metadaten-YAML)
Für die nächste Session: docs/HANDOFF.md lesen.