From 0679a335f4dcf9dd121efb543bf5403505f2756f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lohrer?= Date: Wed, 15 Apr 2026 13:53:16 +0200 Subject: [PATCH] =?UTF-8?q?spike(spa-mini):=20vanilla-html=20viewer=20f?= =?UTF-8?q?=C3=BCr=20einen=20einzelnen=20nostr-post?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tech-Spike unter preview/spa-mini/ — eine index.html, lädt nostr-tools/marked/DOMPurify von esm.sh, holt das kind:30023-Event mit dtag dezentrale-oep-oer von 5 public-relays, rendert clientseitig. Beweist, dass die SPA-Architektur in der Praxis funktioniert, ohne SvelteKit-Build-Pipeline. Inhalt: - index.html mit Loader, Renderer, Fehler-Handling - .htaccess mit SPA-Fallback (relevant sobald gehostet) - README mit Anleitung lokal/Deploy .gitignore um .env*, logs/ ergänzt (für späteren Pipeline-Bedarf). Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitignore | 5 +- preview/spa-mini/.htaccess | 13 ++ preview/spa-mini/README.md | 58 ++++++++ preview/spa-mini/index.html | 267 ++++++++++++++++++++++++++++++++++++ 4 files changed, 342 insertions(+), 1 deletion(-) create mode 100644 preview/spa-mini/.htaccess create mode 100644 preview/spa-mini/README.md create mode 100644 preview/spa-mini/index.html diff --git a/.gitignore b/.gitignore index 6a3e68d..51dbf89 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ -**/.DS_Store \ No newline at end of file +**/.DS_Store +.env +.env.local +logs/ diff --git a/preview/spa-mini/.htaccess b/preview/spa-mini/.htaccess new file mode 100644 index 0000000..3dc45e7 --- /dev/null +++ b/preview/spa-mini/.htaccess @@ -0,0 +1,13 @@ +RewriteEngine On + +# HTTPS forcieren (relevant sobald Zertifikat aktiv) +RewriteCond %{HTTPS} !=on +RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Existierende Datei oder Verzeichnis? Direkt ausliefern. +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Alles andere → SPA-Fallback (für die Mini-Seite optional, aber harmlos). +RewriteRule ^ /index.html [L] diff --git a/preview/spa-mini/README.md b/preview/spa-mini/README.md new file mode 100644 index 0000000..c610842 --- /dev/null +++ b/preview/spa-mini/README.md @@ -0,0 +1,58 @@ +# SPA Mini-Preview + +**Tech-Spike, kein Produkt.** + +Eine einzige `index.html`, die im Browser einen einzelnen Nostr-Post (`kind:30023`) +live von Public-Relays lädt und rendert. Beweist, dass die SPA-Architektur +aus [`docs/superpowers/specs/2026-04-15-nostr-page-design.md`](../../docs/superpowers/specs/2026-04-15-nostr-page-design.md) +in der Praxis funktioniert — ohne SvelteKit-Build, ohne Routing, ohne Backend. + +## Was sie macht + +- Lädt `nostr-tools`, `marked` und `DOMPurify` zur Laufzeit von esm.sh. +- Verbindet sich zu fünf Public-Relays. +- Holt das `kind:30023`-Event mit `d`-Tag `dezentrale-oep-oer` für den hartcodierten Pubkey. +- Rendert Markdown via `marked`, sanitized via `DOMPurify`. +- Cover-Bild wird vom Blossom-Server geladen (URL aus dem Event-Tag `image`). + +## Was sie nicht macht + +- Kein Routing, keine Post-Liste, keine Tags-Navigation, keine Reactions, keine Kommentare. +- Kein NIP-65-Outbox-Resolution (Relays sind hartcodiert). +- Kein NIP-07-Login. +- Kein Code-Splitting, keine Service-Worker, keine Optimierung. + +Für all das wartet die echte SvelteKit-SPA — das hier ist nur das „Hello World". + +## Lokal ausprobieren + +Die Datei kann nicht per `file://` geöffnet werden (CORS für CDN-Imports). +Stattdessen ein lokaler HTTP-Server: + +```sh +cd preview/spa-mini +python3 -m http.server 8000 +# Browser: http://localhost:8000/ +``` + +Oder mit Deno: + +```sh +deno run --allow-net --allow-read jsr:@std/http/file-server preview/spa-mini +``` + +## Auf die Subdomain `spa.joerg-lohrer.de` deployen + +Voraussetzung: Subdomain im All-Inkl-KAS angelegt, eigener DocumentRoot eingerichtet, +SSL-Zertifikat aktiviert. + +Inhalt von `preview/spa-mini/` (also `index.html` und `.htaccess`) per FTP +in den DocumentRoot der Subdomain hochladen. + +Erwartetes Ergebnis: `https://spa.joerg-lohrer.de/` zeigt den Post. + +## Spätere Ablösung + +Sobald die SvelteKit-SPA fertig ist, wird ihr `build/`-Output denselben Webroot +ablösen. Diese Mini-Seite kann dann gelöscht oder als historisches Artefakt +im Repo bleiben. diff --git a/preview/spa-mini/index.html b/preview/spa-mini/index.html new file mode 100644 index 0000000..594a618 --- /dev/null +++ b/preview/spa-mini/index.html @@ -0,0 +1,267 @@ + + + + + + Jörg Lohrer — Nostr SPA Mini-Preview + + + + +
+ + +
+

Lade Post von Nostr-Relays …

+
+ +
+ Eigenständig signiertes kind:30023-Event (NIP-23), + geladen über nostr-tools via WebSocket aus mehreren Relays. + Markdown-Rendering: marked + DOMPurify. + Bild via Blossom-Server. Kein Server-Backend, nur statisches HTML + plus JavaScript im Browser. +
+
+ + + +