2026-04-15 18:34:15 +02:00
|
|
|
# Projekt-Status: joerg-lohrer.de → Nostr-basierte SPA
|
|
|
|
|
|
2026-04-18 16:27:53 +02:00
|
|
|
**Stand:** 2026-04-18 (Cutover abgeschlossen)
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
## Kurzfassung
|
|
|
|
|
|
2026-04-18 16:27:53 +02:00
|
|
|
`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.
|
2026-04-15 18:34:15 +02:00
|
|
|
|
2026-04-18 16:27:53 +02:00
|
|
|
**Das inhaltliche Kernziel des Gesamtprojekts ist erreicht.**
|
|
|
|
|
|
|
|
|
|
## Live-URLs
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
| URL | Status | Rolle |
|
|
|
|
|
|---|---|---|
|
2026-04-18 16:27:53 +02:00
|
|
|
| `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 |
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
## Was auf Nostr liegt
|
|
|
|
|
|
|
|
|
|
- **Autoren-Pubkey:** `npub1f7jar3qnu269uyx5p0e4v24hqxjnxysxudvujza2ur5ehltvdeqsly2fx9`
|
|
|
|
|
(hex: `4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41`)
|
2026-04-18 16:27:53 +02:00
|
|
|
- **NIP-05:** `joerglohrer@joerg-lohrer.de` (via `/.well-known/nostr.json`)
|
2026-04-18 18:10:27 +02:00
|
|
|
- **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 (Commit `7186c32`).
|
|
|
|
|
- **NIP-32-Sprach-Tags:** Alle Events tragen `['L', 'ISO-639-1']` +
|
|
|
|
|
`['l', 'de', 'ISO-639-1']`. Grundlage für spätere Mehrsprachigkeit.
|
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 16:27:53 +02:00
|
|
|
- **91 Bilder** auf beiden Blossom-Servern, alle Events enthalten
|
|
|
|
|
hash-basierte Blossom-URLs.
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
## Repo-Struktur
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
joerglohrerde/
|
2026-04-18 16:27:53 +02:00
|
|
|
├── 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)
|
2026-04-15 18:34:15 +02:00
|
|
|
├── scripts/
|
2026-04-18 16:27:53 +02:00
|
|
|
│ └── deploy-svelte.sh # FTPS-Deploy, Targets: svelte/staging/prod
|
2026-04-15 18:34:15 +02:00
|
|
|
├── docs/
|
|
|
|
|
│ ├── STATUS.md # Dieses Dokument
|
|
|
|
|
│ ├── HANDOFF.md # Wie man hier weitermacht
|
2026-04-18 16:27:53 +02:00
|
|
|
│ ├── redaktion-bild-metadaten.md
|
|
|
|
|
│ ├── wiki-entwurf-nostr-bild-metadaten.md
|
|
|
|
|
│ ├── wiki-draft-nostr-image-metadata.md
|
|
|
|
|
│ ├── github-ci-setup.md
|
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-18 16:27:53 +02:00
|
|
|
│ ├── 2026-04-15-spa-sveltekit.md # erledigt
|
|
|
|
|
│ └── 2026-04-16-publish-pipeline.md # erledigt
|
|
|
|
|
├── .github/workflows/ # publish.yml (Forgejo→GitHub Push-Mirror-Trigger)
|
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-18 16:27:53 +02:00
|
|
|
- **`main`** — kanonischer Zweig, Produktions-Quelle seit Cutover.
|
|
|
|
|
- **`spa`** — historischer SvelteKit-Arbeitszweig, gemerged.
|
2026-04-16 15:17:57 +02:00
|
|
|
- **`hugo-archive`** — Orphan-Branch mit Hugo-Zustand, eingefroren.
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
## Setup-Zustand
|
|
|
|
|
|
2026-04-18 16:27:53 +02:00
|
|
|
Einmalig manuell erledigt (gitignored in `.env.local`):
|
|
|
|
|
- ✅ Amber-Bunker-URL als `BUNKER_URL`
|
|
|
|
|
- ✅ FTP-Creds für alle Targets (SVELTE/STAGING/PROD)
|
|
|
|
|
- ✅ `AUTHOR_PUBKEY_HEX` und `BOOTSTRAP_RELAY=wss://relay.primal.net`
|
|
|
|
|
- ✅ `CLIENT_SECRET_HEX` (identisch mit GitHub-Secret für stabile App-ID in Amber)
|
2026-04-16 15:17:57 +02:00
|
|
|
- ✅ `kind:10002`-Event publiziert (Relay-Liste)
|
|
|
|
|
- ✅ `kind:10063`-Event publiziert (Blossom-Server)
|
|
|
|
|
- ✅ Subdomains mit TLS + HSTS
|
2026-04-18 16:27:53 +02:00
|
|
|
- ✅ Staging → Webroot `joerglohrer26/`
|
|
|
|
|
- ✅ Prod → Webroot `joerglohrer26/` (Cutover 2026-04-18)
|
|
|
|
|
- ✅ NIP-05-JSON mit CORS-Header via `.htaccess`
|
2026-04-15 18:34:15 +02:00
|
|
|
|
2026-04-18 16:27:53 +02:00
|
|
|
## Offene Punkte (Details in HANDOFF.md)
|
2026-04-15 18:34:15 +02:00
|
|
|
|
2026-04-18 16:27:53 +02:00
|
|
|
Nach Priorität:
|
2026-04-18 18:10:27 +02:00
|
|
|
1. **Postfach `webmaster@joerg-lohrer.de`** als Weiterleitung in KAS anlegen.
|
|
|
|
|
2. **SPA respektiert NIP-09-Deletion-Events** (defensiver kind:5-Filter).
|
|
|
|
|
3. **Mehrsprachigkeit** — parallele `lang:en`-Versionen bei Bedarf anlegen,
|
|
|
|
|
per `a`-Tag als `translation_of` verlinken (NIP-32-Grundlage steht).
|
|
|
|
|
4. **Self-hosted CI** (Woodpecker / Cron auf Optiplex), weg von GitHub.
|
|
|
|
|
5. **5 UNKNOWN-Einträge** im VR-Post zur späteren Recherche.
|
2026-04-16 15:17:57 +02:00
|
|
|
|
2026-04-18 16:27:53 +02:00
|
|
|
## Erledigt (chronologisch seit 2026-04-15)
|
2026-04-16 15:17:57 +02:00
|
|
|
|
|
|
|
|
- ✅ Content-Migration: alle 18 Posts haben strukturierte `images:`-Liste
|
2026-04-18 16:27:53 +02:00
|
|
|
im Frontmatter (91 Bilder, mit Alt-Text, Lizenz, Autor:innen, ggf.
|
|
|
|
|
Caption und Modifications).
|
2026-04-18 07:27:48 +02:00
|
|
|
- ✅ Spec, Plan und Bild-Metadaten-Konvention geschrieben.
|
|
|
|
|
- ✅ Community-Wiki-Entwürfe (DE + EN) für Nostr-Bildattribution.
|
2026-04-18 16:27:53 +02:00
|
|
|
- ✅ **Publish-Pipeline komplett implementiert** (24 Tasks, 59 Tests grün).
|
|
|
|
|
- ✅ **Alle 18 Altposts publiziert** als `kind:30023`-Events.
|
2026-04-18 07:27:48 +02:00
|
|
|
- ✅ **91 Bilder** auf beiden Blossom-Servern.
|
2026-04-18 16:27:53 +02:00
|
|
|
- ✅ **GitHub-Actions-Workflow** + Forgejo→GitHub Push-Mirror + Secrets.
|
|
|
|
|
- ✅ **Duplikat-Event via NIP-09 gelöscht** (`bibel-selfies` Unix-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.de` von Hugo (`joerglohrer24/`)
|
|
|
|
|
auf SvelteKit-SPA (`joerglohrer26/`) umgehängt.
|
2026-04-18 18:10:27 +02:00
|
|
|
- ✅ **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 via `CLIENT_SECRET_HEX`.
|
|
|
|
|
- ✅ **NIP-32 Sprach-Tags** in `buildKind30023` (Default `de`, über
|
|
|
|
|
`lang:`-Frontmatter überschreibbar).
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
## Live-Verifikation
|
|
|
|
|
|
|
|
|
|
```sh
|
2026-04-18 16:27:53 +02:00
|
|
|
curl -sI https://joerg-lohrer.de/ | head -3
|
2026-04-16 15:17:57 +02:00
|
|
|
curl -sI https://staging.joerg-lohrer.de/ | head -3
|
2026-04-18 16:27:53 +02:00
|
|
|
curl -s https://joerg-lohrer.de/.well-known/nostr.json | jq .
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Pipeline-Quick-Check
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
# 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
|
2026-04-15 18:34:15 +02:00
|
|
|
```
|
|
|
|
|
|
2026-04-18 16:27:53 +02:00
|
|
|
## Design-Referenzen
|
2026-04-15 18:34:15 +02:00
|
|
|
|
|
|
|
|
- `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)
|
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.
|