OpportunitiesEntities
Docs
    Ring Platform

    Decentralized Self-building Future

    Sign In
    Entities
    Opportunities
    Store
    Docs
    Platform Concepts
    RING EconomySonoratek LLCGlobal ImpactAI Meets Web3
    Get Started
    Quick StartCalculatorRoadmap
    Privacy|Contact
    v1.106.26|Sonoratek LLC

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    Membership & Credits
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Credit Rewards
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    Page Curtain
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Project configuration
    Public environment variables
    Order Lab secrets
    WalletConnect Project ID (Reown Cloud)
    Supported services
    NODUS wiki (project knowledge)
    Configuration playbook
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    News Kingdom architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server
    OSS vs enterprise

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    Membership & Credits
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Credit Rewards
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    Page Curtain
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Project configuration
    Public environment variables
    Order Lab secrets
    WalletConnect Project ID (Reown Cloud)
    Supported services
    NODUS wiki (project knowledge)
    Configuration playbook
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    News Kingdom architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server
    OSS vs enterprise

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    Membership & Credits
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Credit Rewards
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    Page Curtain
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Project configuration
    Public environment variables
    Order Lab secrets
    WalletConnect Project ID (Reown Cloud)
    Supported services
    NODUS wiki (project knowledge)
    Configuration playbook
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    News Kingdom architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server
    OSS vs enterprise

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)
    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Member Blogs

    URL change: member articles now live at /{username}/{slug}, next to the member's profile at /{username}. The older /blog/{username}/{slug} pattern is gone and there is no /blog route. Use the Founder / Developer tabs in the sidebar to filter this page.

    Member blogs turn your clone's news module into a publishing space for every member. Articles are stored in the same news table as official news, tagged with the author's handle, and served on the author's own URL. If an author wants the main feed, they request promotion and the article enters the News Kingdom pipeline.

    Earlier docs saidCurrent behavior
    /blog/{username} and /blog/{username}/{slug}/{username} (profile) and /{username}/{slug} (article)
    Paid membership unlocks the blogWriting needs role member or higher. A paid membership upgrade grants member
    Profile shows a Blog link and a Telegram badgeNot in the current profile page. Authors share their link from /my-news
    Without membership, the blog route returns 404An article returns 404 when it is not published, the handle or slug does not match, or the locale differs

    Why this matters for your clone

    • Members become publishers. Every paying member gets a personal space with a clean, shareable URL under your domain.
    • One identity. The same username carries the profile, the articles and the author listing.
    • A content funnel you control. Good posts can be promoted to your front page for a fee. You approve every one.
    • Readers help improve posts. Other members can propose revisions. The author decides what to accept.

    News Kingdom

    Scoring, paid promotion and Telegram approval for the main feed.

    Public profile

    The /{username} page that sits next to the member's articles.

    Username reservation

    Routes and modules (verified in ring/web)

    ConcernPath
    Article pageapp/[locale]/[username]/[slug]/page.tsx
    Profile pageapp/[locale]/[username]/page.tsx
    Author listingapp/[locale]/news/author/[username]/page.tsx (up to 50 published, via getMyArticles)
    Member editorapp/[locale]/(protected)/news/create/page.tsx (ArticleEditor audience="member")
    Member workspaceapp/[locale]/(protected)/my-news/ with components/layout/rails/my-news-rail.tsx
    Amendments inbox/my-news/{articleId}/amendments (ROUTES.MY_NEWS_AMENDMENTS)
    Handle and path helpers (, , )

    Frequently asked questions

    Migration

    Will old /blog links still work?

    No. There is no /blog route or redirect in ring/web. Update shared links to /{username}/{slug}.

    Impact

    Can readers bookmark member articles?

    Favorites run through GET and POST /api/user/favorites with the useContentFavorite hook. That hook is wired into the news article view (components/wrappers/news-article-wrapper.tsx), not into the /{username}/{slug} page.

    Known gaps

    Related documentation

    Related documentation

    News Kingdom architecture

    Next-step: what happens after an author requests main-page promotion.

    News Module

    Prerequisite: the news module that stores and renders member articles.

    Public Profile Pages

    Same-workflow: the /{username} page that shares the member's handle.

    Username Reservation System

    Depends-on: how handles are chosen and protected, which decides blog URLs.

    1. Docs
    2. /Features
    3. /Member Blogs

    Updated Oct 1, 20265 min listen

    Member Blogs

    URL change: member articles now live at /{username}/{slug}, next to the member's profile at /{username}. The older /blog/{username}/{slug} pattern is gone and there is no /blog route. Use the Founder / Developer tabs in the sidebar to filter this page.

    Member blogs turn your clone's news module into a publishing space for every member. Articles are stored in the same news table as official news, tagged with the author's handle, and served on the author's own URL. If an author wants the main feed, they request promotion and the article enters the News Kingdom pipeline.

    Earlier docs saidCurrent behavior
    /blog/{username} and /blog/{username}/{slug}/{username} (profile) and /{username}/{slug} (article)
    Paid membership unlocks the blogWriting needs role member or higher. A paid membership upgrade grants member
    Profile shows a Blog link and a Telegram badgeNot in the current profile page. Authors share their link from /my-news
    Without membership, the blog route returns 404An article returns 404 when it is not published, the handle or slug does not match, or the locale differs

    Why this matters for your clone

    • Members become publishers. Every paying member gets a personal space with a clean, shareable URL under your domain.
    • One identity. The same username carries the profile, the articles and the author listing.
    • A content funnel you control. Good posts can be promoted to your front page for a fee. You approve every one.
    • Readers help improve posts. Other members can propose revisions. The author decides what to accept.

    News Kingdom

    Scoring, paid promotion and Telegram approval for the main feed.

    Public profile

    The /{username} page that sits next to the member's articles.

    Username reservation

    Routes and modules (verified in ring/web)

    ConcernPath
    Article pageapp/[locale]/[username]/[slug]/page.tsx
    Profile pageapp/[locale]/[username]/page.tsx
    Author listingapp/[locale]/news/author/[username]/page.tsx (up to 50 published, via getMyArticles)
    Member editorapp/[locale]/(protected)/news/create/page.tsx (ArticleEditor audience="member")
    Member workspaceapp/[locale]/(protected)/my-news/ with components/layout/rails/my-news-rail.tsx
    Amendments inbox/my-news/{articleId}/amendments (ROUTES.MY_NEWS_AMENDMENTS)
    Handle and path helpers (, , )

    Frequently asked questions

    Migration

    Will old /blog links still work?

    No. There is no /blog route or redirect in ring/web. Update shared links to /{username}/{slug}.

    Impact

    Can readers bookmark member articles?

    Favorites run through GET and POST /api/user/favorites with the useContentFavorite hook. That hook is wired into the news article view (components/wrappers/news-article-wrapper.tsx), not into the /{username}/{slug} page.

    Known gaps

    Related documentation

    Related documentation

    News Kingdom architecture

    Next-step: what happens after an author requests main-page promotion.

    News Module

    Prerequisite: the news module that stores and renders member articles.

    Public Profile Pages

    Same-workflow: the /{username} page that shares the member's handle.

    Username Reservation System

    Depends-on: how handles are chosen and protected, which decides blog URLs.

    1. Docs
    2. /Features
    3. /Member Blogs

    Updated Oct 1, 20265 min listen

    Member Blogs

    URL change: member articles now live at /{username}/{slug}, next to the member's profile at /{username}. The older /blog/{username}/{slug} pattern is gone and there is no /blog route. Use the Founder / Developer tabs in the sidebar to filter this page.

    Member blogs turn your clone's news module into a publishing space for every member. Articles are stored in the same news table as official news, tagged with the author's handle, and served on the author's own URL. If an author wants the main feed, they request promotion and the article enters the News Kingdom pipeline.

    Earlier docs saidCurrent behavior
    /blog/{username} and /blog/{username}/{slug}/{username} (profile) and /{username}/{slug} (article)
    Paid membership unlocks the blogWriting needs role member or higher. A paid membership upgrade grants member
    Profile shows a Blog link and a Telegram badgeNot in the current profile page. Authors share their link from /my-news
    Without membership, the blog route returns 404An article returns 404 when it is not published, the handle or slug does not match, or the locale differs

    Why this matters for your clone

    • Members become publishers. Every paying member gets a personal space with a clean, shareable URL under your domain.
    • One identity. The same username carries the profile, the articles and the author listing.
    • A content funnel you control. Good posts can be promoted to your front page for a fee. You approve every one.
    • Readers help improve posts. Other members can propose revisions. The author decides what to accept.

    News Kingdom

    Scoring, paid promotion and Telegram approval for the main feed.

    Public profile

    The /{username} page that sits next to the member's articles.

    Username reservation

    Routes and modules (verified in ring/web)

    ConcernPath
    Article pageapp/[locale]/[username]/[slug]/page.tsx
    Profile pageapp/[locale]/[username]/page.tsx
    Author listingapp/[locale]/news/author/[username]/page.tsx (up to 50 published, via getMyArticles)
    Member editorapp/[locale]/(protected)/news/create/page.tsx (ArticleEditor audience="member")
    Member workspaceapp/[locale]/(protected)/my-news/ with components/layout/rails/my-news-rail.tsx
    Amendments inbox/my-news/{articleId}/amendments (ROUTES.MY_NEWS_AMENDMENTS)
    Handle and path helpers (, , )

    Frequently asked questions

    Migration

    Will old /blog links still work?

    No. There is no /blog route or redirect in ring/web. Update shared links to /{username}/{slug}.

    Impact

    Can readers bookmark member articles?

    Favorites run through GET and POST /api/user/favorites with the useContentFavorite hook. That hook is wired into the news article view (components/wrappers/news-article-wrapper.tsx), not into the /{username}/{slug} page.

    Known gaps

    Related documentation

    Related documentation

    News Kingdom architecture

    Next-step: what happens after an author requests main-page promotion.

    News Module

    Prerequisite: the news module that stores and renders member articles.

    Public Profile Pages

    Same-workflow: the /{username} page that shares the member's handle.

    Username Reservation System

    Depends-on: how handles are chosen and protected, which decides blog URLs.

    1. Docs
    2. /Features
    3. /Member Blogs

    Updated Oct 1, 20265 min listen

    Handles decide blog URLs, so reserved names matter.

    Subscriptions

    The paid path that lifts a user to the member role.

    Typical scenarios

    1. Expert community. Members write long-form posts under their own handle, and the best ones are promoted to the front page.
    2. Cooperative newsletter. Each producer keeps a blog. The admin team picks stories for the main feed.
    3. Membership incentive. Free users can read. Writing is a benefit of paid membership.

    Where members work

    SurfacePath
    Write a new article/news/create
    Manage, share and promote/my-news
    Public article/{username}/{slug}
    All articles by one author/news/author/{username}
    lib/blog/blog-path.ts
    normalizeBlogHandle
    profileArticlePathname
    profileArticleHref
    Absolute URLlib/site-branding.ts localeBlogArticleUrl(locale, username, slug)
    Save actionapp/_actions/news.ts
    Permissionsfeatures/news/lib/news-permissions.ts

    How an article resolves

    The article page looks up one row in news that matches all four filters: blogUsername == normalizeBlogHandle(username), slug, locale and status == 'published'. If no row matches, it calls notFound() and the metadata falls back to noindex. Handles are stored with a leading @, so /en/alice/hello looks for blogUsername: '@alice'.

    blogUsername is stamped only on create, and only when the session user has a username. Articles written before the author picked a username never get a handle, so they will not resolve at /{username}/{slug}. The /my-news rail shows a set-username prompt for this case.

    Static routes such as /store, /news or /about take priority over the dynamic [username] segment. A username that matches a static route cannot own a profile URL.

    Permissions

    ActionRule
    CreatecanCreateNewsArticle: role member or higher, platform admin, or confidential
    Edit or deletePlatform admin or the article author
    Visibility site-widePlatform admins only. Members reach it through promotion approval
    Visibility confidentialUsers with confidential access only
    featuredForced to false for non-admins on save
    Propose a revisionSigned-in non-author with canProposeRevision, on published articles

    Write, publish, promote

    1. 1

      Create

      A member opens /news/create. On save, app/_actions/news.ts writes the article through createNewsArticle() with blogUsername and records the first version commit (lib/versioning).

    2. 2

      Publish and share

      Set status: 'published'. The /my-news rail builds the public link from ROUTES.PUBLIC_PROFILE(handle) and offers a copy-link button.

    3. 3

      Promote (optional)

      features/news/components/news-promotion-panel.tsx calls POST /api/news/promotion/submit with { articleId }. Only the author may submit. See News Kingdom for scoring, payment and approval.

    Each article view is counted by recordArticlePageView() inside after(), so the count never blocks rendering.

    Page Curtain

    See-also: product offers and author commission on member posts.

    Handles decide blog URLs, so reserved names matter.

    Subscriptions

    The paid path that lifts a user to the member role.

    Typical scenarios

    1. Expert community. Members write long-form posts under their own handle, and the best ones are promoted to the front page.
    2. Cooperative newsletter. Each producer keeps a blog. The admin team picks stories for the main feed.
    3. Membership incentive. Free users can read. Writing is a benefit of paid membership.

    Where members work

    SurfacePath
    Write a new article/news/create
    Manage, share and promote/my-news
    Public article/{username}/{slug}
    All articles by one author/news/author/{username}
    lib/blog/blog-path.ts
    normalizeBlogHandle
    profileArticlePathname
    profileArticleHref
    Absolute URLlib/site-branding.ts localeBlogArticleUrl(locale, username, slug)
    Save actionapp/_actions/news.ts
    Permissionsfeatures/news/lib/news-permissions.ts

    How an article resolves

    The article page looks up one row in news that matches all four filters: blogUsername == normalizeBlogHandle(username), slug, locale and status == 'published'. If no row matches, it calls notFound() and the metadata falls back to noindex. Handles are stored with a leading @, so /en/alice/hello looks for blogUsername: '@alice'.

    blogUsername is stamped only on create, and only when the session user has a username. Articles written before the author picked a username never get a handle, so they will not resolve at /{username}/{slug}. The /my-news rail shows a set-username prompt for this case.

    Static routes such as /store, /news or /about take priority over the dynamic [username] segment. A username that matches a static route cannot own a profile URL.

    Permissions

    ActionRule
    CreatecanCreateNewsArticle: role member or higher, platform admin, or confidential
    Edit or deletePlatform admin or the article author
    Visibility site-widePlatform admins only. Members reach it through promotion approval
    Visibility confidentialUsers with confidential access only
    featuredForced to false for non-admins on save
    Propose a revisionSigned-in non-author with canProposeRevision, on published articles

    Write, publish, promote

    1. 1

      Create

      A member opens /news/create. On save, app/_actions/news.ts writes the article through createNewsArticle() with blogUsername and records the first version commit (lib/versioning).

    2. 2

      Publish and share

      Set status: 'published'. The /my-news rail builds the public link from ROUTES.PUBLIC_PROFILE(handle) and offers a copy-link button.

    3. 3

      Promote (optional)

      features/news/components/news-promotion-panel.tsx calls POST /api/news/promotion/submit with { articleId }. Only the author may submit. See News Kingdom for scoring, payment and approval.

    Each article view is counted by recordArticlePageView() inside after(), so the count never blocks rendering.

    Page Curtain

    See-also: product offers and author commission on member posts.

    Handles decide blog URLs, so reserved names matter.

    Subscriptions

    The paid path that lifts a user to the member role.

    Typical scenarios

    1. Expert community. Members write long-form posts under their own handle, and the best ones are promoted to the front page.
    2. Cooperative newsletter. Each producer keeps a blog. The admin team picks stories for the main feed.
    3. Membership incentive. Free users can read. Writing is a benefit of paid membership.

    Where members work

    SurfacePath
    Write a new article/news/create
    Manage, share and promote/my-news
    Public article/{username}/{slug}
    All articles by one author/news/author/{username}
    lib/blog/blog-path.ts
    normalizeBlogHandle
    profileArticlePathname
    profileArticleHref
    Absolute URLlib/site-branding.ts localeBlogArticleUrl(locale, username, slug)
    Save actionapp/_actions/news.ts
    Permissionsfeatures/news/lib/news-permissions.ts

    How an article resolves

    The article page looks up one row in news that matches all four filters: blogUsername == normalizeBlogHandle(username), slug, locale and status == 'published'. If no row matches, it calls notFound() and the metadata falls back to noindex. Handles are stored with a leading @, so /en/alice/hello looks for blogUsername: '@alice'.

    blogUsername is stamped only on create, and only when the session user has a username. Articles written before the author picked a username never get a handle, so they will not resolve at /{username}/{slug}. The /my-news rail shows a set-username prompt for this case.

    Static routes such as /store, /news or /about take priority over the dynamic [username] segment. A username that matches a static route cannot own a profile URL.

    Permissions

    ActionRule
    CreatecanCreateNewsArticle: role member or higher, platform admin, or confidential
    Edit or deletePlatform admin or the article author
    Visibility site-widePlatform admins only. Members reach it through promotion approval
    Visibility confidentialUsers with confidential access only
    featuredForced to false for non-admins on save
    Propose a revisionSigned-in non-author with canProposeRevision, on published articles

    Write, publish, promote

    1. 1

      Create

      A member opens /news/create. On save, app/_actions/news.ts writes the article through createNewsArticle() with blogUsername and records the first version commit (lib/versioning).

    2. 2

      Publish and share

      Set status: 'published'. The /my-news rail builds the public link from ROUTES.PUBLIC_PROFILE(handle) and offers a copy-link button.

    3. 3

      Promote (optional)

      features/news/components/news-promotion-panel.tsx calls POST /api/news/promotion/submit with { articleId }. Only the author may submit. See News Kingdom for scoring, payment and approval.

    Each article view is counted by recordArticlePageView() inside after(), so the count never blocks rendering.

    Page Curtain

    See-also: product offers and author commission on member posts.