diff --git a/docs/BRANDING.md b/docs/BRANDING.md new file mode 100644 index 0000000..9a3b3ee --- /dev/null +++ b/docs/BRANDING.md @@ -0,0 +1,156 @@ +# Corrosion — Brand & Naming Taxonomy + +**Source:** Oracle (brand review), 2026-06-12. +**Status:** Reference / proposal. +**Locked (2026-06-12):** **Catalyst Console** (control panel/UI — chosen over "Catalyst Control Panel") · **Substrate** (bare-metal execution / process-automation plane) · **re-Agent** (host node agent, binary `corrosion-re-agent-`), under the **Corrosion Management** house. The "brought to you by Corrosion Management and Chemistry" line is flavor copy, not canonical. +**Leaning (not yet final):** **Formula/Formulae** for deploy manifests (replacing "Blueprints"), repo = **Formulary**, CLI `catalyst deploy --formula rust`. +**Reserved well (adopt per-feature as built, don't name vaporware):** the extended terms below — Formulae, Reaction Jobs, Compounds, Lab Notes, Substrate Engine, etc. — are Oracle's proposed expansion. + +--- + +That rebrand is **way stronger** than "Corrosion Management Panel." + +You now have a real naming system instead of a generic panel name: + +```text +Corrosion Management + ├─ Catalyst Control Panel + ├─ Substrate + └─ re-Agent +``` + +That works because all three names belong to the same metaphor family: + +| Name | Meaning | Product fit | +| ------------- | --------------------------------------------------- | ---------------------------- | +| **Corrosion** | transformation, decay, reaction, harsh environments | game/server management brand | +| **Catalyst** | accelerates reactions without being consumed | operator/admin control panel | +| **Substrate** | material/process layer where reaction happens | automation/workflow engine | +| **re-Agent** | chemical reagent + remote agent pun | host/node agent | + +**Catalyst Control Panel** is especially good. It sounds polished, memorable, and domain-specific without being cartoonish. It also gives you a clean product phrase: + +> "Manage your servers from Catalyst." + +or + +> "Catalyst by Corrosion." + +## Tightened brand hierarchy + +```text +Corrosion +Game server orchestration platform + +Catalyst +The web control panel + +Substrate +The automation and process engine + +re-Agent +The BYOH node agent + +Chemistry +Optional umbrella/library/ecosystem name +``` + +## Tagline caution + +The one thing to be careful with is the phrase: + +> "brought to you by Corrosion Management and Chemistry" + +That is clever, but maybe a little wordy for production branding. Use it as flavor copy, not the canonical name. + +Better canonical versions: + +```text +Catalyst Control Panel +by Corrosion + +Catalyst +A Corrosion Management product + +Catalyst +Powered by Corrosion Chemistry +``` + +## Binary naming + +The binary naming is solid: + +```text +corrosion-re-agent-win-amd64.exe +corrosion-re-agent-linux-amd64 +corrosion-re-agent-linux-arm64 +corrosion-re-agent-darwin-arm64 +``` + +Use **linux** instead of **nix** in binary names unless you specifically mean all Unix-like systems — `nix-amd64` can be confused with NixOS / the Nix package manager. For clarity: + +```text +corrosion-re-agent-linux-amd64 +corrosion-re-agent-windows-amd64.exe +``` + +## Favorite full taxonomy + +```text +Corrosion + ├─ Catalyst Console # UI/control panel + ├─ Substrate Engine # automation/workflows + ├─ re-Agent # BYOH host/node agent + ├─ Formulae # server templates/manifests + ├─ Reaction Jobs # queued automation runs + ├─ Compounds # grouped services/stacks + └─ Lab Notes # audit/log/event history +``` + +That gives Corrosion its own identity while still letting **OxideDock** sit underneath as the container orchestration substrate. + +## Clean separation + +```text +Catalyst / Corrosion +Game-aware: +- Dune BattleGroups +- Rust servers +- wipes +- mods +- game lifecycle +- player/admin-facing concepts + +OxideDock +Infra-aware: +- Docker +- Compose +- Swarm +- agents +- logs +- metrics +- stack deploys +- audit +``` + +So in practice: + +```text +Catalyst asks: +"Deploy Dune BattleGroup Alpha." + +Substrate decides: +"Run the BattleGroup deployment workflow." + +re-Agent reports: +"This BYOH node is ready." + +OxideDock executes: +"Render/deploy/update the container stack." +``` + +That is a **very clean product ecosystem**. + +## One rename suggestion + +Consider **Catalyst Console** over **Catalyst Control Panel** for the polished SaaS/product name. But if you like the old-school "control panel" vibe, **Catalyst Control Panel** absolutely works. diff --git a/frontend/index.html b/frontend/index.html index 3eb779f..eaf2c9a 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -8,7 +8,7 @@ - Corrosion Management + Catalyst Console diff --git a/frontend/src/components/ds/brand/Logo.vue b/frontend/src/components/ds/brand/Logo.vue index 15fa7d7..64e583e 100644 --- a/frontend/src/components/ds/brand/Logo.vue +++ b/frontend/src/components/ds/brand/Logo.vue @@ -1,15 +1,15 @@ @@ -70,7 +70,7 @@ const tagText = computed(() => color: 'var(--text-primary)', lineHeight: 1, }" - >Corrosion + >Catalyst
- No host agent connected + No re-Agent connected
-
Install the Corrosion host agent from the Server page
+
Install re-Agent from the Server page
@@ -272,7 +272,7 @@ const themeIcon = computed(() => theme.value === 'dark' ? 'sun' : 'moon')
- Corrosion + Catalyst / {{ serverName }}
diff --git a/frontend/src/composables/useThemeGame.ts b/frontend/src/composables/useThemeGame.ts index 33721f5..c5fa310 100644 --- a/frontend/src/composables/useThemeGame.ts +++ b/frontend/src/composables/useThemeGame.ts @@ -98,7 +98,7 @@ function applyActiveGame(g: ActiveGame, persist: boolean): void { /** * Derive the active game from the deployed fleet — the game instances are the * source of truth for which game(s) a license runs (game_instances.game, set by - * the host agent). Exactly one game deployed → skin the shell to it; zero or + * re-Agent). Exactly one game deployed → skin the shell to it; zero or * multiple → 'all' (neutral house skin). * * NO-OP when the operator has a manual pick stored (cc-active-game present): an diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index a15ac33..69f66f5 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -52,7 +52,7 @@ const marketingChildren: RouteRecordRaw[] = [ component: () => import('@/views/marketing/HowItWorksView.vue'), meta: { title: 'How It Works — Corrosion', - description: 'Install one host agent on Windows or Linux. It connects outbound-only to Corrosion — no inbound ports, no SSH. Manage every game instance from the browser.', + description: 'Install one re-Agent on Windows or Linux. It connects outbound-only to Corrosion — no inbound ports, no SSH. Manage every game instance from the browser.', }, }, { @@ -70,7 +70,7 @@ const marketingChildren: RouteRecordRaw[] = [ component: () => import('@/views/marketing/RoadmapView.vue'), meta: { title: 'Roadmap — Corrosion', - description: 'Phase 1 shipped: core control plane, auto-wiper, plugin management. In progress: Dune, Conan, Soulmask multi-game blueprints. Planned: API access, integrations.', + description: 'Phase 1 shipped: core control plane, auto-wiper, plugin management. In progress: Dune, Conan, Soulmask multi-game Formulae. Planned: API access, integrations.', }, }, { @@ -94,25 +94,25 @@ const panelRoutes: RouteRecordRaw[] = [ path: '/login', name: 'login', component: () => import('@/views/auth/LoginView.vue'), - meta: { guest: true, title: 'Sign in — Corrosion' }, + meta: { guest: true, title: 'Sign in to Catalyst' }, }, { path: '/register', name: 'register', component: () => import('@/views/auth/RegisterView.vue'), - meta: { guest: true, title: 'Create account — Corrosion' }, + meta: { guest: true, title: 'Create account — Catalyst' }, }, { path: '/forgot-password', name: 'forgot-password', component: () => import('@/views/auth/ForgotPasswordView.vue'), - meta: { guest: true, title: 'Reset password — Corrosion' }, + meta: { guest: true, title: 'Reset password — Catalyst' }, }, { path: '/setup', name: 'setup-wizard', component: () => import('@/views/auth/SetupWizardView.vue'), - meta: { requiresAuth: true, title: 'Setup — Corrosion' }, + meta: { requiresAuth: true, title: 'Setup — Catalyst' }, }, // Admin dashboard routes (with sidebar layout) @@ -125,260 +125,260 @@ const panelRoutes: RouteRecordRaw[] = [ path: '', name: 'dashboard', component: () => import('@/views/admin/DashboardView.vue'), - meta: { title: 'Dashboard — Corrosion' }, + meta: { title: 'Dashboard · Catalyst' }, }, { path: 'server', name: 'server', component: () => import('@/views/admin/ServerView.vue'), - meta: { title: 'Server — Corrosion' }, + meta: { title: 'Server · Catalyst' }, }, { path: 'console', name: 'console', component: () => import('@/views/admin/ConsoleView.vue'), - meta: { title: 'Console — Corrosion' }, + meta: { title: 'Console · Catalyst' }, }, { path: 'players', name: 'players', component: () => import('@/views/admin/PlayersView.vue'), - meta: { title: 'Players — Corrosion' }, + meta: { title: 'Players · Catalyst' }, }, { path: 'plugins', name: 'plugins', component: () => import('@/views/admin/PluginsView.vue'), - meta: { title: 'Plugins — Corrosion' }, + meta: { title: 'Plugins · Catalyst' }, }, { path: 'files', name: 'files', component: () => import('@/views/admin/FileManagerView.vue'), - meta: { title: 'Files — Corrosion' }, + meta: { title: 'Files · Catalyst' }, }, { path: 'plugin-configs', name: 'plugin-configs', component: () => import('@/views/admin/PluginConfigsView.vue'), - meta: { title: 'Plugin Configs — Corrosion' }, + meta: { title: 'Plugin Configs · Catalyst' }, }, { path: 'loot-builder', name: 'loot-builder', component: () => import('@/views/admin/LootBuilderView.vue'), - meta: { title: 'Loot Builder — Corrosion' }, + meta: { title: 'Loot Builder · Catalyst' }, }, { path: 'teleport-config', name: 'teleport-config', component: () => import('@/views/admin/TeleportConfigView.vue'), - meta: { title: 'Teleport Config — Corrosion' }, + meta: { title: 'Teleport Config · Catalyst' }, }, { path: 'gather-manager', name: 'gather-manager', component: () => import('@/views/admin/GatherManagerView.vue'), - meta: { title: 'Gather Manager — Corrosion' }, + meta: { title: 'Gather Manager · Catalyst' }, }, { path: 'autodoors', name: 'autodoors', component: () => import('@/views/admin/AutoDoorsView.vue'), - meta: { title: 'Auto Doors — Corrosion' }, + meta: { title: 'Auto Doors · Catalyst' }, }, { path: 'kits', name: 'kits-config', component: () => import('@/views/admin/KitsView.vue'), - meta: { title: 'Kits — Corrosion' }, + meta: { title: 'Kits · Catalyst' }, }, { path: 'furnace-splitter', name: 'furnace-splitter', component: () => import('@/views/admin/FurnaceSplitterView.vue'), - meta: { title: 'Furnace Splitter — Corrosion' }, + meta: { title: 'Furnace Splitter · Catalyst' }, }, { path: 'better-chat', name: 'better-chat', component: () => import('@/views/admin/BetterChatView.vue'), - meta: { title: 'Better Chat — Corrosion' }, + meta: { title: 'Better Chat · Catalyst' }, }, { path: 'timed-execute', name: 'timed-execute', component: () => import('@/views/admin/TimedExecuteView.vue'), - meta: { title: 'Timed Execute — Corrosion' }, + meta: { title: 'Timed Execute · Catalyst' }, }, { path: 'raidable-bases', name: 'raidable-bases', component: () => import('@/views/admin/RaidableBasesView.vue'), - meta: { title: 'Raidable Bases — Corrosion' }, + meta: { title: 'Raidable Bases · Catalyst' }, }, { path: 'wipes', name: 'wipes', component: () => import('@/views/admin/WipesView.vue'), - meta: { title: 'Wipes — Corrosion' }, + meta: { title: 'Wipes · Catalyst' }, }, { path: 'wipes/profiles', name: 'wipe-profiles', component: () => import('@/views/admin/WipeProfilesView.vue'), - meta: { title: 'Wipe Profiles — Corrosion' }, + meta: { title: 'Wipe Profiles · Catalyst' }, }, { path: 'wipes/calendar', name: 'wipe-calendar', component: () => import('@/views/admin/WipeCalendarView.vue'), - meta: { title: 'Wipe Calendar — Corrosion' }, + meta: { title: 'Wipe Calendar · Catalyst' }, }, { path: 'wipes/history', name: 'wipe-history', component: () => import('@/views/admin/WipeHistoryView.vue'), - meta: { title: 'Wipe History — Corrosion' }, + meta: { title: 'Wipe History · Catalyst' }, }, { path: 'wipes/analytics', name: 'wipe-analytics', component: () => import('@/views/admin/WipeAnalyticsView.vue'), - meta: { title: 'Wipe Analytics — Corrosion' }, + meta: { title: 'Wipe Analytics · Catalyst' }, }, { path: 'maps', name: 'maps', component: () => import('@/views/admin/MapsView.vue'), - meta: { title: 'Maps — Corrosion' }, + meta: { title: 'Maps · Catalyst' }, }, { path: 'maps/analytics', name: 'map-analytics', component: () => import('@/views/admin/MapAnalyticsView.vue'), - meta: { title: 'Map Analytics — Corrosion' }, + meta: { title: 'Map Analytics · Catalyst' }, }, { path: 'chat', name: 'chat', component: () => import('@/views/admin/ChatLogView.vue'), - meta: { title: 'Chat Log — Corrosion' }, + meta: { title: 'Chat Log · Catalyst' }, }, { path: 'analytics', name: 'analytics', component: () => import('@/views/admin/AnalyticsView.vue'), - meta: { title: 'Analytics — Corrosion' }, + meta: { title: 'Analytics · Catalyst' }, }, { path: 'retention', name: 'retention', component: () => import('@/views/admin/PlayerRetentionView.vue'), - meta: { title: 'Player Retention — Corrosion' }, + meta: { title: 'Player Retention · Catalyst' }, }, { path: 'notifications', name: 'notifications', component: () => import('@/views/admin/NotificationsView.vue'), - meta: { title: 'Notifications — Corrosion' }, + meta: { title: 'Notifications · Catalyst' }, }, { path: 'team', name: 'team', component: () => import('@/views/admin/TeamView.vue'), - meta: { title: 'Team — Corrosion' }, + meta: { title: 'Team · Catalyst' }, }, { path: 'store/config', name: 'store-config', component: () => import('@/views/admin/StoreConfigView.vue'), - meta: { title: 'Store Config — Corrosion' }, + meta: { title: 'Store Config · Catalyst' }, }, { path: 'store/items', name: 'store-items', component: () => import('@/views/admin/StoreItemsView.vue'), - meta: { title: 'Store Items — Corrosion' }, + meta: { title: 'Store Items · Catalyst' }, }, { path: 'store/revenue', name: 'store-revenue', component: () => import('@/views/admin/StoreRevenueView.vue'), - meta: { title: 'Store Revenue — Corrosion' }, + meta: { title: 'Store Revenue · Catalyst' }, }, { path: 'modules', name: 'modules', component: () => import('@/views/admin/ModuleStoreView.vue'), - meta: { title: 'Modules — Corrosion' }, + meta: { title: 'Modules · Catalyst' }, }, { path: 'settings', name: 'settings', component: () => import('@/views/admin/SettingsView.vue'), - meta: { title: 'Settings — Corrosion' }, + meta: { title: 'Settings · Catalyst' }, }, { path: 'schedules', name: 'schedules', component: () => import('@/views/admin/SchedulesView.vue'), - meta: { title: 'Schedules — Corrosion' }, + meta: { title: 'Schedules · Catalyst' }, }, { path: 'migration', name: 'migration', component: () => import('@/views/admin/MigrationView.vue'), - meta: { title: 'Migration — Corrosion' }, + meta: { title: 'Migration · Catalyst' }, }, { path: 'changelog', name: 'changelog', component: () => import('@/views/admin/ChangelogView.vue'), - meta: { title: 'Changelog — Corrosion' }, + meta: { title: 'Changelog · Catalyst' }, }, { path: 'alerts', name: 'alerts', component: () => import('@/views/admin/AlertsView.vue'), - meta: { title: 'Alerts — Corrosion' }, + meta: { title: 'Alerts · Catalyst' }, }, { path: 'fleet', name: 'fleet', component: () => import('@/views/admin/FleetView.vue'), - meta: { title: 'Fleet — Corrosion', requiresAuth: true }, + meta: { title: 'Fleet · Catalyst', requiresAuth: true }, }, // Platform Admin views (super-admin only) { path: 'admin', name: 'platform-admin', component: () => import('@/views/platform-admin/AdminDashboard.vue'), - meta: { superAdmin: true, title: 'Admin — Corrosion' }, + meta: { superAdmin: true, title: 'Admin · Catalyst' }, }, { path: 'admin/licenses', name: 'platform-licenses', component: () => import('@/views/platform-admin/AdminLicenses.vue'), - meta: { superAdmin: true, title: 'Admin: Licenses — Corrosion' }, + meta: { superAdmin: true, title: 'Admin: Licenses · Catalyst' }, }, { path: 'admin/subscriptions', name: 'platform-subscriptions', component: () => import('@/views/platform-admin/AdminSubscriptions.vue'), - meta: { superAdmin: true, title: 'Admin: Subscriptions — Corrosion' }, + meta: { superAdmin: true, title: 'Admin: Subscriptions · Catalyst' }, }, { path: 'admin/users', name: 'platform-users', component: () => import('@/views/platform-admin/AdminUsers.vue'), - meta: { superAdmin: true, title: 'Admin: Users — Corrosion' }, + meta: { superAdmin: true, title: 'Admin: Users · Catalyst' }, }, { path: 'admin/servers', name: 'platform-servers', component: () => import('@/views/platform-admin/AdminServers.vue'), - meta: { superAdmin: true, title: 'Admin: Servers — Corrosion' }, + meta: { superAdmin: true, title: 'Admin: Servers · Catalyst' }, }, ], }, @@ -413,7 +413,7 @@ const panelRoutes: RouteRecordRaw[] = [ path: '/status', name: 'status', component: () => import('@/views/public/StatusPageView.vue'), - meta: { title: 'Status — Corrosion' }, + meta: { title: 'Status · Catalyst' }, }, // Catch-all @@ -488,14 +488,14 @@ function setOrClearMeta(selector: string, attr: string, value: string): void { router.afterEach((to) => { // Title - document.title = to.meta.title ?? 'Corrosion Management' + document.title = to.meta.title ?? 'Catalyst Console' // Description const desc = to.meta.description ?? '' setOrClearMeta('meta[name="description"]', 'content', desc) // OG title - setOrClearMeta('meta[property="og:title"]', 'content', to.meta.title ?? 'Corrosion Management') + setOrClearMeta('meta[property="og:title"]', 'content', to.meta.title ?? 'Catalyst Console') // OG description setOrClearMeta('meta[property="og:description"]', 'content', desc) diff --git a/frontend/src/stores/files.ts b/frontend/src/stores/files.ts index 085d2bc..60412a6 100644 --- a/frontend/src/stores/files.ts +++ b/frontend/src/stores/files.ts @@ -39,7 +39,7 @@ export const useFilesStore = defineStore('files', () => { async function list(path: string): Promise { const id = currentId() if (!id) { - error.value = 'No instance — connect the host agent' + error.value = 'No instance — connect re-Agent' entries.value = [] return } diff --git a/frontend/src/views/admin/ConsoleView.vue b/frontend/src/views/admin/ConsoleView.vue index ff8e715..b244677 100644 --- a/frontend/src/views/admin/ConsoleView.vue +++ b/frontend/src/views/admin/ConsoleView.vue @@ -87,7 +87,7 @@ function handleWebSocketMessage(message: WebSocketMessage) { let unsubscribe: (() => void) | null = null onMounted(() => { - addLine('Corrosion console initialized.', 'system') + addLine('Catalyst Console initialized.', 'system') addLine('Type a command and press Enter to send it to the server.', 'system') if (server.connection?.connection_status !== 'connected') { addLine('Warning: server is not connected. Commands will fail.', 'warning') diff --git a/frontend/src/views/admin/DashboardView.vue b/frontend/src/views/admin/DashboardView.vue index 5922067..d66c127 100644 --- a/frontend/src/views/admin/DashboardView.vue +++ b/frontend/src/views/admin/DashboardView.vue @@ -259,7 +259,7 @@ function navServer() { router.push('/server') }