feat(brand): chemistry rebrand across panel + marketing
The logged-in panel is now Catalyst Console (by Corrosion); the marketing site
keeps Corrosion as the platform/company and introduces the lexicon.
- Wordmark: panel/auth Logo lockup -> 'Catalyst' / 'by Corrosion'; the shared
C-core house mark (CorrosionMark) is untouched. Marketing nav/footer keep the
'Corrosion' wordmark.
- Titles: panel routes -> '{View} · Catalyst'; auth -> Catalyst; document.title
fallback + index.html -> 'Catalyst Console'. Marketing titles stay '— Corrosion'.
- Host agent user-facing copy -> 're-Agent' across panel + marketing (the
binary filename / CDN URLs / config paths / domains are UNCHANGED — that's the
separate infra/binary-rename sprint; 'Download re-Agent' fetching
corrosion-host-agent-* is the intended intermediate state).
- Deploy-recipe 'blueprint/template' -> 'Formula/Formulae' in marketing + roadmap;
Rust in-game 'blueprint wipe' kept (game term).
- docs/BRANDING.md added (Oracle review + locked lexicon).
vue-tsc + vite green; rendered clean both faces (Catalyst panel / Corrosion
marketing), 0 console errors.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
<link rel="apple-touch-icon" href="/favicon.png" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="theme-color" content="#0a0a0a" />
|
||||
<title>Corrosion Management</title>
|
||||
<title>Catalyst Console</title>
|
||||
<meta name="description" content="Management panel for self-hosted survival game servers — Rust, Dune: Awakening, Conan Exiles, Soulmask. Wipe automation, plugins, monitoring. Bring your own server." />
|
||||
<meta property="og:title" content="Corrosion — Game Server Operations for Self-Hosted Communities" />
|
||||
<meta property="og:description" content="Management panel for self-hosted survival game servers — Rust, Dune: Awakening, Conan Exiles, Soulmask. Wipe automation, plugins, monitoring. Bring your own server." />
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
<script setup lang="ts">
|
||||
/**
|
||||
* Logo — Corrosion brand lockup.
|
||||
* Composes the CorrosionMark SVG + Oxanium wordmark + optional tagline.
|
||||
* Logo — Catalyst brand lockup.
|
||||
* Composes the CorrosionMark SVG + Oxanium wordmark "Catalyst" + optional tagline.
|
||||
*
|
||||
* The mark renders in `currentColor`, so set `color: var(--accent)` on a
|
||||
* parent (or pass `markColor`) to theme it per active game.
|
||||
*
|
||||
* Props mirror Logo.jsx exactly:
|
||||
* size — base px size; drives mark em-size + wordmark scaling
|
||||
* wordmark — show the "Corrosion" text (default true)
|
||||
* tagline — false | true (→ "Management Panel") | custom string
|
||||
* wordmark — show the "Catalyst" text (default true)
|
||||
* tagline — false | true (→ "by Corrosion") | custom string
|
||||
* glow — accent drop-shadow for marketing / login hero use
|
||||
* markColor — force a fixed color on the mark (bypasses currentColor theming)
|
||||
*/
|
||||
@@ -35,7 +35,7 @@ const glowFilter = computed(() =>
|
||||
props.glow ? `drop-shadow(0 0 ${props.size * 0.5}px var(--accent-glow))` : 'none'
|
||||
)
|
||||
const tagText = computed(() =>
|
||||
typeof props.tagline === 'string' ? props.tagline : 'Management Panel'
|
||||
typeof props.tagline === 'string' ? props.tagline : 'by Corrosion'
|
||||
)
|
||||
</script>
|
||||
|
||||
@@ -70,7 +70,7 @@ const tagText = computed(() =>
|
||||
color: 'var(--text-primary)',
|
||||
lineHeight: 1,
|
||||
}"
|
||||
>Corrosion</span>
|
||||
>Catalyst</span>
|
||||
<span
|
||||
v-if="tagline"
|
||||
:style="{
|
||||
|
||||
@@ -126,7 +126,7 @@ const agentLabel = computed(() => {
|
||||
})
|
||||
// One host → its hostname; multiple → fleet count.
|
||||
const agentName = computed(() =>
|
||||
hostCount.value === 1 ? (realHosts.value[0]?.hostname ?? 'Host agent') : `${hostCount.value} hosts`,
|
||||
hostCount.value === 1 ? (realHosts.value[0]?.hostname ?? 're-Agent') : `${hostCount.value} hosts`,
|
||||
)
|
||||
|
||||
const agentMetaLine = computed(() => {
|
||||
@@ -231,9 +231,9 @@ const themeIcon = computed(() => theme.value === 'dark' ? 'sun' : 'moon')
|
||||
<div v-else class="agent agent--empty">
|
||||
<div class="agent__row">
|
||||
<StatusDot tone="offline" />
|
||||
<span class="agent__name agent__name--muted">No host agent connected</span>
|
||||
<span class="agent__name agent__name--muted">No re-Agent connected</span>
|
||||
</div>
|
||||
<div class="agent__meta">Install the Corrosion host agent from the Server page</div>
|
||||
<div class="agent__meta">Install re-Agent from the Server page</div>
|
||||
</div>
|
||||
<!-- User / logout row -->
|
||||
<div class="side__user">
|
||||
@@ -272,7 +272,7 @@ const themeIcon = computed(() => theme.value === 'dark' ? 'sun' : 'moon')
|
||||
|
||||
<!-- Breadcrumb -->
|
||||
<div class="top__crumbs">
|
||||
<span class="crumb">Corrosion</span>
|
||||
<span class="crumb">Catalyst</span>
|
||||
<span class="crumb__sep">/</span>
|
||||
<span class="crumb crumb--cluster">{{ serverName }}</span>
|
||||
</div>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -39,7 +39,7 @@ export const useFilesStore = defineStore('files', () => {
|
||||
async function list(path: string): Promise<void> {
|
||||
const id = currentId()
|
||||
if (!id) {
|
||||
error.value = 'No instance — connect the host agent'
|
||||
error.value = 'No instance — connect re-Agent'
|
||||
entries.value = []
|
||||
return
|
||||
}
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -259,7 +259,7 @@ function navServer() { router.push('/server') }
|
||||
<EmptyState
|
||||
icon="server"
|
||||
title="No server connected"
|
||||
description="Install the Corrosion host agent on your host machine to begin managing your server from Corrosion."
|
||||
description="Install re-Agent on your host machine to begin managing your server from Catalyst."
|
||||
>
|
||||
<template #action>
|
||||
<Button icon="server" @click="navServer">Set up server</Button>
|
||||
@@ -404,7 +404,7 @@ function navServer() { router.push('/server') }
|
||||
<div class="dash__col dash__col--side">
|
||||
|
||||
<!-- Resources — real stats from agent; null = '—' -->
|
||||
<Panel title="Resources" subtitle="Host agent telemetry">
|
||||
<Panel title="Resources" subtitle="re-Agent telemetry">
|
||||
<div class="solo-meters">
|
||||
<ResourceMeter
|
||||
label="CPU"
|
||||
@@ -418,7 +418,7 @@ function navServer() { router.push('/server') }
|
||||
/>
|
||||
</div>
|
||||
<div v-if="soloCpu === null && soloRamMb === null" class="meters-note">
|
||||
Resource metrics arrive via the host agent heartbeat.
|
||||
Resource metrics arrive via re-Agent heartbeat.
|
||||
<Button size="sm" variant="ghost" icon="server" class="meters-cta" @click="navServer">
|
||||
Agent setup
|
||||
</Button>
|
||||
|
||||
@@ -193,8 +193,8 @@ async function confirmDelete(path: string) {
|
||||
<Panel v-if="!instancesStore.loading && instancesStore.instances.length === 0">
|
||||
<EmptyState
|
||||
icon="server"
|
||||
title="No host agent connected"
|
||||
description="Install the host agent from the Server page to manage files on your game server."
|
||||
title="No re-Agent connected"
|
||||
description="Install re-Agent from the Server page to manage files on your game server."
|
||||
>
|
||||
<template #action>
|
||||
<Button variant="secondary" size="sm" icon="server" @click="router.push('/server')">
|
||||
|
||||
@@ -154,7 +154,7 @@ function relativeHeartbeat(iso: string | null): string {
|
||||
<EmptyState
|
||||
icon="server"
|
||||
title="No hosts connected yet"
|
||||
description="Install the Corrosion host agent on your server machine to see it here."
|
||||
description="Install re-Agent on your server machine to see it here."
|
||||
>
|
||||
<template #action>
|
||||
<Button variant="primary" @click="router.push('/server')">Go to Server page</Button>
|
||||
|
||||
@@ -52,7 +52,7 @@ const tabItems = [
|
||||
function sourceLabel(source: string): string {
|
||||
switch (source) {
|
||||
case 'umod': return 'uMod'
|
||||
case 'corrosion_module': return 'Corrosion'
|
||||
case 'corrosion_module': return 'Catalyst'
|
||||
case 'manual': return 'Manual'
|
||||
default: return source
|
||||
}
|
||||
@@ -485,7 +485,7 @@ onMounted(() => {
|
||||
</Panel>
|
||||
|
||||
<Alert tone="info">
|
||||
The plugin will be registered in your plugin list immediately. Your host agent must be connected
|
||||
The plugin will be registered in your plugin list immediately. Your re-Agent must be connected
|
||||
for the file to be delivered to the game server. If the agent is offline, re-upload once it reconnects.
|
||||
</Alert>
|
||||
</div>
|
||||
|
||||
@@ -327,7 +327,7 @@ async function saveConfig() {
|
||||
|
||||
async function serverAction(action: 'start' | 'stop' | 'restart') {
|
||||
if (!currentInstance.value) {
|
||||
toast.error('No game instance to control — connect the host agent first')
|
||||
toast.error('No game instance to control — connect re-Agent first')
|
||||
return
|
||||
}
|
||||
actionLoading.value = action
|
||||
@@ -532,7 +532,7 @@ onMounted(async () => {
|
||||
v-if="!currentInstance"
|
||||
icon="server"
|
||||
title="No game instance connected"
|
||||
:description="'Install the host agent and add a ' + profile.label + ' instance to its config to manage it here.'"
|
||||
:description="'Install re-Agent and add a ' + profile.label + ' instance to its config to manage it here.'"
|
||||
/>
|
||||
|
||||
<template v-else>
|
||||
@@ -611,7 +611,7 @@ onMounted(async () => {
|
||||
</Panel>
|
||||
|
||||
<!-- Host agent -->
|
||||
<Panel title="Host agent" subtitle="Bare-metal server management binary">
|
||||
<Panel title="re-Agent" subtitle="Bare-metal server management binary">
|
||||
<template #actions>
|
||||
<Badge :tone="isAgentConnected ? 'online' : 'offline'" :dot="true" :pulse="isAgentConnected">
|
||||
{{ isAgentConnected ? 'Active' : 'Inactive' }}
|
||||
@@ -640,7 +640,7 @@ onMounted(async () => {
|
||||
<!-- Download -->
|
||||
<div class="sv__section-head">
|
||||
<Icon name="download" :size="14" />
|
||||
<span>Download host agent</span>
|
||||
<span>Download re-Agent</span>
|
||||
</div>
|
||||
<div class="sv__downloads sv__mb">
|
||||
<a
|
||||
@@ -683,7 +683,7 @@ onMounted(async () => {
|
||||
|
||||
<!-- Linux commands -->
|
||||
<div v-if="setupTab === 'linux'" class="sv__codeblock">
|
||||
<p class="sv__cmt"># Download the agent</p>
|
||||
<p class="sv__cmt"># Download re-Agent</p>
|
||||
<p>curl -LO https://cdn.corrosionmgmt.com/host-agent/latest/corrosion-host-agent-linux-amd64</p>
|
||||
<p>chmod +x corrosion-host-agent-linux-amd64</p>
|
||||
<p class="sv__cmt sv__mt"># Write /etc/corrosion/agent.toml (see config block below), then run:</p>
|
||||
@@ -694,7 +694,7 @@ onMounted(async () => {
|
||||
<!-- Windows commands -->
|
||||
<div v-if="setupTab === 'windows'" class="sv__codeblock">
|
||||
<p class="sv__cmt"># Requires PowerShell (not Command Prompt)</p>
|
||||
<p class="sv__cmt"># Download the agent</p>
|
||||
<p class="sv__cmt"># Download re-Agent</p>
|
||||
<p>Invoke-WebRequest -Uri <span class="sv__accent">"https://cdn.corrosionmgmt.com/host-agent/latest/corrosion-host-agent-windows-amd64.exe"</span> -OutFile <span class="sv__accent">"corrosion-host-agent-windows-amd64.exe"</span></p>
|
||||
<p class="sv__cmt sv__mt"># Write C:\ProgramData\Corrosion\agent.toml (see config block below), then run:</p>
|
||||
<p>New-Item -ItemType Directory -Force -Path <span class="sv__accent">"C:\ProgramData\Corrosion"</span></p>
|
||||
@@ -726,7 +726,7 @@ onMounted(async () => {
|
||||
<pre class="sv__pre">{{ agentTomlConfig }}</pre>
|
||||
</div>
|
||||
<Alert v-if="!agentCreds" tone="warn" class="sv__mt">
|
||||
Could not load credentials from server. Copy this config and replace the placeholders with values from your Corrosion dashboard settings.
|
||||
Could not load credentials from server. Copy this config and replace the placeholders with values from your Catalyst dashboard settings.
|
||||
</Alert>
|
||||
</Panel>
|
||||
|
||||
@@ -858,7 +858,7 @@ onMounted(async () => {
|
||||
<EmptyState
|
||||
icon="box"
|
||||
title="Docker-managed deployment"
|
||||
:description="profile.label + ' servers are managed via Docker Compose. Connect the host agent on your Docker host to enable lifecycle management.'"
|
||||
:description="profile.label + ' servers are managed via Docker Compose. Connect re-Agent on your Docker host to enable lifecycle management.'"
|
||||
>
|
||||
<template #action>
|
||||
<Badge tone="info">Docker · Compose</Badge>
|
||||
@@ -929,7 +929,7 @@ onMounted(async () => {
|
||||
<EmptyState
|
||||
icon="layers"
|
||||
:title="profile.label + ' mod management'"
|
||||
:description="profile.label + ' loads mods directly from Steam Workshop. Manage your mod list in server config — no Corrosion install step needed.'"
|
||||
:description="profile.label + ' loads mods directly from Steam Workshop. Manage your mod list in server config — no Catalyst install step needed.'"
|
||||
/>
|
||||
</Panel>
|
||||
|
||||
@@ -973,7 +973,7 @@ onMounted(async () => {
|
||||
<EmptyState
|
||||
icon="network"
|
||||
title="Cluster management coming soon"
|
||||
:description="'Connect a ' + profile.label + ' host to manage the main-client cluster from this panel. Cluster configuration requires the host agent.'"
|
||||
:description="'Connect a ' + profile.label + ' host to manage the main-client cluster from this panel. Cluster configuration requires re-Agent.'"
|
||||
/>
|
||||
</Panel>
|
||||
|
||||
@@ -986,7 +986,7 @@ onMounted(async () => {
|
||||
<EmptyState
|
||||
icon="map"
|
||||
title="Sietch management requires a connected Dune host"
|
||||
description="Connect the host agent on your Dune: Awakening Docker host to manage BattleGroups and Sietches from this panel."
|
||||
description="Connect re-Agent on your Dune: Awakening Docker host to manage BattleGroups and Sietches from this panel."
|
||||
/>
|
||||
</Panel>
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@ function handleBackToLogin() {
|
||||
<!-- Branding -->
|
||||
<div class="auth-brand">
|
||||
<div class="auth-brand__mark">
|
||||
<Logo :size="40" :glow="true" tagline="Game Server Operations" />
|
||||
<Logo :size="40" :glow="true" tagline="by Corrosion" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ function syncPorts() {
|
||||
}
|
||||
|
||||
const connectionTypes = [
|
||||
{ value: 'bare_metal', label: 'Bare metal / VPS', desc: 'Direct connection via Corrosion host agent' },
|
||||
{ value: 'bare_metal', label: 'Bare metal / VPS', desc: 'Direct connection via re-Agent' },
|
||||
{ value: 'amp', label: 'AMP (CubeCoders)', desc: 'Connect through AMP panel API' },
|
||||
{ value: 'pterodactyl', label: 'Pterodactyl', desc: 'Connect through Pterodactyl panel API' },
|
||||
]
|
||||
@@ -183,7 +183,7 @@ async function completeSetup() {
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Step 2: Corrosion host agent install -->
|
||||
<!-- Step 2: re-Agent install -->
|
||||
<div v-if="step === 2" class="setup-card">
|
||||
<div class="setup-card__head setup-card__head--center">
|
||||
<div class="setup-icon">
|
||||
@@ -191,12 +191,12 @@ async function completeSetup() {
|
||||
<path d="M5 12.55a11 11 0 0 1 14.08 0M1.42 9a16 16 0 0 1 21.16 0M8.53 16.11a6 6 0 0 1 6.95 0M12 20h.01" />
|
||||
</svg>
|
||||
</div>
|
||||
<h1 class="setup-card__title">Install the Corrosion host agent</h1>
|
||||
<p class="setup-card__sub">The agent runs on your server and connects to Corrosion — no inbound ports required.</p>
|
||||
<h1 class="setup-card__title">Install re-Agent</h1>
|
||||
<p class="setup-card__sub">re-Agent runs on your server and connects to Corrosion — no inbound ports required.</p>
|
||||
</div>
|
||||
|
||||
<div class="setup-code">
|
||||
<p class="setup-code__comment"># Download the Corrosion host agent (Linux)</p>
|
||||
<p class="setup-code__comment"># Download re-Agent (Linux)</p>
|
||||
<p class="setup-code__cmd">curl -LO https://cdn.corrosionmgmt.com/host-agent/latest/corrosion-host-agent-linux-amd64</p>
|
||||
<p class="setup-code__cmd">chmod +x corrosion-host-agent-linux-amd64</p>
|
||||
<p class="setup-code__comment setup-code__comment--mt"># Start with your license key</p>
|
||||
@@ -206,7 +206,7 @@ async function completeSetup() {
|
||||
</div>
|
||||
|
||||
<p class="setup-hint">
|
||||
On Windows, download the agent from the Server page after setup. The agent connects outbound and auto-registers with your panel.
|
||||
On Windows, download re-Agent from the Server page after setup. re-Agent connects outbound and auto-registers with Catalyst.
|
||||
</p>
|
||||
|
||||
<div class="setup-actions">
|
||||
|
||||
@@ -105,7 +105,7 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<h2 class="title">Real access to a real platform.</h2>
|
||||
<p class="lead">
|
||||
Early access is not a waitlist gimmick. It is how we manage onboarding while the
|
||||
platform stabilizes. You get the full Corrosion control plane — one tier at a time
|
||||
platform stabilizes. You get the full Catalyst Console control plane — one tier at a time
|
||||
as capacity opens.
|
||||
</p>
|
||||
</div>
|
||||
@@ -114,7 +114,7 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<div class="icard">
|
||||
<div class="icard__ic"><Icon name="cpu" :size="16" /></div>
|
||||
<b>Full control plane</b>
|
||||
<p>Agent, panel, wipes, console, plugins, schedules — all of it. Not a trimmed preview.</p>
|
||||
<p>re-Agent, Catalyst Console, wipes, plugins, schedules — all of it. Not a trimmed preview.</p>
|
||||
</div>
|
||||
<div class="icard">
|
||||
<div class="icard__ic"><Icon name="shield" :size="16" /></div>
|
||||
@@ -248,17 +248,17 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<div class="wrap">
|
||||
<div class="sec__head reveal">
|
||||
<span class="eyebrow">How it works</span>
|
||||
<h2 class="title">Install the agent. Never SSH again.</h2>
|
||||
<h2 class="title">Install re-Agent. Never SSH again.</h2>
|
||||
</div>
|
||||
<div class="steps reveal">
|
||||
<div class="step">
|
||||
<div class="step__n">1</div>
|
||||
<b>Install the host agent</b>
|
||||
<p>Download the Go binary from your dashboard. Run it on Windows or Linux. One agent per machine.</p>
|
||||
<b>Install re-Agent</b>
|
||||
<p>Download re-Agent from your dashboard. Run it on Windows or Linux. One agent per machine.</p>
|
||||
</div>
|
||||
<div class="step">
|
||||
<div class="step__n">2</div>
|
||||
<b>Agent connects to Corrosion</b>
|
||||
<b>re-Agent connects to Corrosion</b>
|
||||
<p>Single outbound NATS connection. No inbound ports. No exposed management panel on your machine.</p>
|
||||
</div>
|
||||
<div class="step">
|
||||
|
||||
@@ -28,12 +28,12 @@ const groups: FaqGroup[] = [
|
||||
{
|
||||
question: 'What if Corrosion itself is broken?',
|
||||
answer:
|
||||
'Platform bugs and agent issues go through structured bug reports in the panel. Operator and Network customers receive priority bug triage for platform-level issues. Direct server administration is not included in any support tier.',
|
||||
'Platform bugs and agent issues go through structured bug reports in Catalyst Console. Operator and Network customers receive priority bug triage for platform-level issues. Direct server administration is not included in any support tier.',
|
||||
},
|
||||
{
|
||||
question: 'Do you manage my server for me?',
|
||||
answer:
|
||||
'No. Corrosion provides the panel, the agent, automation workflows, diagnostics, and the control plane. You remain responsible for your host machine, operating system, network, firewall, game files, mods, and community rules.',
|
||||
'No. Corrosion provides Catalyst Console, re-Agent, automation workflows, diagnostics, and the control plane. You remain responsible for your host machine, operating system, network, firewall, game files, mods, and community rules.',
|
||||
},
|
||||
{
|
||||
question: 'Is hands-on help available?',
|
||||
@@ -54,7 +54,7 @@ const groups: FaqGroup[] = [
|
||||
{
|
||||
question: 'Do I need my own server?',
|
||||
answer:
|
||||
'Yes. Corrosion is bring-your-own-server. You supply the host machine — a VPS, dedicated server, or bare metal box running Windows or Linux. Corrosion provides the control plane, the agent, and the panel.',
|
||||
'Yes. Corrosion is bring-your-own-server. You supply the host machine — a VPS, dedicated server, or bare metal box running Windows or Linux. Corrosion provides the control plane, re-Agent, and Catalyst Console.',
|
||||
},
|
||||
{
|
||||
question: 'Does Corrosion host my game server for me?',
|
||||
@@ -64,7 +64,7 @@ const groups: FaqGroup[] = [
|
||||
{
|
||||
question: 'Do I need to open inbound firewall ports for Corrosion?',
|
||||
answer:
|
||||
'No. The host agent establishes a single outbound NATS connection to Corrosion\'s cloud. No inbound management ports are required. Your game server\'s player ports (RCON, game ports) remain as they have always been.',
|
||||
'No. re-Agent establishes a single outbound NATS connection to Corrosion\'s cloud. No inbound management ports are required. Your game server\'s player ports (RCON, game ports) remain as they have always been.',
|
||||
},
|
||||
{
|
||||
question: 'Does Corrosion replace AMP or Pterodactyl?',
|
||||
@@ -74,7 +74,7 @@ const groups: FaqGroup[] = [
|
||||
{
|
||||
question: 'What happens if Corrosion goes offline?',
|
||||
answer:
|
||||
'Your game servers continue running normally. Corrosion does not proxy gameplay traffic — it only handles management operations. If the panel or cloud is unreachable, your players are unaffected.',
|
||||
'Your game servers continue running normally. Corrosion does not proxy gameplay traffic — it only handles management operations. If Catalyst Console or the cloud is unreachable, your players are unaffected.',
|
||||
},
|
||||
{
|
||||
question: 'Can multiple admins manage the same server?',
|
||||
@@ -82,9 +82,9 @@ const groups: FaqGroup[] = [
|
||||
'Yes. Role-based access control (RBAC) is built in. You can grant team members specific permissions — from full admin access down to read-only viewer — without sharing credentials.',
|
||||
},
|
||||
{
|
||||
question: 'What OS does the agent run on?',
|
||||
question: 'What OS does re-Agent run on?',
|
||||
answer:
|
||||
'Both Windows and Linux are supported for the host agent. The agent binary is downloaded directly from your dashboard — there is no manual build or dependency setup required.',
|
||||
'Both Windows and Linux are supported for re-Agent. The re-Agent binary is downloaded directly from your dashboard — there is no manual build or dependency setup required.',
|
||||
},
|
||||
{
|
||||
question: 'Is my data isolated from other customers?',
|
||||
@@ -100,7 +100,7 @@ const groups: FaqGroup[] = [
|
||||
{
|
||||
question: 'Which games are supported?',
|
||||
answer:
|
||||
'Currently in active development or shipped: Rust, Dune: Awakening, Conan Exiles, and Soulmask. Each game has a purpose-built blueprint — not a generic template — that models its specific operational reality (wipe types, mod systems, cluster configurations). More games are planned.',
|
||||
'Currently in active development or shipped: Rust, Dune: Awakening, Conan Exiles, and Soulmask. Each game has a purpose-built Formula that models its specific operational reality (wipe types, mod systems, cluster configurations). More games are planned.',
|
||||
},
|
||||
{
|
||||
question: 'Does Corrosion support Rust plugin management?',
|
||||
@@ -110,7 +110,7 @@ const groups: FaqGroup[] = [
|
||||
{
|
||||
question: 'Can I run multiple game types on the same host machine?',
|
||||
answer:
|
||||
'Yes. A single host agent can supervise multiple game server processes — across different games — on the same machine. Each game instance has its own lifecycle, configuration, and wipe schedule.',
|
||||
'Yes. A single re-Agent can supervise multiple game server processes — across different games — on the same machine. Each game instance has its own lifecycle, configuration, and wipe schedule.',
|
||||
},
|
||||
{
|
||||
question: 'Does Corrosion handle Rust wipes?',
|
||||
|
||||
@@ -41,12 +41,12 @@ onUnmounted(() => { io?.disconnect() })
|
||||
</div>
|
||||
<span class="eyebrow">How it works</span>
|
||||
<h1 style="font-size:var(--text-5xl)">
|
||||
One agent.
|
||||
One re-Agent.
|
||||
<span class="accent">Every game. No SSH.</span>
|
||||
</h1>
|
||||
<p class="hero__sub">
|
||||
Install the host agent once on your Windows or Linux machine. Corrosion connects
|
||||
securely, outbound-only. You manage every game instance from the browser.
|
||||
Install re-Agent once on your Windows or Linux machine. Corrosion connects
|
||||
securely, outbound-only. You manage every game instance from Catalyst Console.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
@@ -55,20 +55,20 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<section class="sec" id="model">
|
||||
<div class="wrap">
|
||||
<div class="sec__head reveal">
|
||||
<span class="eyebrow">The agent model</span>
|
||||
<span class="eyebrow">The re-Agent model</span>
|
||||
<h2 class="title">Bring your own server.<br>We provide the control plane.</h2>
|
||||
<p class="lead">
|
||||
Corrosion is not a hosting provider. You supply the hardware or the VPS. The host
|
||||
agent runs on that machine and bridges your game instances to Corrosion's control
|
||||
Corrosion is not a hosting provider. You supply the hardware or the VPS. re-Agent
|
||||
runs on that machine and bridges your game instances to Corrosion's control
|
||||
plane — securely, without opening inbound firewall ports.
|
||||
</p>
|
||||
</div>
|
||||
<div class="steps reveal">
|
||||
<div class="step">
|
||||
<div class="step__n">1</div>
|
||||
<b>Install the host agent</b>
|
||||
<b>Install re-Agent</b>
|
||||
<p>
|
||||
Download the Corrosion agent binary from your dashboard. Run it on any Windows
|
||||
Download the re-Agent binary from your dashboard. Run it on any Windows
|
||||
or Linux host. One agent per machine — it manages every game instance you assign
|
||||
to it.
|
||||
</p>
|
||||
@@ -77,7 +77,7 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<div class="step__n">2</div>
|
||||
<b>It connects to Corrosion</b>
|
||||
<p>
|
||||
The agent makes a single outbound NATS connection to Corrosion's cloud. No
|
||||
re-Agent makes a single outbound NATS connection to Corrosion's cloud. No
|
||||
inbound ports. No open panels. No SSH required after initial setup.
|
||||
</p>
|
||||
</div>
|
||||
@@ -86,7 +86,7 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<b>Deploy and manage from the browser</b>
|
||||
<p>
|
||||
Create game instances, run wipes, manage plugins, schedule maintenance, and
|
||||
monitor players — all from the Corrosion panel at panel.corrosionmgmt.com.
|
||||
monitor players — all from Catalyst Console at panel.corrosionmgmt.com.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -106,8 +106,8 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<span class="eyebrow">Multi-game host runtime</span>
|
||||
<h2 class="title">One agent. Multiple game worlds<br>on the same machine.</h2>
|
||||
<p class="lead">
|
||||
The host agent is not a per-game process. It is a general-purpose ops runtime. One
|
||||
agent on a single machine can supervise multiple game server processes across
|
||||
re-Agent is not a per-game process. It is a general-purpose ops runtime. One
|
||||
re-Agent on a single machine can supervise multiple game server processes across
|
||||
different games — each with its own configuration, lifecycle, and wipe schedule.
|
||||
</p>
|
||||
</div>
|
||||
@@ -220,7 +220,7 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<span class="eyebrow">Connectivity model</span>
|
||||
<h2 class="title">Outbound-only. No exposed panel.</h2>
|
||||
<p class="lead">
|
||||
The host agent establishes one secure NATS connection to Corrosion's cloud. All
|
||||
re-Agent establishes one secure NATS connection to Corrosion's cloud. All
|
||||
commands flow through that channel. Your machine never needs to accept inbound
|
||||
connections from the internet.
|
||||
</p>
|
||||
@@ -234,8 +234,8 @@ onUnmounted(() => { io?.disconnect() })
|
||||
</div>
|
||||
<div class="icard">
|
||||
<div class="icard__ic"><Icon name="cpu" :size="16" /></div>
|
||||
<b>Corrosion agent</b>
|
||||
<p>A single Go binary. Runs as a service. Manages game processes, files, and updates.</p>
|
||||
<b>re-Agent</b>
|
||||
<p>A single binary. Runs as a service. Manages game processes, files, and updates.</p>
|
||||
</div>
|
||||
<div class="icard">
|
||||
<div class="icard__ic"><Icon name="zap" :size="16" /></div>
|
||||
@@ -250,12 +250,12 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<div class="icard">
|
||||
<div class="icard__ic"><Icon name="layout-dashboard" :size="16" /></div>
|
||||
<b>Your browser</b>
|
||||
<p>The panel at panel.corrosionmgmt.com. Console, wipes, plugins, schedules — all here.</p>
|
||||
<p>Catalyst Console at panel.corrosionmgmt.com. Console, wipes, plugins, schedules — all here.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="techrow reveal">
|
||||
<span>Go host agent</span>
|
||||
<span>re-Agent</span>
|
||||
<span>NATS JetStream</span>
|
||||
<span>NestJS API</span>
|
||||
<span>PostgreSQL</span>
|
||||
@@ -289,7 +289,7 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<div>
|
||||
<b>Enough CPU and RAM for your game</b>
|
||||
<p style="margin:4px 0 0;color:var(--text-tertiary);font-size:var(--text-xs)">
|
||||
Corrosion's agent is lightweight. Your game server determines the actual
|
||||
re-Agent is lightweight. Your game server determines the actual
|
||||
hardware requirement.
|
||||
</p>
|
||||
</div>
|
||||
@@ -299,7 +299,7 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<div>
|
||||
<b>Outbound internet access</b>
|
||||
<p style="margin:4px 0 0;color:var(--text-tertiary);font-size:var(--text-xs)">
|
||||
The agent connects out; your game server's player ports stay open as they
|
||||
re-Agent connects out; your game server's player ports stay open as they
|
||||
always have been.
|
||||
</p>
|
||||
</div>
|
||||
@@ -310,7 +310,7 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<div class="feat">
|
||||
<span class="feat__ic"><Icon name="download" :size="16" /></span>
|
||||
<div>
|
||||
<b>Agent binary (Windows or Linux)</b>
|
||||
<b>re-Agent binary (Windows or Linux)</b>
|
||||
<p style="margin:4px 0 0;color:var(--text-tertiary);font-size:var(--text-xs)">
|
||||
Downloaded from your dashboard. No manual build. No dependency management.
|
||||
</p>
|
||||
@@ -321,14 +321,14 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<div>
|
||||
<b>Your license key</b>
|
||||
<p style="margin:4px 0 0;color:var(--text-tertiary);font-size:var(--text-xs)">
|
||||
Issued when you register. The agent uses it to authenticate to the cloud.
|
||||
Issued when you register. re-Agent uses it to authenticate to the cloud.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="feat">
|
||||
<span class="feat__ic"><Icon name="globe" :size="16" /></span>
|
||||
<div>
|
||||
<b>The panel</b>
|
||||
<b>Catalyst Console</b>
|
||||
<p style="margin:4px 0 0;color:var(--text-tertiary);font-size:var(--text-xs)">
|
||||
Everything else — console, wipes, schedules, players — lives at
|
||||
panel.corrosionmgmt.com.
|
||||
@@ -344,7 +344,7 @@ onUnmounted(() => { io?.disconnect() })
|
||||
<section class="finalcta">
|
||||
<div class="finalcta__atmo" />
|
||||
<div class="wrap finalcta__in reveal">
|
||||
<h2>Install the agent.<br>Never SSH again.</h2>
|
||||
<h2>Install re-Agent.<br>Never SSH again.</h2>
|
||||
<div class="cta-row">
|
||||
<RouterLink class="btn btn--primary btn--lg" :to="{ name: 'early-access' }">
|
||||
Join early access
|
||||
|
||||
@@ -104,9 +104,9 @@ const mockActiveGame = activeGame
|
||||
</div>
|
||||
<h1>Run your game servers<span class="accent">like an operation.</span></h1>
|
||||
<p class="hero__sub">
|
||||
Corrosion is a management panel for self-hosted survival game servers. Deploy servers, automate
|
||||
Corrosion is a management platform for self-hosted survival game servers. Deploy servers, automate
|
||||
wipes, manage plugins and mods, schedule maintenance, monitor players, and orchestrate
|
||||
multi-server worlds — from one command center.
|
||||
multi-server worlds — all from Catalyst Console.
|
||||
</p>
|
||||
<div class="hero__cta">
|
||||
<RouterLink class="btn btn--primary btn--lg" :to="{ name: 'early-access' }">
|
||||
@@ -144,7 +144,7 @@ const mockActiveGame = activeGame
|
||||
<aside class="mock__side">
|
||||
<div class="mock__brand">
|
||||
<span class="mark"><CorrosionMark :size="18" /></span>
|
||||
<b>Corrosion</b>
|
||||
<b>Catalyst</b>
|
||||
</div>
|
||||
<div class="mock__gs">
|
||||
<span :class="{ on: mockActiveGame === 'rust' }">
|
||||
@@ -177,7 +177,7 @@ const mockActiveGame = activeGame
|
||||
<div class="v">234</div>
|
||||
</div>
|
||||
<div class="mock__kpi">
|
||||
<div class="l">Agent nodes</div>
|
||||
<div class="l">re-Agent nodes</div>
|
||||
<div class="v">2<small>/2</small></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -219,7 +219,7 @@ const mockActiveGame = activeGame
|
||||
</div>
|
||||
<div class="wrap" style="text-align:center">
|
||||
<div class="hero__foot">
|
||||
One host agent, many game instances · Rust · Dune: Awakening · Soulmask · Conan Exiles ·
|
||||
One re-Agent, many game instances · Rust · Dune: Awakening · Soulmask · Conan Exiles ·
|
||||
Windows & Linux hosts
|
||||
</div>
|
||||
</div>
|
||||
@@ -269,7 +269,7 @@ const mockActiveGame = activeGame
|
||||
</div>
|
||||
<p class="closing reveal">
|
||||
Your community sees the server. You deal with the chaos.<br>
|
||||
<span class="accent">Corrosion gives you the control plane.</span>
|
||||
<span class="accent">Catalyst Console gives you the control plane.</span>
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
@@ -279,16 +279,16 @@ const mockActiveGame = activeGame
|
||||
<div class="wrap">
|
||||
<div class="sec__head reveal">
|
||||
<span class="eyebrow">The shift</span>
|
||||
<h2 class="title">Drop in the agent.<br>Take control from the panel.</h2>
|
||||
<h2 class="title">Drop in re-Agent.<br>Take control from Catalyst Console.</h2>
|
||||
<p class="lead">
|
||||
One lightweight host agent runs on your machine and manages every game instance you assign
|
||||
One lightweight re-Agent runs on your machine and manages every game instance you assign
|
||||
to it — an outbound-only ops runtime, not an exposed panel.
|
||||
</p>
|
||||
</div>
|
||||
<div class="steps reveal">
|
||||
<div class="step">
|
||||
<div class="step__n">1</div>
|
||||
<b>Install the Corrosion Agent</b>
|
||||
<b>Install re-Agent</b>
|
||||
<p>One runtime on your Windows or Linux host. Outbound connection only.</p>
|
||||
</div>
|
||||
<div class="step">
|
||||
@@ -310,7 +310,7 @@ const mockActiveGame = activeGame
|
||||
</div>
|
||||
<p class="closing reveal" style="font-size:var(--text-lg)">
|
||||
You provide the machine.
|
||||
<span class="accent">Corrosion provides the control plane.</span>
|
||||
<span class="accent">Catalyst Console provides the control plane.</span>
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
@@ -320,10 +320,9 @@ const mockActiveGame = activeGame
|
||||
<div class="wrap">
|
||||
<div class="sec__head reveal">
|
||||
<span class="eyebrow">Supported games</span>
|
||||
<h2 class="title">Game-aware blueprints,<br>not generic templates</h2>
|
||||
<h2 class="title">Game-aware Formulae,<br>not generic configs</h2>
|
||||
<p class="lead">
|
||||
Every game has a different operational reality. Corrosion models each one as an operations
|
||||
blueprint — Rust wipes, Dune: Awakening battlegroups, Soulmask clusters, Conan persistent
|
||||
Every game has a different operational reality. Corrosion models each one as a Formula — Rust wipes, Dune: Awakening battlegroups, Soulmask clusters, Conan persistent
|
||||
worlds.
|
||||
</p>
|
||||
</div>
|
||||
@@ -527,7 +526,7 @@ const mockActiveGame = activeGame
|
||||
<span class="eyebrow">Built like infrastructure</span>
|
||||
<h2 class="title">Not a skin over SSH</h2>
|
||||
<p class="lead">
|
||||
A hosted control plane plus a host agent — with tenant isolation, command namespacing,
|
||||
A hosted control plane plus re-Agent — with tenant isolation, command namespacing,
|
||||
health reporting, and outbound-only connectivity.
|
||||
</p>
|
||||
</div>
|
||||
@@ -535,7 +534,7 @@ const mockActiveGame = activeGame
|
||||
<div class="icard">
|
||||
<div class="icard__ic"><Icon name="cpu" :size="16" /></div>
|
||||
<b>Agent-based control</b>
|
||||
<p>Your host connects to Corrosion. No exposed management panel required.</p>
|
||||
<p>re-Agent connects to Corrosion. No exposed management panel required.</p>
|
||||
</div>
|
||||
<div class="icard">
|
||||
<div class="icard__ic"><Icon name="shield" :size="16" /></div>
|
||||
@@ -550,7 +549,7 @@ const mockActiveGame = activeGame
|
||||
<div class="icard">
|
||||
<div class="icard__ic"><Icon name="zap" :size="16" /></div>
|
||||
<b>Event-driven</b>
|
||||
<p>NATS-powered messaging keeps agents and panel in sync.</p>
|
||||
<p>NATS-powered messaging keeps re-Agent and Catalyst Console in sync.</p>
|
||||
</div>
|
||||
<div class="icard">
|
||||
<div class="icard__ic"><Icon name="activity" :size="16" /></div>
|
||||
@@ -562,7 +561,7 @@ const mockActiveGame = activeGame
|
||||
<span>NestJS</span>
|
||||
<span>NATS JetStream</span>
|
||||
<span>PostgreSQL</span>
|
||||
<span>Go host agent</span>
|
||||
<span>re-Agent</span>
|
||||
<span>Outbound-only</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -346,7 +346,7 @@ const plans: Plan[] = [
|
||||
|
||||
<p class="closing reveal" style="font-size:var(--text-md);color:var(--text-tertiary);font-weight:500">
|
||||
Direct server administration, firewall configuration, mod installation, and wipe-day
|
||||
hand-holding are not included in any plan. Corrosion gives you the panel and the tools.
|
||||
hand-holding are not included in any plan. Corrosion gives you Catalyst Console and the tools.
|
||||
You run the operation.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -25,14 +25,14 @@ const groups: RoadmapGroup[] = [
|
||||
status: 'shipped',
|
||||
label: 'Phase 1 — Foundation',
|
||||
description:
|
||||
'The core control plane is live. Game server operators can install the agent, connect their server, and manage it entirely from the panel.',
|
||||
'The core control plane is live. Game server operators can install re-Agent, connect their server, and manage it entirely from Catalyst Console.',
|
||||
items: [
|
||||
{ text: 'Host agent (Windows + Linux)', note: 'Go binary, outbound NATS, zero inbound ports' },
|
||||
{ text: 're-Agent (Windows + Linux)', note: 'Outbound NATS, zero inbound ports' },
|
||||
{ text: 'Core control plane', note: 'NestJS API, multi-tenant PostgreSQL, JWT RBAC' },
|
||||
{ text: 'Auto-wiper with rollback', note: 'Map, BP, and full wipes as verified sequences' },
|
||||
{ text: 'Plugin management', note: 'Rust uMod/Oxide — browse, install, configure from the browser' },
|
||||
{ text: 'Real-time console', note: 'NATS-bridged live output' },
|
||||
{ text: 'File manager', note: 'Browser-based file access via the agent' },
|
||||
{ text: 'File manager', note: 'Browser-based file access via re-Agent' },
|
||||
{ text: 'Scheduled tasks and maintenance windows' },
|
||||
{ text: 'Player management and RBAC team access' },
|
||||
{ text: 'Public server page', note: 'Live status, wipe countdown, player count' },
|
||||
@@ -44,12 +44,12 @@ const groups: RoadmapGroup[] = [
|
||||
status: 'in-progress',
|
||||
label: 'Multi-game expansion',
|
||||
description:
|
||||
'The agent and control plane are being extended with per-game blueprints. Rust is the reference implementation; Dune, Conan, and Soulmask follow the same agent model with game-specific operational logic.',
|
||||
're-Agent and the control plane are being extended with per-game Formulae. Rust is the reference implementation; Dune, Conan, and Soulmask follow the same deployment model with game-specific operational logic.',
|
||||
items: [
|
||||
{ text: 'Dune: Awakening blueprint', note: 'Deep Desert wipe scheduling, battlegroup lifecycle' },
|
||||
{ text: 'Conan Exiles blueprint', note: 'Persistent world management, mod support, purge tracking' },
|
||||
{ text: 'Soulmask blueprint', note: 'Linked-world cluster deployment, port automation' },
|
||||
{ text: 'Multi-instance host runtime', note: 'One agent managing N game processes on the same machine' },
|
||||
{ text: 'Dune: Awakening Formula', note: 'Deep Desert wipe scheduling, battlegroup lifecycle' },
|
||||
{ text: 'Conan Exiles Formula', note: 'Persistent world management, mod support, purge tracking' },
|
||||
{ text: 'Soulmask Formula', note: 'Linked-world cluster deployment, port automation' },
|
||||
{ text: 'Multi-instance host runtime', note: 'One re-Agent managing N game processes on the same machine' },
|
||||
{ text: 'Per-game wipe and event scheduling' },
|
||||
],
|
||||
},
|
||||
@@ -72,7 +72,7 @@ const groups: RoadmapGroup[] = [
|
||||
items: [
|
||||
{ text: 'Item catalog and categories' },
|
||||
{ text: 'PayPal and Stripe payment processing' },
|
||||
{ text: 'Automated in-game delivery via RCON/agent' },
|
||||
{ text: 'Automated in-game delivery via RCON/re-Agent' },
|
||||
{ text: 'Transaction history and revenue dashboard' },
|
||||
],
|
||||
},
|
||||
@@ -83,7 +83,7 @@ const groups: RoadmapGroup[] = [
|
||||
'Tools for hosting providers and multi-server operations running 50+ instances across multiple physical hosts.',
|
||||
items: [
|
||||
{ text: 'Fleet-level dashboards and health monitoring' },
|
||||
{ text: 'Multi-host agent orchestration' },
|
||||
{ text: 'Multi-host re-Agent orchestration' },
|
||||
{ text: 'Bulk wipe and update scheduling across a fleet' },
|
||||
{ text: 'Fleet Block capacity management' },
|
||||
],
|
||||
@@ -95,7 +95,7 @@ const groups: RoadmapGroup[] = [
|
||||
'Corrosion\'s agent model is not Rust-specific. The platform is being designed to support any game that can be managed via process control, file operations, and RCON-style commands.',
|
||||
items: [
|
||||
{ text: 'Additional survival and sandbox games' },
|
||||
{ text: 'Community-requested game blueprints' },
|
||||
{ text: 'Community-requested game Formulae' },
|
||||
],
|
||||
},
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user