xPulse
πŸ‡¬πŸ‡§ EN

xpulse-web – Concept & Strategy

Status: v2.0.0 Β· Repo: xpulse-web Companion document: CONTENT_xpulse-web.md (page content) Updated April 2026


Goal & Principle

xpulse.one is the platform. Not just a landing page for the chat, but the shared home for all xPulse tools, components, and platform-wide content.

chat.xpulse.one is the first tool. More can follow.

Single Responsibility:

The /info page in the chat becomes a minimal about screen (version, one-liner, links to xpulse.one) – no own content anymore.


URL Structure

/{slug} ← platform-wide (general & legal)
/doc/tool/{tool-slug}/ ← tool documentation (via @xpulse/doc)
/doc/component/{component-slug}/ ← component documentation (via @xpulse/doc)

Domain Structure

── Platform ───────────────────────────────────────────
xpulse.one/ ← Platform landing
xpulse.one/status/ ← Services & version status
── Documentation (via @xpulse/doc) ───────────────────
xpulse.one/doc/ ← Documentation overview
xpulse.one/doc/tool/chat/ ← Chat tool (guide, security, changelog, ...)
xpulse.one/doc/component/*/ ← All @xpulse/* components
── Legal ──────────────────────────────────────────────
xpulse.one/privacy/ ← Privacy policy (incl. chat-specific section)
xpulse.one/terms/ ← Terms of service (incl. chat-specific section)
xpulse.one/disclaimer/ ← Disclaimer (incl. chat-specific section)
xpulse.one/imprint/ ← Imprint
xpulse.one/contact/ ← Contact
── App ────────────────────────────────────────────────
chat.xpulse.one/ ← xPulse Chat app

The platform legal pages (/privacy/, /terms/, /disclaimer/) each contain a visually distinct section with the chat-specific additions β€” no separate tool URLs needed.

Linking from the chat app:

Location Target
/info – Privacy xpulse.one/privacy/
/info – Terms of Service xpulse.one/terms/
/info – Disclaimer xpulse.one/disclaimer/
/info – Imprint xpulse.one/imprint/

Page Overview

Route Title Type Status
/ xPulse Platform Landing v2.0.0
/status/ Status & Versions Platform v2.0.0
/doc/ Documentation Platform v2.0.0
/privacy/ Privacy Policy (Platform) Legal v2.0.0
/terms/ Terms of Service (Platform) Legal v2.0.0
/disclaimer/ Disclaimer (Platform) Legal v2.0.0
/contact/ Contact Platform v2.0.0
/imprint/ Imprint Legal v2.0.0
/doc/tool/chat/ Chat Documentation Docs v2.0.0
/doc/component/*/ Component Documentation Docs v2.0.0

Repo Structure

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-managed
status.json.example
docs/
Dockerfile
docker-compose.yml
docker-compose.stage.yml
Makefile
package.json
xpulse.json

Infrastructure

Docker / Traefik

Node.js 22 Alpine behind Traefik, port 3000. status.json is mounted as a read-only volume.

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

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


Landing Page Layout

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚
β”‚ xPulse β”‚ ← Logo (serif, accent)
β”‚ ───────────────────── β”‚
β”‚ P2P Chat. Private. Encrypted. β”‚ ← Tagline (currently chat-focused,
β”‚ β”‚ later platform-wider)
β”‚ [β†’ Open Chat] β”‚ ← CTA β†’ chat.xpulse.one
β”‚ β”‚
β”‚ ───────────────────── β”‚
β”‚ β”‚
β”‚ πŸ”’ End-to-end encrypted β”‚ ← Feature pills
β”‚ ⬑ Peer-to-peer, no server β”‚
β”‚ πŸ“΅ No data storage β”‚
β”‚ πŸ“¦ Installable as PWA β”‚
β”‚ β”‚
β”‚ ───────────────────── β”‚
β”‚ β”‚
β”‚ Guide Β· Security Β· Changelog β”‚ ← Navigation tool info
β”‚ β”‚
β”‚ ───────────────────── β”‚
β”‚ β”‚
β”‚ Privacy Β· Terms of Service β”‚ ← Footer (platform base, legal)
β”‚ Disclaimer Β· Imprint β”‚
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Chat App `/info` – New Role from v1.3.0

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ xPulse Chat β”‚
β”‚ Version 1.3.0 β”‚
β”‚ β”‚
β”‚ P2P Chat. Private. β”‚
β”‚ End-to-end encrypted. β”‚
β”‚ β”‚
β”‚ ───────────────────────── β”‚
β”‚ β”‚
β”‚ β†’ Getting Started β”‚ /doc/tool/chat/current/guide/
β”‚ β†’ Security & Anonymity β”‚ /doc/tool/chat/current/security/
β”‚ β†’ Changelog β”‚ /doc/tool/chat/current/changelog/
β”‚ β”‚
β”‚ ───────────────────────── β”‚
β”‚ β”‚
β”‚ Privacy Policy β”‚ /privacy/
β”‚ Terms of Service β”‚ /terms/
β”‚ Disclaimer β”‚ /disclaimer/
β”‚ Imprint β”‚ /imprint/
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Linking Chat ↔ xpulse.one

