2026-04-15 18:34:15 +02:00
|
|
|
|
# Projekt-Status: joerg-lohrer.de → Nostr-basierte SPA
|
|
|
|
|
|
|
2026-04-18 07:27:48 +02:00
|
|
|
|
**Stand:** 2026-04-18
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
|
|
## Kurzfassung
|
|
|
|
|
|
|
|
|
|
|
|
Jörg Lohrers persönliche Webseite wird von einem Hugo-basierten statischen
|
|
|
|
|
|
Site-Generator zu einer dezentralen Nostr-basierten SPA überführt. Posts
|
|
|
|
|
|
existieren als signierte Events (NIP-23, `kind:30023`) auf Public-Relays und
|
|
|
|
|
|
werden zur Laufzeit im Browser gerendert.
|
|
|
|
|
|
|
2026-04-16 15:17:57 +02:00
|
|
|
|
## Vier parallele Webseiten
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
|
|
| URL | Status | Rolle |
|
|
|
|
|
|
|---|---|---|
|
2026-04-16 15:17:57 +02:00
|
|
|
|
| `https://joerg-lohrer.de/` | live, unverändert | **Hugo-Altbestand** (bleibt bis Cutover) |
|
|
|
|
|
|
| `https://spa.joerg-lohrer.de/` | live | **Vanilla-HTML-Mini-Spike** (Proof of Concept) |
|
2026-04-15 18:34:15 +02:00
|
|
|
|
| `https://svelte.joerg-lohrer.de/` | live | **SvelteKit-SPA** (35-Task-Plan komplett) |
|
2026-04-16 15:17:57 +02:00
|
|
|
|
| `https://staging.joerg-lohrer.de/` | live, leer | **Staging** (Webroot `joerglohrer26/` für Pipeline-Entwicklung; FTP-Creds in `.env.local`) |
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
|
|
Die SvelteKit-SPA unter `svelte.joerg-lohrer.de` ist die Ziel-Implementierung.
|
|
|
|
|
|
`spa.joerg-lohrer.de` bleibt als schlanke Referenz erhalten. Hugo läuft weiter,
|
|
|
|
|
|
bis die Publish-Pipeline steht und der Cutover auf die Hauptdomain erfolgt.
|
|
|
|
|
|
|
|
|
|
|
|
## Was auf Nostr liegt
|
|
|
|
|
|
|
|
|
|
|
|
- **Autoren-Pubkey:** `npub1f7jar3qnu269uyx5p0e4v24hqxjnxysxudvujza2ur5ehltvdeqsly2fx9`
|
|
|
|
|
|
(hex: `4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41`)
|
2026-04-18 07:27:48 +02:00
|
|
|
|
- **Publizierte Events:** **18 Langform-Posts** (`kind:30023`) — alle Altposts
|
|
|
|
|
|
via Publish-Pipeline migriert (Commit `0c6fdd1`, Log in
|
|
|
|
|
|
`docs/publish-logs/2026-04-18-force-all-migration.json`).
|
2026-04-15 18:34:15 +02:00
|
|
|
|
- **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`
|
|
|
|
|
|
|
2026-04-18 07:27:48 +02:00
|
|
|
|
**91 Bilder** auf beiden Blossom-Servern. Alle Events enthalten hash-basierte
|
|
|
|
|
|
Blossom-URLs. SPA rendert alle Posts einheitlich — kein Legacy-Pfad, keine
|
|
|
|
|
|
rsync-Artefakte.
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
|
|
## Repo-Struktur
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
joerglohrerde/
|
2026-04-16 15:17:57 +02:00
|
|
|
|
├── content/posts/ # 18 Markdown-Posts, alle mit structured images: im Frontmatter
|
2026-04-15 18:34:15 +02:00
|
|
|
|
├── app/ # SvelteKit-SPA (Ziel-Implementation)
|
|
|
|
|
|
├── preview/spa-mini/ # Vanilla-HTML-Mini-Spike (Referenz)
|
2026-04-16 15:17:57 +02:00
|
|
|
|
├── publish/ # NOCH NICHT ANGELEGT — Publish-Pipeline (Task 1 aus Plan)
|
2026-04-15 18:34:15 +02:00
|
|
|
|
├── scripts/
|
|
|
|
|
|
│ └── deploy-svelte.sh # FTPS-Deploy nach svelte.joerg-lohrer.de
|
|
|
|
|
|
├── docs/
|
|
|
|
|
|
│ ├── STATUS.md # Dieses Dokument
|
|
|
|
|
|
│ ├── HANDOFF.md # Wie man hier weitermacht
|
2026-04-16 15:17:57 +02:00
|
|
|
|
│ ├── redaktion-bild-metadaten.md # Checkliste, Bild-Durchgang (abgearbeitet)
|
|
|
|
|
|
│ ├── wiki-entwurf-nostr-bild-metadaten.md # Wiki-Konvention deutsch
|
|
|
|
|
|
│ ├── wiki-draft-nostr-image-metadata.md # Wiki-Konvention englisch
|
2026-04-15 18:34:15 +02:00
|
|
|
|
│ └── superpowers/
|
2026-04-16 15:17:57 +02:00
|
|
|
|
│ ├── specs/ # SPA + Publish-Pipeline + Bild-Metadaten-Konvention
|
|
|
|
|
|
│ └── plans/
|
|
|
|
|
|
│ ├── 2026-04-15-spa-sveltekit.md # erledigt
|
|
|
|
|
|
│ └── 2026-04-16-publish-pipeline.md # ⬅ als nächstes
|
2026-04-15 18:34:15 +02:00
|
|
|
|
├── .claude/
|
|
|
|
|
|
│ ├── skills/ # Repo-spezifischer Claude-Skill
|
2026-04-16 15:17:57 +02:00
|
|
|
|
│ └── settings.local.json # Claude-Session-State (gitignored)
|
|
|
|
|
|
└── .env.local # Gitignored: FTP-Creds, Bunker-URL, Publish-Pipeline-Keys
|
2026-04-15 18:34:15 +02:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Branch-Layout (Git)
|
|
|
|
|
|
|
2026-04-16 15:17:57 +02:00
|
|
|
|
- **`main`** — kanonischer Zweig.
|
|
|
|
|
|
- **`spa`** — aktueller Arbeits-Branch, vor `main`. SvelteKit-SPA live,
|
|
|
|
|
|
Content-Migration (Bild-Metadaten) abgeschlossen, Publish-Pipeline geplant.
|
|
|
|
|
|
- **`hugo-archive`** — Orphan-Branch mit Hugo-Zustand, eingefroren.
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
|
|
## Setup-Zustand
|
|
|
|
|
|
|
|
|
|
|
|
Einmalig manuell erledigt:
|
|
|
|
|
|
- ✅ Amber-Bunker-URL in `.env.local` als `BUNKER_URL`
|
2026-04-16 15:17:57 +02:00
|
|
|
|
- ✅ FTP-Creds für alle Subdomains (SPA, SVELTE, STAGING) in `.env.local`
|
|
|
|
|
|
- ✅ `AUTHOR_PUBKEY_HEX` und `BOOTSTRAP_RELAY=wss://relay.primal.net` in `.env.local`
|
|
|
|
|
|
- ✅ `kind:10002`-Event publiziert (Relay-Liste)
|
|
|
|
|
|
- ✅ `kind:10063`-Event publiziert (Blossom-Server)
|
|
|
|
|
|
- ✅ Subdomains mit TLS + HSTS
|
|
|
|
|
|
- ✅ Staging-Subdomain `staging.joerg-lohrer.de` → Webroot `joerglohrer26/`
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
|
|
Alles in `.env.local` — gitignored, nicht committet.
|
|
|
|
|
|
|
2026-04-16 15:17:57 +02:00
|
|
|
|
## Offene Punkte
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
2026-04-18 07:44:00 +02:00
|
|
|
|
- **End-to-End-Test CI mit echtem Content-Push** (Workflow-Manual-Trigger
|
|
|
|
|
|
ist grün; automatischer Auto-Trigger via Push-Mirror noch nicht real
|
|
|
|
|
|
ausprobiert).
|
2026-04-15 18:34:15 +02:00
|
|
|
|
- **Menü-Navigation** in der SPA (Home / Archiv / Impressum / Kontakt)
|
|
|
|
|
|
- **Impressum-Seite** (braucht rechtlichen Text)
|
2026-04-18 07:27:48 +02:00
|
|
|
|
- **Cutover auf `joerg-lohrer.de`** (Pipeline läuft, Voraussetzung erfüllt;
|
|
|
|
|
|
Hauptdomain kann auf SvelteKit-SPA umgestellt werden)
|
|
|
|
|
|
- **5 UNKNOWN-Einträge** im `virtual-reality`-Post zur späteren Recherche
|
|
|
|
|
|
(Wikipedia-Screenshot, Sketchfab-Fotograf, Ready-Player-Me, EyeMeasure-App)
|
2026-04-18 07:44:00 +02:00
|
|
|
|
- **CI-Migration** (später): weg von GitHub-Actions zu Woodpecker oder
|
|
|
|
|
|
Cron auf Optiplex — siehe `docs/github-ci-setup.md`.
|
2026-04-16 15:17:57 +02:00
|
|
|
|
|
|
|
|
|
|
## Erledigt 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). Commit `c023b59`.
|
2026-04-18 07:27:48 +02:00
|
|
|
|
- ✅ Erlebnispädagogik-Post: tote Amazon-Hotlinks entfernt.
|
|
|
|
|
|
- ✅ Spec, Plan und Bild-Metadaten-Konvention geschrieben.
|
|
|
|
|
|
- ✅ Community-Wiki-Entwürfe (DE + EN) für Nostr-Bildattribution.
|
|
|
|
|
|
- ✅ **Publish-Pipeline komplett implementiert**, 22 Tasks aus dem Plan:
|
|
|
|
|
|
- 18 Code-Tasks (Phase 1–6), 59 Unit-Tests grün
|
|
|
|
|
|
- Stabile NIP-46-Anbindung via `CLIENT_SECRET_HEX` für wiederverwendbare
|
|
|
|
|
|
App-Identität in Amber
|
|
|
|
|
|
- `validatePost` akzeptiert auch string-dates (für Hugo-Kompatibilität)
|
|
|
|
|
|
- ✅ **Alle 18 Altposts publiziert** als `kind:30023`-Events (Commit `0c6fdd1`,
|
|
|
|
|
|
Log in `docs/publish-logs/2026-04-18-force-all-migration.json`).
|
|
|
|
|
|
- ✅ **91 Bilder** auf beiden Blossom-Servern.
|
|
|
|
|
|
- ✅ SPA rendert alle Posts mit Bildern von Blossom (visuell verifiziert).
|
|
|
|
|
|
- ✅ **GitHub-Actions-Workflow** angelegt (`.github/workflows/publish.yml`).
|
|
|
|
|
|
- ✅ Forgejo → GitHub Push-Mirror eingerichtet, GitHub-Secrets gesetzt.
|
2026-04-18 07:44:00 +02:00
|
|
|
|
- ✅ **`spa` → `main` gemergt**, GitHub-Actions-Workflow manuell verifiziert
|
|
|
|
|
|
(Run #1: signer ok, outbox ok, blossom-liste ok, mode=diff posts=0).
|
|
|
|
|
|
**Alle 24 Tasks des Publish-Pipeline-Plans abgeschlossen.**
|
2026-04-18 14:30:37 +02:00
|
|
|
|
- ✅ **Staging-Deploy-Infrastruktur:** `scripts/deploy-svelte.sh` mit
|
|
|
|
|
|
drei Targets (`svelte`/`staging`/`prod`), dynamisches `og:url` und
|
|
|
|
|
|
`canonical` via `__SITE_URL__`-Platzhalter. Staging-Subdomain
|
|
|
|
|
|
`staging.joerg-lohrer.de` bedient jetzt `joerglohrer26/` (Cutover-Ziel).
|
|
|
|
|
|
- ✅ **Duplikat-Event `1744905463975` via NIP-09 gelöscht** (Delete-Event
|
|
|
|
|
|
`7f5d08b8…`, auf alle 5 Relays). Nach Migration nicht mehr auffindbar.
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
|
|
## Live-Verifikation
|
|
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
|
curl -sI https://svelte.joerg-lohrer.de/ | head -3
|
2026-04-16 15:17:57 +02:00
|
|
|
|
curl -sI https://staging.joerg-lohrer.de/ | head -3
|
2026-04-15 18:34:15 +02:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Kontakt zur Implementierung
|
|
|
|
|
|
|
|
|
|
|
|
Alle Design-Entscheidungen in:
|
|
|
|
|
|
- `docs/superpowers/specs/2026-04-15-nostr-page-design.md` (SPA)
|
2026-04-16 15:17:57 +02:00
|
|
|
|
- `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)
|
|
|
|
|
|
- `docs/superpowers/plans/2026-04-16-publish-pipeline.md` (24 Tasks, als nächstes)
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
2026-04-16 15:17:57 +02:00
|
|
|
|
Für die nächste Session: **`docs/HANDOFF.md`** lesen.
|