diff --git a/.github/workflows/nostr-sync.yml b/.github/workflows/nostr-sync.yml new file mode 100644 index 0000000..7a2aeae --- /dev/null +++ b/.github/workflows/nostr-sync.yml @@ -0,0 +1,85 @@ +name: Nostr Sync + +on: + push: + branches: [main] + paths: + - 'Website/content/**' + workflow_dispatch: + inputs: + force_all: + description: 'Publish all posts (--force-all)' + type: boolean + default: false + +jobs: + sync: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout content repo + uses: actions/checkout@v6 + with: + fetch-depth: 0 + path: content-repo + + - name: Checkout mdparser + uses: actions/checkout@v6 + with: + repository: edufeed-org/mdparser + ref: main + path: mdparser + + - name: Setup Deno + uses: denoland/setup-deno@v2 + with: + deno-version: v2.x + + - name: Pre-Flight Check + working-directory: mdparser/sync + env: + BUNKER_URL: ${{ secrets.BUNKER_URL }} + AUTHOR_PUBKEY_HEX: ${{ secrets.AUTHOR_PUBKEY_HEX }} + CLIENT_SECRET_HEX: ${{ secrets.CLIENT_SECRET_HEX }} + run: deno run --allow-env --allow-net --allow-read cli.ts check + + - name: Publish (force-all) + if: ${{ github.event.inputs.force_all == 'true' }} + working-directory: mdparser/sync + env: + BUNKER_URL: ${{ secrets.BUNKER_URL }} + AUTHOR_PUBKEY_HEX: ${{ secrets.AUTHOR_PUBKEY_HEX }} + CLIENT_SECRET_HEX: ${{ secrets.CLIENT_SECRET_HEX }} + MIN_RELAY_ACKS: '2' + CONTENT_ROOT: ${{ github.workspace }}/content-repo/Website/content + run: | + deno run \ + --allow-env --allow-read --allow-write=./logs \ + --allow-net --allow-run=git \ + cli.ts publish --force-all + + - name: Publish (diff) + if: ${{ github.event.inputs.force_all != 'true' }} + working-directory: mdparser/sync + env: + BUNKER_URL: ${{ secrets.BUNKER_URL }} + AUTHOR_PUBKEY_HEX: ${{ secrets.AUTHOR_PUBKEY_HEX }} + CLIENT_SECRET_HEX: ${{ secrets.CLIENT_SECRET_HEX }} + MIN_RELAY_ACKS: '2' + CONTENT_ROOT: ${{ github.workspace }}/content-repo/Website/content + GITHUB_EVENT_BEFORE: ${{ github.event.before }} + run: | + deno run \ + --allow-env --allow-read --allow-write=./logs \ + --allow-net --allow-run=git \ + cli.ts publish + + - name: Upload run log + if: always() + uses: actions/upload-artifact@v7 + with: + name: nostr-sync-log-${{ github.run_id }} + path: mdparser/sync/logs/publish-*.json + retention-days: 30 + if-no-files-found: warn diff --git a/.gitignore b/.gitignore index ec14cdd..1d348ce 100644 --- a/.gitignore +++ b/.gitignore @@ -44,4 +44,5 @@ logs # Build directories public -dist \ No newline at end of file +dist +.claude/settings.local.json diff --git a/.woodpecker/build_and_copy_website.yaml b/.woodpecker/build_and_copy_website.yaml index d3b9c09..6659041 100644 --- a/.woodpecker/build_and_copy_website.yaml +++ b/.woodpecker/build_and_copy_website.yaml @@ -12,7 +12,7 @@ steps: - date -I'seconds' - name: build_by_hugo - image: alpine:3.21 # hugomods/hugo # vs image: alpine >= 3.21, damit Hugo-Version >= 0.139 + image: alpine:3.23 # PaperMod (Stand 2026-05) braucht Hugo >= 0.146; alpine:3.23 liefert 0.152.2 commands: - date -I'seconds' - cat /etc/alpine-release @@ -26,7 +26,7 @@ steps: - if grep -E "Team vollständig" Website/PROD/index.html; then echo "Blog Teamseite"; else echo "Webseite Startseite"; fi - echo $? - - grep -E "Du hast sogar schon mal selbst Materialien erstellt oder arbeitest in einer Community" Website/PROD/index.html + - grep -E "Du hast sogar schon mal selbst Materialien erstellt" Website/PROD/index.html - name: copy_to_server image: alpine diff --git a/Communities/openreli/matrix-wordpress.md b/Communities/openreli/matrix-wordpress.md new file mode 100644 index 0000000..75ed310 --- /dev/null +++ b/Communities/openreli/matrix-wordpress.md @@ -0,0 +1,705 @@ +# Matrix Chat Widget – Dokumentation + +**Projekt:** Öffentliche Leseanzeige eines Matrix-Raums auf einer WordPress-Seite +**Homeserver:** `matrix.rpi-virtuell.de` +**Element-Client:** `element.rpi-virtuell.de` +**Raum-ID:** `!NQPmoqtLSjGzdtLaXO:rpi-virtuell.de` +**Stand:** März 2026 + +--- + +## Kontext und Problemlage + +Ziel war es, einen öffentlichen Matrix-Raum als Leseanzeige (kein Login für Besucher:innen erforderlich) in eine WordPress-Seite einzubetten. Dabei wurden folgende Wege geprüft und verworfen: + +**Matrix Public Archive / Matrix Viewer** – wurde eingestellt. + +**matrix-live (live.hello-matrix.net)** – funktioniert nur mit Homeservern, die Guest Access aktiviert haben. + +**Guest Access** – auf `matrix.rpi-virtuell.de` nicht aktiviert; auf `matrix.org` seit Januar 2025 abgeschaltet. + +**Element Web als iFrame** – `app.element.io` und die meisten selbst gehosteten Instanzen setzen `X-Frame-Options: DENY` und können nicht eingebettet werden. + +**Gewählte Lösung:** Ein eigenständiges HTML/JS-Widget, das direkt die Matrix Client-Server API abfragt. Voraussetzung ist ein dedizierter Bot-Account mit Lesezugriff, dessen Token fest im Widget hinterlegt ist. Das ist unkritisch, da der Token nur Lesezugriff auf einen öffentlichen Raum hat. + +--- + +## Voraussetzungen + +### 1. Raum auf „world_readable" setzen + +In Element: **Raumeinstellungen → Sicherheit & Datenschutz → „Wer kann den Verlauf lesen?" → „Jeder"** + +Ohne diese Einstellung antwortet die API mit HTTP 403. + +### 2. Bot-Account anlegen und Token holen + +Einen dedizierten Account (z. B. `@openrelibot:rpi-virtuell.de`) anlegen und einmalig per API einloggen: + +```bash +curl -X POST https://matrix.rpi-virtuell.de/_matrix/client/v3/login \ + -H "Content-Type: application/json" \ + -d '{"type":"m.login.password","user":"openrelibot","password":"PASSWORT"}' +``` + +Die Antwort enthält `access_token` – dieser wird im Widget als `TOKEN` eingetragen. + +> **Hinweis:** Da der Token in einem Chatprotokoll sichtbar war, sollte er bei nächster Gelegenheit rotiert werden (siehe Abschnitt Token-Rotation). + +--- + +## Einbindung in WordPress + +Gutenberg-Editor → Block **„Benutzerdefiniertes HTML"** → vollständigen Widget-Code einfügen → Speichern. + +Kein Plugin erforderlich. Der Code ist vollständig eigenständig (kein externes CDN, keine Abhängigkeiten). + +--- + +## Vollständiger Code + +```html + + +
+ OER-Bildnachweise nach der + TULLUBA-Regel + — mit Klartext, HTML, Markdown & JSON-LD +
+Mehrere Autor:innen möglich. Leere Zeilen werden ignoriert.
++ Pflicht bei CC BY / CC BY-SA: Urheber:in, Lizenzname und -link. Bei Bearbeitungen immer kenntlich machen (+B). +
+Für Impressum, Bildnachweis-Listen oder Alt-Text.
+HTML-Snippet zum Einfügen unter Bildern.
+Vorschau (gerendert):
+Für README-Dateien, Wiki-Seiten, Markdown-Dokumente.
+Vorschau (gerendert):
+ +Strukturierte Daten für SEO & maschinelle Auswertung.
++ FOERBICO bringt religionsbezogene Communities zusammen, die offene Bildungsmaterialien (OER) + erstellen, teilen und weiterentwickeln. Gemeinsame Qualitätskriterien, gemeinsame Metadaten — + damit das, was in einer Community entsteht, auch in den anderen ankommt. +
+
+ + in religionsbezogenen Communities durch die Entwicklung + eines koordinierten OER-Ökosystems. +
++ Du bist interessiert an offenen Materialien (OER — Open Educational Resources) für das Lernen und Lehren? + Du hast sogar schon mal selbst Materialien erstellt oder arbeitest in einer Community oder einem + Netzwerk an der Entwicklung von Bildungsmaterialien mit? +
++ Dann bist du bei FOERBICO genau richtig. Im Sinne einer Community of Communities zielt + FOERBICO auf die Vernetzung und den Austausch von verschiedenen religionsbezogenen Communities, + um gemeinsame Qualitätskriterien und Metadatenstandards zu entwickeln. +
++ So können die wertvoll erarbeiteten OER in verschiedene Materialpools eingepflegt und + anschlussfähig gemacht werden — um weiter verbreitet, weiterentwickelt und von mehr Leuten + verwendet zu werden. +
++ Werde Teil der Community of Communities. Wir treffen uns in einem offenen Element-Space — + niedrigschwellig, dezentral, ohne große Hürden. Komm dazu, hör rein, schreib mit. +
++ Unser Element/Matrix-Space ist offen für alle, die an offenen Bildungsmaterialien + im religionsbezogenen Kontext interessiert sind. +
+ ++ FOERBICO wird als Verbund von drei Institutionen umgesetzt: dem Comenius-Institut als Projektträger + und zwei religionspädagogischen Lehrstühlen für die wissenschaftliche Begleitung. Mehr zu den Personen + gibt es auf der Team-Seite. +
+
+ + Evangelische Arbeitsstätte für Erziehungswissenschaft. Verantwortet FOERBICO, + koordiniert Community-Aufbau und technische Umsetzung. +
+
+ + Professur für Religionspädagogik und Mediendidaktik. Forschung zu religiöser Bildung + und Mediendidaktik, Vernetzung in die Wissenschaft. +
+
+ + Lehrstuhl für Religionspädagogik und Didaktik des Evangelischen Religionsunterrichts. + Empirische Begleitforschung des Projekts. +
++ Live aus dem Relay-Netzwerk. Signiert via Nostr, verteilt über + relay-rpi.edufeed.org und + relay.primal.net. + Die folgende Ressource ist die zuletzt veröffentlichte Longform-Note. +
+Pipeline · Event-Kinds · Live-Statistik aus dem Relay-Netzwerk · für die Neugierigen.
++ Markdown ist die Quelle. Nostr-Events sind das Transport-Format. + Relays cachen, Clients rendern. Der Prozess ist deterministisch, + signiert und reproduzierbar — keine Plattform dazwischen. +
+Markdown mit YAML-Frontmatter. Dual-Block-Schema für Inhalt & Statik. Gespeichert in Forgejo.
+NIP-07-Browser-Extension oder nak-CLI. Schlüssel bleiben lokal, der Inhalt wird kryptographisch attestiert.
Publikation an mehrere Relays gleichzeitig. Kein Single-Point-of-Failure, jedes Relay ist eine vollständige Kopie.
+OERSI liest die kind:30142-AMB-Events ab. Diese Seite liest kind:30023 live aus dem Relay.
+ Jeder Inhalt bekommt eine maschinenlesbare Form. Vier Event-Kinds + bilden das aktive FOERBICO-Vokabular ab — von der Longform-Note bis + zum AMB-Metadatensatz. +
+Allgemeines Metadatenschema für Bildungsressourcen. FOERBICO-Kernformat.
+Markdown-Artikel mit Titel, Summary und Bild. Was du gerade liest.
+Kollaborativ editierbare Begriffe und Glossarseiten als versionierter Stream.
+Zeitbasierte Veranstaltungen wie Webinare, Tagungen, Sprechstunden.
++ Die folgenden Zahlen werden direkt aus den geladenen Events berechnet + — kein Server, keine Telemetrie. Wenn du die Seite neu lädst, kommen + die Daten frisch aus dem Relay. +
+
+
+
+
+ + FOERBICO wird von Mai 2024 bis Ende April 2027 vom + Bundesministerium für Bildung, Familie, Senioren, Frauen und Jugend (BMBFSFJ) + im Rahmen der OER-Strategie des Bundes gefördert. +
+Aufrufe pro Seite/Post · nur menschliche Besucher (Bots separat) · Quelle: Apache-Logs www + Apex
+Indexierter Zeitraum: 14.07.2025 – 13.05.2026 (304 Tage) · generiert am 13.05.2026 12:27
+ +| URL | +Aufrufe gesamt | +Besucher (IPs) | +letzte 7 Tage | +letzte 30 Tage | +letzte 90 Tage | +davon Bots | +Erster Hit | +Letzter Hit | +
|---|