Concepts, value, and typical clone scenarios — less code.
Concepts, value, and typical clone scenarios — less code.
Preparing Ring Platform content
Preparing Ring Platform content
Preparing Ring Platform content
Use Founder / Developer tabs in the docs sidebar to filter this page. HTTP handlers for the same desks live in Admin API.
Ring’s Admin console (/admin/*) is a three-pane operator surface: left menus for section hubs, center for work, right rail for in-module submenus and related hubs. Navigation is role-filtered from one SSOT — platform admins (admin | superadmin) see community, trust, commerce, and CRM hubs; superadmin also sees Platform ops (settings, processes, performance, subscriptions, Web3).
| Surface | What it shows | Source |
|---|---|---|
| Icon rail | Single Admin entry → /admin | sidebar-rail.tsx + isPlatformAdmin |
| Desktop aside | Grouped hubs (Overview → … → Platform) | useAdminNavMenu ← admin-nav-config.ts |
| Mobile bottom sheet | Same filtered hubs | bottom-navigation.tsx |
| Right rail | Submenu → related hubs → optional news stats → help | AdminWrapper → admin-rail.tsx |
| Dashboard tiles | Same hubs (minus Dashboard itself) | admin-dashboard-tiles.ts |
| CRM shell | Full-width center + horizontal tabs (no right rail) | CrmAdminShell |
Operators should not hunt three different menus. One config drives desktop, mobile, dashboard tiles, and the right rail — so promoting someone to admin or superadmin changes what they can open consistently.
Deep-dive: verified `/api/admin/*` routes and access tiers for console work.
Depends-on: RBAC layers and confidential tiers that gate AdminWrapper.
Same-workflow: CRM admin UI under `/admin/crm/*` shares the operator desk model.
Next-step: store compounding project knowledge in the Admin Wiki vault beside News.
Use Founder / Developer tabs in the docs sidebar to filter this page. HTTP handlers for the same desks live in Admin API.
Ring’s Admin console (/admin/*) is a three-pane operator surface: left menus for section hubs, center for work, right rail for in-module submenus and related hubs. Navigation is role-filtered from one SSOT — platform admins (admin | superadmin) see community, trust, commerce, and CRM hubs; superadmin also sees Platform ops (settings, processes, performance, subscriptions, Web3).
| Surface | What it shows | Source |
|---|---|---|
| Icon rail | Single Admin entry → /admin | sidebar-rail.tsx + isPlatformAdmin |
| Desktop aside | Grouped hubs (Overview → … → Platform) | useAdminNavMenu ← admin-nav-config.ts |
| Mobile bottom sheet | Same filtered hubs | bottom-navigation.tsx |
| Right rail | Submenu → related hubs → optional news stats → help | AdminWrapper → admin-rail.tsx |
| Dashboard tiles | Same hubs (minus Dashboard itself) | admin-dashboard-tiles.ts |
| CRM shell | Full-width center + horizontal tabs (no right rail) | CrmAdminShell |
Operators should not hunt three different menus. One config drives desktop, mobile, dashboard tiles, and the right rail — so promoting someone to admin or superadmin changes what they can open consistently.
Deep-dive: verified `/api/admin/*` routes and access tiers for console work.
Depends-on: RBAC layers and confidential tiers that gate AdminWrapper.
Same-workflow: CRM admin UI under `/admin/crm/*` shares the operator desk model.
Next-step: store compounding project knowledge in the Admin Wiki vault beside News.
Use Founder / Developer tabs in the docs sidebar to filter this page. HTTP handlers for the same desks live in Admin API.
Ring’s Admin console (/admin/*) is a three-pane operator surface: left menus for section hubs, center for work, right rail for in-module submenus and related hubs. Navigation is role-filtered from one SSOT — platform admins (admin | superadmin) see community, trust, commerce, and CRM hubs; superadmin also sees Platform ops (settings, processes, performance, subscriptions, Web3).
| Surface | What it shows | Source |
|---|---|---|
| Icon rail | Single Admin entry → /admin | sidebar-rail.tsx + isPlatformAdmin |
| Desktop aside | Grouped hubs (Overview → … → Platform) | useAdminNavMenu ← admin-nav-config.ts |
| Mobile bottom sheet | Same filtered hubs | bottom-navigation.tsx |
| Right rail | Submenu → related hubs → optional news stats → help | AdminWrapper → admin-rail.tsx |
| Dashboard tiles | Same hubs (minus Dashboard itself) | admin-dashboard-tiles.ts |
| CRM shell | Full-width center + horizontal tabs (no right rail) | CrmAdminShell |
Operators should not hunt three different menus. One config drives desktop, mobile, dashboard tiles, and the right rail — so promoting someone to admin or superadmin changes what they can open consistently.
Deep-dive: verified `/api/admin/*` routes and access tiers for console work.
Depends-on: RBAC layers and confidential tiers that gate AdminWrapper.
Same-workflow: CRM admin UI under `/admin/crm/*` shares the operator desk model.
Next-step: store compounding project knowledge in the Admin Wiki vault beside News.
Store hub opens products; rail links orders, stock, commissions, and add product.
Legacy URLs /admin/fraud-desk and /admin/verification still work — they redirect into the Security hub tabs so bookmarks and old docs keep working.
| Role | Main menus | Platform group |
|---|---|---|
admin | Overview, Community, Trust & safety, Commerce, Email & CRM | Hidden |
superadmin | Same + Platform | Settings, Processes, Performance, Subscriptions, Web3 |
SSOT roles: features/auth/user-role.ts (isPlatformAdmin, isSuperadmin). Layout guard: AdminAuthGuard on app/[locale]/admin/layout.tsx.
| Layout shell | components/wrappers/admin-wrapper.tsx → RingRightRailLayout |
| Email shell (deprecated alias) | features/admin/email/email-admin-shell.tsx → CrmAdminShell |
| CRM shell | features/admin/crm/crm-admin-shell.tsx |
| Routes | constants/routes.ts (ADMIN_*, ADMIN_CRM_*; ADMIN_EMAIL_* aliases → /admin/crm/*) |
| Locale copy | locales/{en,uk,ru}/modules/admin.json |
ADMIN_NAV_GROUPS)Group id | Title key | Items (hubs) | minRole |
|---|---|---|---|
overview | navGroupOverview | Dashboard | admin |
community | navGroupCommunity | Users, News, DAO, Moderation, Analytics | admin |
trust | navGroupTrust | Security, Matcher | admin |
commerce | navGroupCommerce | Store → products, Refcodes | admin |
email | navGroupEmail | CRM orders + inbox hubs | admin |
platform | navGroupPlatformOps | Settings, Processes, Performance, Subscriptions, Web3 | superadmin |
Fraud desk and Verification are not main-menu items.
Order in AdminSidebarContent:
resolveRailSection(pageContext) is non-null and getRailSubmenu returns linksgetRelatedHubspageContext === 'dashboard'pageContext === 'news' and newsStats is passedActive highlighting for query tabs uses pathWithQuery (pathname + useSearchParams) so Security / Matcher / Moderation ?tab= links highlight correctly.
pageContext | Rail section | Notable submenu |
|---|---|---|
security / legacy fraud-desk / verification | security | ?tab=overview|fraud|verification|events |
matcher | matcher | Analytics vs ?tab=moderation |
store | store | Products, orders, stock, commissions, add |
crm-* | CRM (tabs, no rail) | Orders, inbox, drafts, contacts, analytics, tasks via CrmAdminShell |
news | news | Articles, categories, analytics, bulk |
web3 | web3 | Dashboard + Settings (settings link if superadmin) |
users | users | ?tab= overview / users / verification / analytics |
moderation | moderation | queue / rules / reports / analytics (URL-synced client) |
Tabs SSOT: features/admin/security/types/security-overview.ts (SECURITY_TABS). Client: admin-security-center-client.tsx (controlled Tabs + router.push).
Rail Moderation → /admin/matcher?tab=moderation. Client admin-matcher-client.tsx reads tab; analytics sub-tabs (performance, quality, …) stay client-local when tab is absent.
All CRM routes wrap with CrmAdminShell + pageContext (crm-orders, crm-inbox, crm-drafts, crm-contacts, crm-tasks, crm-analytics). The shell sets showRightRail={false} and renders horizontal tabs: Orders | Inbox | Drafts | Contacts | Tasks | Analytics. Email HTTP APIs stay at /api/admin/email/*. Project-order chat topology: Owner Project Lab.
There are no redirects from legacy /admin/email-* URLs. Use /admin/crm/*. ADMIN_EMAIL_* constants alias to CRM paths for code compatibility.
/admin/web3/settings must pass pageContext="web3" (superadmin-only page) so the Web3 submenu appears instead of dashboard related hubs.
Add an item under the right group in ADMIN_NAV_GROUPS with href, pageContext, minRole, and labelKey. Add the label to admin-labels.ts and locales/{en,uk,ru}/modules/admin.json.
Wrap the page (or client) with AdminWrapper and the matching pageContext. Email routes use EmailAdminShell.
Extend getRailSubmenu / resolveRailSection. Prefer real routes or ?tab= synced in the page client (see Security / Moderation). Pass pathWithQuery into isActive predicates that inspect query strings.
See-also: clone-level nav customization when forking admin menus.
/admin/fraud-desk → /admin/security?tab=fraud
/admin/verification → /admin/security?tab=verificationStore hub opens products; rail links orders, stock, commissions, and add product.
Legacy URLs /admin/fraud-desk and /admin/verification still work — they redirect into the Security hub tabs so bookmarks and old docs keep working.
| Role | Main menus | Platform group |
|---|---|---|
admin | Overview, Community, Trust & safety, Commerce, Email & CRM | Hidden |
superadmin | Same + Platform | Settings, Processes, Performance, Subscriptions, Web3 |
SSOT roles: features/auth/user-role.ts (isPlatformAdmin, isSuperadmin). Layout guard: AdminAuthGuard on app/[locale]/admin/layout.tsx.
| Layout shell | components/wrappers/admin-wrapper.tsx → RingRightRailLayout |
| Email shell (deprecated alias) | features/admin/email/email-admin-shell.tsx → CrmAdminShell |
| CRM shell | features/admin/crm/crm-admin-shell.tsx |
| Routes | constants/routes.ts (ADMIN_*, ADMIN_CRM_*; ADMIN_EMAIL_* aliases → /admin/crm/*) |
| Locale copy | locales/{en,uk,ru}/modules/admin.json |
ADMIN_NAV_GROUPS)Group id | Title key | Items (hubs) | minRole |
|---|---|---|---|
overview | navGroupOverview | Dashboard | admin |
community | navGroupCommunity | Users, News, DAO, Moderation, Analytics | admin |
trust | navGroupTrust | Security, Matcher | admin |
commerce | navGroupCommerce | Store → products, Refcodes | admin |
email | navGroupEmail | CRM orders + inbox hubs | admin |
platform | navGroupPlatformOps | Settings, Processes, Performance, Subscriptions, Web3 | superadmin |
Fraud desk and Verification are not main-menu items.
Order in AdminSidebarContent:
resolveRailSection(pageContext) is non-null and getRailSubmenu returns linksgetRelatedHubspageContext === 'dashboard'pageContext === 'news' and newsStats is passedActive highlighting for query tabs uses pathWithQuery (pathname + useSearchParams) so Security / Matcher / Moderation ?tab= links highlight correctly.
pageContext | Rail section | Notable submenu |
|---|---|---|
security / legacy fraud-desk / verification | security | ?tab=overview|fraud|verification|events |
matcher | matcher | Analytics vs ?tab=moderation |
store | store | Products, orders, stock, commissions, add |
crm-* | CRM (tabs, no rail) | Orders, inbox, drafts, contacts, analytics, tasks via CrmAdminShell |
news | news | Articles, categories, analytics, bulk |
web3 | web3 | Dashboard + Settings (settings link if superadmin) |
users | users | ?tab= overview / users / verification / analytics |
moderation | moderation | queue / rules / reports / analytics (URL-synced client) |
Tabs SSOT: features/admin/security/types/security-overview.ts (SECURITY_TABS). Client: admin-security-center-client.tsx (controlled Tabs + router.push).
Rail Moderation → /admin/matcher?tab=moderation. Client admin-matcher-client.tsx reads tab; analytics sub-tabs (performance, quality, …) stay client-local when tab is absent.
All CRM routes wrap with CrmAdminShell + pageContext (crm-orders, crm-inbox, crm-drafts, crm-contacts, crm-tasks, crm-analytics). The shell sets showRightRail={false} and renders horizontal tabs: Orders | Inbox | Drafts | Contacts | Tasks | Analytics. Email HTTP APIs stay at /api/admin/email/*. Project-order chat topology: Owner Project Lab.
There are no redirects from legacy /admin/email-* URLs. Use /admin/crm/*. ADMIN_EMAIL_* constants alias to CRM paths for code compatibility.
/admin/web3/settings must pass pageContext="web3" (superadmin-only page) so the Web3 submenu appears instead of dashboard related hubs.
Add an item under the right group in ADMIN_NAV_GROUPS with href, pageContext, minRole, and labelKey. Add the label to admin-labels.ts and locales/{en,uk,ru}/modules/admin.json.
Wrap the page (or client) with AdminWrapper and the matching pageContext. Email routes use EmailAdminShell.
Extend getRailSubmenu / resolveRailSection. Prefer real routes or ?tab= synced in the page client (see Security / Moderation). Pass pathWithQuery into isActive predicates that inspect query strings.
See-also: clone-level nav customization when forking admin menus.
/admin/fraud-desk → /admin/security?tab=fraud
/admin/verification → /admin/security?tab=verificationStore hub opens products; rail links orders, stock, commissions, and add product.
Legacy URLs /admin/fraud-desk and /admin/verification still work — they redirect into the Security hub tabs so bookmarks and old docs keep working.
| Role | Main menus | Platform group |
|---|---|---|
admin | Overview, Community, Trust & safety, Commerce, Email & CRM | Hidden |
superadmin | Same + Platform | Settings, Processes, Performance, Subscriptions, Web3 |
SSOT roles: features/auth/user-role.ts (isPlatformAdmin, isSuperadmin). Layout guard: AdminAuthGuard on app/[locale]/admin/layout.tsx.
| Layout shell | components/wrappers/admin-wrapper.tsx → RingRightRailLayout |
| Email shell (deprecated alias) | features/admin/email/email-admin-shell.tsx → CrmAdminShell |
| CRM shell | features/admin/crm/crm-admin-shell.tsx |
| Routes | constants/routes.ts (ADMIN_*, ADMIN_CRM_*; ADMIN_EMAIL_* aliases → /admin/crm/*) |
| Locale copy | locales/{en,uk,ru}/modules/admin.json |
ADMIN_NAV_GROUPS)Group id | Title key | Items (hubs) | minRole |
|---|---|---|---|
overview | navGroupOverview | Dashboard | admin |
community | navGroupCommunity | Users, News, DAO, Moderation, Analytics | admin |
trust | navGroupTrust | Security, Matcher | admin |
commerce | navGroupCommerce | Store → products, Refcodes | admin |
email | navGroupEmail | CRM orders + inbox hubs | admin |
platform | navGroupPlatformOps | Settings, Processes, Performance, Subscriptions, Web3 | superadmin |
Fraud desk and Verification are not main-menu items.
Order in AdminSidebarContent:
resolveRailSection(pageContext) is non-null and getRailSubmenu returns linksgetRelatedHubspageContext === 'dashboard'pageContext === 'news' and newsStats is passedActive highlighting for query tabs uses pathWithQuery (pathname + useSearchParams) so Security / Matcher / Moderation ?tab= links highlight correctly.
pageContext | Rail section | Notable submenu |
|---|---|---|
security / legacy fraud-desk / verification | security | ?tab=overview|fraud|verification|events |
matcher | matcher | Analytics vs ?tab=moderation |
store | store | Products, orders, stock, commissions, add |
crm-* | CRM (tabs, no rail) | Orders, inbox, drafts, contacts, analytics, tasks via CrmAdminShell |
news | news | Articles, categories, analytics, bulk |
web3 | web3 | Dashboard + Settings (settings link if superadmin) |
users | users | ?tab= overview / users / verification / analytics |
moderation | moderation | queue / rules / reports / analytics (URL-synced client) |
Tabs SSOT: features/admin/security/types/security-overview.ts (SECURITY_TABS). Client: admin-security-center-client.tsx (controlled Tabs + router.push).
Rail Moderation → /admin/matcher?tab=moderation. Client admin-matcher-client.tsx reads tab; analytics sub-tabs (performance, quality, …) stay client-local when tab is absent.
All CRM routes wrap with CrmAdminShell + pageContext (crm-orders, crm-inbox, crm-drafts, crm-contacts, crm-tasks, crm-analytics). The shell sets showRightRail={false} and renders horizontal tabs: Orders | Inbox | Drafts | Contacts | Tasks | Analytics. Email HTTP APIs stay at /api/admin/email/*. Project-order chat topology: Owner Project Lab.
There are no redirects from legacy /admin/email-* URLs. Use /admin/crm/*. ADMIN_EMAIL_* constants alias to CRM paths for code compatibility.
/admin/web3/settings must pass pageContext="web3" (superadmin-only page) so the Web3 submenu appears instead of dashboard related hubs.
Add an item under the right group in ADMIN_NAV_GROUPS with href, pageContext, minRole, and labelKey. Add the label to admin-labels.ts and locales/{en,uk,ru}/modules/admin.json.
Wrap the page (or client) with AdminWrapper and the matching pageContext. Email routes use EmailAdminShell.
Extend getRailSubmenu / resolveRailSection. Prefer real routes or ?tab= synced in the page client (see Security / Moderation). Pass pathWithQuery into isActive predicates that inspect query strings.
See-also: clone-level nav customization when forking admin menus.
/admin/fraud-desk → /admin/security?tab=fraud
/admin/verification → /admin/security?tab=verification