Go to file
Jörg Lohrer f6824019c8 feat(deploy): snapshot vor svelte-build im deploy-skript
Damit DEPLOY_TARGET=svelte/staging/prod immer mit aktuellem
snapshot/output baut. Ohne diesen step wuerde ein veralteter
snapshot ins HTML wandern, frische posts oder uebersetzungen
saessen erst beim naechsten deploy drin.

Schlaegt der snapshot fehl (relays down, env fehlt), bricht das
skript ab — bewusst hard-fail, damit kein verfaelschter build
hochgeladen wird.

Live-verifiziert auf https://svelte.joerg-lohrer.de/bibel-selfies/:
- HTTP 200, og-tags + hreflang + json-ld korrekt
- __SITE_URL__-substitution greift sauber
- <title>, og:title, json-ld stimmen mit snapshot ueberein

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 08:55:53 +02:00
.claude docs: status/handoff/readme/claude.md auf multilingual-stand 2026-04-21 16:31:16 +02:00
.github/workflows ci: snapshot-step nach publish + output als artifact 2026-04-28 08:37:59 +02:00
app fix(spa): prerender-build laeuft + meta/json-ld korrekt 2026-04-28 08:50:27 +02:00
content feat(content): erste englische übersetzung (bible-selfies) + bidirektionaler a-tag 2026-04-21 12:53:59 +02:00
docs docs: plan-korrektur — svelte:head muss top-level stehen 2026-04-28 08:42:07 +02:00
preview/spa-mini spike(spa-mini): legacy-hugo-urls auf kurze form normalisieren 2026-04-15 14:44:25 +02:00
publish fix(publish): changedPostDirs gibt pfade mit original-contentRoot zurück 2026-04-21 10:18:20 +02:00
scripts feat(deploy): snapshot vor svelte-build im deploy-skript 2026-04-28 08:55:53 +02:00
snapshot fix(spa): prerender-build laeuft + meta/json-ld korrekt 2026-04-28 08:50:27 +02:00
static comment integration ohne styling 2025-02-12 19:43:36 +01:00
.gitignore spike(spa-mini): vanilla-html viewer für einen einzelnen nostr-post 2026-04-15 13:53:16 +02:00
CLAUDE.md docs: top-level-rollen geklaert + status-stempel 2026-04-28 07:30:44 +02:00
LICENSE Initial commit 2024-11-06 15:55:54 +01:00
README.md docs: top-level-rollen geklaert + status-stempel 2026-04-28 07:30:44 +02:00

README.md

joerg-lohrer.de

Rolle dieses Dokuments: Außensicht — was ist das Repo, wie funktioniert es grob, wo geht's weiter. Für interne Arbeit siehe docs/STATUS.md (Logbuch) und docs/HANDOFF.md (Konventionen, Workflows).

Persönliche Webseite. Nach einer Transition von einer Hugo-basierten, statischen Seite läuft joerg-lohrer.de jetzt als SvelteKit-SPA, die Blog-Posts live aus signierten Nostr-Events (NIP-23, kind:30023) rendert.

Aktueller Stand

  • https://joerg-lohrer.de/ — SvelteKit-SPA, seit 2026-04-18 live. Seit 2026-04-21 multilingual (Deutsch + Englisch via NIP-32 l-Tag und NIP-33-a-Tag-Verlinkung).
  • https://staging.joerg-lohrer.de/ — Staging (gleicher Build, ein Schritt vor Prod).
  • https://svelte.joerg-lohrer.de/ — Entwicklungs-Deploy-Target der Pipeline.
  • https://spa.joerg-lohrer.de/ — Vanilla-HTML-Mini-Spike (Proof of Concept, historisch).

Detailliert in docs/STATUS.md.

