Concepts, value, and typical clone scenarios — less code.
Concepts, value, and typical clone scenarios — less code.
Підготовка контенту платформи Ring
Підготовка контенту платформи Ring
Підготовка контенту платформи Ring
Ring news is a full publishing surface: member authors create articles, promote to the main page when enabled, and readers engage on public and blog URLs. As of 2026-07-16, article bodies are authored in TipTap (TinyMCE removed), and members can propose pending revisions on published articles for the author to accept or reject.
Use the Founder / Developer tabs in the docs sidebar to filter this page.
Migrations, promotion workflow, scoring, and Telegram callbacks.
Per-user blog paths via blogUsername and public article URLs.
Autonomous draft pipeline, featured images, TTS, and locale fan-out.
TipTap publications editor (equations, versions) — separate from news articles.
| Surface | What it does |
|---|---|
| TipTap NewsEditor | Slash / commands, paste URL embeds, Mood Player widget, image upload, AI generate image, debounced autosave |
| My News | /my-news — author dashboard, visit charts, create/edit, Proposed amendments: $count |
| Create | /news/create (members) and admin create — shared ArticleEditor |
| Revise | Revise on published articles → /news/[slug]/revise → pending-revision (live article unchanged until Accept) |
| Amendments | Author preview with pale red/green hunks → Accept applies content / Reject closes |
| Public render | /news/[slug] and /[username]/[slug] — HTML allowlisted via sanitizeNewsHtml |
/my-news) and create an article, or go to /news/create./ for headings, lists, image, embed, or generate image.Members improve accuracy without silent overwrite. Authors stay in control of the live article.
| Action | Who |
|---|---|
| Create / edit own | Member+ (and admins) |
Same-workflow: member blogs share public article surfaces with news.
Deep-dive: promotion, Telegram, and News Kingdom migrations.
Next-step: generative newsroom tooling on the same clone.
See-also: publications TipTap — not the news HTML editor.
News Kingdom migrations (002 / 003) and promotion remain required for paid main-page flows. TipTap + pending-revision ship on the news feature surface without changing NewsStatus (draft | published | archived | deleted).
Ring news is a full publishing surface: member authors create articles, promote to the main page when enabled, and readers engage on public and blog URLs. As of 2026-07-16, article bodies are authored in TipTap (TinyMCE removed), and members can propose pending revisions on published articles for the author to accept or reject.
Use the Founder / Developer tabs in the docs sidebar to filter this page.
Migrations, promotion workflow, scoring, and Telegram callbacks.
Per-user blog paths via blogUsername and public article URLs.
Autonomous draft pipeline, featured images, TTS, and locale fan-out.
TipTap publications editor (equations, versions) — separate from news articles.
| Surface | What it does |
|---|---|
| TipTap NewsEditor | Slash / commands, paste URL embeds, Mood Player widget, image upload, AI generate image, debounced autosave |
| My News | /my-news — author dashboard, visit charts, create/edit, Proposed amendments: $count |
| Create | /news/create (members) and admin create — shared ArticleEditor |
| Revise | Revise on published articles → /news/[slug]/revise → pending-revision (live article unchanged until Accept) |
| Amendments | Author preview with pale red/green hunks → Accept applies content / Reject closes |
| Public render | /news/[slug] and /[username]/[slug] — HTML allowlisted via sanitizeNewsHtml |
/my-news) and create an article, or go to /news/create./ for headings, lists, image, embed, or generate image.Members improve accuracy without silent overwrite. Authors stay in control of the live article.
| Action | Who |
|---|---|
| Create / edit own | Member+ (and admins) |
Same-workflow: member blogs share public article surfaces with news.
Deep-dive: promotion, Telegram, and News Kingdom migrations.
Next-step: generative newsroom tooling on the same clone.
See-also: publications TipTap — not the news HTML editor.
News Kingdom migrations (002 / 003) and promotion remain required for paid main-page flows. TipTap + pending-revision ship on the news feature surface without changing NewsStatus (draft | published | archived | deleted).
Ring news is a full publishing surface: member authors create articles, promote to the main page when enabled, and readers engage on public and blog URLs. As of 2026-07-16, article bodies are authored in TipTap (TinyMCE removed), and members can propose pending revisions on published articles for the author to accept or reject.
Use the Founder / Developer tabs in the docs sidebar to filter this page.
Migrations, promotion workflow, scoring, and Telegram callbacks.
Per-user blog paths via blogUsername and public article URLs.
Autonomous draft pipeline, featured images, TTS, and locale fan-out.
TipTap publications editor (equations, versions) — separate from news articles.
| Surface | What it does |
|---|---|
| TipTap NewsEditor | Slash / commands, paste URL embeds, Mood Player widget, image upload, AI generate image, debounced autosave |
| My News | /my-news — author dashboard, visit charts, create/edit, Proposed amendments: $count |
| Create | /news/create (members) and admin create — shared ArticleEditor |
| Revise | Revise on published articles → /news/[slug]/revise → pending-revision (live article unchanged until Accept) |
| Amendments | Author preview with pale red/green hunks → Accept applies content / Reject closes |
| Public render | /news/[slug] and /[username]/[slug] — HTML allowlisted via sanitizeNewsHtml |
/my-news) and create an article, or go to /news/create./ for headings, lists, image, embed, or generate image.Members improve accuracy without silent overwrite. Authors stay in control of the live article.
| Action | Who |
|---|---|
| Create / edit own | Member+ (and admins) |
Same-workflow: member blogs share public article surfaces with news.
Deep-dive: promotion, Telegram, and News Kingdom migrations.
Next-step: generative newsroom tooling on the same clone.
See-also: publications TipTap — not the news HTML editor.
News Kingdom migrations (002 / 003) and promotion remain required for paid main-page flows. TipTap + pending-revision ship on the news feature surface without changing NewsStatus (draft | published | archived | deleted).
| Propose revision on published | Member+ (not needed for the author — they Edit) |
| Accept / reject amendments | Article author or platform admin |
| Invite co-editors by email | Scaffolded APIs only — not a full UI yet |
features/news/components/article-editor.tsx| Form shell; mounts TipTapNewsEditor |
features/news/components/editor/rich-text-editor.tsx | Re-exports TipTapNewsEditor (legacy name) |
Embed preview (authenticated): POST /api/news/embed-preview with { url } — OG title/description/image when fetch succeeds.
Autosave: debounced PUT /api/news/[id] with { content } (HTML). Storage remains HTML on news.content for public render compatibility; TipTap JSON is editor-internal.
Dependency: @tiptap/suggestion (TipTap 3.x).
| Route helper | Path |
|---|---|
ROUTES.MY_NEWS | /my-news |
ROUTES.NEWS_CREATE | /news/create |
ROUTES.NEWS_REVISE(slug) | /news/[slug]/revise |
ROUTES.MY_NEWS_AMENDMENTS(articleId) | /my-news/[articleId]/amendments |
ROUTES.MY_NEWS_AMENDMENT_PREVIEW(...) | /my-news/[articleId]/amendments/[revisionId] |
UI: app/[locale]/(protected)/my-news/, components/wrappers/my-news-wrapper.tsx.
Collection: news_revisions via DatabaseService createDoc / queryDocs / updateDoc.
| Method | Route | Behavior |
|---|---|---|
GET | /api/news/[id]/revisions?status=pending-revision | List |
POST | /api/news/[id]/revisions | Body { proposedContent } → status pending-revision |
GET | /api/news/revisions/[revisionId] | One revision |
PATCH | /api/news/revisions/[revisionId] | { action: 'accept' | 'reject' } — accept writes proposedContent onto the article |
Service: features/news/services/revision-service.ts
Permissions: features/news/lib/news-collaboration-permissions.ts (canProposeRevision, canResolveRevision)
Types: features/news/types/collaboration.ts
Diff UI: features/news/lib/revision-diff.ts + features/news/components/revision-hunk-preview.tsx (ported from file-registry-viewer LCS)
sanitizeNewsHtml strips scripts/handlers and allowlists tags including iframe (YouTube nocookie + Rumble hosts), ring-embed, and ring-mood-player. Used on /news/[slug] and /[username]/[slug].
| Piece | Status |
|---|---|
lib/database/schema/news-collaboration.sql | Conceptual schema notes |
GET/POST /api/news/[id]/collaborators | 501 stub |
GET/POST /api/news/collaboration/invite/[token] | 501 stub |
Roles owner|admin|editor|reviewer|viewer | Types only (Zemna Phase 4 map) |
features/news/lib/news-collab-gate.ts + existing hooks/use-collaboration.ts / Tunnel Yjs provider. Channel convention: collab:news:{articleId}. Requires NEXT_PUBLIC_COLLAB_ENABLED=true and native WSS — TipTap Collaboration extensions not mounted on news yet. See Real Time.
features/news/services/news-service.ts — createNewsArticle, updateNewsArticle, getMyArticles, getUserArticleStats, recordArticlePageView, etc. Promotion and Telegram flows: News Kingdom.
Depends-on: Tunnel / future CRDT collab channels for news.
| Propose revision on published | Member+ (not needed for the author — they Edit) |
| Accept / reject amendments | Article author or platform admin |
| Invite co-editors by email | Scaffolded APIs only — not a full UI yet |
features/news/components/article-editor.tsx| Form shell; mounts TipTapNewsEditor |
features/news/components/editor/rich-text-editor.tsx | Re-exports TipTapNewsEditor (legacy name) |
Embed preview (authenticated): POST /api/news/embed-preview with { url } — OG title/description/image when fetch succeeds.
Autosave: debounced PUT /api/news/[id] with { content } (HTML). Storage remains HTML on news.content for public render compatibility; TipTap JSON is editor-internal.
Dependency: @tiptap/suggestion (TipTap 3.x).
| Route helper | Path |
|---|---|
ROUTES.MY_NEWS | /my-news |
ROUTES.NEWS_CREATE | /news/create |
ROUTES.NEWS_REVISE(slug) | /news/[slug]/revise |
ROUTES.MY_NEWS_AMENDMENTS(articleId) | /my-news/[articleId]/amendments |
ROUTES.MY_NEWS_AMENDMENT_PREVIEW(...) | /my-news/[articleId]/amendments/[revisionId] |
UI: app/[locale]/(protected)/my-news/, components/wrappers/my-news-wrapper.tsx.
Collection: news_revisions via DatabaseService createDoc / queryDocs / updateDoc.
| Method | Route | Behavior |
|---|---|---|
GET | /api/news/[id]/revisions?status=pending-revision | List |
POST | /api/news/[id]/revisions | Body { proposedContent } → status pending-revision |
GET | /api/news/revisions/[revisionId] | One revision |
PATCH | /api/news/revisions/[revisionId] | { action: 'accept' | 'reject' } — accept writes proposedContent onto the article |
Service: features/news/services/revision-service.ts
Permissions: features/news/lib/news-collaboration-permissions.ts (canProposeRevision, canResolveRevision)
Types: features/news/types/collaboration.ts
Diff UI: features/news/lib/revision-diff.ts + features/news/components/revision-hunk-preview.tsx (ported from file-registry-viewer LCS)
sanitizeNewsHtml strips scripts/handlers and allowlists tags including iframe (YouTube nocookie + Rumble hosts), ring-embed, and ring-mood-player. Used on /news/[slug] and /[username]/[slug].
| Piece | Status |
|---|---|
lib/database/schema/news-collaboration.sql | Conceptual schema notes |
GET/POST /api/news/[id]/collaborators | 501 stub |
GET/POST /api/news/collaboration/invite/[token] | 501 stub |
Roles owner|admin|editor|reviewer|viewer | Types only (Zemna Phase 4 map) |
features/news/lib/news-collab-gate.ts + existing hooks/use-collaboration.ts / Tunnel Yjs provider. Channel convention: collab:news:{articleId}. Requires NEXT_PUBLIC_COLLAB_ENABLED=true and native WSS — TipTap Collaboration extensions not mounted on news yet. See Real Time.
features/news/services/news-service.ts — createNewsArticle, updateNewsArticle, getMyArticles, getUserArticleStats, recordArticlePageView, etc. Promotion and Telegram flows: News Kingdom.
Depends-on: Tunnel / future CRDT collab channels for news.
| Propose revision on published | Member+ (not needed for the author — they Edit) |
| Accept / reject amendments | Article author or platform admin |
| Invite co-editors by email | Scaffolded APIs only — not a full UI yet |
features/news/components/article-editor.tsx| Form shell; mounts TipTapNewsEditor |
features/news/components/editor/rich-text-editor.tsx | Re-exports TipTapNewsEditor (legacy name) |
Embed preview (authenticated): POST /api/news/embed-preview with { url } — OG title/description/image when fetch succeeds.
Autosave: debounced PUT /api/news/[id] with { content } (HTML). Storage remains HTML on news.content for public render compatibility; TipTap JSON is editor-internal.
Dependency: @tiptap/suggestion (TipTap 3.x).
| Route helper | Path |
|---|---|
ROUTES.MY_NEWS | /my-news |
ROUTES.NEWS_CREATE | /news/create |
ROUTES.NEWS_REVISE(slug) | /news/[slug]/revise |
ROUTES.MY_NEWS_AMENDMENTS(articleId) | /my-news/[articleId]/amendments |
ROUTES.MY_NEWS_AMENDMENT_PREVIEW(...) | /my-news/[articleId]/amendments/[revisionId] |
UI: app/[locale]/(protected)/my-news/, components/wrappers/my-news-wrapper.tsx.
Collection: news_revisions via DatabaseService createDoc / queryDocs / updateDoc.
| Method | Route | Behavior |
|---|---|---|
GET | /api/news/[id]/revisions?status=pending-revision | List |
POST | /api/news/[id]/revisions | Body { proposedContent } → status pending-revision |
GET | /api/news/revisions/[revisionId] | One revision |
PATCH | /api/news/revisions/[revisionId] | { action: 'accept' | 'reject' } — accept writes proposedContent onto the article |
Service: features/news/services/revision-service.ts
Permissions: features/news/lib/news-collaboration-permissions.ts (canProposeRevision, canResolveRevision)
Types: features/news/types/collaboration.ts
Diff UI: features/news/lib/revision-diff.ts + features/news/components/revision-hunk-preview.tsx (ported from file-registry-viewer LCS)
sanitizeNewsHtml strips scripts/handlers and allowlists tags including iframe (YouTube nocookie + Rumble hosts), ring-embed, and ring-mood-player. Used on /news/[slug] and /[username]/[slug].
| Piece | Status |
|---|---|
lib/database/schema/news-collaboration.sql | Conceptual schema notes |
GET/POST /api/news/[id]/collaborators | 501 stub |
GET/POST /api/news/collaboration/invite/[token] | 501 stub |
Roles owner|admin|editor|reviewer|viewer | Types only (Zemna Phase 4 map) |
features/news/lib/news-collab-gate.ts + existing hooks/use-collaboration.ts / Tunnel Yjs provider. Channel convention: collab:news:{articleId}. Requires NEXT_PUBLIC_COLLAB_ENABLED=true and native WSS — TipTap Collaboration extensions not mounted on news yet. See Real Time.
features/news/services/news-service.ts — createNewsArticle, updateNewsArticle, getMyArticles, getUserArticleStats, recordArticlePageView, etc. Promotion and Telegram flows: News Kingdom.
Depends-on: Tunnel / future CRDT collab channels for news.