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:
156
docs/BRANDING.md
Normal file
156
docs/BRANDING.md
Normal file
@@ -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-<platform>`), 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.
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="apple-touch-icon" href="/favicon.png" />
|
<link rel="apple-touch-icon" href="/favicon.png" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<meta name="theme-color" content="#0a0a0a" />
|
<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 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: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." />
|
<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">
|
<script setup lang="ts">
|
||||||
/**
|
/**
|
||||||
* Logo — Corrosion brand lockup.
|
* Logo — Catalyst brand lockup.
|
||||||
* Composes the CorrosionMark SVG + Oxanium wordmark + optional tagline.
|
* Composes the CorrosionMark SVG + Oxanium wordmark "Catalyst" + optional tagline.
|
||||||
*
|
*
|
||||||
* The mark renders in `currentColor`, so set `color: var(--accent)` on a
|
* The mark renders in `currentColor`, so set `color: var(--accent)` on a
|
||||||
* parent (or pass `markColor`) to theme it per active game.
|
* parent (or pass `markColor`) to theme it per active game.
|
||||||
*
|
*
|
||||||
* Props mirror Logo.jsx exactly:
|
* Props mirror Logo.jsx exactly:
|
||||||
* size — base px size; drives mark em-size + wordmark scaling
|
* size — base px size; drives mark em-size + wordmark scaling
|
||||||
* wordmark — show the "Corrosion" text (default true)
|
* wordmark — show the "Catalyst" text (default true)
|
||||||
* tagline — false | true (→ "Management Panel") | custom string
|
* tagline — false | true (→ "by Corrosion") | custom string
|
||||||
* glow — accent drop-shadow for marketing / login hero use
|
* glow — accent drop-shadow for marketing / login hero use
|
||||||
* markColor — force a fixed color on the mark (bypasses currentColor theming)
|
* 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'
|
props.glow ? `drop-shadow(0 0 ${props.size * 0.5}px var(--accent-glow))` : 'none'
|
||||||
)
|
)
|
||||||
const tagText = computed(() =>
|
const tagText = computed(() =>
|
||||||
typeof props.tagline === 'string' ? props.tagline : 'Management Panel'
|
typeof props.tagline === 'string' ? props.tagline : 'by Corrosion'
|
||||||
)
|
)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ const tagText = computed(() =>
|
|||||||
color: 'var(--text-primary)',
|
color: 'var(--text-primary)',
|
||||||
lineHeight: 1,
|
lineHeight: 1,
|
||||||
}"
|
}"
|
||||||
>Corrosion</span>
|
>Catalyst</span>
|
||||||
<span
|
<span
|
||||||
v-if="tagline"
|
v-if="tagline"
|
||||||
:style="{
|
:style="{
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ const agentLabel = computed(() => {
|
|||||||
})
|
})
|
||||||
// One host → its hostname; multiple → fleet count.
|
// One host → its hostname; multiple → fleet count.
|
||||||
const agentName = computed(() =>
|
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(() => {
|
const agentMetaLine = computed(() => {
|
||||||
@@ -231,9 +231,9 @@ const themeIcon = computed(() => theme.value === 'dark' ? 'sun' : 'moon')
|
|||||||
<div v-else class="agent agent--empty">
|
<div v-else class="agent agent--empty">
|
||||||
<div class="agent__row">
|
<div class="agent__row">
|
||||||
<StatusDot tone="offline" />
|
<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>
|
||||||
<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>
|
</div>
|
||||||
<!-- User / logout row -->
|
<!-- User / logout row -->
|
||||||
<div class="side__user">
|
<div class="side__user">
|
||||||
@@ -272,7 +272,7 @@ const themeIcon = computed(() => theme.value === 'dark' ? 'sun' : 'moon')
|
|||||||
|
|
||||||
<!-- Breadcrumb -->
|
<!-- Breadcrumb -->
|
||||||
<div class="top__crumbs">
|
<div class="top__crumbs">
|
||||||
<span class="crumb">Corrosion</span>
|
<span class="crumb">Catalyst</span>
|
||||||
<span class="crumb__sep">/</span>
|
<span class="crumb__sep">/</span>
|
||||||
<span class="crumb crumb--cluster">{{ serverName }}</span>
|
<span class="crumb crumb--cluster">{{ serverName }}</span>
|
||||||
</div>
|
</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
|
* 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
|
* 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).
|
* multiple → 'all' (neutral house skin).
|
||||||
*
|
*
|
||||||
* NO-OP when the operator has a manual pick stored (cc-active-game present): an
|
* 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'),
|
component: () => import('@/views/marketing/HowItWorksView.vue'),
|
||||||
meta: {
|
meta: {
|
||||||
title: 'How It Works — Corrosion',
|
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'),
|
component: () => import('@/views/marketing/RoadmapView.vue'),
|
||||||
meta: {
|
meta: {
|
||||||
title: 'Roadmap — Corrosion',
|
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',
|
path: '/login',
|
||||||
name: 'login',
|
name: 'login',
|
||||||
component: () => import('@/views/auth/LoginView.vue'),
|
component: () => import('@/views/auth/LoginView.vue'),
|
||||||
meta: { guest: true, title: 'Sign in — Corrosion' },
|
meta: { guest: true, title: 'Sign in to Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/register',
|
path: '/register',
|
||||||
name: 'register',
|
name: 'register',
|
||||||
component: () => import('@/views/auth/RegisterView.vue'),
|
component: () => import('@/views/auth/RegisterView.vue'),
|
||||||
meta: { guest: true, title: 'Create account — Corrosion' },
|
meta: { guest: true, title: 'Create account — Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/forgot-password',
|
path: '/forgot-password',
|
||||||
name: 'forgot-password',
|
name: 'forgot-password',
|
||||||
component: () => import('@/views/auth/ForgotPasswordView.vue'),
|
component: () => import('@/views/auth/ForgotPasswordView.vue'),
|
||||||
meta: { guest: true, title: 'Reset password — Corrosion' },
|
meta: { guest: true, title: 'Reset password — Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/setup',
|
path: '/setup',
|
||||||
name: 'setup-wizard',
|
name: 'setup-wizard',
|
||||||
component: () => import('@/views/auth/SetupWizardView.vue'),
|
component: () => import('@/views/auth/SetupWizardView.vue'),
|
||||||
meta: { requiresAuth: true, title: 'Setup — Corrosion' },
|
meta: { requiresAuth: true, title: 'Setup — Catalyst' },
|
||||||
},
|
},
|
||||||
|
|
||||||
// Admin dashboard routes (with sidebar layout)
|
// Admin dashboard routes (with sidebar layout)
|
||||||
@@ -125,260 +125,260 @@ const panelRoutes: RouteRecordRaw[] = [
|
|||||||
path: '',
|
path: '',
|
||||||
name: 'dashboard',
|
name: 'dashboard',
|
||||||
component: () => import('@/views/admin/DashboardView.vue'),
|
component: () => import('@/views/admin/DashboardView.vue'),
|
||||||
meta: { title: 'Dashboard — Corrosion' },
|
meta: { title: 'Dashboard · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'server',
|
path: 'server',
|
||||||
name: 'server',
|
name: 'server',
|
||||||
component: () => import('@/views/admin/ServerView.vue'),
|
component: () => import('@/views/admin/ServerView.vue'),
|
||||||
meta: { title: 'Server — Corrosion' },
|
meta: { title: 'Server · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'console',
|
path: 'console',
|
||||||
name: 'console',
|
name: 'console',
|
||||||
component: () => import('@/views/admin/ConsoleView.vue'),
|
component: () => import('@/views/admin/ConsoleView.vue'),
|
||||||
meta: { title: 'Console — Corrosion' },
|
meta: { title: 'Console · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'players',
|
path: 'players',
|
||||||
name: 'players',
|
name: 'players',
|
||||||
component: () => import('@/views/admin/PlayersView.vue'),
|
component: () => import('@/views/admin/PlayersView.vue'),
|
||||||
meta: { title: 'Players — Corrosion' },
|
meta: { title: 'Players · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'plugins',
|
path: 'plugins',
|
||||||
name: 'plugins',
|
name: 'plugins',
|
||||||
component: () => import('@/views/admin/PluginsView.vue'),
|
component: () => import('@/views/admin/PluginsView.vue'),
|
||||||
meta: { title: 'Plugins — Corrosion' },
|
meta: { title: 'Plugins · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'files',
|
path: 'files',
|
||||||
name: 'files',
|
name: 'files',
|
||||||
component: () => import('@/views/admin/FileManagerView.vue'),
|
component: () => import('@/views/admin/FileManagerView.vue'),
|
||||||
meta: { title: 'Files — Corrosion' },
|
meta: { title: 'Files · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'plugin-configs',
|
path: 'plugin-configs',
|
||||||
name: 'plugin-configs',
|
name: 'plugin-configs',
|
||||||
component: () => import('@/views/admin/PluginConfigsView.vue'),
|
component: () => import('@/views/admin/PluginConfigsView.vue'),
|
||||||
meta: { title: 'Plugin Configs — Corrosion' },
|
meta: { title: 'Plugin Configs · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'loot-builder',
|
path: 'loot-builder',
|
||||||
name: 'loot-builder',
|
name: 'loot-builder',
|
||||||
component: () => import('@/views/admin/LootBuilderView.vue'),
|
component: () => import('@/views/admin/LootBuilderView.vue'),
|
||||||
meta: { title: 'Loot Builder — Corrosion' },
|
meta: { title: 'Loot Builder · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'teleport-config',
|
path: 'teleport-config',
|
||||||
name: 'teleport-config',
|
name: 'teleport-config',
|
||||||
component: () => import('@/views/admin/TeleportConfigView.vue'),
|
component: () => import('@/views/admin/TeleportConfigView.vue'),
|
||||||
meta: { title: 'Teleport Config — Corrosion' },
|
meta: { title: 'Teleport Config · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'gather-manager',
|
path: 'gather-manager',
|
||||||
name: 'gather-manager',
|
name: 'gather-manager',
|
||||||
component: () => import('@/views/admin/GatherManagerView.vue'),
|
component: () => import('@/views/admin/GatherManagerView.vue'),
|
||||||
meta: { title: 'Gather Manager — Corrosion' },
|
meta: { title: 'Gather Manager · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'autodoors',
|
path: 'autodoors',
|
||||||
name: 'autodoors',
|
name: 'autodoors',
|
||||||
component: () => import('@/views/admin/AutoDoorsView.vue'),
|
component: () => import('@/views/admin/AutoDoorsView.vue'),
|
||||||
meta: { title: 'Auto Doors — Corrosion' },
|
meta: { title: 'Auto Doors · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'kits',
|
path: 'kits',
|
||||||
name: 'kits-config',
|
name: 'kits-config',
|
||||||
component: () => import('@/views/admin/KitsView.vue'),
|
component: () => import('@/views/admin/KitsView.vue'),
|
||||||
meta: { title: 'Kits — Corrosion' },
|
meta: { title: 'Kits · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'furnace-splitter',
|
path: 'furnace-splitter',
|
||||||
name: 'furnace-splitter',
|
name: 'furnace-splitter',
|
||||||
component: () => import('@/views/admin/FurnaceSplitterView.vue'),
|
component: () => import('@/views/admin/FurnaceSplitterView.vue'),
|
||||||
meta: { title: 'Furnace Splitter — Corrosion' },
|
meta: { title: 'Furnace Splitter · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'better-chat',
|
path: 'better-chat',
|
||||||
name: 'better-chat',
|
name: 'better-chat',
|
||||||
component: () => import('@/views/admin/BetterChatView.vue'),
|
component: () => import('@/views/admin/BetterChatView.vue'),
|
||||||
meta: { title: 'Better Chat — Corrosion' },
|
meta: { title: 'Better Chat · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'timed-execute',
|
path: 'timed-execute',
|
||||||
name: 'timed-execute',
|
name: 'timed-execute',
|
||||||
component: () => import('@/views/admin/TimedExecuteView.vue'),
|
component: () => import('@/views/admin/TimedExecuteView.vue'),
|
||||||
meta: { title: 'Timed Execute — Corrosion' },
|
meta: { title: 'Timed Execute · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'raidable-bases',
|
path: 'raidable-bases',
|
||||||
name: 'raidable-bases',
|
name: 'raidable-bases',
|
||||||
component: () => import('@/views/admin/RaidableBasesView.vue'),
|
component: () => import('@/views/admin/RaidableBasesView.vue'),
|
||||||
meta: { title: 'Raidable Bases — Corrosion' },
|
meta: { title: 'Raidable Bases · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'wipes',
|
path: 'wipes',
|
||||||
name: 'wipes',
|
name: 'wipes',
|
||||||
component: () => import('@/views/admin/WipesView.vue'),
|
component: () => import('@/views/admin/WipesView.vue'),
|
||||||
meta: { title: 'Wipes — Corrosion' },
|
meta: { title: 'Wipes · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'wipes/profiles',
|
path: 'wipes/profiles',
|
||||||
name: 'wipe-profiles',
|
name: 'wipe-profiles',
|
||||||
component: () => import('@/views/admin/WipeProfilesView.vue'),
|
component: () => import('@/views/admin/WipeProfilesView.vue'),
|
||||||
meta: { title: 'Wipe Profiles — Corrosion' },
|
meta: { title: 'Wipe Profiles · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'wipes/calendar',
|
path: 'wipes/calendar',
|
||||||
name: 'wipe-calendar',
|
name: 'wipe-calendar',
|
||||||
component: () => import('@/views/admin/WipeCalendarView.vue'),
|
component: () => import('@/views/admin/WipeCalendarView.vue'),
|
||||||
meta: { title: 'Wipe Calendar — Corrosion' },
|
meta: { title: 'Wipe Calendar · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'wipes/history',
|
path: 'wipes/history',
|
||||||
name: 'wipe-history',
|
name: 'wipe-history',
|
||||||
component: () => import('@/views/admin/WipeHistoryView.vue'),
|
component: () => import('@/views/admin/WipeHistoryView.vue'),
|
||||||
meta: { title: 'Wipe History — Corrosion' },
|
meta: { title: 'Wipe History · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'wipes/analytics',
|
path: 'wipes/analytics',
|
||||||
name: 'wipe-analytics',
|
name: 'wipe-analytics',
|
||||||
component: () => import('@/views/admin/WipeAnalyticsView.vue'),
|
component: () => import('@/views/admin/WipeAnalyticsView.vue'),
|
||||||
meta: { title: 'Wipe Analytics — Corrosion' },
|
meta: { title: 'Wipe Analytics · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'maps',
|
path: 'maps',
|
||||||
name: 'maps',
|
name: 'maps',
|
||||||
component: () => import('@/views/admin/MapsView.vue'),
|
component: () => import('@/views/admin/MapsView.vue'),
|
||||||
meta: { title: 'Maps — Corrosion' },
|
meta: { title: 'Maps · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'maps/analytics',
|
path: 'maps/analytics',
|
||||||
name: 'map-analytics',
|
name: 'map-analytics',
|
||||||
component: () => import('@/views/admin/MapAnalyticsView.vue'),
|
component: () => import('@/views/admin/MapAnalyticsView.vue'),
|
||||||
meta: { title: 'Map Analytics — Corrosion' },
|
meta: { title: 'Map Analytics · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'chat',
|
path: 'chat',
|
||||||
name: 'chat',
|
name: 'chat',
|
||||||
component: () => import('@/views/admin/ChatLogView.vue'),
|
component: () => import('@/views/admin/ChatLogView.vue'),
|
||||||
meta: { title: 'Chat Log — Corrosion' },
|
meta: { title: 'Chat Log · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'analytics',
|
path: 'analytics',
|
||||||
name: 'analytics',
|
name: 'analytics',
|
||||||
component: () => import('@/views/admin/AnalyticsView.vue'),
|
component: () => import('@/views/admin/AnalyticsView.vue'),
|
||||||
meta: { title: 'Analytics — Corrosion' },
|
meta: { title: 'Analytics · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'retention',
|
path: 'retention',
|
||||||
name: 'retention',
|
name: 'retention',
|
||||||
component: () => import('@/views/admin/PlayerRetentionView.vue'),
|
component: () => import('@/views/admin/PlayerRetentionView.vue'),
|
||||||
meta: { title: 'Player Retention — Corrosion' },
|
meta: { title: 'Player Retention · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'notifications',
|
path: 'notifications',
|
||||||
name: 'notifications',
|
name: 'notifications',
|
||||||
component: () => import('@/views/admin/NotificationsView.vue'),
|
component: () => import('@/views/admin/NotificationsView.vue'),
|
||||||
meta: { title: 'Notifications — Corrosion' },
|
meta: { title: 'Notifications · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'team',
|
path: 'team',
|
||||||
name: 'team',
|
name: 'team',
|
||||||
component: () => import('@/views/admin/TeamView.vue'),
|
component: () => import('@/views/admin/TeamView.vue'),
|
||||||
meta: { title: 'Team — Corrosion' },
|
meta: { title: 'Team · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'store/config',
|
path: 'store/config',
|
||||||
name: 'store-config',
|
name: 'store-config',
|
||||||
component: () => import('@/views/admin/StoreConfigView.vue'),
|
component: () => import('@/views/admin/StoreConfigView.vue'),
|
||||||
meta: { title: 'Store Config — Corrosion' },
|
meta: { title: 'Store Config · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'store/items',
|
path: 'store/items',
|
||||||
name: 'store-items',
|
name: 'store-items',
|
||||||
component: () => import('@/views/admin/StoreItemsView.vue'),
|
component: () => import('@/views/admin/StoreItemsView.vue'),
|
||||||
meta: { title: 'Store Items — Corrosion' },
|
meta: { title: 'Store Items · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'store/revenue',
|
path: 'store/revenue',
|
||||||
name: 'store-revenue',
|
name: 'store-revenue',
|
||||||
component: () => import('@/views/admin/StoreRevenueView.vue'),
|
component: () => import('@/views/admin/StoreRevenueView.vue'),
|
||||||
meta: { title: 'Store Revenue — Corrosion' },
|
meta: { title: 'Store Revenue · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'modules',
|
path: 'modules',
|
||||||
name: 'modules',
|
name: 'modules',
|
||||||
component: () => import('@/views/admin/ModuleStoreView.vue'),
|
component: () => import('@/views/admin/ModuleStoreView.vue'),
|
||||||
meta: { title: 'Modules — Corrosion' },
|
meta: { title: 'Modules · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'settings',
|
path: 'settings',
|
||||||
name: 'settings',
|
name: 'settings',
|
||||||
component: () => import('@/views/admin/SettingsView.vue'),
|
component: () => import('@/views/admin/SettingsView.vue'),
|
||||||
meta: { title: 'Settings — Corrosion' },
|
meta: { title: 'Settings · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'schedules',
|
path: 'schedules',
|
||||||
name: 'schedules',
|
name: 'schedules',
|
||||||
component: () => import('@/views/admin/SchedulesView.vue'),
|
component: () => import('@/views/admin/SchedulesView.vue'),
|
||||||
meta: { title: 'Schedules — Corrosion' },
|
meta: { title: 'Schedules · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'migration',
|
path: 'migration',
|
||||||
name: 'migration',
|
name: 'migration',
|
||||||
component: () => import('@/views/admin/MigrationView.vue'),
|
component: () => import('@/views/admin/MigrationView.vue'),
|
||||||
meta: { title: 'Migration — Corrosion' },
|
meta: { title: 'Migration · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'changelog',
|
path: 'changelog',
|
||||||
name: 'changelog',
|
name: 'changelog',
|
||||||
component: () => import('@/views/admin/ChangelogView.vue'),
|
component: () => import('@/views/admin/ChangelogView.vue'),
|
||||||
meta: { title: 'Changelog — Corrosion' },
|
meta: { title: 'Changelog · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'alerts',
|
path: 'alerts',
|
||||||
name: 'alerts',
|
name: 'alerts',
|
||||||
component: () => import('@/views/admin/AlertsView.vue'),
|
component: () => import('@/views/admin/AlertsView.vue'),
|
||||||
meta: { title: 'Alerts — Corrosion' },
|
meta: { title: 'Alerts · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'fleet',
|
path: 'fleet',
|
||||||
name: 'fleet',
|
name: 'fleet',
|
||||||
component: () => import('@/views/admin/FleetView.vue'),
|
component: () => import('@/views/admin/FleetView.vue'),
|
||||||
meta: { title: 'Fleet — Corrosion', requiresAuth: true },
|
meta: { title: 'Fleet · Catalyst', requiresAuth: true },
|
||||||
},
|
},
|
||||||
// Platform Admin views (super-admin only)
|
// Platform Admin views (super-admin only)
|
||||||
{
|
{
|
||||||
path: 'admin',
|
path: 'admin',
|
||||||
name: 'platform-admin',
|
name: 'platform-admin',
|
||||||
component: () => import('@/views/platform-admin/AdminDashboard.vue'),
|
component: () => import('@/views/platform-admin/AdminDashboard.vue'),
|
||||||
meta: { superAdmin: true, title: 'Admin — Corrosion' },
|
meta: { superAdmin: true, title: 'Admin · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'admin/licenses',
|
path: 'admin/licenses',
|
||||||
name: 'platform-licenses',
|
name: 'platform-licenses',
|
||||||
component: () => import('@/views/platform-admin/AdminLicenses.vue'),
|
component: () => import('@/views/platform-admin/AdminLicenses.vue'),
|
||||||
meta: { superAdmin: true, title: 'Admin: Licenses — Corrosion' },
|
meta: { superAdmin: true, title: 'Admin: Licenses · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'admin/subscriptions',
|
path: 'admin/subscriptions',
|
||||||
name: 'platform-subscriptions',
|
name: 'platform-subscriptions',
|
||||||
component: () => import('@/views/platform-admin/AdminSubscriptions.vue'),
|
component: () => import('@/views/platform-admin/AdminSubscriptions.vue'),
|
||||||
meta: { superAdmin: true, title: 'Admin: Subscriptions — Corrosion' },
|
meta: { superAdmin: true, title: 'Admin: Subscriptions · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'admin/users',
|
path: 'admin/users',
|
||||||
name: 'platform-users',
|
name: 'platform-users',
|
||||||
component: () => import('@/views/platform-admin/AdminUsers.vue'),
|
component: () => import('@/views/platform-admin/AdminUsers.vue'),
|
||||||
meta: { superAdmin: true, title: 'Admin: Users — Corrosion' },
|
meta: { superAdmin: true, title: 'Admin: Users · Catalyst' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'admin/servers',
|
path: 'admin/servers',
|
||||||
name: 'platform-servers',
|
name: 'platform-servers',
|
||||||
component: () => import('@/views/platform-admin/AdminServers.vue'),
|
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',
|
path: '/status',
|
||||||
name: 'status',
|
name: 'status',
|
||||||
component: () => import('@/views/public/StatusPageView.vue'),
|
component: () => import('@/views/public/StatusPageView.vue'),
|
||||||
meta: { title: 'Status — Corrosion' },
|
meta: { title: 'Status · Catalyst' },
|
||||||
},
|
},
|
||||||
|
|
||||||
// Catch-all
|
// Catch-all
|
||||||
@@ -488,14 +488,14 @@ function setOrClearMeta(selector: string, attr: string, value: string): void {
|
|||||||
|
|
||||||
router.afterEach((to) => {
|
router.afterEach((to) => {
|
||||||
// Title
|
// Title
|
||||||
document.title = to.meta.title ?? 'Corrosion Management'
|
document.title = to.meta.title ?? 'Catalyst Console'
|
||||||
|
|
||||||
// Description
|
// Description
|
||||||
const desc = to.meta.description ?? ''
|
const desc = to.meta.description ?? ''
|
||||||
setOrClearMeta('meta[name="description"]', 'content', desc)
|
setOrClearMeta('meta[name="description"]', 'content', desc)
|
||||||
|
|
||||||
// OG title
|
// 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
|
// OG description
|
||||||
setOrClearMeta('meta[property="og:description"]', 'content', desc)
|
setOrClearMeta('meta[property="og:description"]', 'content', desc)
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ export const useFilesStore = defineStore('files', () => {
|
|||||||
async function list(path: string): Promise<void> {
|
async function list(path: string): Promise<void> {
|
||||||
const id = currentId()
|
const id = currentId()
|
||||||
if (!id) {
|
if (!id) {
|
||||||
error.value = 'No instance — connect the host agent'
|
error.value = 'No instance — connect re-Agent'
|
||||||
entries.value = []
|
entries.value = []
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ function handleWebSocketMessage(message: WebSocketMessage) {
|
|||||||
let unsubscribe: (() => void) | null = null
|
let unsubscribe: (() => void) | null = null
|
||||||
|
|
||||||
onMounted(() => {
|
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')
|
addLine('Type a command and press Enter to send it to the server.', 'system')
|
||||||
if (server.connection?.connection_status !== 'connected') {
|
if (server.connection?.connection_status !== 'connected') {
|
||||||
addLine('Warning: server is not connected. Commands will fail.', 'warning')
|
addLine('Warning: server is not connected. Commands will fail.', 'warning')
|
||||||
|
|||||||
@@ -259,7 +259,7 @@ function navServer() { router.push('/server') }
|
|||||||
<EmptyState
|
<EmptyState
|
||||||
icon="server"
|
icon="server"
|
||||||
title="No server connected"
|
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>
|
<template #action>
|
||||||
<Button icon="server" @click="navServer">Set up server</Button>
|
<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">
|
<div class="dash__col dash__col--side">
|
||||||
|
|
||||||
<!-- Resources — real stats from agent; null = '—' -->
|
<!-- Resources — real stats from agent; null = '—' -->
|
||||||
<Panel title="Resources" subtitle="Host agent telemetry">
|
<Panel title="Resources" subtitle="re-Agent telemetry">
|
||||||
<div class="solo-meters">
|
<div class="solo-meters">
|
||||||
<ResourceMeter
|
<ResourceMeter
|
||||||
label="CPU"
|
label="CPU"
|
||||||
@@ -418,7 +418,7 @@ function navServer() { router.push('/server') }
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="soloCpu === null && soloRamMb === null" class="meters-note">
|
<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">
|
<Button size="sm" variant="ghost" icon="server" class="meters-cta" @click="navServer">
|
||||||
Agent setup
|
Agent setup
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -193,8 +193,8 @@ async function confirmDelete(path: string) {
|
|||||||
<Panel v-if="!instancesStore.loading && instancesStore.instances.length === 0">
|
<Panel v-if="!instancesStore.loading && instancesStore.instances.length === 0">
|
||||||
<EmptyState
|
<EmptyState
|
||||||
icon="server"
|
icon="server"
|
||||||
title="No host agent connected"
|
title="No re-Agent connected"
|
||||||
description="Install the host agent from the Server page to manage files on your game server."
|
description="Install re-Agent from the Server page to manage files on your game server."
|
||||||
>
|
>
|
||||||
<template #action>
|
<template #action>
|
||||||
<Button variant="secondary" size="sm" icon="server" @click="router.push('/server')">
|
<Button variant="secondary" size="sm" icon="server" @click="router.push('/server')">
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ function relativeHeartbeat(iso: string | null): string {
|
|||||||
<EmptyState
|
<EmptyState
|
||||||
icon="server"
|
icon="server"
|
||||||
title="No hosts connected yet"
|
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>
|
<template #action>
|
||||||
<Button variant="primary" @click="router.push('/server')">Go to Server page</Button>
|
<Button variant="primary" @click="router.push('/server')">Go to Server page</Button>
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ const tabItems = [
|
|||||||
function sourceLabel(source: string): string {
|
function sourceLabel(source: string): string {
|
||||||
switch (source) {
|
switch (source) {
|
||||||
case 'umod': return 'uMod'
|
case 'umod': return 'uMod'
|
||||||
case 'corrosion_module': return 'Corrosion'
|
case 'corrosion_module': return 'Catalyst'
|
||||||
case 'manual': return 'Manual'
|
case 'manual': return 'Manual'
|
||||||
default: return source
|
default: return source
|
||||||
}
|
}
|
||||||
@@ -485,7 +485,7 @@ onMounted(() => {
|
|||||||
</Panel>
|
</Panel>
|
||||||
|
|
||||||
<Alert tone="info">
|
<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.
|
for the file to be delivered to the game server. If the agent is offline, re-upload once it reconnects.
|
||||||
</Alert>
|
</Alert>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -327,7 +327,7 @@ async function saveConfig() {
|
|||||||
|
|
||||||
async function serverAction(action: 'start' | 'stop' | 'restart') {
|
async function serverAction(action: 'start' | 'stop' | 'restart') {
|
||||||
if (!currentInstance.value) {
|
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
|
return
|
||||||
}
|
}
|
||||||
actionLoading.value = action
|
actionLoading.value = action
|
||||||
@@ -532,7 +532,7 @@ onMounted(async () => {
|
|||||||
v-if="!currentInstance"
|
v-if="!currentInstance"
|
||||||
icon="server"
|
icon="server"
|
||||||
title="No game instance connected"
|
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>
|
<template v-else>
|
||||||
@@ -611,7 +611,7 @@ onMounted(async () => {
|
|||||||
</Panel>
|
</Panel>
|
||||||
|
|
||||||
<!-- Host agent -->
|
<!-- Host agent -->
|
||||||
<Panel title="Host agent" subtitle="Bare-metal server management binary">
|
<Panel title="re-Agent" subtitle="Bare-metal server management binary">
|
||||||
<template #actions>
|
<template #actions>
|
||||||
<Badge :tone="isAgentConnected ? 'online' : 'offline'" :dot="true" :pulse="isAgentConnected">
|
<Badge :tone="isAgentConnected ? 'online' : 'offline'" :dot="true" :pulse="isAgentConnected">
|
||||||
{{ isAgentConnected ? 'Active' : 'Inactive' }}
|
{{ isAgentConnected ? 'Active' : 'Inactive' }}
|
||||||
@@ -640,7 +640,7 @@ onMounted(async () => {
|
|||||||
<!-- Download -->
|
<!-- Download -->
|
||||||
<div class="sv__section-head">
|
<div class="sv__section-head">
|
||||||
<Icon name="download" :size="14" />
|
<Icon name="download" :size="14" />
|
||||||
<span>Download host agent</span>
|
<span>Download re-Agent</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="sv__downloads sv__mb">
|
<div class="sv__downloads sv__mb">
|
||||||
<a
|
<a
|
||||||
@@ -683,7 +683,7 @@ onMounted(async () => {
|
|||||||
|
|
||||||
<!-- Linux commands -->
|
<!-- Linux commands -->
|
||||||
<div v-if="setupTab === 'linux'" class="sv__codeblock">
|
<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>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>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>
|
<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 -->
|
<!-- Windows commands -->
|
||||||
<div v-if="setupTab === 'windows'" class="sv__codeblock">
|
<div v-if="setupTab === 'windows'" class="sv__codeblock">
|
||||||
<p class="sv__cmt"># Requires PowerShell (not Command Prompt)</p>
|
<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>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 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>
|
<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>
|
<pre class="sv__pre">{{ agentTomlConfig }}</pre>
|
||||||
</div>
|
</div>
|
||||||
<Alert v-if="!agentCreds" tone="warn" class="sv__mt">
|
<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>
|
</Alert>
|
||||||
</Panel>
|
</Panel>
|
||||||
|
|
||||||
@@ -858,7 +858,7 @@ onMounted(async () => {
|
|||||||
<EmptyState
|
<EmptyState
|
||||||
icon="box"
|
icon="box"
|
||||||
title="Docker-managed deployment"
|
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>
|
<template #action>
|
||||||
<Badge tone="info">Docker · Compose</Badge>
|
<Badge tone="info">Docker · Compose</Badge>
|
||||||
@@ -929,7 +929,7 @@ onMounted(async () => {
|
|||||||
<EmptyState
|
<EmptyState
|
||||||
icon="layers"
|
icon="layers"
|
||||||
:title="profile.label + ' mod management'"
|
: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>
|
</Panel>
|
||||||
|
|
||||||
@@ -973,7 +973,7 @@ onMounted(async () => {
|
|||||||
<EmptyState
|
<EmptyState
|
||||||
icon="network"
|
icon="network"
|
||||||
title="Cluster management coming soon"
|
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>
|
</Panel>
|
||||||
|
|
||||||
@@ -986,7 +986,7 @@ onMounted(async () => {
|
|||||||
<EmptyState
|
<EmptyState
|
||||||
icon="map"
|
icon="map"
|
||||||
title="Sietch management requires a connected Dune host"
|
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>
|
</Panel>
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ function handleBackToLogin() {
|
|||||||
<!-- Branding -->
|
<!-- Branding -->
|
||||||
<div class="auth-brand">
|
<div class="auth-brand">
|
||||||
<div class="auth-brand__mark">
|
<div class="auth-brand__mark">
|
||||||
<Logo :size="40" :glow="true" tagline="Game Server Operations" />
|
<Logo :size="40" :glow="true" tagline="by Corrosion" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ function syncPorts() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const connectionTypes = [
|
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: 'amp', label: 'AMP (CubeCoders)', desc: 'Connect through AMP panel API' },
|
||||||
{ value: 'pterodactyl', label: 'Pterodactyl', desc: 'Connect through Pterodactyl panel API' },
|
{ value: 'pterodactyl', label: 'Pterodactyl', desc: 'Connect through Pterodactyl panel API' },
|
||||||
]
|
]
|
||||||
@@ -183,7 +183,7 @@ async function completeSetup() {
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Step 2: Corrosion host agent install -->
|
<!-- Step 2: re-Agent install -->
|
||||||
<div v-if="step === 2" class="setup-card">
|
<div v-if="step === 2" class="setup-card">
|
||||||
<div class="setup-card__head setup-card__head--center">
|
<div class="setup-card__head setup-card__head--center">
|
||||||
<div class="setup-icon">
|
<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" />
|
<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>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
<h1 class="setup-card__title">Install the Corrosion host agent</h1>
|
<h1 class="setup-card__title">Install re-Agent</h1>
|
||||||
<p class="setup-card__sub">The agent runs on your server and connects to Corrosion — no inbound ports required.</p>
|
<p class="setup-card__sub">re-Agent runs on your server and connects to Corrosion — no inbound ports required.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setup-code">
|
<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">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__cmd">chmod +x corrosion-host-agent-linux-amd64</p>
|
||||||
<p class="setup-code__comment setup-code__comment--mt"># Start with your license key</p>
|
<p class="setup-code__comment setup-code__comment--mt"># Start with your license key</p>
|
||||||
@@ -206,7 +206,7 @@ async function completeSetup() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="setup-hint">
|
<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>
|
</p>
|
||||||
|
|
||||||
<div class="setup-actions">
|
<div class="setup-actions">
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<h2 class="title">Real access to a real platform.</h2>
|
<h2 class="title">Real access to a real platform.</h2>
|
||||||
<p class="lead">
|
<p class="lead">
|
||||||
Early access is not a waitlist gimmick. It is how we manage onboarding while the
|
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.
|
as capacity opens.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -114,7 +114,7 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<div class="icard">
|
<div class="icard">
|
||||||
<div class="icard__ic"><Icon name="cpu" :size="16" /></div>
|
<div class="icard__ic"><Icon name="cpu" :size="16" /></div>
|
||||||
<b>Full control plane</b>
|
<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>
|
||||||
<div class="icard">
|
<div class="icard">
|
||||||
<div class="icard__ic"><Icon name="shield" :size="16" /></div>
|
<div class="icard__ic"><Icon name="shield" :size="16" /></div>
|
||||||
@@ -248,17 +248,17 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<div class="sec__head reveal">
|
<div class="sec__head reveal">
|
||||||
<span class="eyebrow">How it works</span>
|
<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>
|
||||||
<div class="steps reveal">
|
<div class="steps reveal">
|
||||||
<div class="step">
|
<div class="step">
|
||||||
<div class="step__n">1</div>
|
<div class="step__n">1</div>
|
||||||
<b>Install the host agent</b>
|
<b>Install re-Agent</b>
|
||||||
<p>Download the Go binary from your dashboard. Run it on Windows or Linux. One agent per machine.</p>
|
<p>Download re-Agent from your dashboard. Run it on Windows or Linux. One agent per machine.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="step">
|
<div class="step">
|
||||||
<div class="step__n">2</div>
|
<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>
|
<p>Single outbound NATS connection. No inbound ports. No exposed management panel on your machine.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="step">
|
<div class="step">
|
||||||
|
|||||||
@@ -28,12 +28,12 @@ const groups: FaqGroup[] = [
|
|||||||
{
|
{
|
||||||
question: 'What if Corrosion itself is broken?',
|
question: 'What if Corrosion itself is broken?',
|
||||||
answer:
|
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?',
|
question: 'Do you manage my server for me?',
|
||||||
answer:
|
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?',
|
question: 'Is hands-on help available?',
|
||||||
@@ -54,7 +54,7 @@ const groups: FaqGroup[] = [
|
|||||||
{
|
{
|
||||||
question: 'Do I need my own server?',
|
question: 'Do I need my own server?',
|
||||||
answer:
|
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?',
|
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?',
|
question: 'Do I need to open inbound firewall ports for Corrosion?',
|
||||||
answer:
|
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?',
|
question: 'Does Corrosion replace AMP or Pterodactyl?',
|
||||||
@@ -74,7 +74,7 @@ const groups: FaqGroup[] = [
|
|||||||
{
|
{
|
||||||
question: 'What happens if Corrosion goes offline?',
|
question: 'What happens if Corrosion goes offline?',
|
||||||
answer:
|
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?',
|
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.',
|
'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:
|
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?',
|
question: 'Is my data isolated from other customers?',
|
||||||
@@ -100,7 +100,7 @@ const groups: FaqGroup[] = [
|
|||||||
{
|
{
|
||||||
question: 'Which games are supported?',
|
question: 'Which games are supported?',
|
||||||
answer:
|
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?',
|
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?',
|
question: 'Can I run multiple game types on the same host machine?',
|
||||||
answer:
|
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?',
|
question: 'Does Corrosion handle Rust wipes?',
|
||||||
|
|||||||
@@ -41,12 +41,12 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
</div>
|
</div>
|
||||||
<span class="eyebrow">How it works</span>
|
<span class="eyebrow">How it works</span>
|
||||||
<h1 style="font-size:var(--text-5xl)">
|
<h1 style="font-size:var(--text-5xl)">
|
||||||
One agent.
|
One re-Agent.
|
||||||
<span class="accent">Every game. No SSH.</span>
|
<span class="accent">Every game. No SSH.</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p class="hero__sub">
|
<p class="hero__sub">
|
||||||
Install the host agent once on your Windows or Linux machine. Corrosion connects
|
Install re-Agent once on your Windows or Linux machine. Corrosion connects
|
||||||
securely, outbound-only. You manage every game instance from the browser.
|
securely, outbound-only. You manage every game instance from Catalyst Console.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -55,20 +55,20 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<section class="sec" id="model">
|
<section class="sec" id="model">
|
||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<div class="sec__head reveal">
|
<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>
|
<h2 class="title">Bring your own server.<br>We provide the control plane.</h2>
|
||||||
<p class="lead">
|
<p class="lead">
|
||||||
Corrosion is not a hosting provider. You supply the hardware or the VPS. The host
|
Corrosion is not a hosting provider. You supply the hardware or the VPS. re-Agent
|
||||||
agent runs on that machine and bridges your game instances to Corrosion's control
|
runs on that machine and bridges your game instances to Corrosion's control
|
||||||
plane — securely, without opening inbound firewall ports.
|
plane — securely, without opening inbound firewall ports.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="steps reveal">
|
<div class="steps reveal">
|
||||||
<div class="step">
|
<div class="step">
|
||||||
<div class="step__n">1</div>
|
<div class="step__n">1</div>
|
||||||
<b>Install the host agent</b>
|
<b>Install re-Agent</b>
|
||||||
<p>
|
<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
|
or Linux host. One agent per machine — it manages every game instance you assign
|
||||||
to it.
|
to it.
|
||||||
</p>
|
</p>
|
||||||
@@ -77,7 +77,7 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<div class="step__n">2</div>
|
<div class="step__n">2</div>
|
||||||
<b>It connects to Corrosion</b>
|
<b>It connects to Corrosion</b>
|
||||||
<p>
|
<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.
|
inbound ports. No open panels. No SSH required after initial setup.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -86,7 +86,7 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<b>Deploy and manage from the browser</b>
|
<b>Deploy and manage from the browser</b>
|
||||||
<p>
|
<p>
|
||||||
Create game instances, run wipes, manage plugins, schedule maintenance, and
|
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>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -106,8 +106,8 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<span class="eyebrow">Multi-game host runtime</span>
|
<span class="eyebrow">Multi-game host runtime</span>
|
||||||
<h2 class="title">One agent. Multiple game worlds<br>on the same machine.</h2>
|
<h2 class="title">One agent. Multiple game worlds<br>on the same machine.</h2>
|
||||||
<p class="lead">
|
<p class="lead">
|
||||||
The host agent is not a per-game process. It is a general-purpose ops runtime. One
|
re-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 on a single machine can supervise multiple game server processes across
|
||||||
different games — each with its own configuration, lifecycle, and wipe schedule.
|
different games — each with its own configuration, lifecycle, and wipe schedule.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -220,7 +220,7 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<span class="eyebrow">Connectivity model</span>
|
<span class="eyebrow">Connectivity model</span>
|
||||||
<h2 class="title">Outbound-only. No exposed panel.</h2>
|
<h2 class="title">Outbound-only. No exposed panel.</h2>
|
||||||
<p class="lead">
|
<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
|
commands flow through that channel. Your machine never needs to accept inbound
|
||||||
connections from the internet.
|
connections from the internet.
|
||||||
</p>
|
</p>
|
||||||
@@ -234,8 +234,8 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
</div>
|
</div>
|
||||||
<div class="icard">
|
<div class="icard">
|
||||||
<div class="icard__ic"><Icon name="cpu" :size="16" /></div>
|
<div class="icard__ic"><Icon name="cpu" :size="16" /></div>
|
||||||
<b>Corrosion agent</b>
|
<b>re-Agent</b>
|
||||||
<p>A single Go binary. Runs as a service. Manages game processes, files, and updates.</p>
|
<p>A single binary. Runs as a service. Manages game processes, files, and updates.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="icard">
|
<div class="icard">
|
||||||
<div class="icard__ic"><Icon name="zap" :size="16" /></div>
|
<div class="icard__ic"><Icon name="zap" :size="16" /></div>
|
||||||
@@ -250,12 +250,12 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<div class="icard">
|
<div class="icard">
|
||||||
<div class="icard__ic"><Icon name="layout-dashboard" :size="16" /></div>
|
<div class="icard__ic"><Icon name="layout-dashboard" :size="16" /></div>
|
||||||
<b>Your browser</b>
|
<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>
|
</div>
|
||||||
|
|
||||||
<div class="techrow reveal">
|
<div class="techrow reveal">
|
||||||
<span>Go host agent</span>
|
<span>re-Agent</span>
|
||||||
<span>NATS JetStream</span>
|
<span>NATS JetStream</span>
|
||||||
<span>NestJS API</span>
|
<span>NestJS API</span>
|
||||||
<span>PostgreSQL</span>
|
<span>PostgreSQL</span>
|
||||||
@@ -289,7 +289,7 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<div>
|
<div>
|
||||||
<b>Enough CPU and RAM for your game</b>
|
<b>Enough CPU and RAM for your game</b>
|
||||||
<p style="margin:4px 0 0;color:var(--text-tertiary);font-size:var(--text-xs)">
|
<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.
|
hardware requirement.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -299,7 +299,7 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<div>
|
<div>
|
||||||
<b>Outbound internet access</b>
|
<b>Outbound internet access</b>
|
||||||
<p style="margin:4px 0 0;color:var(--text-tertiary);font-size:var(--text-xs)">
|
<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.
|
always have been.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -310,7 +310,7 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<div class="feat">
|
<div class="feat">
|
||||||
<span class="feat__ic"><Icon name="download" :size="16" /></span>
|
<span class="feat__ic"><Icon name="download" :size="16" /></span>
|
||||||
<div>
|
<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)">
|
<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.
|
Downloaded from your dashboard. No manual build. No dependency management.
|
||||||
</p>
|
</p>
|
||||||
@@ -321,14 +321,14 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<div>
|
<div>
|
||||||
<b>Your license key</b>
|
<b>Your license key</b>
|
||||||
<p style="margin:4px 0 0;color:var(--text-tertiary);font-size:var(--text-xs)">
|
<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>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feat">
|
<div class="feat">
|
||||||
<span class="feat__ic"><Icon name="globe" :size="16" /></span>
|
<span class="feat__ic"><Icon name="globe" :size="16" /></span>
|
||||||
<div>
|
<div>
|
||||||
<b>The panel</b>
|
<b>Catalyst Console</b>
|
||||||
<p style="margin:4px 0 0;color:var(--text-tertiary);font-size:var(--text-xs)">
|
<p style="margin:4px 0 0;color:var(--text-tertiary);font-size:var(--text-xs)">
|
||||||
Everything else — console, wipes, schedules, players — lives at
|
Everything else — console, wipes, schedules, players — lives at
|
||||||
panel.corrosionmgmt.com.
|
panel.corrosionmgmt.com.
|
||||||
@@ -344,7 +344,7 @@ onUnmounted(() => { io?.disconnect() })
|
|||||||
<section class="finalcta">
|
<section class="finalcta">
|
||||||
<div class="finalcta__atmo" />
|
<div class="finalcta__atmo" />
|
||||||
<div class="wrap finalcta__in reveal">
|
<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">
|
<div class="cta-row">
|
||||||
<RouterLink class="btn btn--primary btn--lg" :to="{ name: 'early-access' }">
|
<RouterLink class="btn btn--primary btn--lg" :to="{ name: 'early-access' }">
|
||||||
Join early access
|
Join early access
|
||||||
|
|||||||
@@ -104,9 +104,9 @@ const mockActiveGame = activeGame
|
|||||||
</div>
|
</div>
|
||||||
<h1>Run your game servers<span class="accent">like an operation.</span></h1>
|
<h1>Run your game servers<span class="accent">like an operation.</span></h1>
|
||||||
<p class="hero__sub">
|
<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
|
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>
|
</p>
|
||||||
<div class="hero__cta">
|
<div class="hero__cta">
|
||||||
<RouterLink class="btn btn--primary btn--lg" :to="{ name: 'early-access' }">
|
<RouterLink class="btn btn--primary btn--lg" :to="{ name: 'early-access' }">
|
||||||
@@ -144,7 +144,7 @@ const mockActiveGame = activeGame
|
|||||||
<aside class="mock__side">
|
<aside class="mock__side">
|
||||||
<div class="mock__brand">
|
<div class="mock__brand">
|
||||||
<span class="mark"><CorrosionMark :size="18" /></span>
|
<span class="mark"><CorrosionMark :size="18" /></span>
|
||||||
<b>Corrosion</b>
|
<b>Catalyst</b>
|
||||||
</div>
|
</div>
|
||||||
<div class="mock__gs">
|
<div class="mock__gs">
|
||||||
<span :class="{ on: mockActiveGame === 'rust' }">
|
<span :class="{ on: mockActiveGame === 'rust' }">
|
||||||
@@ -177,7 +177,7 @@ const mockActiveGame = activeGame
|
|||||||
<div class="v">234</div>
|
<div class="v">234</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="mock__kpi">
|
<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 class="v">2<small>/2</small></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -219,7 +219,7 @@ const mockActiveGame = activeGame
|
|||||||
</div>
|
</div>
|
||||||
<div class="wrap" style="text-align:center">
|
<div class="wrap" style="text-align:center">
|
||||||
<div class="hero__foot">
|
<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
|
Windows & Linux hosts
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -269,7 +269,7 @@ const mockActiveGame = activeGame
|
|||||||
</div>
|
</div>
|
||||||
<p class="closing reveal">
|
<p class="closing reveal">
|
||||||
Your community sees the server. You deal with the chaos.<br>
|
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>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -279,16 +279,16 @@ const mockActiveGame = activeGame
|
|||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<div class="sec__head reveal">
|
<div class="sec__head reveal">
|
||||||
<span class="eyebrow">The shift</span>
|
<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">
|
<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.
|
to it — an outbound-only ops runtime, not an exposed panel.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="steps reveal">
|
<div class="steps reveal">
|
||||||
<div class="step">
|
<div class="step">
|
||||||
<div class="step__n">1</div>
|
<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>
|
<p>One runtime on your Windows or Linux host. Outbound connection only.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="step">
|
<div class="step">
|
||||||
@@ -310,7 +310,7 @@ const mockActiveGame = activeGame
|
|||||||
</div>
|
</div>
|
||||||
<p class="closing reveal" style="font-size:var(--text-lg)">
|
<p class="closing reveal" style="font-size:var(--text-lg)">
|
||||||
You provide the machine.
|
You provide the machine.
|
||||||
<span class="accent">Corrosion provides the control plane.</span>
|
<span class="accent">Catalyst Console provides the control plane.</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -320,10 +320,9 @@ const mockActiveGame = activeGame
|
|||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<div class="sec__head reveal">
|
<div class="sec__head reveal">
|
||||||
<span class="eyebrow">Supported games</span>
|
<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">
|
<p class="lead">
|
||||||
Every game has a different operational reality. Corrosion models each one as an operations
|
Every game has a different operational reality. Corrosion models each one as a Formula — Rust wipes, Dune: Awakening battlegroups, Soulmask clusters, Conan persistent
|
||||||
blueprint — Rust wipes, Dune: Awakening battlegroups, Soulmask clusters, Conan persistent
|
|
||||||
worlds.
|
worlds.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -527,7 +526,7 @@ const mockActiveGame = activeGame
|
|||||||
<span class="eyebrow">Built like infrastructure</span>
|
<span class="eyebrow">Built like infrastructure</span>
|
||||||
<h2 class="title">Not a skin over SSH</h2>
|
<h2 class="title">Not a skin over SSH</h2>
|
||||||
<p class="lead">
|
<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.
|
health reporting, and outbound-only connectivity.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -535,7 +534,7 @@ const mockActiveGame = activeGame
|
|||||||
<div class="icard">
|
<div class="icard">
|
||||||
<div class="icard__ic"><Icon name="cpu" :size="16" /></div>
|
<div class="icard__ic"><Icon name="cpu" :size="16" /></div>
|
||||||
<b>Agent-based control</b>
|
<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>
|
||||||
<div class="icard">
|
<div class="icard">
|
||||||
<div class="icard__ic"><Icon name="shield" :size="16" /></div>
|
<div class="icard__ic"><Icon name="shield" :size="16" /></div>
|
||||||
@@ -550,7 +549,7 @@ const mockActiveGame = activeGame
|
|||||||
<div class="icard">
|
<div class="icard">
|
||||||
<div class="icard__ic"><Icon name="zap" :size="16" /></div>
|
<div class="icard__ic"><Icon name="zap" :size="16" /></div>
|
||||||
<b>Event-driven</b>
|
<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>
|
||||||
<div class="icard">
|
<div class="icard">
|
||||||
<div class="icard__ic"><Icon name="activity" :size="16" /></div>
|
<div class="icard__ic"><Icon name="activity" :size="16" /></div>
|
||||||
@@ -562,7 +561,7 @@ const mockActiveGame = activeGame
|
|||||||
<span>NestJS</span>
|
<span>NestJS</span>
|
||||||
<span>NATS JetStream</span>
|
<span>NATS JetStream</span>
|
||||||
<span>PostgreSQL</span>
|
<span>PostgreSQL</span>
|
||||||
<span>Go host agent</span>
|
<span>re-Agent</span>
|
||||||
<span>Outbound-only</span>
|
<span>Outbound-only</span>
|
||||||
</div>
|
</div>
|
||||||
</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">
|
<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
|
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.
|
You run the operation.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -25,14 +25,14 @@ const groups: RoadmapGroup[] = [
|
|||||||
status: 'shipped',
|
status: 'shipped',
|
||||||
label: 'Phase 1 — Foundation',
|
label: 'Phase 1 — Foundation',
|
||||||
description:
|
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: [
|
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: '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: '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: 'Plugin management', note: 'Rust uMod/Oxide — browse, install, configure from the browser' },
|
||||||
{ text: 'Real-time console', note: 'NATS-bridged live output' },
|
{ 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: 'Scheduled tasks and maintenance windows' },
|
||||||
{ text: 'Player management and RBAC team access' },
|
{ text: 'Player management and RBAC team access' },
|
||||||
{ text: 'Public server page', note: 'Live status, wipe countdown, player count' },
|
{ text: 'Public server page', note: 'Live status, wipe countdown, player count' },
|
||||||
@@ -44,12 +44,12 @@ const groups: RoadmapGroup[] = [
|
|||||||
status: 'in-progress',
|
status: 'in-progress',
|
||||||
label: 'Multi-game expansion',
|
label: 'Multi-game expansion',
|
||||||
description:
|
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: [
|
items: [
|
||||||
{ text: 'Dune: Awakening blueprint', note: 'Deep Desert wipe scheduling, battlegroup lifecycle' },
|
{ text: 'Dune: Awakening Formula', note: 'Deep Desert wipe scheduling, battlegroup lifecycle' },
|
||||||
{ text: 'Conan Exiles blueprint', note: 'Persistent world management, mod support, purge tracking' },
|
{ text: 'Conan Exiles Formula', note: 'Persistent world management, mod support, purge tracking' },
|
||||||
{ text: 'Soulmask blueprint', note: 'Linked-world cluster deployment, port automation' },
|
{ text: 'Soulmask Formula', note: 'Linked-world cluster deployment, port automation' },
|
||||||
{ text: 'Multi-instance host runtime', note: 'One agent managing N game processes on the same machine' },
|
{ text: 'Multi-instance host runtime', note: 'One re-Agent managing N game processes on the same machine' },
|
||||||
{ text: 'Per-game wipe and event scheduling' },
|
{ text: 'Per-game wipe and event scheduling' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -72,7 +72,7 @@ const groups: RoadmapGroup[] = [
|
|||||||
items: [
|
items: [
|
||||||
{ text: 'Item catalog and categories' },
|
{ text: 'Item catalog and categories' },
|
||||||
{ text: 'PayPal and Stripe payment processing' },
|
{ 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' },
|
{ 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.',
|
'Tools for hosting providers and multi-server operations running 50+ instances across multiple physical hosts.',
|
||||||
items: [
|
items: [
|
||||||
{ text: 'Fleet-level dashboards and health monitoring' },
|
{ 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: 'Bulk wipe and update scheduling across a fleet' },
|
||||||
{ text: 'Fleet Block capacity management' },
|
{ 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.',
|
'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: [
|
items: [
|
||||||
{ text: 'Additional survival and sandbox games' },
|
{ text: 'Additional survival and sandbox games' },
|
||||||
{ text: 'Community-requested game blueprints' },
|
{ text: 'Community-requested game Formulae' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user