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

    Whitelabel Navigation

    Use Founder / Developer tabs in the docs sidebar to filter this page. Shared sections apply to both audiences.

    Status: Layer1 chrome is a data manifest + closed icon map, not per-clone *-desktop-navigation.tsx variants. There is no config/navigation.config.ts. Packs overwrite lib/navigation/primary-nav.ts. Clones remap existing slot ids in lib/navigation/primary-nav-overlay.ts. Unknown icon ids render the users glyph.

    Previous habitRing equivalent
    Fork vikka-desktop-navigation.tsx / greenfood-navigation.tsxL2 pack overwrites lib/navigation/primary-nav.ts (slots, hrefs, icon ids)
    Import a vertical-named Lucide icon in chromeAdd a generic id to PRIMARY_NAV_ICONS on Layer1, then reference that id
    Overlay a new mobile tab from the cloneOverlay cannot add, hide, or reorder slots — change the pack manifest
    Copy desktop-sidebar.tsx onto the cloneKeep chrome on Layer1; remap iconById / labelKeysById / hrefById only

    Architecture

    Primary nav layers

    home.preset does not select the menu. Overflow modules (the [...] catalog) live in lib/navigation/platform-menu.ts plus ring-config.navigation.platformMenu. Packs must not overwrite platform-menu.ts; vertical defaults belong in PACK.json.platformMenu and are copied onto the clone ring-config.

    What you can change without forking chrome

    • Labels — next-intl keys on each slot (labelKeys). Pack pack.json and clone overlay can override leaves. See Localization.
    • Which Lucide glyph — pick an id that already exists in the closed map (table below). If you need a new glyph, that is a Layer1 change, not a clone file.
    • Href of an existing slot — L3 hrefById on that slot id (same locale → string contract as pack items).
    • Mobile bar shape — first two manifest hrefs, center plus (add opportunity), then the rest. A pack that lists three hrefs plus overflow (and omits docs-or-admin) gets that bar from the same chrome slices. Overlay cannot add or hide those slots.

    Do not ask an integrator to drop a custom sidebar component into components/navigation/ for brand icons.

    Closed icon map

    Path: lib/navigation/primary-nav-icons.ts. Chrome calls getPrimaryNavIcon(id). Packs and overlays pass string ids only.

    IdLucide export
    usersUsers (fallback for unknown ids)
    briefcaseBriefcase
    storeStore
    userUserRound
    file-textFileText
    ellipsisCircleEllipsis
    more-horizontalMoreHorizontal

    Frequently asked questions

    Impact

    Can the clone hide the Store tab with overlay alone?

    No. Remove or replace the slot in the pack primary-nav.ts (compose overwrite). Overlay only patches icon / labelKeys / href on ids that already exist.

    What happens if the pack uses sun before Layer1 lists it?

    getPrimaryNavIcon returns Users. The bar does not crash; the glyph is wrong until Layer1 ships the id.

    Migration

    We still have a clone-local sidebar component. What instead?

    Delete the fork. Point compose at pack primary-nav.ts + empty-or-remap primary-nav-overlay.ts. Chrome files stay Layer1.

    Ops

    Who owns platform-menu.ts?

    Layer1. Packs must not rsync over it. Clone ring-config.navigation.platformMenu (items / exclude / extra) is the overflow catalog knob.

    Related documentation

    Related documentation

    Vertical Presets (SSOT)

    Depends-on: L1 / L2 pack / L3 overlay compose and pack.json socket.

    Localization

    Same-workflow: nav labelKeys resolve through Layer1 → pack → overlay messages.

    Ringization playbook

    Prerequisite: chrome stays on Layer1; product stays on pack or clone overlay.

    Customization Guide

    See-also: ring-config feature flags that hide routes from nav.

    1. Docs
    2. /Development
    3. /Whitelabel Navigation

    Updated Sep 9, 20265 min listen

    Whitelabel Navigation

    Use Founder / Developer tabs in the docs sidebar to filter this page. Shared sections apply to both audiences.

    Status: Layer1 chrome is a data manifest + closed icon map, not per-clone *-desktop-navigation.tsx variants. There is no config/navigation.config.ts. Packs overwrite lib/navigation/primary-nav.ts. Clones remap existing slot ids in lib/navigation/primary-nav-overlay.ts. Unknown icon ids render the users glyph.

    Previous habitRing equivalent
    Fork vikka-desktop-navigation.tsx / greenfood-navigation.tsxL2 pack overwrites lib/navigation/primary-nav.ts (slots, hrefs, icon ids)
    Import a vertical-named Lucide icon in chromeAdd a generic id to PRIMARY_NAV_ICONS on Layer1, then reference that id
    Overlay a new mobile tab from the cloneOverlay cannot add, hide, or reorder slots — change the pack manifest
    Copy desktop-sidebar.tsx onto the cloneKeep chrome on Layer1; remap iconById / labelKeysById / hrefById only

    Architecture

    Primary nav layers

    home.preset does not select the menu. Overflow modules (the [...] catalog) live in lib/navigation/platform-menu.ts plus ring-config.navigation.platformMenu. Packs must not overwrite platform-menu.ts; vertical defaults belong in PACK.json.platformMenu and are copied onto the clone ring-config.

    What you can change without forking chrome

    • Labels — next-intl keys on each slot (labelKeys). Pack pack.json and clone overlay can override leaves. See Localization.
    • Which Lucide glyph — pick an id that already exists in the closed map (table below). If you need a new glyph, that is a Layer1 change, not a clone file.
    • Href of an existing slot — L3 hrefById on that slot id (same locale → string contract as pack items).
    • Mobile bar shape — first two manifest hrefs, center plus (add opportunity), then the rest. A pack that lists three hrefs plus overflow (and omits docs-or-admin) gets that bar from the same chrome slices. Overlay cannot add or hide those slots.

    Do not ask an integrator to drop a custom sidebar component into components/navigation/ for brand icons.

    Closed icon map

    Path: lib/navigation/primary-nav-icons.ts. Chrome calls getPrimaryNavIcon(id). Packs and overlays pass string ids only.

    IdLucide export
    usersUsers (fallback for unknown ids)
    briefcaseBriefcase
    storeStore
    userUserRound
    file-textFileText
    ellipsisCircleEllipsis
    more-horizontalMoreHorizontal

    Frequently asked questions

    Impact

    Can the clone hide the Store tab with overlay alone?

    No. Remove or replace the slot in the pack primary-nav.ts (compose overwrite). Overlay only patches icon / labelKeys / href on ids that already exist.

    What happens if the pack uses sun before Layer1 lists it?

    getPrimaryNavIcon returns Users. The bar does not crash; the glyph is wrong until Layer1 ships the id.

    Migration

    We still have a clone-local sidebar component. What instead?

    Delete the fork. Point compose at pack primary-nav.ts + empty-or-remap primary-nav-overlay.ts. Chrome files stay Layer1.

    Ops

    Who owns platform-menu.ts?

    Layer1. Packs must not rsync over it. Clone ring-config.navigation.platformMenu (items / exclude / extra) is the overflow catalog knob.

    Related documentation

    Related documentation

    Vertical Presets (SSOT)

    Depends-on: L1 / L2 pack / L3 overlay compose and pack.json socket.

    Localization

    Same-workflow: nav labelKeys resolve through Layer1 → pack → overlay messages.

    Ringization playbook

    Prerequisite: chrome stays on Layer1; product stays on pack or clone overlay.

    Customization Guide

    See-also: ring-config feature flags that hide routes from nav.

    1. Docs
    2. /Development
    3. /Whitelabel Navigation

    Updated Sep 9, 20265 min listen

    Whitelabel Navigation

    Use Founder / Developer tabs in the docs sidebar to filter this page. Shared sections apply to both audiences.

    Status: Layer1 chrome is a data manifest + closed icon map, not per-clone *-desktop-navigation.tsx variants. There is no config/navigation.config.ts. Packs overwrite lib/navigation/primary-nav.ts. Clones remap existing slot ids in lib/navigation/primary-nav-overlay.ts. Unknown icon ids render the users glyph.

    Previous habitRing equivalent
    Fork vikka-desktop-navigation.tsx / greenfood-navigation.tsxL2 pack overwrites lib/navigation/primary-nav.ts (slots, hrefs, icon ids)
    Import a vertical-named Lucide icon in chromeAdd a generic id to PRIMARY_NAV_ICONS on Layer1, then reference that id
    Overlay a new mobile tab from the cloneOverlay cannot add, hide, or reorder slots — change the pack manifest
    Copy desktop-sidebar.tsx onto the cloneKeep chrome on Layer1; remap iconById / labelKeysById / hrefById only

    Architecture

    Primary nav layers

    home.preset does not select the menu. Overflow modules (the [...] catalog) live in lib/navigation/platform-menu.ts plus ring-config.navigation.platformMenu. Packs must not overwrite platform-menu.ts; vertical defaults belong in PACK.json.platformMenu and are copied onto the clone ring-config.

    What you can change without forking chrome

    • Labels — next-intl keys on each slot (labelKeys). Pack pack.json and clone overlay can override leaves. See Localization.
    • Which Lucide glyph — pick an id that already exists in the closed map (table below). If you need a new glyph, that is a Layer1 change, not a clone file.
    • Href of an existing slot — L3 hrefById on that slot id (same locale → string contract as pack items).
    • Mobile bar shape — first two manifest hrefs, center plus (add opportunity), then the rest. A pack that lists three hrefs plus overflow (and omits docs-or-admin) gets that bar from the same chrome slices. Overlay cannot add or hide those slots.

    Do not ask an integrator to drop a custom sidebar component into components/navigation/ for brand icons.

    Closed icon map

    Path: lib/navigation/primary-nav-icons.ts. Chrome calls getPrimaryNavIcon(id). Packs and overlays pass string ids only.

    IdLucide export
    usersUsers (fallback for unknown ids)
    briefcaseBriefcase
    storeStore
    userUserRound
    file-textFileText
    ellipsisCircleEllipsis
    more-horizontalMoreHorizontal

    Frequently asked questions

    Impact

    Can the clone hide the Store tab with overlay alone?

    No. Remove or replace the slot in the pack primary-nav.ts (compose overwrite). Overlay only patches icon / labelKeys / href on ids that already exist.

    What happens if the pack uses sun before Layer1 lists it?

    getPrimaryNavIcon returns Users. The bar does not crash; the glyph is wrong until Layer1 ships the id.

    Migration

    We still have a clone-local sidebar component. What instead?

    Delete the fork. Point compose at pack primary-nav.ts + empty-or-remap primary-nav-overlay.ts. Chrome files stay Layer1.

    Ops

    Who owns platform-menu.ts?

    Layer1. Packs must not rsync over it. Clone ring-config.navigation.platformMenu (items / exclude / extra) is the overflow catalog knob.

    Related documentation

    Related documentation

    Vertical Presets (SSOT)

    Depends-on: L1 / L2 pack / L3 overlay compose and pack.json socket.

    Localization

    Same-workflow: nav labelKeys resolve through Layer1 → pack → overlay messages.

    Ringization playbook

    Prerequisite: chrome stays on Layer1; product stays on pack or clone overlay.

    Customization Guide

    See-also: ring-config feature flags that hide routes from nav.

    1. Docs
    2. /Development
    3. /Whitelabel Navigation

    Updated Sep 9, 20265 min listen

    shopping-basket
    ShoppingBasket
    shopping-bagShoppingBag
    buildingBuilding2
    newspaperNewspaper
    tvTv
    sparklesSparkles
    gamepadGamepad2
    hexagonHexagon
    mapMap
    layout-gridLayoutGrid
    walletWallet
    bellBell
    heartHeart
    shopping-cartShoppingCart
    message-circleMessageCircle
    list-todoListTodo
    settingsSettings
    sunSun
    orbitOrbit
    calendarCalendar
    scaleScale
    hashHash
    typeType
    moonMoon
    compassCompass

    Add a generic glyph here before a pack or overlay references a new id. Do not overlay this file with clone-named icons.

    Overlay socket (remap only)

    Layer1 ships export const PRIMARY_NAV_OVERLAY = {} in lib/navigation/primary-nav-overlay.ts so webpack always resolves the import. A clone overwrites that file (not primary-nav.ts) with:

    getPrimaryNavManifest() maps BASE_MANIFEST through applyHrefOverlay / applyMobileOverlay. Ids that are not in the pack/L1 manifest are ignored.

    Mobile chrome

    components/navigation/bottom-navigation.tsx renders navItems.slice(0, 2), then the center add control, then navItems.slice(2). Icon components come from getPrimaryNavIcon. Desktop rail: sidebar-rail.tsx and sidebar-synced-layout.tsx use the same helper.

    Orchestrator: components/navigation/navigation.tsx dynamically imports desktop-sidebar.tsx and bottom-navigation.tsx. There is no public DesktopNavigation variant registry.

    Recommended path

    Need a new glyph? Land it on Layer1 first (ring/web/lib/navigation/primary-nav-icons.ts), then point the pack slot at the id. Cursor skill layer2-preset-operator owns pack primary-nav.ts; ringization-implementer owns L3 overlay remap. Neither should copy chrome.

    Starter prompt (does not mutate until you approve):

    Add generic Lucide id <id> to Layer1 lib/navigation/primary-nav-icons.ts before pack <pack> references it. Do not import vertical-named icons in chrome. Overlay may only remap existing slot ids in primary-nav-overlay.ts.

    Manual path

    1. 1

      Confirm the slot id exists in the composed primary-nav.ts manifest (mobile / desktop arrays). Overlay cannot invent ids.

    2. 2

      If the icon id is missing from PRIMARY_NAV_ICONS, add the Lucide import and map entry on Layer1. Unknown ids silently fall back to users.

    3. 3

      Set icon on the pack slot or PRIMARY_NAV_OVERLAY.iconById[slotId] on the clone. Keep platform-menu.ts on Layer1; put vertical overflow defaults in PACK.json.platformMenu.

    Locale System

    Next-step: locale env used by href builders and next-intl.

    shopping-basket
    ShoppingBasket
    shopping-bagShoppingBag
    buildingBuilding2
    newspaperNewspaper
    tvTv
    sparklesSparkles
    gamepadGamepad2
    hexagonHexagon
    mapMap
    layout-gridLayoutGrid
    walletWallet
    bellBell
    heartHeart
    shopping-cartShoppingCart
    message-circleMessageCircle
    list-todoListTodo
    settingsSettings
    sunSun
    orbitOrbit
    calendarCalendar
    scaleScale
    hashHash
    typeType
    moonMoon
    compassCompass

    Add a generic glyph here before a pack or overlay references a new id. Do not overlay this file with clone-named icons.

    Overlay socket (remap only)

    Layer1 ships export const PRIMARY_NAV_OVERLAY = {} in lib/navigation/primary-nav-overlay.ts so webpack always resolves the import. A clone overwrites that file (not primary-nav.ts) with:

    getPrimaryNavManifest() maps BASE_MANIFEST through applyHrefOverlay / applyMobileOverlay. Ids that are not in the pack/L1 manifest are ignored.

    Mobile chrome

    components/navigation/bottom-navigation.tsx renders navItems.slice(0, 2), then the center add control, then navItems.slice(2). Icon components come from getPrimaryNavIcon. Desktop rail: sidebar-rail.tsx and sidebar-synced-layout.tsx use the same helper.

    Orchestrator: components/navigation/navigation.tsx dynamically imports desktop-sidebar.tsx and bottom-navigation.tsx. There is no public DesktopNavigation variant registry.

    Recommended path

    Need a new glyph? Land it on Layer1 first (ring/web/lib/navigation/primary-nav-icons.ts), then point the pack slot at the id. Cursor skill layer2-preset-operator owns pack primary-nav.ts; ringization-implementer owns L3 overlay remap. Neither should copy chrome.

    Starter prompt (does not mutate until you approve):

    Add generic Lucide id <id> to Layer1 lib/navigation/primary-nav-icons.ts before pack <pack> references it. Do not import vertical-named icons in chrome. Overlay may only remap existing slot ids in primary-nav-overlay.ts.

    Manual path

    1. 1

      Confirm the slot id exists in the composed primary-nav.ts manifest (mobile / desktop arrays). Overlay cannot invent ids.

    2. 2

      If the icon id is missing from PRIMARY_NAV_ICONS, add the Lucide import and map entry on Layer1. Unknown ids silently fall back to users.

    3. 3

      Set icon on the pack slot or PRIMARY_NAV_OVERLAY.iconById[slotId] on the clone. Keep platform-menu.ts on Layer1; put vertical overflow defaults in PACK.json.platformMenu.

    Locale System

    Next-step: locale env used by href builders and next-intl.

    shopping-basket
    ShoppingBasket
    shopping-bagShoppingBag
    buildingBuilding2
    newspaperNewspaper
    tvTv
    sparklesSparkles
    gamepadGamepad2
    hexagonHexagon
    mapMap
    layout-gridLayoutGrid
    walletWallet
    bellBell
    heartHeart
    shopping-cartShoppingCart
    message-circleMessageCircle
    list-todoListTodo
    settingsSettings
    sunSun
    orbitOrbit
    calendarCalendar
    scaleScale
    hashHash
    typeType
    moonMoon
    compassCompass

    Add a generic glyph here before a pack or overlay references a new id. Do not overlay this file with clone-named icons.

    Overlay socket (remap only)

    Layer1 ships export const PRIMARY_NAV_OVERLAY = {} in lib/navigation/primary-nav-overlay.ts so webpack always resolves the import. A clone overwrites that file (not primary-nav.ts) with:

    getPrimaryNavManifest() maps BASE_MANIFEST through applyHrefOverlay / applyMobileOverlay. Ids that are not in the pack/L1 manifest are ignored.

    Mobile chrome

    components/navigation/bottom-navigation.tsx renders navItems.slice(0, 2), then the center add control, then navItems.slice(2). Icon components come from getPrimaryNavIcon. Desktop rail: sidebar-rail.tsx and sidebar-synced-layout.tsx use the same helper.

    Orchestrator: components/navigation/navigation.tsx dynamically imports desktop-sidebar.tsx and bottom-navigation.tsx. There is no public DesktopNavigation variant registry.

    Recommended path

    Need a new glyph? Land it on Layer1 first (ring/web/lib/navigation/primary-nav-icons.ts), then point the pack slot at the id. Cursor skill layer2-preset-operator owns pack primary-nav.ts; ringization-implementer owns L3 overlay remap. Neither should copy chrome.

    Starter prompt (does not mutate until you approve):

    Add generic Lucide id <id> to Layer1 lib/navigation/primary-nav-icons.ts before pack <pack> references it. Do not import vertical-named icons in chrome. Overlay may only remap existing slot ids in primary-nav-overlay.ts.

    Manual path

    1. 1

      Confirm the slot id exists in the composed primary-nav.ts manifest (mobile / desktop arrays). Overlay cannot invent ids.

    2. 2

      If the icon id is missing from PRIMARY_NAV_ICONS, add the Lucide import and map entry on Layer1. Unknown ids silently fall back to users.

    3. 3

      Set icon on the pack slot or PRIMARY_NAV_OVERLAY.iconById[slotId] on the clone. Keep platform-menu.ts on Layer1; put vertical overflow defaults in PACK.json.platformMenu.

    Locale System

    Next-step: locale env used by href builders and next-intl.