xPulse
πŸ‡¬πŸ‡§ EN

xpulse-web – Concept & Strategy

Status: CONCEPT v3 Β· Repo: xpulse-web Companion document: CONTENT_xpulse-web.md (page content) Updated March 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)
/tool/{tool-slug}/ ← tool landing & tool-specific content
/tool/{tool-slug}/{sub-slug}/ ← tool sub-pages
/component/{component-slug}/ ← shared components overview
/component/{component-slug}/{sub}/ ← component sub-pages

Domain Structure

── Platform ───────────────────────────────────────────
xpulse.one/ ← Platform landing
xpulse.one/about/ ← What is xPulse (the platform)
── Tools ──────────────────────────────────────────────
xpulse.one/tool/chat/ ← Chat tool landing
xpulse.one/tool/chat/guide/ ← Getting started (chat-specific)
xpulse.one/tool/chat/security/ ← Security & anonymity (chat-specific)
xpulse.one/tool/chat/changelog/ ← Chat changelog ← version pill in chat
── Components ─────────────────────────────────────────
xpulse.one/component/ui/ ← Shared UI components (TBD)
xpulse.one/component/ui/examples/ ← Examples / showcase (TBD)
── Legal (Platform Base) ──────────────────────────────
xpulse.one/privacy/ ← Privacy policy platform base
xpulse.one/terms/ ← Terms of service platform base
xpulse.one/disclaimer/ ← Disclaimer platform base
xpulse.one/imprint/ ← Imprint
── Legal (Tool-specific) ──────────────────────────────
xpulse.one/tool/chat/privacy/ ← Privacy supplement chat
xpulse.one/tool/chat/terms/ ← Terms supplement chat
xpulse.one/tool/chat/disclaimer/ ← Disclaimer supplement chat
── App ────────────────────────────────────────────────
chat.xpulse.one/ ← xPulse Chat app (p2p-chat repo)

Platform-wide legal documents apply as the base for all tools. Tool-specific documents are supplements, not replacements.

xpulse.one/privacy/ ← always applies, for all tools
xpulse.one/tool/chat/privacy/ ← applies additionally, for chat only

Principle:

Linking in the chat app:

Location Target
/info – Privacy xpulse.one/tool/chat/privacy/ (internally references platform base)
/info – Terms of Service xpulse.one/tool/chat/terms/
/info – Disclaimer xpulse.one/tool/chat/disclaimer/
/info – Imprint xpulse.one/imprint/ (platform only, no tool-specific)

Page Overview

Route Title Type Status
/ xPulse Platform Landing Planned
/about/ About xPulse Platform Info Planned
/tool/chat/ xPulse Chat Tool Landing Planned
/tool/chat/guide/ Getting Started Tool Info Planned
/tool/chat/security/ Security & Anonymity Tool Info Planned
/tool/chat/changelog/ Changelog Tool Info Planned
/tool/chat/status/ Status Tool Info TBD
/component/ui/ UI Components Component TBD
/privacy/ Privacy Policy (Platform) Legal Planned
/terms/ Terms of Service (Platform) Legal Planned
/disclaimer/ Disclaimer (Platform) Legal Planned
/imprint/ Imprint Legal Planned
/tool/chat/privacy/ Privacy Policy (Chat) Legal Planned
/tool/chat/terms/ Terms of Service (Chat) Legal Planned
/tool/chat/disclaimer/ Disclaimer (Chat) Legal Planned

Repo Structure

xpulse-web/
docs/
CONCEPT_xpulse-web.md
CONTENT_xpulse-web.md
public/
index.html ← Platform landing
about/
index.html
tool/
chat/
index.html ← Chat tool landing
guide/
index.html
security/
index.html
changelog/
index.html
status/
index.html ← TBD
privacy/
index.html
terms/
index.html
disclaimer/
index.html
component/
ui/
index.html ← TBD
examples/
index.html ← TBD
privacy/
index.html ← Platform base
terms/
index.html
disclaimer/
index.html
imprint/
index.html
assets/
favicon.svg
icons/
icon-192.png
icon-512.png
nginx.conf
Dockerfile
docker-compose.yml

Infrastructure

Docker / Traefik

# docker-compose.yml (xpulse-web)
services:
web:
build: .
restart: always
networks:
- webproxy
- internal
labels:
- traefik.enable=true
- traefik.docker.network=webproxy
# HTTP β†’ HTTPS redirect
- traefik.http.routers.xpulseweb.rule=Host(`xpulse.one`) || Host(`www.xpulse.one`)
- traefik.http.routers.xpulseweb.entrypoints=http
- traefik.http.routers.xpulseweb.middlewares=https-redirect
# HTTPS
- traefik.http.routers.xpulseweb-secured.rule=Host(`xpulse.one`) || Host(`www.xpulse.one`)
- traefik.http.routers.xpulseweb-secured.entrypoints=https
- traefik.http.routers.xpulseweb-secured.tls=true
- traefik.http.routers.xpulseweb-secured.tls.certresolver=le
- traefik.http.services.xpulseweb.loadbalancer.server.port=80
networks:
webproxy:
external: true
internal:
external: true

nginx

server {
listen 80;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ $uri/index.html =404;
}
}

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 β”‚ /tool/chat/guide/
β”‚ β†’ Security & Anonymity β”‚ /tool/chat/security/
β”‚ β†’ Changelog β”‚ /tool/chat/changelog/
β”‚ β”‚
β”‚ ───────────────────────── β”‚
β”‚ β”‚
β”‚ Privacy Policy β”‚ /tool/chat/privacy/
β”‚ Terms of Service β”‚ /tool/chat/terms/
β”‚ Disclaimer β”‚ /tool/chat/disclaimer/
β”‚ Imprint β”‚ /imprint/
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Linking Chat ↔ xpulse.one

Location in Chat Target From Version
/info – Guide xpulse.one/tool/chat/guide/ v1.3.0
/info – Security xpulse.one/tool/chat/security/ v1.3.0
/info – Changelog xpulse.one/tool/chat/changelog/ v1.3.0
/info – Privacy xpulse.one/tool/chat/privacy/ v1.1.1
/info – Terms of Service xpulse.one/tool/chat/terms/ v1.1.1
/info – Disclaimer xpulse.one/tool/chat/disclaimer/ v1.1.1
/info – Imprint xpulse.one/imprint/ v1.1.1
Sidebar version pill xpulse.one/tool/chat/changelog/ v1.3.0
Sidebar footer xpulse.one/tool/chat/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 Planned, next step
/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/i18n.md 2026-04-20