From 6f783bfac828d554dbe622f969aff285113b073a Mon Sep 17 00:00:00 2001 From: Vantz Stockwell Date: Thu, 11 Jun 2026 22:06:10 -0400 Subject: [PATCH] =?UTF-8?q?feat(panel):=20Beta=20sweep=20=E2=80=94=20multi?= =?UTF-8?q?-game=20coherence,=20honesty,=20UX=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Multi-game rebrand (no more Rust-only leftovers): game-neutral setup wizard + deploy/store defaults; player-id labels driven by game profile (Steam ID only for Rust); blueprint wipe type + verify-plugins gated to uMod games; oxide command examples + Rust-only plugin pages (AutoDoors/FurnaceSplitter/BetterChat) guarded behind mods==='umod' with empty-states for other games. Honesty: webstore checkout shows coming-soon (backend now 503s); 'integrated webstore' marketed as coming-soon; Discord references neutralized to community/webhook; migration FAQ marked in-development; analytics dev phase labels removed; Network pricing tier set to Custom/Contact (was a confusing duplicate of Operator); docs/PRICING.md rewritten to match live subscriptions. UX/bugs: fixed ServerView oxide-status operator-precedence bug; dead 'Deploy server' button wired; non-functional topbar search removed; alert()/confirm() replaced with toasts across schedules/alerts/migration/public store+server; analytics chart arrays null-guarded; production console.logs gated to DEV. Frontend build (vue-tsc + vite) green. Co-Authored-By: Claude Opus 4.8 --- docs/PRICING.md | 100 +++++++++++++++--- .../src/components/layout/DashboardLayout.vue | 13 +-- .../src/components/layout/MarketingLayout.vue | 3 +- frontend/src/composables/useWebSocket.ts | 16 +-- frontend/src/views/admin/AlertsView.vue | 6 +- frontend/src/views/admin/AnalyticsView.vue | 18 ++-- frontend/src/views/admin/AutoDoorsView.vue | 17 ++- frontend/src/views/admin/BetterChatView.vue | 15 +++ frontend/src/views/admin/ChatLogView.vue | 5 +- frontend/src/views/admin/DashboardView.vue | 2 +- .../src/views/admin/FurnaceSplitterView.vue | 17 ++- frontend/src/views/admin/MigrationView.vue | 4 +- frontend/src/views/admin/PlayersView.vue | 7 +- frontend/src/views/admin/SchedulesView.vue | 4 +- frontend/src/views/admin/ServerView.vue | 6 +- frontend/src/views/admin/StoreConfigView.vue | 2 +- frontend/src/views/admin/StoreItemsView.vue | 17 ++- frontend/src/views/admin/TimedExecuteView.vue | 6 +- frontend/src/views/admin/WipeProfilesView.vue | 9 +- frontend/src/views/admin/WipesView.vue | 17 ++- frontend/src/views/auth/SetupWizardView.vue | 4 +- .../src/views/marketing/EarlyAccessView.vue | 14 +-- frontend/src/views/marketing/FaqView.vue | 2 +- frontend/src/views/marketing/LandingView.vue | 18 +++- frontend/src/views/marketing/PricingView.vue | 21 +++- frontend/src/views/marketing/RoadmapView.vue | 2 +- frontend/src/views/public/ServerInfoView.vue | 8 +- frontend/src/views/public/StoreView.vue | 11 +- 28 files changed, 265 insertions(+), 99 deletions(-) diff --git a/docs/PRICING.md b/docs/PRICING.md index 40f4f69..3282f33 100644 --- a/docs/PRICING.md +++ b/docs/PRICING.md @@ -1,27 +1,95 @@ # Pricing +> This document mirrors the live pricing page at corrosionmgmt.com/pricing. + --- -## Base License — $50 (Launch Price) +## Hobby — $9.99/month -One server. Lifetime access. +1–5 game server instances · non-commercial use only. Includes: -* Full control plane -* Auto-Wiper -* Plugin management -* Public site -* RBAC - -## Webstore Add-On — $10/month - -Integrated monetization platform. - -## Modules — $9.99+ - -Optional feature expansions. +- Up to 5 game server instances +- Non-commercial servers only +- Auto-wiper with rollback +- Plugin management (Rust uMod/Oxide) +- File manager + real-time console +- Scheduled tasks +- Public server page +- Community support --- -Simple. Transparent. No hidden tiers. +## Community — $19.99/month + +6–10 game server instances · non-commercial use only. + +Includes: + +- Up to 10 game server instances +- Non-commercial servers only +- Auto-wiper with rollback +- Plugin management (Rust uMod/Oxide) +- File manager + real-time console +- Scheduled tasks +- Public server page +- Community support + +--- + +## Operator — $99.99/month _(Most popular)_ + +Commercial use permitted, or up to 50 servers. + +Includes: + +- Up to 50 game server instances +- Commercial use permitted +- All games: Rust, Dune: Awakening, Soulmask, Conan Exiles +- Auto-wiper with rollback +- Plugin + mod management +- File manager + real-time console +- Scheduled tasks + maintenance windows +- Player management + RBAC team access +- Public server page + storefront +- Community support + priority bug triage + +--- + +## Network — Custom pricing + +50+ servers · hosting partners and fleets. Contact support@corrosionmgmt.com for pricing. + +Includes: + +- 50 servers base included +- Fleet Blocks: +$49.99/mo per additional 50 servers +- Commercial use permitted +- All games + multi-game hosts +- Full Operator feature set +- Fleet-level management +- Priority bug triage for platform issues +- Community support + +--- + +## Fleet Block Add-On — +$49.99/month per 50 servers + +Stack as many Fleet Blocks as your Network plan operation requires. + +--- + +## Direct 1:1 Support — $125/hour (prepaid 1-hour blocks) + +Available to any customer. Billed time with a human — not a support tier. Community support (docs, forum, diagnostics, structured bug reports) is included with every plan at no extra charge. + +--- + +## Commercial Use Definition + +Commercial use includes monetized communities, paid access, VIP slots, donations, sponsorship-supported servers, hosting providers, or managing servers for others. Hobby and Community plans are non-commercial only. Operator and Network plans permit commercial use. + +--- + +Simple. Transparent. No per-seat charges. No hidden tiers. diff --git a/frontend/src/components/layout/DashboardLayout.vue b/frontend/src/components/layout/DashboardLayout.vue index eb59b59..2adb005 100644 --- a/frontend/src/components/layout/DashboardLayout.vue +++ b/frontend/src/components/layout/DashboardLayout.vue @@ -277,17 +277,6 @@ const themeIcon = computed(() => theme.value === 'dark' ? 'sun' : 'moon') {{ serverName }} - - -
theme.value === 'dark' ? 'sun' : 'moon') @click="toggleTheme" /> - +
diff --git a/frontend/src/composables/useWebSocket.ts b/frontend/src/composables/useWebSocket.ts index 1c03ff8..7f77a52 100644 --- a/frontend/src/composables/useWebSocket.ts +++ b/frontend/src/composables/useWebSocket.ts @@ -51,12 +51,12 @@ export function useWebSocket() { function connect() { if (!authStore.isAuthenticated) { - console.log('[WebSocket] Not authenticated, skipping connection') + if (import.meta.env.DEV) console.log('[WebSocket] Not authenticated, skipping connection') return } if (isConnecting.value || isConnected.value) { - console.log('[WebSocket] Already connecting or connected') + if (import.meta.env.DEV) console.log('[WebSocket] Already connecting or connected') return } @@ -65,12 +65,12 @@ export function useWebSocket() { error.value = null const url = getWebSocketUrl() - console.log('[WebSocket] Connecting to', url.replace(/token=[^&]+/, 'token=***')) + if (import.meta.env.DEV) console.log('[WebSocket] Connecting to', url.replace(/token=[^&]+/, 'token=***')) ws.value = new WebSocket(url) ws.value.onopen = () => { - console.log('[WebSocket] Connected') + if (import.meta.env.DEV) console.log('[WebSocket] Connected') isConnected.value = true isConnecting.value = false reconnectAttempts.value = 0 @@ -80,7 +80,7 @@ export function useWebSocket() { ws.value.onmessage = (event) => { try { const message: WebSocketMessage = JSON.parse(event.data) - console.log('[WebSocket] Message received:', message) + if (import.meta.env.DEV) console.log('[WebSocket] Message received:', message) // Broadcast to all handlers messageHandlers.forEach(handler => { @@ -102,7 +102,7 @@ export function useWebSocket() { } ws.value.onclose = (event) => { - console.log('[WebSocket] Closed:', event.code, event.reason) + if (import.meta.env.DEV) console.log('[WebSocket] Closed:', event.code, event.reason) isConnected.value = false isConnecting.value = false @@ -132,7 +132,7 @@ export function useWebSocket() { 30000 // Max 30 seconds ) - console.log( + if (import.meta.env.DEV) console.log( `[WebSocket] Reconnecting in ${delay}ms (attempt ${reconnectAttempts.value}/${maxReconnectAttempts})` ) @@ -148,7 +148,7 @@ export function useWebSocket() { } if (ws.value) { - console.log('[WebSocket] Disconnecting') + if (import.meta.env.DEV) console.log('[WebSocket] Disconnecting') ws.value.close(1000, 'Client disconnect') ws.value = null } diff --git a/frontend/src/views/admin/AlertsView.vue b/frontend/src/views/admin/AlertsView.vue index 54b1669..34eead9 100644 --- a/frontend/src/views/admin/AlertsView.vue +++ b/frontend/src/views/admin/AlertsView.vue @@ -1,6 +1,7 @@