Location in Chat Target From 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 – Privacy xpulse.one/privacy/ v1.1.1
/info – Terms of Service xpulse.one/terms/ v1.1.1
/info – Disclaimer xpulse.one/disclaimer/ v1.1.1
/info – Imprint 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

Style Guide

Identical to the chat app and feedback forms – a unified design across all xPulse presences.

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;
}

Typography

Element Font Size Weight Notes
Logo / Brand --serif 2.4rem 300 color: var(--accent)
Body 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)

Spacing & Shapes

border-radius: 2px;
border: 1px solid var(--border);
padding (cards): 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 – Internationalisation

Strategy

No language slugs in URLs (/de/, /en/ are dropped). Language is a user preference, not a route.

Screen Reader Compatibility

Text always exists as real content in the DOM – never empty. The default text (German) is embedded directly in the HTML. On language switch, JS replaces the textContent / innerHTML of elements. Data attributes serve only as hooks, not as text sources.

<!-- Correct: real text in HTML, data-i18n only as hook -->
<p data-i18n="chat.guide.pairing.intro">
Um mit jemandem zu chatten, mΓΌsst ihr euch einmalig pairen...
</p>
<!-- Wrong: empty element, text only via JS -->
<p data-i18n="chat.guide.pairing.intro"></p>

File Structure

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
...

File names mirror the URL structure: {scope}.{tool?}.{page}.json. The locales/ directory is fully parsed on startup – new files are detected automatically, no manual registration.

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..."
}

Flat key-value structure. Keys follow the scheme {scope}.{page}.{block}.{element}. No deeply nested JSON – easier to search and maintain.

JavaScript – i18n.js

// Responsibilities of i18n.js:
// 1. Read language from localStorage (fallback: 'de')
// 2. Load matching JSON for the current page
// 3. Populate all [data-i18n] elements with textContent/innerHTML
// 4. Set <html lang="xx">
// 5. Lang switch: load new language, update DOM, write to localStorage
const STORAGE_KEY = 'xpulse_lang';
const DEFAULT_LANG = 'de';

Each page only loads the JSON it needs – no monolithic translations bundle.

HTML Integration

<html lang="de">
...
<!-- Language switch button -->
<button data-lang-switch="en">EN</button>
<button data-lang-switch="de">DE</button>
<!-- Translatable content -->
<h1 data-i18n="chat.guide.title">Erste Schritte</h1>
<p data-i18n="chat.guide.pairing.intro">Um mit jemandem...</p>

Open Points

Topic Status
i18n – Implementation Deployed (xpulse-web v1.x)
/tool/chat/status/ – content & format TBD
Changelog format (manual vs. auto-build) TBD
TURN-only mode in chat Planned, version open
/component/ui/ – scope & content TBD

Release Order

xpulse-web v1.0.0 β†’ Platform landing + tool chat (guide, security, changelog)
+ all legal pages (platform base + chat supplements)
↓
chat v1.1.1 β†’ Legal links to xpulse.one/tool/chat/* in /info
↓
chat v1.2.0 β†’ v1.1.1 already merged
↓
chat v1.3.0 β†’ /info as pure about screen, all links β†’ xpulse.one
version pill β†’ xpulse.one/tool/chat/changelog/
sidebar footer β†’ xpulse.one/tool/chat/* legal
en/concept.md 2026-04-24