ВозможностиОрганизации
Документация
    Ring Platform

    Децентрализованное самостроящееся будущее

    Войти
    Организации
    Возможности
    Магазин
    Документация
    Концепции платформы
    RING ЭкономикаSonoratek LLCГлобальное влияниеAI встречает Web3
    Начать
    Быстрый стартКалькуляторДорожная карта
    Конфиденциальность|Контакты
    v1.104.26|Sonoratek LLC

    Documentation

    Концепции, ценность и типичные сценарии клонирования — меньше кода.

    Добро пожаловать в Ring
    Краткий справочник
    С чего начать
    Предварительные требования
    Установка
    Первый успех
    Следующие шаги
    Функции
    Store
    Склад и остатки
    Управление вендорами
    Комиссии и расчёты
    SubscriptionConductor
    PaymentConductor
    Интеграция платежей
    Интеграция WayForPay
    Web3 Кошелек
    WalletConductor
    Реферальные коды (Refcodes)
    NFT Exhibition Marketplace
    Система Стейкинга Токенов
    Entities
    Opportunities
    AI Matcher
    Real-Time Messaging
    Peer Games
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Система Резервирования Имён Пользователей
    Научный редактор
    Notifications
    Push-уведомления через FCM (Ring)
    Email AI-CRM
    Протокол Tunnel
    Authentication
    Безопасность и соответствие
    Система локалей
    Мобильный Опыт
    Паттерны Оптимизации Производительности
    Примеры
    Quick Start
    Базовая настройка
    White Label
    Custom Branding
    Интеграция Web3
    Реальные Проекты
    Advanced Features
    Кастомизация
    Быстрый старт — ваш первый клон Ring
    Руководство по кастомизации
    Vertical Presets (SSOT)
    Руководство по Ringization
    Branding
    Темы оформления
    Features
    Localization
    Настройка токеномики
    Интеграция платёжного шлюза
    Референсные деплои Ring
    Конфигурация проекта
    Публичные переменные окружения
    Секреты Order Lab
    Project ID WalletConnect (Reown Cloud)
    Поддерживаемые сервисы
    Вики NODUS (знания проекта)
    Плейбук конфигурации
    Web3
    Token launch jurisdictions
    Кошелёк
    Советы по безопасности кошелька
    Интеграции
    Ethereum-кошельки (Wagmi v3)
    Развёртывание
    Развёртывание на собственном сервере
    Vercel
    Docker
    Конфигурация Окружения
    Мониторинг и аналитика
    Оптимизация производительности
    Резервное копирование и восстановление
    Архитектура
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    Архитектура PaymentConductor
    Wallet Conductor
    Архитектура News Kingdom
    Бекенд Сервисы
    Интеграция Firebase
    Разработка
    Ring MCP Server
    OSS и enterprise

    Быстрый вход (CTO · аудиторы · агенты)

    Приветствие — миссия и аудитории
    Краткий справочник
    С чего начать
    Архитектура и Auth.js
    Режимы бэкенда и базы данных (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безопасность и соответствие требованиям
    ringdom.org — база LegioX
    Исходный код — лицензия MIT (GitHub)

    Documentation

    Концепции, ценность и типичные сценарии клонирования — меньше кода.

    Добро пожаловать в Ring
    Краткий справочник
    С чего начать
    Предварительные требования
    Установка
    Первый успех
    Следующие шаги
    Функции
    Store
    Склад и остатки
    Управление вендорами
    Комиссии и расчёты
    SubscriptionConductor
    PaymentConductor
    Интеграция платежей
    Интеграция WayForPay
    Web3 Кошелек
    WalletConductor
    Реферальные коды (Refcodes)
    NFT Exhibition Marketplace
    Система Стейкинга Токенов
    Entities
    Opportunities
    AI Matcher
    Real-Time Messaging
    Peer Games
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Система Резервирования Имён Пользователей
    Научный редактор
    Notifications
    Push-уведомления через FCM (Ring)
    Email AI-CRM
    Протокол Tunnel
    Authentication
    Безопасность и соответствие
    Система локалей
    Мобильный Опыт
    Паттерны Оптимизации Производительности
    Примеры
    Quick Start
    Базовая настройка
    White Label
    Custom Branding
    Интеграция Web3
    Реальные Проекты
    Advanced Features
    Кастомизация
    Быстрый старт — ваш первый клон Ring
    Руководство по кастомизации
    Vertical Presets (SSOT)
    Руководство по Ringization
    Branding
    Темы оформления
    Features
    Localization
    Настройка токеномики
    Интеграция платёжного шлюза
    Референсные деплои Ring
    Конфигурация проекта
    Публичные переменные окружения
    Секреты Order Lab
    Project ID WalletConnect (Reown Cloud)
    Поддерживаемые сервисы
    Вики NODUS (знания проекта)
    Плейбук конфигурации
    Web3
    Token launch jurisdictions
    Кошелёк
    Советы по безопасности кошелька
    Интеграции
    Ethereum-кошельки (Wagmi v3)
    Развёртывание
    Развёртывание на собственном сервере
    Vercel
    Docker
    Конфигурация Окружения
    Мониторинг и аналитика
    Оптимизация производительности
    Резервное копирование и восстановление
    Архитектура
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    Архитектура PaymentConductor
    Wallet Conductor
    Архитектура News Kingdom
    Бекенд Сервисы
    Интеграция Firebase
    Разработка
    Ring MCP Server
    OSS и enterprise

    Быстрый вход (CTO · аудиторы · агенты)

    Приветствие — миссия и аудитории
    Краткий справочник
    С чего начать
    Архитектура и Auth.js
    Режимы бэкенда и базы данных (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безопасность и соответствие требованиям
    ringdom.org — база LegioX
    Исходный код — лицензия MIT (GitHub)

    Documentation

    Концепции, ценность и типичные сценарии клонирования — меньше кода.

    Добро пожаловать в Ring
    Краткий справочник
    С чего начать
    Предварительные требования
    Установка
    Первый успех
    Следующие шаги
    Функции
    Store
    Склад и остатки
    Управление вендорами
    Комиссии и расчёты
    SubscriptionConductor
    PaymentConductor
    Интеграция платежей
    Интеграция WayForPay
    Web3 Кошелек
    WalletConductor
    Реферальные коды (Refcodes)
    NFT Exhibition Marketplace
    Система Стейкинга Токенов
    Entities
    Opportunities
    AI Matcher
    Real-Time Messaging
    Peer Games
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Система Резервирования Имён Пользователей
    Научный редактор
    Notifications
    Push-уведомления через FCM (Ring)
    Email AI-CRM
    Протокол Tunnel
    Authentication
    Безопасность и соответствие
    Система локалей
    Мобильный Опыт
    Паттерны Оптимизации Производительности
    Примеры
    Quick Start
    Базовая настройка
    White Label
    Custom Branding
    Интеграция Web3
    Реальные Проекты
    Advanced Features
    Кастомизация
    Быстрый старт — ваш первый клон Ring
    Руководство по кастомизации
    Vertical Presets (SSOT)
    Руководство по Ringization
    Branding
    Темы оформления
    Features
    Localization
    Настройка токеномики
    Интеграция платёжного шлюза
    Референсные деплои Ring
    Конфигурация проекта
    Публичные переменные окружения
    Секреты Order Lab
    Project ID WalletConnect (Reown Cloud)
    Поддерживаемые сервисы
    Вики NODUS (знания проекта)
    Плейбук конфигурации
    Web3
    Token launch jurisdictions
    Кошелёк
    Советы по безопасности кошелька
    Интеграции
    Ethereum-кошельки (Wagmi v3)
    Развёртывание
    Развёртывание на собственном сервере
    Vercel
    Docker
    Конфигурация Окружения
    Мониторинг и аналитика
    Оптимизация производительности
    Резервное копирование и восстановление
    Архитектура
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    Архитектура PaymentConductor
    Wallet Conductor
    Архитектура News Kingdom
    Бекенд Сервисы
    Интеграция Firebase
    Разработка
    Ring MCP Server
    OSS и enterprise

    Быстрый вход (CTO · аудиторы · агенты)

    Приветствие — миссия и аудитории
    Краткий справочник
    С чего начать
    Архитектура и Auth.js
    Режимы бэкенда и базы данных (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безопасность и соответствие требованиям
    ringdom.org — база LegioX
    Исходный код — лицензия MIT (GitHub)
    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Блоги участников

    Изменение URL: статьи участников теперь размещаются по адресу /{username}/{slug}, рядом с профилем участника на /{username}. Старого шаблона /blog/{username}/{slug} больше нет, и маршрута /blog не существует. Используйте вкладки Основатель / Разработчик на боковой панели, чтобы отфильтровать эту страницу.

    Блоги участников превращают модуль новостей вашего клона в пространство для публикаций каждого участника. Статьи хранятся в той же таблице news, что и официальные новости, помечаются именем автора и отдаются по собственному URL автора. Если автор хочет попасть в главную ленту, он подаёт запрос на продвижение, и статья попадает в конвейер News Kingdom.

    Раньше в документацииТекущее поведение
    /blog/{username} и /blog/{username}/{slug}/{username} (профиль) и /{username}/{slug} (статья)
    Платное членство открывает блогДля написания нужна роль member или выше. Платное повышение членства выдаёт роль member
    Профиль показывает ссылку на блог и значок TelegramНа текущей странице профиля этого нет. Авторы делятся ссылкой из /my-news
    Без членства маршрут блога возвращает 404Статья возвращает 404, если она не опубликована, имя или slug не совпадают либо отличается язык

    Почему это важно для вашего клона

    • Участники становятся авторами. Каждый платный участник получает личное пространство с чистым URL под вашим доменом, которым удобно делиться.
    • Одна идентичность. Одно и то же имя пользователя объединяет профиль, статьи и список статей автора.
    • Контентная воронка под вашим контролем. Хорошие посты можно за плату продвинуть на первую полосу. Каждый из них одобряете вы.
    • Читатели помогают улучшать посты. Другие участники могут предлагать правки. Автор решает, что принять.

    News Kingdom

    Оценка, платное продвижение и одобрение в Telegram для главной ленты.

    Публичный профиль

    Страница /{username}, расположенная рядом со статьями участника.

    Резервирование имён пользователей

    Маршруты и модули (проверено в ring/web)

    АспектПуть
    Страница статьиapp/[locale]/[username]/[slug]/page.tsx
    Страница профиляapp/[locale]/[username]/page.tsx
    Список статей автораapp/[locale]/news/author/[username]/page.tsx (до 50 опубликованных, через getMyArticles)
    Редактор участникаapp/[locale]/(protected)/news/create/page.tsx (ArticleEditor audience="member")
    Рабочее пространство участникаapp/[locale]/(protected)/my-news/ с components/layout/rails/my-news-rail.tsx
    Входящие предложения правок/my-news/{articleId}/amendments (ROUTES.MY_NEWS_AMENDMENTS)
    Хелперы имён и путей (, , )

    Частые вопросы

    Миграция

    Будут ли работать старые ссылки /blog?

    Нет. В ring/web нет ни маршрута /blog, ни перенаправления. Обновите распространённые ссылки на /{username}/{slug}.

    Влияние

    Могут ли читатели добавлять статьи участников в закладки?

    Избранное работает через GET и POST /api/user/favorites с хуком useContentFavorite. Этот хук подключён к просмотру новостной статьи (components/wrappers/news-article-wrapper.tsx), а не к странице /{username}/{slug}.

    Известные пробелы

    Связанная документация

    Related documentation

    News Kingdom architecture

    Следующий шаг: что происходит после того, как автор подаёт запрос на продвижение на главную страницу.

    News Module

    Предпосылка: модуль новостей, который хранит и отображает статьи участников.

    Public Profile Pages

    Тот же процесс: страница /{username}, которая использует то же имя участника.

    Username Reservation System

    Зависимость: как выбираются и защищаются имена, от которых зависят URL блогов.

    1. Документация
    2. /Функции
    3. /Блоги участников

    Обновлено 1 окт. 2026 г.5 мин прослушивания

    Блоги участников

    Изменение URL: статьи участников теперь размещаются по адресу /{username}/{slug}, рядом с профилем участника на /{username}. Старого шаблона /blog/{username}/{slug} больше нет, и маршрута /blog не существует. Используйте вкладки Основатель / Разработчик на боковой панели, чтобы отфильтровать эту страницу.

    Блоги участников превращают модуль новостей вашего клона в пространство для публикаций каждого участника. Статьи хранятся в той же таблице news, что и официальные новости, помечаются именем автора и отдаются по собственному URL автора. Если автор хочет попасть в главную ленту, он подаёт запрос на продвижение, и статья попадает в конвейер News Kingdom.

    Раньше в документацииТекущее поведение
    /blog/{username} и /blog/{username}/{slug}/{username} (профиль) и /{username}/{slug} (статья)
    Платное членство открывает блогДля написания нужна роль member или выше. Платное повышение членства выдаёт роль member
    Профиль показывает ссылку на блог и значок TelegramНа текущей странице профиля этого нет. Авторы делятся ссылкой из /my-news
    Без членства маршрут блога возвращает 404Статья возвращает 404, если она не опубликована, имя или slug не совпадают либо отличается язык

    Почему это важно для вашего клона

    • Участники становятся авторами. Каждый платный участник получает личное пространство с чистым URL под вашим доменом, которым удобно делиться.
    • Одна идентичность. Одно и то же имя пользователя объединяет профиль, статьи и список статей автора.
    • Контентная воронка под вашим контролем. Хорошие посты можно за плату продвинуть на первую полосу. Каждый из них одобряете вы.
    • Читатели помогают улучшать посты. Другие участники могут предлагать правки. Автор решает, что принять.

    News Kingdom

    Оценка, платное продвижение и одобрение в Telegram для главной ленты.

    Публичный профиль

    Страница /{username}, расположенная рядом со статьями участника.

    Резервирование имён пользователей

    Маршруты и модули (проверено в ring/web)

    АспектПуть
    Страница статьиapp/[locale]/[username]/[slug]/page.tsx
    Страница профиляapp/[locale]/[username]/page.tsx
    Список статей автораapp/[locale]/news/author/[username]/page.tsx (до 50 опубликованных, через getMyArticles)
    Редактор участникаapp/[locale]/(protected)/news/create/page.tsx (ArticleEditor audience="member")
    Рабочее пространство участникаapp/[locale]/(protected)/my-news/ с components/layout/rails/my-news-rail.tsx
    Входящие предложения правок/my-news/{articleId}/amendments (ROUTES.MY_NEWS_AMENDMENTS)
    Хелперы имён и путей (, , )

    Частые вопросы

    Миграция

    Будут ли работать старые ссылки /blog?

    Нет. В ring/web нет ни маршрута /blog, ни перенаправления. Обновите распространённые ссылки на /{username}/{slug}.

    Влияние

    Могут ли читатели добавлять статьи участников в закладки?

    Избранное работает через GET и POST /api/user/favorites с хуком useContentFavorite. Этот хук подключён к просмотру новостной статьи (components/wrappers/news-article-wrapper.tsx), а не к странице /{username}/{slug}.

    Известные пробелы

    Связанная документация

    Related documentation

    News Kingdom architecture

    Следующий шаг: что происходит после того, как автор подаёт запрос на продвижение на главную страницу.

    News Module

    Предпосылка: модуль новостей, который хранит и отображает статьи участников.

    Public Profile Pages

    Тот же процесс: страница /{username}, которая использует то же имя участника.

    Username Reservation System

    Зависимость: как выбираются и защищаются имена, от которых зависят URL блогов.

    1. Документация
    2. /Функции
    3. /Блоги участников

    Обновлено 1 окт. 2026 г.5 мин прослушивания

    Блоги участников

    Изменение URL: статьи участников теперь размещаются по адресу /{username}/{slug}, рядом с профилем участника на /{username}. Старого шаблона /blog/{username}/{slug} больше нет, и маршрута /blog не существует. Используйте вкладки Основатель / Разработчик на боковой панели, чтобы отфильтровать эту страницу.

    Блоги участников превращают модуль новостей вашего клона в пространство для публикаций каждого участника. Статьи хранятся в той же таблице news, что и официальные новости, помечаются именем автора и отдаются по собственному URL автора. Если автор хочет попасть в главную ленту, он подаёт запрос на продвижение, и статья попадает в конвейер News Kingdom.

    Раньше в документацииТекущее поведение
    /blog/{username} и /blog/{username}/{slug}/{username} (профиль) и /{username}/{slug} (статья)
    Платное членство открывает блогДля написания нужна роль member или выше. Платное повышение членства выдаёт роль member
    Профиль показывает ссылку на блог и значок TelegramНа текущей странице профиля этого нет. Авторы делятся ссылкой из /my-news
    Без членства маршрут блога возвращает 404Статья возвращает 404, если она не опубликована, имя или slug не совпадают либо отличается язык

    Почему это важно для вашего клона

    • Участники становятся авторами. Каждый платный участник получает личное пространство с чистым URL под вашим доменом, которым удобно делиться.
    • Одна идентичность. Одно и то же имя пользователя объединяет профиль, статьи и список статей автора.
    • Контентная воронка под вашим контролем. Хорошие посты можно за плату продвинуть на первую полосу. Каждый из них одобряете вы.
    • Читатели помогают улучшать посты. Другие участники могут предлагать правки. Автор решает, что принять.

    News Kingdom

    Оценка, платное продвижение и одобрение в Telegram для главной ленты.

    Публичный профиль

    Страница /{username}, расположенная рядом со статьями участника.

    Резервирование имён пользователей

    Маршруты и модули (проверено в ring/web)

    АспектПуть
    Страница статьиapp/[locale]/[username]/[slug]/page.tsx
    Страница профиляapp/[locale]/[username]/page.tsx
    Список статей автораapp/[locale]/news/author/[username]/page.tsx (до 50 опубликованных, через getMyArticles)
    Редактор участникаapp/[locale]/(protected)/news/create/page.tsx (ArticleEditor audience="member")
    Рабочее пространство участникаapp/[locale]/(protected)/my-news/ с components/layout/rails/my-news-rail.tsx
    Входящие предложения правок/my-news/{articleId}/amendments (ROUTES.MY_NEWS_AMENDMENTS)
    Хелперы имён и путей (, , )

    Частые вопросы

    Миграция

    Будут ли работать старые ссылки /blog?

    Нет. В ring/web нет ни маршрута /blog, ни перенаправления. Обновите распространённые ссылки на /{username}/{slug}.

    Влияние

    Могут ли читатели добавлять статьи участников в закладки?

    Избранное работает через GET и POST /api/user/favorites с хуком useContentFavorite. Этот хук подключён к просмотру новостной статьи (components/wrappers/news-article-wrapper.tsx), а не к странице /{username}/{slug}.

    Известные пробелы

    Связанная документация

    Related documentation

    News Kingdom architecture

    Следующий шаг: что происходит после того, как автор подаёт запрос на продвижение на главную страницу.

    News Module

    Предпосылка: модуль новостей, который хранит и отображает статьи участников.

    Public Profile Pages

    Тот же процесс: страница /{username}, которая использует то же имя участника.

    Username Reservation System

    Зависимость: как выбираются и защищаются имена, от которых зависят URL блогов.

    1. Документация
    2. /Функции
    3. /Блоги участников

    Обновлено 1 окт. 2026 г.5 мин прослушивания

    Имена определяют URL блогов, поэтому зарезервированные имена имеют значение.

    Подписки

    Платный путь, который повышает пользователя до роли member.

    Типичные сценарии

    1. Экспертное сообщество. Участники пишут развёрнутые посты под собственным именем, а лучшие из них продвигаются на первую полосу.
    2. Кооперативная рассылка. Каждый производитель ведёт блог. Команда администраторов отбирает материалы для главной ленты.
    3. Стимул для членства. Бесплатные пользователи могут читать. Возможность писать является преимуществом платного членства.

    Где работают участники

    РазделПуть
    Написать новую статью/news/create
    Управлять, делиться и продвигать/my-news
    Публичная статья/{username}/{slug}
    Все статьи одного автора/news/author/{username}
    lib/blog/blog-path.ts
    normalizeBlogHandle
    profileArticlePathname
    profileArticleHref
    Абсолютный URLlib/site-branding.ts localeBlogArticleUrl(locale, username, slug)
    Действие сохраненияapp/_actions/news.ts
    Разрешенияfeatures/news/lib/news-permissions.ts

    Как находится статья

    Страница статьи ищет в news одну строку, которая соответствует всем четырём фильтрам: blogUsername == normalizeBlogHandle(username), slug, locale и status == 'published'. Если ни одна строка не подходит, она вызывает notFound(), а метаданные переходят на noindex. Имена хранятся с начальным @, поэтому /en/alice/hello ищет blogUsername: '@alice'.

    blogUsername проставляется только при создании и только тогда, когда у пользователя сессии есть имя пользователя. Статьи, написанные до того, как автор выбрал имя, никогда его не получают, поэтому они не будут открываться по адресу /{username}/{slug}. Для такого случая панель /my-news показывает подсказку задать имя пользователя.

    Статические маршруты, например /store, /news или /about, имеют приоритет над динамическим сегментом [username]. Имя пользователя, совпадающее со статическим маршрутом, не может иметь URL профиля.

    Разрешения

    ДействиеПравило
    СозданиеcanCreateNewsArticle: роль member или выше, администратор платформы или confidential
    Редактирование или удалениеАдминистратор платформы или автор статьи
    Видимость site-wideТолько администраторы платформы. Участники получают её через одобрение продвижения
    Видимость confidentialТолько пользователи с конфиденциальным доступом
    featuredПри сохранении принудительно false для не-администраторов
    Предложить правкуВошедший пользователь, не являющийся автором, с canProposeRevision, для опубликованных статей

    Написание, публикация, продвижение

    1. 1

      Создание

      Участник открывает /news/create. При сохранении app/_actions/news.ts записывает статью через createNewsArticle() с blogUsername и фиксирует первый коммит версии (lib/versioning).

    2. 2

      Публикация и распространение

      Установите status: 'published'. Панель /my-news формирует публичную ссылку из ROUTES.PUBLIC_PROFILE(handle) и предлагает кнопку копирования ссылки.

    3. 3

      Продвижение (необязательно)

      features/news/components/news-promotion-panel.tsx вызывает POST /api/news/promotion/submit с { articleId }. Подавать может только автор. Оценка, оплата и одобрение описаны в News Kingdom.

    Каждый просмотр статьи учитывает recordArticlePageView() внутри after(), поэтому подсчёт никогда не блокирует рендеринг.

    Имена определяют URL блогов, поэтому зарезервированные имена имеют значение.

    Подписки

    Платный путь, который повышает пользователя до роли member.

    Типичные сценарии

    1. Экспертное сообщество. Участники пишут развёрнутые посты под собственным именем, а лучшие из них продвигаются на первую полосу.
    2. Кооперативная рассылка. Каждый производитель ведёт блог. Команда администраторов отбирает материалы для главной ленты.
    3. Стимул для членства. Бесплатные пользователи могут читать. Возможность писать является преимуществом платного членства.

    Где работают участники

    РазделПуть
    Написать новую статью/news/create
    Управлять, делиться и продвигать/my-news
    Публичная статья/{username}/{slug}
    Все статьи одного автора/news/author/{username}
    lib/blog/blog-path.ts
    normalizeBlogHandle
    profileArticlePathname
    profileArticleHref
    Абсолютный URLlib/site-branding.ts localeBlogArticleUrl(locale, username, slug)
    Действие сохраненияapp/_actions/news.ts
    Разрешенияfeatures/news/lib/news-permissions.ts

    Как находится статья

    Страница статьи ищет в news одну строку, которая соответствует всем четырём фильтрам: blogUsername == normalizeBlogHandle(username), slug, locale и status == 'published'. Если ни одна строка не подходит, она вызывает notFound(), а метаданные переходят на noindex. Имена хранятся с начальным @, поэтому /en/alice/hello ищет blogUsername: '@alice'.

    blogUsername проставляется только при создании и только тогда, когда у пользователя сессии есть имя пользователя. Статьи, написанные до того, как автор выбрал имя, никогда его не получают, поэтому они не будут открываться по адресу /{username}/{slug}. Для такого случая панель /my-news показывает подсказку задать имя пользователя.

    Статические маршруты, например /store, /news или /about, имеют приоритет над динамическим сегментом [username]. Имя пользователя, совпадающее со статическим маршрутом, не может иметь URL профиля.

    Разрешения

    ДействиеПравило
    СозданиеcanCreateNewsArticle: роль member или выше, администратор платформы или confidential
    Редактирование или удалениеАдминистратор платформы или автор статьи
    Видимость site-wideТолько администраторы платформы. Участники получают её через одобрение продвижения
    Видимость confidentialТолько пользователи с конфиденциальным доступом
    featuredПри сохранении принудительно false для не-администраторов
    Предложить правкуВошедший пользователь, не являющийся автором, с canProposeRevision, для опубликованных статей

    Написание, публикация, продвижение

    1. 1

      Создание

      Участник открывает /news/create. При сохранении app/_actions/news.ts записывает статью через createNewsArticle() с blogUsername и фиксирует первый коммит версии (lib/versioning).

    2. 2

      Публикация и распространение

      Установите status: 'published'. Панель /my-news формирует публичную ссылку из ROUTES.PUBLIC_PROFILE(handle) и предлагает кнопку копирования ссылки.

    3. 3

      Продвижение (необязательно)

      features/news/components/news-promotion-panel.tsx вызывает POST /api/news/promotion/submit с { articleId }. Подавать может только автор. Оценка, оплата и одобрение описаны в News Kingdom.

    Каждый просмотр статьи учитывает recordArticlePageView() внутри after(), поэтому подсчёт никогда не блокирует рендеринг.

    Имена определяют URL блогов, поэтому зарезервированные имена имеют значение.

    Подписки

    Платный путь, который повышает пользователя до роли member.

    Типичные сценарии

    1. Экспертное сообщество. Участники пишут развёрнутые посты под собственным именем, а лучшие из них продвигаются на первую полосу.
    2. Кооперативная рассылка. Каждый производитель ведёт блог. Команда администраторов отбирает материалы для главной ленты.
    3. Стимул для членства. Бесплатные пользователи могут читать. Возможность писать является преимуществом платного членства.

    Где работают участники

    РазделПуть
    Написать новую статью/news/create
    Управлять, делиться и продвигать/my-news
    Публичная статья/{username}/{slug}
    Все статьи одного автора/news/author/{username}
    lib/blog/blog-path.ts
    normalizeBlogHandle
    profileArticlePathname
    profileArticleHref
    Абсолютный URLlib/site-branding.ts localeBlogArticleUrl(locale, username, slug)
    Действие сохраненияapp/_actions/news.ts
    Разрешенияfeatures/news/lib/news-permissions.ts

    Как находится статья

    Страница статьи ищет в news одну строку, которая соответствует всем четырём фильтрам: blogUsername == normalizeBlogHandle(username), slug, locale и status == 'published'. Если ни одна строка не подходит, она вызывает notFound(), а метаданные переходят на noindex. Имена хранятся с начальным @, поэтому /en/alice/hello ищет blogUsername: '@alice'.

    blogUsername проставляется только при создании и только тогда, когда у пользователя сессии есть имя пользователя. Статьи, написанные до того, как автор выбрал имя, никогда его не получают, поэтому они не будут открываться по адресу /{username}/{slug}. Для такого случая панель /my-news показывает подсказку задать имя пользователя.

    Статические маршруты, например /store, /news или /about, имеют приоритет над динамическим сегментом [username]. Имя пользователя, совпадающее со статическим маршрутом, не может иметь URL профиля.

    Разрешения

    ДействиеПравило
    СозданиеcanCreateNewsArticle: роль member или выше, администратор платформы или confidential
    Редактирование или удалениеАдминистратор платформы или автор статьи
    Видимость site-wideТолько администраторы платформы. Участники получают её через одобрение продвижения
    Видимость confidentialТолько пользователи с конфиденциальным доступом
    featuredПри сохранении принудительно false для не-администраторов
    Предложить правкуВошедший пользователь, не являющийся автором, с canProposeRevision, для опубликованных статей

    Написание, публикация, продвижение

    1. 1

      Создание

      Участник открывает /news/create. При сохранении app/_actions/news.ts записывает статью через createNewsArticle() с blogUsername и фиксирует первый коммит версии (lib/versioning).

    2. 2

      Публикация и распространение

      Установите status: 'published'. Панель /my-news формирует публичную ссылку из ROUTES.PUBLIC_PROFILE(handle) и предлагает кнопку копирования ссылки.

    3. 3

      Продвижение (необязательно)

      features/news/components/news-promotion-panel.tsx вызывает POST /api/news/promotion/submit с { articleId }. Подавать может только автор. Оценка, оплата и одобрение описаны в News Kingdom.

    Каждый просмотр статьи учитывает recordArticlePageView() внутри after(), поэтому подсчёт никогда не блокирует рендеринг.