March 24, 2026 09:06 PM
Product Roadmap (Content Platform)
This roadmap tracks the remaining work for the article platform and related quality requirements.
Current Baseline
Multi-step article editor is implemented (
Preview -> Content -> SEO -> Publish).Public article page has dynamic SEO metadata and JSON-LD.
Preview page is
noindex/nofollow.Sitemap and RSS now include published public articles from DB.
Publish flow already triggers search engine notifications for indexable public articles.
Media pipeline: Uploadcare via own API (
/api/v1/media),MediaAssetin DB, proxy delivery (/cdn/...), editor paste/drop + Preview/SEO image fields, responsive/srcseton public article HTML.Public article HTML path:
unstable_cache+revalidateTagon publish/revision update (src/lib/cache/publicArticlePageCache.ts). RUM (Phase 4) + optional analytics cookie consent.
Immediate Execution (Can Start Now)
Add security test fixtures with common XSS payloads and run them in CI.
Document canonical policy (
default from article URL + optional manual override in SEO step).Add canonical URL normalization utility (protocol/host/trailing slash rules).
Define publishing state-transition matrix (draft/confirmed/published/unpublished/republished).
Add minimal publish pipeline logs (
publish_started,publish_succeeded,publish_failed).Define initial Web Vitals SLO targets (p75 by route/device) before alert tuning.
Phase 1 — Security and Content Safety (Highest Priority)
1. UGC sanitization pipeline
Done for read-only HTML output only: sanitization runs on the server after Tiptap static render (finalizeArticleBodyHtml → DOMPurify in src/lib/sanitize/articleHtml.ts) on public article, preview, and private article pages. The TipTap editor surface is not passed through this pipeline (authoring uses the live document; hardening there remains a separate decision).
Add server-side sanitization for user-generated HTML (DOMPurify via
isomorphic-dompurifyon the render path).Define allowlist for tags/attributes based on current Tiptap extensions.
Enforce safe URL policy (
http/https, safe relative paths, blockjavascript:/data:/ protocol-relative URLs where enforced, strip inline event handlers via allowlist).Add defense-in-depth sanitization before any
dangerouslySetInnerHTMLrendering (article + preview + private-article bodies).Add unit tests with XSS payload fixtures (
npm run test).Add security regression suite for known payloads in CI.
2. Safe rendering policy
Document one canonical rendering path for article content (JSON -> static renderer -> sanitized HTML).
Ensure preview/public rendering behavior is consistent.
Add fallback behavior for malformed content payloads.
Introduce baseline Content Security Policy for public article pages.
Phase 2 — Publishing Workflow Completion
1. Revision lifecycle and publishing states
Finalize “publish specific revision” contract (
article.revisionId,version, statuses, timestamps).Make confirmed/published revisions read-only in UI.
Add “create draft from published revision” action.
Prevent editing of immutable revisions through backend validation.
Define and document allowed state transitions as a single source of truth (state machine table).
2. Publishing side-effects robustness
Add explicit handling for publish vs unpublish vs republish transitions.
Add retry-safe notification logic for search engines.
Add observability logs around publishing pipeline steps.
Add integration tests for publish/unpublish/indexable/non-indexable scenarios.
Add idempotency key handling for publish/unpublish operations to prevent duplicate side-effects.
3. Editor UX and media authoring
Add image paste/drop upload flow in editor (auto-upload and replace local blobs with CDN links).
Add thumbnail upload action in step 1 (Preview) and/or SEO step (alongside URL input).
Define upload error/retry UX and validation (size/type) for author-facing media actions.
Phase 3 — SEO and Discovery Hardening
1. Metadata consistency
Enforce consistent fallback strategy for title/description/OG/Twitter/canonical (
resolvePublicArticlePageMetafor/article/[slug]).Validate canonical URL format and domain policy (same origin as
NEXT_PUBLIC_SITE_URL/seoConfig.siteUrl; API + SEO form).Ensure private/link-only content cannot leak to indexable metadata (sitemap/RSS unchanged — public +
noindexfilter; private/previewrobotsunchanged).Article / site locale in metadata and markup (see Phase 7).
Keep canonical defaults derived from article URL while allowing explicit SEO-step override with validation (
articleCanonical.ts).Use one canonical generation/normalization utility for metadata, sitemap, RSS, IndexNow URL, and JSON-LD (
buildDefaultArticleUrl/resolveArticleCanonicalUrl).
2. Structured data improvements
Expand article JSON-LD with optional fields (
keywords,isAccessibleForFree;articleSectionnot yet in revision metadata).Add schema validation checks in CI (JSON-LD shape sanity checks —
src/lib/seo/jsonld.test.ts, run vianpm run test/ pre-push).
3. Search platform setup
Complete Google Search Console setup (domain verification + sitemap submission).
Complete Bing Webmaster setup (sitemap + IndexNow verification).
Create SEO operations checklist for production incidents.
4. AI-assisted SEO authoring (optional module)
Add AI suggestions for SEO fields (title, description, OG title/description) with explicit user confirmation.
Add AI-assisted keyword suggestions based on article content.
Add provider abstraction and feature flags (disabled by default for self-hosted/open-source baseline).
Add audit trail for AI-generated drafts (what was suggested and what was accepted).
Phase 4 — Performance and Runtime Monitoring
1. Core Web Vitals instrumentation
Implement
reportWebVitalspipeline (App Router compatible —web-vitals+WebVitalsReporterin root layout).Store RUM events (
LCP,INP,CLS,TTFB,FCP) in Mongo (RumWebVital, TTL 14d, client session sampleNEXT_PUBLIC_RUM_SAMPLE_RATEdefault 20%, server persists all received beacons,COMMIT_HASHon ingest only).Admin RUM dashboard:
GET /api/v1/rum/dashboard+/admin/rum— aggregate p75/avg/min/max per metric, total samples, top pathnames by volume (window 1–14d).Extend dashboards: p75 by route (per pathname or route group) and by device / connection segment (needs stable client fields + aggregation).
Define target SLO thresholds per metric and route group for consistent alerting.
2. Alerting
Add threshold-based alerting for metric degradation windows.
Send alerts to Telegram with dedupe/cooldown logic.
Add runbook links in alert payloads.
3. Frontend performance budget
Track critical JS budget and keep under target.
Reduce editor/admin payload impact on public pages.
Review image loading strategy (
sizes,srcset, lazy boundaries).
4. Caching, CDN, and origin load
Data cache (Next):
unstable_cachefor public/article/[slug]payload (HTML body + revision metadata path); tagpublic-article:{slug};revalidateTagfrom article and revision update routes.Invalidation coverage: any future mutation of published content (slug swap, revision switch, bulk jobs) must call the same tag/path revalidation — document or centralize in one service.
Multi-instance: if self-hosted replicas do not share Next Data Cache, validate
revalidateTagbehavior or add external cache (Redis) for hot HTML.Images / Uploadcare:
/cdn/...redirect to CDN — traffic still billed upstream; optional: stricter presets,next/image, or self-proxy only if egress economics justify it.Optional Redis for article JSON/HTML beyond Next cache if profiling shows DB+render still hot at scale.
Phase 5 — Accessibility and Compliance
1. Accessibility baseline (WCAG 2.2 AA)
Run full keyboard navigation audit on editor and public pages.
Improve semantic structure and ARIA usage where needed.
Add automated a11y checks (axe + lint rules in CI).
Add manual accessibility QA checklist.
Assign owner and audit cadence for recurring accessibility validation.
2. Privacy and consent
Define GDPR/CCPA data collection policy for analytics and telemetry.
Implement cookie consent flow if non-essential tracking is enabled.
Document data retention and user opt-out behavior.
Phase 6 — Content Distribution and Growth
1. AI referral and citation tracking
Add referrer classification for AI sources (Perplexity, ChatGPT, Copilot, Gemini, etc.).
Build acquisition dashboard segment for AI-origin sessions.
Track landing page performance from AI traffic.
2. Public article listing UX
Keep SSR first page for SEO.
Add client continuation pagination (“Load more” or infinite scroll) from SSR cursor.
Add filter/sort state persistence in URL.
3. Internationalization readiness
Introduce key-based UI translations and local locale files for author/public pages.
Add i18n conventions for content-related labels, validation messages, and notifications.
Define migration plan for replacing hardcoded UI strings with translation keys.
Phase 7 — Locale, content language, and user-facing language
Goal: one coherent story for document lang, user/session locale, formatting (Intl), and article content language (SEO/a11y). Multilingual UI string catalogs stay aligned with Phase 6 §3; this phase focuses on locale negotiation and content-level language.
1. Site default and user locale
Single source of truth for default locale (e.g.
NEXT_PUBLIC_DEFAULT_LOCALE/seoConfig) driving rootand server-sideIntldefaults.Optional: read
Accept-Languagein middleware + persist choice (cookie or user profile) for first-time visitors.Optional later:
app/[locale]URL segment and redirects; document trade-offs (SEO, caching) before implementation.
2. Article content language (optional field; powers metadata + rendering)
Optional field on revision or SEO step: primary language of the article (BCP 47, e.g.
ru,en-US).Public (and preview/private) article markup: set
langon article wrapper when known; fallback to site default.Metadata + JSON-LD:
inLanguage; dates/numbers use article locale when set, else site default.When/if translations exist:
hreflangand locale-aware alternates (sitemap +); until then, single-language sites can ship without alternates.
3. Consistency and docs
Short doc: relationship between site locale, user preference, article language, and UI translations (Phase 6).
Definition of Done (Cross-cutting)
For each roadmap item:
Typecheck and lint pass.
Unit/integration tests added or updated.
Docs updated (
READMEordocs/).Error handling and logs included.
Backward compatibility considered.
Owner and target review date assigned.
Nice-to-Have (Later)
Lighthouse CI quality gate (warn mode first, then fail mode).
Advanced media management abstraction (Uploadcare adapter + provider interface).
Web Push + basic offline/cache support via service worker (
public/sw.js).Offline-first strategy beyond push service worker.