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
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    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
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server

    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
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    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
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server

    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
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    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
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server

    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 Platform Logo

    Loading documentation...

    Preparing Ring Platform content

    Ring Platform Logo

    Loading documentation...

    Preparing Ring Platform content

    Ring Platform Logo

    Loading documentation...

    Preparing Ring Platform content

    Public Profile Pages

    Use Founder / Developer tabs in the docs sidebar to filter this page. Personal file media, mood audio, and peer-game availability are separate routes under the same username — see Ring File Cabinet and Peer Games. Visit telemetry joins ring-wide analytics — see Monitoring & Analytics.

    Every user with a reserved username can expose a public profile at /{username} (locale-prefixed as needed). The page is App Router server-rendered with dynamic SEO metadata. Related public surfaces:

    URLPurpose
    /{username}Profile header, bio, NFT listings, blog/staking when enabled; records personal_page_view for non-owners
    /{username}/imgPublic File Cabinet gallery lightbox (visibility=public)
    /{username}/playerPublic mood player (DaVinci shell + right-rail playlists)
    /{username}/gamesPublic peer-game availability (“Play with me”)
    /profile/songsPrivate mood-player manage
    /profile/gamesPrivate Member manage for enabled game slugs

    Owners see a visit stats widget (unique 24h / 7d, broken down by visitor role). Self-views are skipped so refreshing your own page does not inflate uniques.

    Why this matters for your clone

    The public profile is the member’s trust face: who they are, what they sell/list, which media they choose to show, and (via Peer Games) which free mini-games they accept. Visibility for the main profile page is all-or-nothing today — private profiles 404. Unique-visit stats help members see whether their page is attracting guests vs subscribers vs members without counting themselves.

    Username reservation

    Claim @handle first — public routes resolve via getUserByUsername.

    File Cabinet gallery

    Member+ own manager at /file-cabinet; public items on /{username}/img.

    Peer Games

    Members enable slugs on /profile/games; visitors challenge from //games.

    Route map

    App pathNotes
    app/[locale]/[username]/page.tsxMain profile; getUserByUsername; notFound() if missing / private; skips recordPersonalPageView when isOwner
    app/[locale]/[username]/img/page.tsxlistPublicGalleryByOwner + PublicProfileImgGallery
    app/[locale]/[username]/player/page.tsxPublicPlayerShell + mood-player service
    app/[locale]/[username]/games/page.tsxPublic enabled slugs + Play-with-me
    app/[locale]/(protected)/profile/songs/page.tsxAuthenticated mood-player manage
    app/[locale]/(protected)/profile/games/page.tsxAuthenticated Member game availability

    Constants: ROUTES.PUBLIC_PROFILE_IMG, ROUTES.PUBLIC_PROFILE_PLAYER, , , , .

    Related documentation

    Related documentation

    Profile Account Widgets

    Same-workflow: signed-in /profile Professional widgets (Organization, tags, My CV) feed the public trust face.

    Ring File Cabinet

    Next-step: member-gated /file-cabinet + gallery curation; public /img from visibility=public.

    Monitoring & Analytics

    Depends-on: personal_page_view joins first-party analytics_events and admin personalPages.

    Peer Games

    Same-workflow: public /{username}/games availability and Member /profile/games manage.

    Public Profile Pages

    Use Founder / Developer tabs in the docs sidebar to filter this page. Personal file media, mood audio, and peer-game availability are separate routes under the same username — see Ring File Cabinet and Peer Games. Visit telemetry joins ring-wide analytics — see Monitoring & Analytics.

    Every user with a reserved username can expose a public profile at /{username} (locale-prefixed as needed). The page is App Router server-rendered with dynamic SEO metadata. Related public surfaces:

    URLPurpose
    /{username}Profile header, bio, NFT listings, blog/staking when enabled; records personal_page_view for non-owners
    /{username}/imgPublic File Cabinet gallery lightbox (visibility=public)
    /{username}/playerPublic mood player (DaVinci shell + right-rail playlists)
    /{username}/gamesPublic peer-game availability (“Play with me”)
    /profile/songsPrivate mood-player manage
    /profile/gamesPrivate Member manage for enabled game slugs

    Owners see a visit stats widget (unique 24h / 7d, broken down by visitor role). Self-views are skipped so refreshing your own page does not inflate uniques.

    Why this matters for your clone

    The public profile is the member’s trust face: who they are, what they sell/list, which media they choose to show, and (via Peer Games) which free mini-games they accept. Visibility for the main profile page is all-or-nothing today — private profiles 404. Unique-visit stats help members see whether their page is attracting guests vs subscribers vs members without counting themselves.

    Username reservation

    Claim @handle first — public routes resolve via getUserByUsername.

    File Cabinet gallery

    Member+ own manager at /file-cabinet; public items on /{username}/img.

    Peer Games

    Members enable slugs on /profile/games; visitors challenge from //games.

    Route map

    App pathNotes
    app/[locale]/[username]/page.tsxMain profile; getUserByUsername; notFound() if missing / private; skips recordPersonalPageView when isOwner
    app/[locale]/[username]/img/page.tsxlistPublicGalleryByOwner + PublicProfileImgGallery
    app/[locale]/[username]/player/page.tsxPublicPlayerShell + mood-player service
    app/[locale]/[username]/games/page.tsxPublic enabled slugs + Play-with-me
    app/[locale]/(protected)/profile/songs/page.tsxAuthenticated mood-player manage
    app/[locale]/(protected)/profile/games/page.tsxAuthenticated Member game availability

    Constants: ROUTES.PUBLIC_PROFILE_IMG, ROUTES.PUBLIC_PROFILE_PLAYER, , , , .

    Related documentation

    Related documentation

    Profile Account Widgets

    Same-workflow: signed-in /profile Professional widgets (Organization, tags, My CV) feed the public trust face.

    Ring File Cabinet

    Next-step: member-gated /file-cabinet + gallery curation; public /img from visibility=public.

    Monitoring & Analytics

    Depends-on: personal_page_view joins first-party analytics_events and admin personalPages.

    Peer Games

    Same-workflow: public /{username}/games availability and Member /profile/games manage.

    Public Profile Pages

    Use Founder / Developer tabs in the docs sidebar to filter this page. Personal file media, mood audio, and peer-game availability are separate routes under the same username — see Ring File Cabinet and Peer Games. Visit telemetry joins ring-wide analytics — see Monitoring & Analytics.

    Every user with a reserved username can expose a public profile at /{username} (locale-prefixed as needed). The page is App Router server-rendered with dynamic SEO metadata. Related public surfaces:

    URLPurpose
    /{username}Profile header, bio, NFT listings, blog/staking when enabled; records personal_page_view for non-owners
    /{username}/imgPublic File Cabinet gallery lightbox (visibility=public)
    /{username}/playerPublic mood player (DaVinci shell + right-rail playlists)
    /{username}/gamesPublic peer-game availability (“Play with me”)
    /profile/songsPrivate mood-player manage
    /profile/gamesPrivate Member manage for enabled game slugs

    Owners see a visit stats widget (unique 24h / 7d, broken down by visitor role). Self-views are skipped so refreshing your own page does not inflate uniques.

    Why this matters for your clone

    The public profile is the member’s trust face: who they are, what they sell/list, which media they choose to show, and (via Peer Games) which free mini-games they accept. Visibility for the main profile page is all-or-nothing today — private profiles 404. Unique-visit stats help members see whether their page is attracting guests vs subscribers vs members without counting themselves.

    Username reservation

    Claim @handle first — public routes resolve via getUserByUsername.

    File Cabinet gallery

    Member+ own manager at /file-cabinet; public items on /{username}/img.

    Peer Games

    Members enable slugs on /profile/games; visitors challenge from //games.

    Route map

    App pathNotes
    app/[locale]/[username]/page.tsxMain profile; getUserByUsername; notFound() if missing / private; skips recordPersonalPageView when isOwner
    app/[locale]/[username]/img/page.tsxlistPublicGalleryByOwner + PublicProfileImgGallery
    app/[locale]/[username]/player/page.tsxPublicPlayerShell + mood-player service
    app/[locale]/[username]/games/page.tsxPublic enabled slugs + Play-with-me
    app/[locale]/(protected)/profile/songs/page.tsxAuthenticated mood-player manage
    app/[locale]/(protected)/profile/games/page.tsxAuthenticated Member game availability

    Constants: ROUTES.PUBLIC_PROFILE_IMG, ROUTES.PUBLIC_PROFILE_PLAYER, , , , .

    Related documentation

    Related documentation

    Profile Account Widgets

    Same-workflow: signed-in /profile Professional widgets (Organization, tags, My CV) feed the public trust face.

    Ring File Cabinet

    Next-step: member-gated /file-cabinet + gallery curation; public /img from visibility=public.

    Monitoring & Analytics

    Depends-on: personal_page_view joins first-party analytics_events and admin personalPages.

    Peer Games

    Same-workflow: public /{username}/games availability and Member /profile/games manage.

    Monitoring & Analytics

    personal_page_view events land in analytics_events; admins see personalPages on /admin/analytics.

    Operator checklist

    • Confirm username claim + “Personal page” visibility in profile settings.
    • Smoke /{username} as anonymous visitor — owner widget should show a unique visit after a non-owner hit.
    • Confirm owner reload does not bump unique counts.
    • Own gallery manage stays at /profile/gallery (member+).
    • Private playlist CRUD stays at /profile/songs.
    Granular contact toggles

    Per-field public contact toggles (email, phone, social) are not shipped as independent switches yet — treat the personal-page toggle as the current gate.

    ROUTES.PUBLIC_PROFILE_GAMES
    ROUTES.PROFILE_SONGS
    ROUTES.PROFILE_GAMES
    ROUTES.PROFILE_GALLERY

    Personal page visit analytics (shipped)

    ConcernPath
    Event typepersonal_page_view → analytics_events via insertAnalyticsEventBatch
    Recorderfeatures/analytics/lib/personal-page-analytics.ts → recordPersonalPageView
    Owner skipPage: if (isOwner) return before record; recorder: skip when visitorUserId === profileUserId
    Types SSOTfeatures/analytics/types/personal-page.ts (PersonalPageVisitStats, role buckets)
    Owner widget actiongetPersonalPageViewStats in features/auth/services/personal-page-stats.ts (owner or platform admin)
    Widget UIfeatures/auth/components/personal-page-widget.tsx
    Admin rollupgetPersonalPagePlatformStats → PlatformAnalyticsSummary.personalPages on /admin/analytics
    Engagement joinanalytics-db.ts includes personal_page_view with docs_page_view / page_view / app_load in pageViews aggregates
    Kill switchANALYTICS_DISABLE_STORAGE=true — recorder no-ops

    Stats shape: unique24h / unique7d, visits24h / visits7d, byRole24h / byRole7d (unique + visits per role). Visitor identity prefers user id, else session key, else anon IP.

    Identity lookup

    features/auth/services/get-user-by-username.ts — cache()’d queryDocs on users with case-insensitive username.

    What’s on the main profile (verified surface)

    • Avatar (photoURL), name, @username, bio
    • Message button for authenticated visitors (not self)
    • Telegram verification badge when verified
    • NFT listings via public GET /api/nft-market/listings?username=…
    • Blog / staking sections when product flags and data allow
    • Header/nav links to Player, Games, and Gallery
    • Owner visit-stats widget (when owner chrome is shown)

    Visibility

    Users control public visibility through the username / personal-page flow. Public → page renders; Private → route returns 404.

    Related APIs (profile-adjacent)

    EndpointPurpose
    GET /api/auth/check-usernameAvailability
    GET /api/nft-market/listings?username=Public listings
    POST /api/auth/telegram/callbackTelegram verification callback

    File Cabinet gallery data is not a separate public REST list — the img page reads via listPublicGalleryByOwner. Peer-game availability uses user_peer_games (migration 043_peer_games.sql).

    Username Reservation System

    Prerequisite: reserved username before public /{username} routes resolve.

    Member Blogs

    Same-workflow: blog section on the profile when membership is active.

    NFT Exhibition Marketplace

    See-also: ProfileListings public NFT grid on the profile page.

    Ring CDN (RingFileBase edge)

    Depends-on: public gallery images use CDN /files/{uuid} URLs.

    Monitoring & Analytics

    personal_page_view events land in analytics_events; admins see personalPages on /admin/analytics.

    Operator checklist

    • Confirm username claim + “Personal page” visibility in profile settings.
    • Smoke /{username} as anonymous visitor — owner widget should show a unique visit after a non-owner hit.
    • Confirm owner reload does not bump unique counts.
    • Own gallery manage stays at /profile/gallery (member+).
    • Private playlist CRUD stays at /profile/songs.
    Granular contact toggles

    Per-field public contact toggles (email, phone, social) are not shipped as independent switches yet — treat the personal-page toggle as the current gate.

    ROUTES.PUBLIC_PROFILE_GAMES
    ROUTES.PROFILE_SONGS
    ROUTES.PROFILE_GAMES
    ROUTES.PROFILE_GALLERY

    Personal page visit analytics (shipped)

    ConcernPath
    Event typepersonal_page_view → analytics_events via insertAnalyticsEventBatch
    Recorderfeatures/analytics/lib/personal-page-analytics.ts → recordPersonalPageView
    Owner skipPage: if (isOwner) return before record; recorder: skip when visitorUserId === profileUserId
    Types SSOTfeatures/analytics/types/personal-page.ts (PersonalPageVisitStats, role buckets)
    Owner widget actiongetPersonalPageViewStats in features/auth/services/personal-page-stats.ts (owner or platform admin)
    Widget UIfeatures/auth/components/personal-page-widget.tsx
    Admin rollupgetPersonalPagePlatformStats → PlatformAnalyticsSummary.personalPages on /admin/analytics
    Engagement joinanalytics-db.ts includes personal_page_view with docs_page_view / page_view / app_load in pageViews aggregates
    Kill switchANALYTICS_DISABLE_STORAGE=true — recorder no-ops

    Stats shape: unique24h / unique7d, visits24h / visits7d, byRole24h / byRole7d (unique + visits per role). Visitor identity prefers user id, else session key, else anon IP.

    Identity lookup

    features/auth/services/get-user-by-username.ts — cache()’d queryDocs on users with case-insensitive username.

    What’s on the main profile (verified surface)

    • Avatar (photoURL), name, @username, bio
    • Message button for authenticated visitors (not self)
    • Telegram verification badge when verified
    • NFT listings via public GET /api/nft-market/listings?username=…
    • Blog / staking sections when product flags and data allow
    • Header/nav links to Player, Games, and Gallery
    • Owner visit-stats widget (when owner chrome is shown)

    Visibility

    Users control public visibility through the username / personal-page flow. Public → page renders; Private → route returns 404.

    Related APIs (profile-adjacent)

    EndpointPurpose
    GET /api/auth/check-usernameAvailability
    GET /api/nft-market/listings?username=Public listings
    POST /api/auth/telegram/callbackTelegram verification callback

    File Cabinet gallery data is not a separate public REST list — the img page reads via listPublicGalleryByOwner. Peer-game availability uses user_peer_games (migration 043_peer_games.sql).

    Username Reservation System

    Prerequisite: reserved username before public /{username} routes resolve.

    Member Blogs

    Same-workflow: blog section on the profile when membership is active.

    NFT Exhibition Marketplace

    See-also: ProfileListings public NFT grid on the profile page.

    Ring CDN (RingFileBase edge)

    Depends-on: public gallery images use CDN /files/{uuid} URLs.

    Monitoring & Analytics

    personal_page_view events land in analytics_events; admins see personalPages on /admin/analytics.

    Operator checklist

    • Confirm username claim + “Personal page” visibility in profile settings.
    • Smoke /{username} as anonymous visitor — owner widget should show a unique visit after a non-owner hit.
    • Confirm owner reload does not bump unique counts.
    • Own gallery manage stays at /profile/gallery (member+).
    • Private playlist CRUD stays at /profile/songs.
    Granular contact toggles

    Per-field public contact toggles (email, phone, social) are not shipped as independent switches yet — treat the personal-page toggle as the current gate.

    ROUTES.PUBLIC_PROFILE_GAMES
    ROUTES.PROFILE_SONGS
    ROUTES.PROFILE_GAMES
    ROUTES.PROFILE_GALLERY

    Personal page visit analytics (shipped)

    ConcernPath
    Event typepersonal_page_view → analytics_events via insertAnalyticsEventBatch
    Recorderfeatures/analytics/lib/personal-page-analytics.ts → recordPersonalPageView
    Owner skipPage: if (isOwner) return before record; recorder: skip when visitorUserId === profileUserId
    Types SSOTfeatures/analytics/types/personal-page.ts (PersonalPageVisitStats, role buckets)
    Owner widget actiongetPersonalPageViewStats in features/auth/services/personal-page-stats.ts (owner or platform admin)
    Widget UIfeatures/auth/components/personal-page-widget.tsx
    Admin rollupgetPersonalPagePlatformStats → PlatformAnalyticsSummary.personalPages on /admin/analytics
    Engagement joinanalytics-db.ts includes personal_page_view with docs_page_view / page_view / app_load in pageViews aggregates
    Kill switchANALYTICS_DISABLE_STORAGE=true — recorder no-ops

    Stats shape: unique24h / unique7d, visits24h / visits7d, byRole24h / byRole7d (unique + visits per role). Visitor identity prefers user id, else session key, else anon IP.

    Identity lookup

    features/auth/services/get-user-by-username.ts — cache()’d queryDocs on users with case-insensitive username.

    What’s on the main profile (verified surface)

    • Avatar (photoURL), name, @username, bio
    • Message button for authenticated visitors (not self)
    • Telegram verification badge when verified
    • NFT listings via public GET /api/nft-market/listings?username=…
    • Blog / staking sections when product flags and data allow
    • Header/nav links to Player, Games, and Gallery
    • Owner visit-stats widget (when owner chrome is shown)

    Visibility

    Users control public visibility through the username / personal-page flow. Public → page renders; Private → route returns 404.

    Related APIs (profile-adjacent)

    EndpointPurpose
    GET /api/auth/check-usernameAvailability
    GET /api/nft-market/listings?username=Public listings
    POST /api/auth/telegram/callbackTelegram verification callback

    File Cabinet gallery data is not a separate public REST list — the img page reads via listPublicGalleryByOwner. Peer-game availability uses user_peer_games (migration 043_peer_games.sql).

    Username Reservation System

    Prerequisite: reserved username before public /{username} routes resolve.

    Member Blogs

    Same-workflow: blog section on the profile when membership is active.

    NFT Exhibition Marketplace

    See-also: ProfileListings public NFT grid on the profile page.

    Ring CDN (RingFileBase edge)

    Depends-on: public gallery images use CDN /files/{uuid} URLs.

    1. Docs
    2. /Features
    3. /Public Profile Pages

    Updated Aug 3, 20264 min listen

    1. Docs
    2. /Features
    3. /Public Profile Pages

    Updated Aug 3, 20264 min listen

    1. Docs
    2. /Features
    3. /Public Profile Pages

    Updated Aug 3, 20264 min listen