Pages
Contents
xPulse Chat β Roadmap
As of: March 2026 Companion documents:
TOOL_chat_concept-ui-layout.md,MAIN_roadmap-ecosystem.md
Version Overview
| v1.2.0 Bug fixes, performance, pairing UI |
| v1.3.0 UI/CSS refactoring + app shell layout |
| v1.4.0 Components + i18n (de/en) |
| v1.5.0 Themes (dark/light) |
| v1.6.0 Profile features + avatar + chat images |
| v1.7.0 Emojis, stickers, GIFs |
| v1.8.0 Chat history paging (lazy render, local) |
| v1.9.0 Peer sync (history + profile via DataChannel) |
| v2.0.0 Abrax β AI assistant via @xpulse/ai |
v1.3.0 β App Shell + Landing Page + Project Foundation
Status: PROGRESS Β· Staging: rc-1-3-0.stage.xpulse.one
UI/UX
- App shell with CSS Grid (
layout-shell/layout-fullscreen) - Left sidebar β peer list,
[+]button, footer with toggle, version pill - Top bar β hamburger, title, status dot, user menu
- CSS extracted:
base.css,components.css,layout.css,views/*.css - Router:
routeShell,routeShellParam,routeFullscreen - Mobile sidebar as overlay with backdrop
- Chat landing page
chat.xpulse.one/β live on Stage RC-v1.3.0
Project Foundation
- Integrate
xpulse-chat-logo.svgin sidebar (replaces "xPulse" text) - Integrate
xpulse-chat-logo.svgin feedback form - Create
xpulse.jsonin repo root (name+typeset) - Create
docs/base structure (index.md,de/index.md,en/index.md,de/adr/) β not yet in repo root, only on RC branch
v1.4.0 β Components + i18n
Status: PLANNED
Prerequisite: Verdaccio running, @xpulse/theme + @xpulse/theme available
Extraction
- Integrate
@xpulse/theme(replaces localbase.css+components.css) - Integrate
@xpulse/theme(colours + effects extracted from@xpulse/theme) - Integrate
@xpulse/logger(replacesmodules/logger.js) - Integrate
@xpulse/crypto(replacescrypto.js) - Integrate
@xpulse/session(replacessession.js) - Integrate
@xpulse/notify(replacesmodules/notify.js) - Integrate
@xpulse/presence(replacesmodules/presence.js)
i18n
- Integrate
@xpulse/i18n - German / English
- Move all UI strings out of code into
src/translations/ - Language selection in profile or settings
Feedback
- Feedback link in sidebar footer (
Info Β· Guidelines Β· Feedback) - Modal with feedback / bug report via
mailto:
Docs
- Fully develop
docs/(guide, security, changelog) - Create
CHAT-001ff. ADRs - Fully develop
docs/incl.de/+en/subdirectories (no_meta.jsonβ navigation via structure + TOC)
v1.5.0 β Themes
- Dark/light theme toggle
- Theme encapsulable via
@xpulse/theme - User preference in localStorage
v1.6.0 β Profile Features + Avatar + Chat Images
- Avatar (initials or upload)
- Display name (independent of login)
- Send images via DataChannel
- IndexedDB as local cache for images
v1.7.0 β Emojis, Stickers, GIFs
- Emoji picker
- Sticker support
- GIF integration (TBD: source)
v1.8.0 β Chat History Paging
Prerequisite: v1.6.0 completed (IndexedDB)
Lazy rendering of chat history: initially only the last 50 messages are rendered. Older messages can be loaded via button (50 at a time, cursor-based via timestamp). All data comes from local storage β no network required.
Features
-
loadChatHistoryreceiveslimit+beforeparameters (cursor) - Initial: last 50 messages
- "Load older messages" button at the top of
#chat-messages - Prepend + maintain scroll position (
scrollTop += newHeight - oldHeight) - Button disappears when no more messages are available
v1.9.0 β Peer Sync
Version: v1.9.0 (after v1.6.0 β IndexedDB prerequisite for image sync)
Problem
Chat history and profile data currently only exist locally in localStorage (via session.js).
If Peer A writes a new message while Peer B is offline, that message is gone
for B forever. Similarly, B always only sees A's login name β no display name,
no avatar, no current profile state.
Goal
When two peers connect, two things are synchronised β without a server, purely P2P over the DataChannel:
- Profile sync β current display name, avatar, etc. from A β B and vice versa
- History sync β missing messages since the last shared timestamp
How It Works (Draft)
| Peer A connects to Peer B |
| β |
| ββ Phase 1: Profile Sync ββββββββββββββββββββββββββββ |
| A sends: { type: 'sync:profile', displayName: 'Alex', avatar: null, updatedAt: ... } |
| B stores A's profile locally β from now on shows "Alex" instead of login name |
| B sends the same back β A knows B's current profile state |
| β |
| ββ Phase 2: History Sync ββββββββββββββββββββββββββββ |
| A sends: { type: 'sync:request', lastTs: 1710000000000 } |
| (= timestamp of the last known message from B) |
| B responds: { type: 'sync:response', messages: [...] } |
| (= all messages B sent after lastTs) |
| A stores missing messages in localStorage + renders them |
| B does the same in the other direction |
Profile Data in Sync
| Field | Description | From Version |
|---|---|---|
displayName |
Displayed name (freely chosen, β login) | v1.7.0 |
avatar |
Base64 thumbnail or null | v1.7.0 |
updatedAt |
Timestamp of last profile change | v1.7.0 |
Profile sync is therefore already useful from v1.7.0 onwards β once display name exists. History sync can come earlier (no profile required).
Limitations (by design)
- No server buffer β sync only works when both peers are online
- No offline sending β messages sent while the other is offline are lost (stays this way)
- Direct peers only β no relay, no multi-hop
- One-time at connection establishment β no persistent sync channel
Open Questions
| Topic | Status |
|---|---|
| Maximum sync depth? (all messages or only last N / last X days) | TBD |
| What happens with very long history? (DataChannel size limit) | TBD |
| Conflict handling on simultaneous sync? | TBD |
| Encryption of sync payload? | Yes β same AES-GCM crypto as normal messages |
| Avatar sync: size limit? (DataChannel ~256KB chunks) | TBD |
Possible Version
- History sync β v1.9.0, standalone after v1.4.0 (i18n)
- Profile sync β v1.9.0, together with v1.6.0 (profile features)
- Full sync incl. images β v1.9.0, after v1.6.0 when IndexedDB is available
v2.0.0 β Abrax (Codename: Abra)
Status: PLANNED
Prerequisite: v1.9.0 completed, @xpulse/ai package ready
Concept: COMP_ai_concept.md
AI integration via @xpulse/ai β a special AI peer in the peers list,
with full conversation context, streaming, and full user control over
provider, model, and personality. Browser-to-provider directly, no detour
via xPulse server.
Opt-in & Legal
- Implement consent flow (modal on "activate AI")
-
xp_ai_consentin localStorage with version tracking - Create legal page
xpulse.one/tool/chat/ai-terms/ - "Deactivate AI" + complete deletion of all AI data
AI Peer
- π€ AI peer in peers list (only visible after opt-in)
- Name configurable in peer details (default: "Abrax")
- Personality configurable in peer details (templates + free text)
- Chat history in
@xpulse/sessionlike any other peer
Provider & Settings (Profile)
- Provider selection: Anthropic, OpenAI, xAI, Google, Ollama
- API key input β stored encrypted, never leaves the browser
- Direct link to API key page of the respective provider
- Ollama URL configurable (for local instances)
- Ollama marked as "Advanced" with link to guide
Chat Info Panel
- Model selection (dynamically queried via provider API)
- Streaming on/off
- Context size (number of messages)
- Creativity / temperature (0.0 β 1.0)
- Max. response length (tokens)
- (i) Tooltip with help text for each setting
- Context warning when older messages are dropped
- Token usage (this session + total local)
- "Clear history" button
i18n
- Create
src/translations/ai.de.json+ai.en.json - All UI texts, help texts, personality templates in de + en
Chat UX
- Input field disabled while Abrax is responding (streaming + normal)
- Automatic focus return after complete response
- Persistent AI notice below input (
{trans:ai.chat.disclaimer})