# tracker-web — Backend Enablers > Follow-ups that **cannot ship from `dashboards/tracker-web` alone** because they require a change > to the shared `services/platform-service`. They are the only remaining items on the > [UX integration roadmap](UX_INTEGRATION_BYTELYST.md) and are **excluded from its ✅ count** until > the backend enabler lands. > > **Hard constraint for every item below:** `platform-service` is **shared by 9 products** > (LysnrAI, MindLyst, ChronoMind, JarvisJr, NomGap, PeakPulse, FlowMonk, NoteLett, ActionTrail, > EffoRise, LocalMemGPT — see `AGENTS.md`). Every change here **must be additive and > backward-compatible**: no behavioural change for products that do not opt in, existing rows/reads > keep working, and every persisted document keeps its `productId`. | ID | Title | Blocks | Target module | Status | | ---- | ----------------------------------------------------- | ------------------------------ | ------------------------------------------------------------------------- | -------------- | | BE-1 | Server-side HTML sanitization for item/comment bodies | UX-12.3 (rich-text) | `services/platform-service` — items + comments write paths | 🔒 Not started | | BE-2 | Tracker-event notifications feed | UX-13.1 (`NotificationCenter`) | `services/platform-service` — notifications module + `/api/tracker` proxy | 🔒 Not started | --- ## BE-1 — Server-side HTML sanitization for `items.description` + `comments.body` - **Title:** Sanitize rich HTML on the item-description and comment-body write paths. - **Blocking roadmap item:** [UX-12.3](UX_INTEGRATION_BYTELYST.md#ux-12--detail--board-richness-tabs--tooltip--drawer--timeline--rich-text) — adopt `@bytelyst/rich-text` `RichTextEditor` / `RichTextViewer` in tracker-web. - **Target module:** `services/platform-service` — the **items** module (`items.description`) and the **comments** module (`comments.body`), applied **server-side before persist** (create + update). - **Why it's blocked:** Today `TrackerItem.description` and `Comment.body` are plain `string`s rendered with `whitespace-pre-wrap`; the `/api/tracker/*` proxy neither stores nor sanitizes rich HTML. Adopting a rich-text editor client-side would persist attacker-controlled HTML with no server-side sanitization (stored-XSS), so it must not be done until the backend guarantees safety. ### Acceptance criteria - HTML is sanitized **on the server** (never trust the client) on every write to `items.description` and `comments.body` (create and update). - **Allowlist** of formatting tags only — e.g. `p`, `br`, `strong`, `em`, `u`, `s`, `a`, `ul`/`ol`/`li`, `blockquote`, `code`, `pre`, `h1`–`h3`. Everything else is stripped/escaped. - **Attribute allowlist:** only safe attributes survive; `a[href]` is restricted to `http:` / `https:` / `mailto:` schemes (and gets `rel="noopener noreferrer"`). - **Stripped unconditionally:** `