Wie die Seite funktioniert

  1. Inhalte liegen als Markdown in content/posts/<lang>/<slug>/index.md (z. B. content/posts/de/<slug>/ oder content/posts/en/<slug>/) mit strukturierten Bild-Metadaten im Frontmatter (Alt-Text, Lizenz, Autor:innen). Übersetzungen eines Posts werden über bidirektionale a:-Tags im Frontmatter verlinkt — Details in docs/superpowers/specs/2026-04-21-multilingual-posts-design.md.
  2. Publish-Pipeline (publish/, Deno) lädt Bilder auf Blossom-Server (content-addressed) und publiziert signierte kind:30023-Events via NIP-46-Bunker (Amber) auf 5 Relays — inkl. NIP-32 l-Tag (Sprache) und NIP-33 a-Tag (Verlinkung zu anderssprachigen Varianten).
  3. SvelteKit-SPA (app/) lädt diese Events zur Laufzeit und rendert Post-Liste + Detailseiten. UI-Chrome via svelte-i18n (DE/EN), Browser- Locale als Default, Listen nach aktivem Locale gefiltert. Keine Server-Komponente, Static-Hosting reicht.
  4. CI: GitHub Actions triggert die Publish-Pipeline bei Push auf main (via Forgejo→GitHub Push-Mirror).

Identität und Assets:

  • Pubkey: npub1f7jar3qnu269uyx5p0e4v24hqxjnxysxudvujza2ur5ehltvdeqsly2fx9
  • NIP-05: joerglohrer@joerg-lohrer.de (statisches .well-known/nostr.json)
  • Blossom-Server: blossom.edufeed.org, blossom.primal.net
  • Relays: relay.damus.io, nos.lol, relay.primal.net, relay.tchncs.de, relay.edufeed.org

Navigation

Branches

  • main — kanonisch. Seit Cutover (2026-04-18) Produktions-Quelle.
  • spa — historischer SvelteKit-Arbeitszweig, inzwischen gemerged.
  • hugo-archive — eingefrorener Hugo-Zustand als Orphan-Branch. Rollback-Option über git checkout hugo-archive && hugo build.

Repo-Struktur

content/posts/<lang>/<slug>/    Markdown-Posts pro Sprache (26× de, 1× en)
content/impressum.md            Statisches Impressum (wird von SPA geladen)
app/                            SvelteKit-SPA (Laufzeit-Renderer)
  src/lib/i18n/                 UI-Lokalisierung (svelte-i18n + Messages)
  src/lib/nostr/                Relay-Loader, Translations-Resolving
publish/                        Deno-Publish-Pipeline (Blossom + Nostr)
preview/spa-mini/               Vanilla-HTML-Mini-Spike (historische Referenz)
scripts/deploy-svelte.sh        FTPS-Deploy, Targets: svelte/staging/prod
static/                         Site-Assets (Favicons, Profilbild, .well-known/)
docs/                           Specs, Pläne, Status, Handoff, Wiki-Entwürfe
.github/workflows/              GitHub-Actions CI (Publish-Pipeline-Trigger)
.claude/                        Claude-Code-Sessions (Transparenz) + Skills
CLAUDE.md                       Einstiegspunkt für Claude-Sessions

Entwicklung

# SPA lokal
cd app && npm run dev

# SPA testen
cd app && npm run test:unit
cd app && npm run test:e2e
cd app && npm run check

# Publish-Pipeline
cd publish && deno task check                    # pre-flight
cd publish && deno task publish --dry-run        # Simulation
cd publish && deno task publish                  # diff-modus echt
cd publish && deno task publish --post <slug>    # ein Post
cd publish && deno task test                     # Tests

# Deploy
DEPLOY_TARGET=staging ./scripts/deploy-svelte.sh
DEPLOY_TARGET=prod ./scripts/deploy-svelte.sh

Lizenz

Inhalte: CC0 1.0 Universal (Namensnennung erwünscht, aber rechtlich nicht erforderlich), sofern nicht anders vermerkt. Drittinhalte sind beim jeweiligen Bild mit Autor:innen und Lizenz gekennzeichnet.

Code: siehe LICENSE.