docs: status + handoff für fortsetzung morgen aktualisiert
- aktueller stand: content-migration fertig, pipeline-plan geschrieben - nächster schritt klar benannt: task 1 aus publish-pipeline-plan - env-vorarbeiten dokumentiert (alle keys in .env.local) - offene UNKNOWN-liste für spätere recherche Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
931ef9f03f
commit
32fe856232
160
docs/HANDOFF.md
160
docs/HANDOFF.md
|
|
@ -3,44 +3,58 @@
|
||||||
Du (Claude, nächste Session) oder ich (Jörg, später) kommen hier zurück.
|
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.
|
Dieses Dokument sagt: was ist der Zustand, was wartet, wo liegen die Fäden.
|
||||||
|
|
||||||
## Zustand (siehe `STATUS.md` für Details)
|
## Zustand (Details in `STATUS.md`)
|
||||||
|
|
||||||
Die SvelteKit-SPA unter `svelte.joerg-lohrer.de` ist **fertig und live**.
|
Die SvelteKit-SPA unter `svelte.joerg-lohrer.de` ist **fertig und live**.
|
||||||
35 geplante Tasks + einige Erweiterungen abgeschlossen. Branch `spa` hat
|
Alle 18 Posts haben jetzt **strukturierte Bild-Metadaten** im Frontmatter
|
||||||
alle Commits. Ein Git-Merge nach `main` und Deploy auf die Hauptdomain ist
|
(Commit `c023b59`, 91 Bilder). Der Publish-Pipeline-**Plan ist geschrieben**
|
||||||
**noch nicht** erfolgt — das kommt erst nach dem Cutover-Plan.
|
(`docs/superpowers/plans/2026-04-16-publish-pipeline.md`, 24 Tasks in 12 Phasen).
|
||||||
|
|
||||||
|
**Als nächstes:** Pipeline implementieren, beginnend mit Task 1.
|
||||||
|
|
||||||
## Was als Nächstes ansteht
|
## Was als Nächstes ansteht
|
||||||
|
|
||||||
Drei Optionen, ordered by natürlichkeit der Fortsetzung:
|
### Option 1 — Publish-Pipeline implementieren ⬅ empfohlen
|
||||||
|
|
||||||
### Option 1 — Publish-Pipeline bauen
|
**Warum:** Spec + Plan fertig, Content vorbereitet, alle Design-Entscheidungen
|
||||||
|
getroffen. Kann direkt losgehen.
|
||||||
|
|
||||||
**Warum:** aktuell muss Jörg jeden neuen Post manuell mit `nak event` signieren
|
**Nächster konkreter Schritt:**
|
||||||
und publishen (siehe `preview/spa-mini/README.md`, Referenzbefehl in den
|
|
||||||
Brainstorm-Notizen). Eine Publish-Pipeline automatisiert:
|
|
||||||
|
|
||||||
1. Markdown-Post in `content/posts/` bearbeiten / neu anlegen
|
|
||||||
2. Git-Commit + push auf `main`
|
|
||||||
3. GitHub Action signiert Event via NIP-46 (Amber-Bunker), pushed zu allen
|
|
||||||
Relays aus `kind:10002`, lädt Bilder zu Blossom, lädt Altbild-Assets
|
|
||||||
ggf. zu All-Inkl via SSH/rsync.
|
|
||||||
|
|
||||||
**Was existiert:** Spec vollständig unter
|
|
||||||
`docs/superpowers/specs/2026-04-15-publish-pipeline-design.md`. Plan
|
|
||||||
**noch nicht geschrieben.**
|
|
||||||
|
|
||||||
**Nächster Konkreter Schritt:**
|
|
||||||
```
|
```
|
||||||
superpowers:writing-plans
|
cd /Users/joerglohrer/repositories/joerglohrerde
|
||||||
```
|
```
|
||||||
mit dem Publish-Spec als Input.
|
|
||||||
|
|
||||||
**Vorarbeiten:**
|
Dann den Plan öffnen:
|
||||||
- SSH-Zugang zu All-Inkl klären (Premium-Tarif angefragt, Status prüfen)
|
```
|
||||||
- Deno ≥ 2.x installiert?
|
docs/superpowers/plans/2026-04-16-publish-pipeline.md
|
||||||
- GitHub Actions-Repo-Secrets vorbereiten (`BUNKER_URL`, `ALLINKL_DEPLOY_ROOT`,
|
```
|
||||||
`SSH_DEPLOY_KEY`, `AUTHOR_PUBKEY_HEX`)
|
|
||||||
|
Und Task 1 (Deno-Projekt-Grundgerüst) starten. Der Plan nutzt TDD;
|
||||||
|
jeder Task hat Test-First, Implementation, Commit.
|
||||||
|
|
||||||
|
**Ausführungsweisen:**
|
||||||
|
- **Subagent-Driven** (im Plan empfohlen): pro Task frischer Subagent,
|
||||||
|
Review zwischen Tasks. Skill: `superpowers:subagent-driven-development`.
|
||||||
|
- **Inline**: alles in einer Session. Skill: `superpowers:executing-plans`.
|
||||||
|
|
||||||
|
**Besonderheiten beim Plan:**
|
||||||
|
- Pipeline ist **Blaupause** für andere Nostr-Repos — keine
|
||||||
|
Projekt-Konstanten im Code, alles via Env.
|
||||||
|
- **Env-File:** nutzt `../.env.local` (Repo-Root), wo `BUNKER_URL`,
|
||||||
|
`AUTHOR_PUBKEY_HEX`, `BOOTSTRAP_RELAY` bereits stehen.
|
||||||
|
- **Blossom-only**: keine rsync/SSH-Altlasten mehr; alle Bilder (auch
|
||||||
|
die der 17 Altposts) werden zu Blossom hochgeladen.
|
||||||
|
- **Staging:** `staging.joerg-lohrer.de` zeigt auf `/www/htdocs/v109928/joerglohrer26/`.
|
||||||
|
Wird erst beim Cutover relevant — Pipeline selbst braucht es nicht.
|
||||||
|
|
||||||
|
**Vorarbeiten (bereits erledigt):**
|
||||||
|
- ✅ SSH-Zugang All-Inkl (Premium): `ssh-v109928@v109928.kasserver.com`
|
||||||
|
mit Deploy-Key `~/.ssh/id_ed25519_joerglohrerde_deploy` (auch im KAS
|
||||||
|
eingetragen). Wird jetzt allerdings nicht mehr für die Pipeline
|
||||||
|
gebraucht — Blossom-only.
|
||||||
|
- ✅ `.env.local` enthält alle Pipeline-Keys.
|
||||||
|
- ✅ Content-Migration (18 Posts × Bild-Metadaten) abgeschlossen.
|
||||||
|
|
||||||
### Option 2 — Menü-Navigation + Impressum auf der SPA
|
### Option 2 — Menü-Navigation + Impressum auf der SPA
|
||||||
|
|
||||||
|
|
@ -51,28 +65,29 @@ mit dem Publish-Spec als Input.
|
||||||
- `/impressum/`-Route anlegen mit rechtlichem Text
|
- `/impressum/`-Route anlegen mit rechtlichem Text
|
||||||
- ggf. Archives-Route als eigene Liste mit Gruppierung nach Jahr
|
- ggf. Archives-Route als eigene Liste mit Gruppierung nach Jahr
|
||||||
|
|
||||||
**Aufwand:** ~30-60 min je nach Layout-Wunsch. Kein Spec-Update nötig,
|
**Aufwand:** ~30-60 min.
|
||||||
ist in SPA-Spec §2 bereits als Ziel erwähnt.
|
|
||||||
|
|
||||||
### Option 3 — Cutover auf Hauptdomain
|
### Option 3 — Cutover auf Hauptdomain
|
||||||
|
|
||||||
**Warum:** `joerg-lohrer.de` liefert aktuell noch Hugo aus. Sobald genug
|
**Voraussetzung:** Option 1 abgeschlossen und alle 18 Posts als Events
|
||||||
Altposts als Events publiziert sind und die Publish-Pipeline läuft, kann die
|
publiziert, Bilder auf Blossom.
|
||||||
SvelteKit-SPA auf die Hauptdomain umziehen. Das ist aber **kein Task jetzt**
|
|
||||||
— muss auf Publish-Pipeline warten, sonst brechen Backlinks zu Posts, die
|
|
||||||
noch nicht als Events existieren.
|
|
||||||
|
|
||||||
**Reihenfolge:** Option 1 → Publish-Pipeline + einmaliger Massen-Import der
|
**Dann:** KAS → Domain `joerg-lohrer.de` auf den SvelteKit-Webroot
|
||||||
übrigen 17 Altposts → dann Option 3.
|
umhängen (derselbe wie `svelte.joerg-lohrer.de` oder `joerglohrer26/`,
|
||||||
|
je nach Entscheidung).
|
||||||
|
|
||||||
|
Reihenfolge: **Option 1 → Option 3**, Option 2 kann parallel laufen.
|
||||||
|
|
||||||
## Schnell-Orientierung für die nächste Claude-Session
|
## Schnell-Orientierung für die nächste Claude-Session
|
||||||
|
|
||||||
Lies in dieser Reihenfolge:
|
Lies in dieser Reihenfolge:
|
||||||
1. `docs/STATUS.md` (5 min)
|
1. `docs/STATUS.md` (5 min)
|
||||||
2. `docs/HANDOFF.md` (= dieses Dokument)
|
2. `docs/HANDOFF.md` (= dieses Dokument)
|
||||||
3. Die relevante Spec, je nachdem was drankommt:
|
3. Für die Pipeline: `docs/superpowers/plans/2026-04-16-publish-pipeline.md`
|
||||||
|
4. Bei Design-Fragen:
|
||||||
- Publish-Pipeline: `docs/superpowers/specs/2026-04-15-publish-pipeline-design.md`
|
- Publish-Pipeline: `docs/superpowers/specs/2026-04-15-publish-pipeline-design.md`
|
||||||
- SPA-Anpassungen: `docs/superpowers/specs/2026-04-15-nostr-page-design.md`
|
- Bild-Metadaten: `docs/superpowers/specs/2026-04-16-image-metadata-convention.md`
|
||||||
|
- SPA: `docs/superpowers/specs/2026-04-15-nostr-page-design.md`
|
||||||
|
|
||||||
Nutze den Skill unter `.claude/skills/joerglohrerde-workflow.md` für
|
Nutze den Skill unter `.claude/skills/joerglohrerde-workflow.md` für
|
||||||
wiederkehrende Kommandos.
|
wiederkehrende Kommandos.
|
||||||
|
|
@ -80,50 +95,41 @@ wiederkehrende Kommandos.
|
||||||
## Dev-Kommandos
|
## Dev-Kommandos
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Unit-Tests (Vitest)
|
# Unit-Tests SPA (Vitest)
|
||||||
cd app && npm run test:unit
|
cd app && npm run test:unit
|
||||||
|
|
||||||
# E2E-Tests (Playwright)
|
# E2E-Tests SPA (Playwright)
|
||||||
cd app && npm run test:e2e
|
cd app && npm run test:e2e
|
||||||
|
|
||||||
# Type-Check
|
# Type-Check SPA
|
||||||
cd app && npm run check
|
cd app && npm run check
|
||||||
|
|
||||||
# Dev-Server (Port 5173)
|
# SPA-Dev-Server (Port 5173)
|
||||||
cd app && npm run dev
|
cd app && npm run dev
|
||||||
|
|
||||||
# Production-Build + Deploy
|
# SPA-Production-Build + Deploy
|
||||||
cd app && npm run build && cd .. && ./scripts/deploy-svelte.sh
|
cd app && npm run build && cd .. && ./scripts/deploy-svelte.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
## Manuelles Publishen (bis Publish-Pipeline fertig ist)
|
Publish-Pipeline-Kommandos (sobald implementiert):
|
||||||
|
|
||||||
Einen Post aus `content/posts/<ordner>/index.md` als kind:30023-Event
|
|
||||||
publizieren:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Body ohne Frontmatter extrahieren
|
cd publish && deno task check # Pre-Flight
|
||||||
awk 'BEGIN{in_fm=0; past_fm=0} NR==1 && /^---$/ {in_fm=1; next} in_fm && /^---$/ {in_fm=0; past_fm=1; next} past_fm {print}' content/posts/<ordner>/index.md > /tmp/body.md
|
cd publish && deno task publish --dry-run # Simulation
|
||||||
|
cd publish && deno task publish --post <slug> # einen Post
|
||||||
# Bunker-URL aus .env.local
|
cd publish && deno task publish --force-all # alle Posts
|
||||||
BUNKER_URL=$(grep -E '^BUNKER_URL=' .env.local | sed 's/^BUNKER_URL=//')
|
cd publish && deno task test # Tests
|
||||||
|
|
||||||
# Event bauen, signieren, zu Relays pushen
|
|
||||||
# (Tags: d, title, summary, image, published_at, t×n)
|
|
||||||
# Siehe "dezentrale-oep-oer"-Beispiel in der Brainstorm-Historie
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Für Bilder: Upload zu Blossom mit `nak blossom upload`:
|
## Manuelles Publishen (Übergang, bis Pipeline fertig)
|
||||||
```sh
|
|
||||||
nak blossom upload --server https://blossom.edufeed.org --sec "$BUNKER_URL" <bild>
|
Siehe frühere Version dieses Dokuments. Bis die Pipeline läuft, gehen
|
||||||
```
|
neue Posts manuell über `nak event` raus.
|
||||||
|
|
||||||
## Bekannte Stolperfallen
|
## Bekannte Stolperfallen
|
||||||
|
|
||||||
- **Amber-Bunker:** bei neuer Bunker-URL müssen globale Permissions in Amber
|
- **Amber-Bunker:** bei neuer Bunker-URL müssen globale Permissions in Amber
|
||||||
zurückgesetzt werden, sonst hängt `nak` auf den Signatur-Request.
|
zurückgesetzt werden, sonst hängt `nak` auf den Signatur-Request.
|
||||||
- **All-Inkl FTPS:** bricht mit TLS 1.3 die Data-Connection ab. Script
|
Auto-Approve für `kind:30023` und `kind:24242` (Blossom-Auth) setzen.
|
||||||
nutzt `--tls-max 1.2`. Bei SSH-Umstellung: rsync fixen, TLS-Flag raus.
|
|
||||||
- **Svelte 5 Runes:** `$props()`-Werte müssen via `$derived()` in lokale
|
- **Svelte 5 Runes:** `$props()`-Werte müssen via `$derived()` in lokale
|
||||||
Variablen, sonst `state_referenced_locally`-Warning.
|
Variablen, sonst `state_referenced_locally`-Warning.
|
||||||
- **applesauce-relay API:** ist RxJS-basiert. `pool.request(relays, filter)`
|
- **applesauce-relay API:** ist RxJS-basiert. `pool.request(relays, filter)`
|
||||||
|
|
@ -131,10 +137,36 @@ nak blossom upload --server https://blossom.edufeed.org --sec "$BUNKER_URL" <bil
|
||||||
if msg[0]==='EVENT'})`-Form).
|
if msg[0]==='EVENT'})`-Form).
|
||||||
- **Slug-Normalisierung:** alle Frontmatter-Slugs sind lowercase (Commit
|
- **Slug-Normalisierung:** alle Frontmatter-Slugs sind lowercase (Commit
|
||||||
`d17410f`). Beim Publishen 1:1 übernehmen, keine Runtime-Transformation.
|
`d17410f`). Beim Publishen 1:1 übernehmen, keine Runtime-Transformation.
|
||||||
|
- **Dateiname mit Leerzeichen:** im Moodle-Post liegt `03-config generieren.png`.
|
||||||
|
Pipeline muss URL-Encoding im `rewriteImageUrls`-Helper korrekt umsetzen
|
||||||
|
(Test ist im Plan Task 5 vorgesehen).
|
||||||
|
|
||||||
## Session-Kontext
|
## Session-Kontext
|
||||||
|
|
||||||
Hilfreich beim Wiedereinstieg mit Claude:
|
Hilfreich beim Wiedereinstieg mit Claude:
|
||||||
- Branch-Check: `git log --oneline -10 spa main hugo-archive`
|
- Branch-Check: `git log --oneline -10 spa main hugo-archive`
|
||||||
- Live-Check: `curl -sI https://svelte.joerg-lohrer.de/`
|
- Live-Check: `curl -sI https://svelte.joerg-lohrer.de/`
|
||||||
- Publish-Status: `nak req -k 30023 -a 4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41 wss://relay.damus.io 2>/dev/null | jq -c '{d: (.tags[] | select(.[0]=="d") | .[1]), title: (.tags[] | select(.[0]=="title") | .[1])}'`
|
- Publish-Status: `nak req -k 30023 -a 4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41 wss://relay.damus.io 2>/dev/null | jq -s 'length'`
|
||||||
|
(aktuell ~10, nach Pipeline-Lauf `--force-all`: 18)
|
||||||
|
|
||||||
|
## Offene UNKNOWN-Einträge zur späteren Recherche
|
||||||
|
|
||||||
|
Im VR-Post (`content/posts/2021-08-15-virtual-reality/index.md`)
|
||||||
|
sind 4 Bilder als `license: UNKNOWN / authors: UNKNOWN` markiert:
|
||||||
|
- `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)
|
||||||
|
|
||||||
|
Pipeline loggt beim Publishen eine Warnung pro UNKNOWN, publisht aber
|
||||||
|
trotzdem (Phase-1-Default: `STRICT_MODE=false`). Die Recherche-Todo-Liste
|
||||||
|
steht in `docs/redaktion-bild-metadaten.md`.
|
||||||
|
|
||||||
|
## Community-Wiki-Entwürfe
|
||||||
|
|
||||||
|
Noch nicht extern veröffentlicht, liegen im Repo bereit:
|
||||||
|
- `docs/wiki-entwurf-nostr-bild-metadaten.md` — DE
|
||||||
|
- `docs/wiki-draft-nostr-image-metadata.md` — EN
|
||||||
|
|
||||||
|
Können in die Nostr-Community eingebracht werden (z. B. als NIP-Proposal
|
||||||
|
oder auf nostrbook.dev), sobald die Pipeline sie in der Praxis validiert.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# Projekt-Status: joerg-lohrer.de → Nostr-basierte SPA
|
# Projekt-Status: joerg-lohrer.de → Nostr-basierte SPA
|
||||||
|
|
||||||
**Stand:** 2026-04-15
|
**Stand:** 2026-04-16
|
||||||
|
|
||||||
## Kurzfassung
|
## Kurzfassung
|
||||||
|
|
||||||
|
|
@ -9,13 +9,14 @@ Site-Generator zu einer dezentralen Nostr-basierten SPA überführt. Posts
|
||||||
existieren als signierte Events (NIP-23, `kind:30023`) auf Public-Relays und
|
existieren als signierte Events (NIP-23, `kind:30023`) auf Public-Relays und
|
||||||
werden zur Laufzeit im Browser gerendert.
|
werden zur Laufzeit im Browser gerendert.
|
||||||
|
|
||||||
## Drei parallele Webseiten
|
## Vier parallele Webseiten
|
||||||
|
|
||||||
| URL | Status | Rolle |
|
| URL | Status | Rolle |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `https://joerg-lohrer.de/` | live, unverändert | **Hugo-Altbestand** (wird noch nicht ersetzt) |
|
| `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, ~250 Zeilen HTML+JS) |
|
| `https://spa.joerg-lohrer.de/` | live | **Vanilla-HTML-Mini-Spike** (Proof of Concept) |
|
||||||
| `https://svelte.joerg-lohrer.de/` | live | **SvelteKit-SPA** (35-Task-Plan komplett) |
|
| `https://svelte.joerg-lohrer.de/` | live | **SvelteKit-SPA** (35-Task-Plan komplett) |
|
||||||
|
| `https://staging.joerg-lohrer.de/` | live, leer | **Staging** (Webroot `joerglohrer26/` für Pipeline-Entwicklung; FTP-Creds in `.env.local`) |
|
||||||
|
|
||||||
Die SvelteKit-SPA unter `svelte.joerg-lohrer.de` ist die Ziel-Implementierung.
|
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,
|
`spa.joerg-lohrer.de` bleibt als schlanke Referenz erhalten. Hugo läuft weiter,
|
||||||
|
|
@ -25,81 +26,104 @@ bis die Publish-Pipeline steht und der Cutover auf die Hauptdomain erfolgt.
|
||||||
|
|
||||||
- **Autoren-Pubkey:** `npub1f7jar3qnu269uyx5p0e4v24hqxjnxysxudvujza2ur5ehltvdeqsly2fx9`
|
- **Autoren-Pubkey:** `npub1f7jar3qnu269uyx5p0e4v24hqxjnxysxudvujza2ur5ehltvdeqsly2fx9`
|
||||||
(hex: `4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41`)
|
(hex: `4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41`)
|
||||||
- **Publizierte Events:** ~10 Langform-Posts (`kind:30023`), darunter
|
- **Publizierte Events:** ~10 Langform-Posts (`kind:30023`). Die restlichen
|
||||||
`dezentrale-oep-oer`, `offenheit-das-wesentliche`, `gleichnis-vom-saemann`,
|
8 Posts warten auf die Publish-Pipeline (Events werden beim ersten
|
||||||
`bibelfussball`, `dampfnudeln` u. a.
|
`deno task publish --force-all`-Lauf erzeugt).
|
||||||
- **Relay-Liste** (`kind:10002`): `relay.damus.io`, `nos.lol`,
|
- **Relay-Liste** (`kind:10002`): `relay.damus.io`, `nos.lol`,
|
||||||
`relay.primal.net`, `relay.tchncs.de`, `relay.edufeed.org`
|
`relay.primal.net`, `relay.tchncs.de`, `relay.edufeed.org`
|
||||||
- **Blossom-Server** (`kind:10063`): `blossom.edufeed.org`, `blossom.primal.net`
|
- **Blossom-Server** (`kind:10063`): `blossom.edufeed.org`, `blossom.primal.net`
|
||||||
|
|
||||||
Bilder des ersten „experimentell publizierten" Posts (`dezentrale-oep-oer`)
|
Bisher nur die Bilder des `dezentrale-oep-oer`-Posts auf Blossom. **Designentscheidung
|
||||||
liegen auf Blossom. Weitere 17 Altposts haben ihre Bilder noch unter dem
|
2026-04-16:** Alle Bilder (inkl. der 17 Altpost-Bilder) kommen via Publish-Pipeline
|
||||||
ursprünglichen Hugo-Permalink auf All-Inkl.
|
auf Blossom — kein rsync-Legacy-Pfad mehr, kein `image_source: legacy`-Flag.
|
||||||
|
Einheitlicher Render-Pfad in der SPA.
|
||||||
|
|
||||||
## Repo-Struktur
|
## Repo-Struktur
|
||||||
|
|
||||||
```
|
```
|
||||||
joerglohrerde/
|
joerglohrerde/
|
||||||
├── content/posts/ # Markdown-Quelle (18 Posts, wird vom Publish-Skript gelesen)
|
├── content/posts/ # 18 Markdown-Posts, alle mit structured images: im Frontmatter
|
||||||
├── app/ # SvelteKit-SPA (Ziel-Implementation)
|
├── app/ # SvelteKit-SPA (Ziel-Implementation)
|
||||||
├── preview/spa-mini/ # Vanilla-HTML-Mini-Spike (Referenz)
|
├── preview/spa-mini/ # Vanilla-HTML-Mini-Spike (Referenz)
|
||||||
|
├── publish/ # NOCH NICHT ANGELEGT — Publish-Pipeline (Task 1 aus Plan)
|
||||||
├── scripts/
|
├── scripts/
|
||||||
│ └── deploy-svelte.sh # FTPS-Deploy nach svelte.joerg-lohrer.de
|
│ └── deploy-svelte.sh # FTPS-Deploy nach svelte.joerg-lohrer.de
|
||||||
├── docs/
|
├── docs/
|
||||||
│ ├── STATUS.md # Dieses Dokument
|
│ ├── STATUS.md # Dieses Dokument
|
||||||
│ ├── HANDOFF.md # Wie man hier weitermacht
|
│ ├── HANDOFF.md # Wie man hier weitermacht
|
||||||
|
│ ├── 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
|
||||||
│ └── superpowers/
|
│ └── superpowers/
|
||||||
│ ├── specs/ # SPA-Spec + Publish-Pipeline-Spec
|
│ ├── specs/ # SPA + Publish-Pipeline + Bild-Metadaten-Konvention
|
||||||
│ └── plans/ # SPA-Implementation-Plan (35 Tasks, abgeschlossen)
|
│ └── plans/
|
||||||
|
│ ├── 2026-04-15-spa-sveltekit.md # erledigt
|
||||||
|
│ └── 2026-04-16-publish-pipeline.md # ⬅ als nächstes
|
||||||
├── .claude/
|
├── .claude/
|
||||||
│ ├── skills/ # Repo-spezifischer Claude-Skill
|
│ ├── skills/ # Repo-spezifischer Claude-Skill
|
||||||
│ └── settings.local.json # Claude-Session-State (nicht committen? aktuell schon)
|
│ └── settings.local.json # Claude-Session-State (gitignored)
|
||||||
└── .env.local # Gitignored: FTP-Creds + Bunker-URL
|
└── .env.local # Gitignored: FTP-Creds, Bunker-URL, Publish-Pipeline-Keys
|
||||||
```
|
```
|
||||||
|
|
||||||
## Branch-Layout (Git)
|
## Branch-Layout (Git)
|
||||||
|
|
||||||
- **`main`** — kanonischer Zweig. Enthält Content, Specs, Pläne, Deploy-Scripts,
|
- **`main`** — kanonischer Zweig.
|
||||||
`.claude/`-Skill. Schlanker als früher (kein Hugo-Artefakt mehr).
|
- **`spa`** — aktueller Arbeits-Branch, vor `main`. SvelteKit-SPA live,
|
||||||
- **`spa`** — aktueller Arbeits-Branch. SvelteKit-SPA in `app/` komplett
|
Content-Migration (Bild-Metadaten) abgeschlossen, Publish-Pipeline geplant.
|
||||||
implementiert und live. **Aktuell vor `main` mit allen `spa:`-Commits.**
|
- **`hugo-archive`** — Orphan-Branch mit Hugo-Zustand, eingefroren.
|
||||||
- **`hugo-archive`** — Orphan-Branch mit dem letzten funktionierenden
|
|
||||||
Hugo-Zustand, eingefroren. Rollback über `git checkout hugo-archive && hugo build`.
|
|
||||||
|
|
||||||
## Setup-Zustand
|
## Setup-Zustand
|
||||||
|
|
||||||
Einmalig manuell erledigt:
|
Einmalig manuell erledigt:
|
||||||
- ✅ Amber-Bunker-URL in `.env.local` als `BUNKER_URL`
|
- ✅ Amber-Bunker-URL in `.env.local` als `BUNKER_URL`
|
||||||
- ✅ SPA-FTP-Creds (`spa.joerg-lohrer.de`) in `.env.local` als `SPA_FTP_*`
|
- ✅ FTP-Creds für alle Subdomains (SPA, SVELTE, STAGING) in `.env.local`
|
||||||
- ✅ SvelteKit-FTP-Creds (`svelte.joerg-lohrer.de`) in `.env.local` als `SVELTE_FTP_*`
|
- ✅ `AUTHOR_PUBKEY_HEX` und `BOOTSTRAP_RELAY=wss://relay.primal.net` in `.env.local`
|
||||||
- ✅ `kind:10002`-Event publiziert
|
- ✅ `kind:10002`-Event publiziert (Relay-Liste)
|
||||||
- ✅ `kind:10063`-Event publiziert
|
- ✅ `kind:10063`-Event publiziert (Blossom-Server)
|
||||||
- ✅ Subdomains mit TLS + HSTS (`max-age=300`)
|
- ✅ Subdomains mit TLS + HSTS
|
||||||
|
- ✅ Staging-Subdomain `staging.joerg-lohrer.de` → Webroot `joerglohrer26/`
|
||||||
|
|
||||||
Alles in `.env.local` — gitignored, nicht committet.
|
Alles in `.env.local` — gitignored, nicht committet.
|
||||||
|
|
||||||
## Offene Punkte / Nicht-in-Scope
|
## Offene Punkte
|
||||||
|
|
||||||
- **Publish-Pipeline** (Spec vorhanden unter `docs/superpowers/specs/2026-04-15-publish-pipeline-design.md`, Plan noch nicht geschrieben)
|
- **Publish-Pipeline** — Spec + Plan vollständig, **Implementierung steht an**
|
||||||
|
(Task 1 aus `docs/superpowers/plans/2026-04-16-publish-pipeline.md`).
|
||||||
- **Menü-Navigation** in der SPA (Home / Archiv / Impressum / Kontakt)
|
- **Menü-Navigation** in der SPA (Home / Archiv / Impressum / Kontakt)
|
||||||
- **Impressum-Seite** (braucht rechtlichen Text)
|
- **Impressum-Seite** (braucht rechtlichen Text)
|
||||||
- **Meta-Stubs für Social-Previews und SEO** (wird Teil der Publish-Pipeline)
|
- **Cutover auf `joerg-lohrer.de`** (nach Pipeline-Live: Hauptdomain
|
||||||
- **SSH-Zugang zu All-Inkl** (laut Notiz von Jörg: Premium-Tarif im Kommen → rsync statt FTPS möglich)
|
bekommt die SvelteKit-SPA)
|
||||||
- **Cutover auf `joerg-lohrer.de`** (Hauptdomain bekommt dann die SvelteKit-SPA)
|
|
||||||
|
## 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`.
|
||||||
|
- ✅ Erlebnispädagogik-Post: tote Amazon-Hotlinks entfernt, Literatur-
|
||||||
|
Liste aufgeräumt.
|
||||||
|
- ✅ Design-Entscheidung „Blossom-only" dokumentiert in Spec
|
||||||
|
`docs/superpowers/specs/2026-04-15-publish-pipeline-design.md`.
|
||||||
|
- ✅ Publish-Pipeline-Plan (24 Tasks, Blaupausen-tauglich) geschrieben:
|
||||||
|
`docs/superpowers/plans/2026-04-16-publish-pipeline.md`.
|
||||||
|
- ✅ Bild-Metadaten-Konvention (Phase 1) in Spec:
|
||||||
|
`docs/superpowers/specs/2026-04-16-image-metadata-convention.md`.
|
||||||
|
- ✅ Community-Wiki-Entwürfe (DE + EN) für Nostr-Bildattribution:
|
||||||
|
`docs/wiki-entwurf-nostr-bild-metadaten.md` + `-draft-nostr-image-metadata.md`.
|
||||||
|
- ✅ 5 `UNKNOWN`-Einträge im VR-Post zur Recherche markiert (bleiben erstmal so).
|
||||||
|
|
||||||
## Live-Verifikation
|
## Live-Verifikation
|
||||||
|
|
||||||
Jederzeit:
|
|
||||||
```sh
|
```sh
|
||||||
curl -sI https://svelte.joerg-lohrer.de/ | head -3
|
curl -sI https://svelte.joerg-lohrer.de/ | head -3
|
||||||
curl -sI https://spa.joerg-lohrer.de/ | head -3
|
curl -sI https://staging.joerg-lohrer.de/ | head -3
|
||||||
```
|
```
|
||||||
|
|
||||||
## Kontakt zur Implementierung
|
## Kontakt zur Implementierung
|
||||||
|
|
||||||
Alle Design-Entscheidungen in:
|
Alle Design-Entscheidungen in:
|
||||||
- `docs/superpowers/specs/2026-04-15-nostr-page-design.md` (SPA)
|
- `docs/superpowers/specs/2026-04-15-nostr-page-design.md` (SPA)
|
||||||
- `docs/superpowers/specs/2026-04-15-publish-pipeline-design.md` (Publish)
|
- `docs/superpowers/specs/2026-04-15-publish-pipeline-design.md` (Publish, Blossom-only)
|
||||||
- `docs/superpowers/plans/2026-04-15-spa-sveltekit.md` (35-Task-Plan, abgeschlossen)
|
- `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)
|
||||||
|
|
||||||
Für die nächste Session: `docs/HANDOFF.md` lesen.
|
Für die nächste Session: **`docs/HANDOFF.md`** lesen.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue