xPulse
πŸ‡©πŸ‡ͺ DE

xpulse-web – Konzept & Strategie

Status: v2.0.0 Β· Repo: xpulse-web Begleitdokument: CONTENT_xpulse-web.md (Seiteninhalte) Aktualisiert April 2026


Ziel & Prinzip

xpulse.one ist die Plattform. Nicht nur eine Landing Page fΓΌr den Chat, sondern der gemeinsame Heimatort fΓΌr alle xPulse Tools, Komponenten und plattformweite Inhalte.

chat.xpulse.one ist das erste Tool. Weitere kΓΆnnen folgen.

Single Responsibility:

Die /info-Seite im Chat wird zu einem minimalen About-Screen (Version, One-Liner, Links nach xpulse.one) – keine eigenen Inhalte mehr.


URL-Struktur

/{slug} ← Plattform-weit (allgemein & rechtlich)
/doc/tool/{tool-slug}/ ← Tool-Dokumentation (via @xpulse/doc)
/doc/component/{component-slug}/ ← Component-Dokumentation (via @xpulse/doc)

Domain-Struktur

── Plattform ──────────────────────────────────────────
xpulse.one/ ← Plattform Landing
xpulse.one/status/ ← Dienste & Versionsstatus
── Dokumentation (via @xpulse/doc) ───────────────────
xpulse.one/doc/ ← Dokumentations-Übersicht
xpulse.one/doc/tool/chat/ ← Chat Tool (Guide, Security, Changelog, ...)
xpulse.one/doc/component/*/ ← Alle @xpulse/* Components
── Rechtlich ──────────────────────────────────────────
xpulse.one/privacy/ ← Datenschutz (inkl. Chat-spezifischem Abschnitt)
xpulse.one/terms/ ← Nutzungsbedingungen (inkl. Chat-spezifischem Abschnitt)
xpulse.one/disclaimer/ ← Haftungsausschluss (inkl. Chat-spezifischem Abschnitt)
xpulse.one/imprint/ ← Impressum
xpulse.one/contact/ ← Kontakt
── App ────────────────────────────────────────────────
chat.xpulse.one/ ← xPulse Chat App

Rechtliches

Die Plattform-Rechtsseiten (/privacy/, /terms/, /disclaimer/) enthalten jeweils einen visuell abgesetzten Abschnitt mit den Chat-spezifischen ErgΓ€nzungen β€” keine separaten Tool-URLs nΓΆtig.

Verlinkung aus der Chat-App:

Ort Ziel
/info – Datenschutz xpulse.one/privacy/
/info – Nutzungsbedingungen xpulse.one/terms/
/info – Haftungsausschluss xpulse.one/disclaimer/
/info – Impressum xpulse.one/imprint/

Seiten-Übersicht

Route Titel Typ Status
/ xPulse Plattform Landing v2.0.0
/status/ Status & Versionen Plattform v2.0.0
/doc/ Dokumentation Plattform v2.0.0
/privacy/ Datenschutz (Plattform) Rechtlich v2.0.0
/terms/ Nutzungsbedingungen (Plattform) Rechtlich v2.0.0
/disclaimer/ Haftungsausschluss (Plattform) Rechtlich v2.0.0
/contact/ Kontakt Plattform v2.0.0
/imprint/ Impressum Rechtlich v2.0.0
/doc/tool/chat/ Chat-Dokumentation Docs v2.0.0
/doc/component/*/ Component-Dokumentation Docs v2.0.0

Repo-Struktur

xpulse-web/
src/
index.js
controllers/
index.js
privacy.js
terms.js
disclaimer.js
contact.js
imprint.js
status.js
templates/
shared/base.tpl.html
platform.tpl.html
privacy.tpl.html
terms.tpl.html
disclaimer.tpl.html
contact.tpl.html
imprint.tpl.html
status.tpl.html
translations/
de/ platform.*.json
en/ platform.*.json
themes/
web.css
public/
assets/
favicon.svg
status/
status.json ← gitignored, server-seitig
status.json.example
docs/
Dockerfile
docker-compose.yml
docker-compose.stage.yml
Makefile
package.json
xpulse.json

Infrastruktur

Docker / Traefik

Node.js 22 Alpine hinter Traefik, Port 3000. status.json wird als read-only Volume gemountet.

make stage # rc-2-0-0.stage.web.xpulse.one (.env.stage erforderlich)
make prod # xpulse.one + www.xpulse.one

Stage-URL: ${RC_VERSION}.stage.web.xpulse.one


Landingpage Layout

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚
β”‚ xPulse β”‚ ← Logo (Serif, accent)
β”‚ ───────────────────── β”‚
β”‚ P2P Chat. Privat. VerschlΓΌsseltβ”‚ ← Tagline (aktuell Chat-fokussiert,
β”‚ β”‚ spΓ€ter platform-weiter)
β”‚ [β†’ Chat ΓΆffnen] β”‚ ← CTA β†’ chat.xpulse.one
β”‚ β”‚
β”‚ ───────────────────── β”‚
β”‚ β”‚
β”‚ πŸ”’ Ende-zu-Ende verschlΓΌsselt β”‚ ← Feature Pills
β”‚ ⬑ Peer-to-Peer, kein Server β”‚
β”‚ πŸ“΅ Keine Datenspeicherung β”‚
β”‚ πŸ“¦ Installierbar als PWA β”‚
β”‚ β”‚
β”‚ ───────────────────── β”‚
β”‚ β”‚
β”‚ Guide Β· Security Β· Changelog β”‚ ← Navigation Tool-Infos
β”‚ β”‚
β”‚ ───────────────────── β”‚
β”‚ β”‚
β”‚ Datenschutz Β· Nutzungsbeding. β”‚ ← Footer (Plattform-Basis, rechtlich)
β”‚ Haftungsausschluss Β· Impressumβ”‚
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Chat-App `/info` – neue Rolle ab v1.3.0

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ xPulse Chat β”‚
β”‚ Version 1.3.0 β”‚
β”‚ β”‚
β”‚ P2P Chat. Privat. β”‚
β”‚ Ende-zu-Ende verschlΓΌsselt. β”‚
β”‚ β”‚
β”‚ ───────────────────────── β”‚
β”‚ β”‚
β”‚ β†’ Erste Schritte β”‚ /doc/tool/chat/current/guide/
β”‚ β†’ Sicherheit & AnonymitΓ€t β”‚ /doc/tool/chat/current/security/
β”‚ β†’ Changelog β”‚ /doc/tool/chat/current/changelog/
β”‚ β”‚
β”‚ ───────────────────────── β”‚
β”‚ β”‚
β”‚ Datenschutz β”‚ /privacy/
β”‚ Nutzungsbedingungen β”‚ /terms/
β”‚ Haftungsausschluss β”‚ /disclaimer/
β”‚ Impressum β”‚ /imprint/
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Verlinkung Chat ↔ xpulse.one

Ort im Chat Ziel Ab Version
/info – Guide xpulse.one/doc/tool/chat/current/guide/ v1.3.0
/info – Security xpulse.one/doc/tool/chat/current/security/ v1.3.0
/info – Changelog xpulse.one/doc/tool/chat/current/changelog/ v1.3.0
/info – Datenschutz xpulse.one/privacy/ v1.1.1
/info – Nutzungsbedingungen xpulse.one/terms/ v1.1.1
/info – Haftungsausschluss xpulse.one/disclaimer/ v1.1.1
/info – Impressum xpulse.one/imprint/ v1.1.1
Sidebar Version-Pill xpulse.one/doc/tool/chat/current/changelog/ v1.3.0
Sidebar Footer xpulse.one/privacy/ etc. v1.3.0

Styleguide

Identisch mit der Chat-App und den Feedback-Forms – ein einheitliches Design ΓΌber alle xPulse-PrΓ€senzen.

CSS Custom Properties

:root {
--bg: #0d0d0d;
--surface: #141414;
--border: #222;
--muted: #444;
--text: #c8c8c8;
--text-dim: #555;
--accent: #8703b0;
--accent2: #7eb8a4;
--danger: #c0606a;
--mono: 'JetBrains Mono', ui-monospace, 'Cascadia Code', 'Fira Code', Consolas, monospace;
--serif: 'Fraunces', Georgia, ui-serif, serif;
}

Typografie

Element Font Grâße Gewicht Besonderheit
Logo / Brand --serif 2.4rem 300 color: var(--accent)
Fließtext --mono 13px 400 line-height: 1.6
Labels / Badges --mono 10–11px 400 letter-spacing: 0.08–0.12em; text-transform: uppercase
Section Titles --mono 10px 400 color: var(--accent2); letter-spacing: 0.12em
Code --mono 11px 400 background: var(--surface); border: 1px solid var(--border)

AbstΓ€nde & Formen

border-radius: 2px;
border: 1px solid var(--border);
padding (Karten): 1rem 1.2rem;
max-width (Content): 640px;
margin: 0 auto;

Noise-Overlay

body::before {
content: '';
position: fixed;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
pointer-events: none;
z-index: 9999;
opacity: 0.4;
}

Buttons

.btn-primary {
background: var(--accent);
color: #fff;
border: none;
font-family: var(--mono);
font-size: 12px;
font-weight: 600;
letter-spacing: 0.1em;
text-transform: uppercase;
padding: 0.75rem 1.5rem;
border-radius: 2px;
cursor: pointer;
transition: opacity 0.15s, transform 0.1s;
}
.btn-primary:hover { opacity: 0.85; }
.btn-primary:active { transform: scale(0.98); }
.btn-secondary {
background: none;
color: var(--text);
border: 1px solid var(--border);
}
.btn-secondary:hover { border-color: var(--accent2); color: var(--accent2); }
a {
color: var(--text-dim);
text-decoration: none;
letter-spacing: 0.08em;
text-transform: uppercase;
font-size: 11px;
transition: color 0.15s;
}
a:hover { color: var(--accent); }

Animations

@keyframes fadeIn {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
animation: fadeIn 0.3s ease both;

i18n – Internationalisierung

Strategie

Keine URL-Slugs fΓΌr Sprachen (/de/, /en/ entfΓ€llt). Die Sprache ist eine Nutzer-PrΓ€ferenz, keine Route.

Screenreader-KompatibilitΓ€t

Texte stehen immer als echter Inhalt im DOM – nie leer. Der Default-Text (Deutsch) ist direkt im HTML eingebettet. Beim Sprachwechsel ersetzt JS den textContent / innerHTML der Elemente. Data-Attribute dienen nur als Hook, nicht als Textquelle.

<!-- Korrekt: echter Text im HTML, data-i18n nur als Hook -->
<p data-i18n="chat.guide.pairing.intro">
Um mit jemandem zu chatten, mΓΌsst ihr euch einmalig pairen...
</p>
<!-- Falsch: leeres Element, Text nur via JS -->
<p data-i18n="chat.guide.pairing.intro"></p>

Dateistruktur

locales/
de/
platform.about.json
platform.privacy.json
platform.terms.json
platform.disclaimer.json
tool.chat.guide.json
tool.chat.security.json
tool.chat.changelog.json
tool.chat.privacy.json
tool.chat.terms.json
tool.chat.disclaimer.json
en/
platform.about.json
platform.privacy.json
...

Dateinamen spiegeln die URL-Struktur wider: {scope}.{tool?}.{page}.json. Der locales/-Ordner wird beim Start vollstΓ€ndig geparst – neue Dateien werden automatisch erkannt, kein manuelles Registrieren.

JSON-Format

{
"chat.guide.pairing.intro": "Um mit jemandem zu chatten...",
"chat.guide.pairing.step1": "Eine Person ΓΆffnet β€žPeer hinzufΓΌgen"...",
"chat.guide.faq.storage": "Ausschließlich lokal in deinem Browser..."
}

Flache Key-Value-Struktur. Keys folgen dem Schema {scope}.{page}.{block}.{element}. Kein tief verschachteltes JSON – einfacher zu durchsuchen und zu pflegen.

JavaScript – i18n.js

// Verantwortlichkeiten von i18n.js:
// 1. Sprache aus localStorage lesen (Fallback: 'de')
// 2. Passendes JSON fΓΌr die aktuelle Seite laden
// 3. Alle [data-i18n] Elemente mit textContent/innerHTML befΓΌllen
// 4. <html lang="xx"> setzen
// 5. Lang-Switch: neue Sprache laden, DOM aktualisieren, localStorage schreiben
const STORAGE_KEY = 'xpulse_lang';
const DEFAULT_LANG = 'de';

Jede Seite bindet nur das JSON ein das sie braucht – kein monolithisches Translations-Bundle.

HTML-Integration

<html lang="de">
...
<!-- Sprachwechsel-Button -->
<button data-lang-switch="en">EN</button>
<button data-lang-switch="de">DE</button>
<!-- Übersetzbarer Inhalt -->
<h1 data-i18n="chat.guide.title">Erste Schritte</h1>
<p data-i18n="chat.guide.pairing.intro">Um mit jemandem...</p>

Offene Punkte

Thema Status
i18n – Implementierung Deployed (xpulse-web v2.0.0)
Changelog-Format in Chat-Docs (manuell vs. auto-build) TBD
TURN-only Modus im Chat Geplant, Version offen

Release-Reihenfolge

xpulse-web v1.0.0 β†’ Plattform Landing, alle Rechtsseiten [RELEASED]
↓
xpulse-web v2.0.0 β†’ Node.js SSR, @xpulse/* Stack, Docs-Integration [RELEASED 2026-04-24]
↓
chat v1.3.0 β†’ /info als reiner About-Screen, alle Links β†’ xpulse.one
Version-Pill β†’ xpulse.one/tool/chat/changelog/ [Geplant]
de/concept.md 2026-04-24