Architecture clarification:
- Gitea + SeaweedFS run on PUBLIC docker stack
- Act runner runs on ASGARD (Ryzen 9 build server)
- Runner connects remotely to git.corrosionmgmt.com
New documentation:
- ASGARD-RUNNER.md: Complete setup guide for registering
and running act_runner as systemd service on asgard
- Includes example workflows for companion agent builds
- Troubleshooting and security notes
Runner capabilities:
- Docker access for containerized builds
- Native Go/Rust toolchains (already installed)
- 16C/32T, 64GB DDR5 for fast builds
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Separate infrastructure services from application stack for operational
resilience. Following Gemini's architectural guidance.
Infrastructure Services:
- Gitea (git.corrosionmgmt.com) - Source control, CI/CD, releases
* SQLite database (self-contained)
* Port 8090: Web UI
* Port 2222: SSH
- SeaweedFS (cdn.corrosionmgmt.com) - S3-compatible object storage
* Port 8091: Filer UI (primary CDN interface)
* Port 8092: S3 API (programmatic access)
* Port 9333: Master UI (internal admin)
* Port 8080: Volume server (internal)
Benefits:
- Restarting Corrosion app doesn't affect Git/CDN services
- No shared database dependencies (Gitea uses SQLite)
- Clear separation between infrastructure and application concerns
- Foundation for plugin ecosystem and map hosting
Deployment:
cd infra && docker compose up -d
See infra/README.md for full setup instructions and NPM configuration.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Backend:
- Stats ingestion consumer subscribing to corrosion.*.stats NATS subject
- Hourly aggregation scheduler (runs :05 past every hour)
- Daily cleanup job (03:00 UTC) with 7-day raw / 90-day hourly retention
- Analytics API (summary, timeseries, CSV export)
- Complete stats DB queries with aggregation and cleanup
Frontend:
- Analytics dashboard with ECharts integration
- Player count and server performance charts
- Time range selector (24h/7d/30d)
- CSV export functionality
- Real-time data loading
Infrastructure:
- Exposed NatsBridge.jetstream for consumer access
- Background service initialization in main.rs
Data flow: Plugin → NATS → Consumer → DB → Aggregation → API → Charts
Unblocks Strike 4B (dashboards) and 4C (alerting).
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Tiered agent model for token budget optimization: Haiku for recon,
Sonnet as daily XO, Opus reserved for escalation-only surgical strikes.
CLAUDE.md updated with resource discipline section referencing the roster.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Operational doctrine migrated from Vigilance HQ — V4_WORKFLOW, engagement
rules, and lessons learned carry forward. Project-specific sections written
for Corrosion's Rust/Axum + Vue 3 + Go stack. Claude Code settings configured
with permissions for cargo, go, npm, docker, and git operations.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Vite bakes env vars at build time, not runtime. Without .env.production
in the frontend directory, the Docker build had no VITE_PANEL_URL and
Sign In / Get Started links resolved to empty hrefs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
corrosionmgmt.com now serves LandingView as the default page with marketing
routes at root level. panel.corrosionmgmt.com continues serving the admin
panel unchanged. /site/* backward compat via redirects on marketing domain.
- nginx: Add bare domain server block (only proxies /api/early-access/)
- router: Detect hostname at module load, generate domain-specific routes
- MarketingLayout: Named routes for nav, external <a> tags for auth links
- LandingView: CTAs point to panel domain via VITE_PANEL_URL
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
API returns unexpected shape when backend isn't wired — data.members
is undefined, assigned to ref, then .length in template throws
TypeError. Nullish coalescing to empty array prevents the crash.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
/admin/servers.startsWith('/admin') was true, so both Admin Home
and Server Fleet highlighted simultaneously. Now /admin uses
exact match like / does.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ADMIN_EMAIL and ADMIN_PASSWORD were in the .env file but not
forwarded to the API container — bootstrap_admin() couldn't
read them, so no initial user was created. Login returned 400
on every attempt because no user existed in the database.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Nginx container now builds the Vue frontend in a Node stage
instead of mounting local dist/ files. This means:
- No need to commit dist/ or build locally before deploying
- docker compose up --build handles everything end-to-end
- Removed obsolete compose version key
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
NATS minimal image has no shell tools for health probes. The API
already handles NATS unavailability gracefully, so service_started
is sufficient.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The old healthcheck used nats-server --signal ldm which puts NATS into
lame duck (shutdown) mode. Use the /healthz HTTP endpoint instead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Config file already sets jetstream and store_dir. Duplicate CLI flags
cause NATS to exit with error.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove deprecated #[axum::async_trait] from 2 middleware files (native
async traits on Rust 1.88+). Fix 71 stub handlers: change return type
from ApiResult<impl IntoResponse> to ApiResult<Json<Value>> and replace
todo!() with proper JSON stub responses. Clean compile, zero errors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
lettre defaults pull in native-tls which conflicts with tokio1-rustls-tls.
Explicitly list needed features with default-features = false.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dependencies require Rust 1.88. Alpine images lag behind. Switched
to rust:latest (Debian) for build and debian:bookworm-slim for runtime.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cargo.lock may not exist before first build. Use wildcard copy
so Docker doesn't fail if lockfile is missing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Combined page: countdown timer (Feb 28), email capture with server
count segmentation (wired to POST /api/early-access), Founding Admin
Program (25 slots), demo dashboard preview placeholders, roadmap
voting, and launch timeline. Backend: Axum handler, migration for
early_access_signups table with email + server_count + created_at.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wholesale pricing model ($6/server/mo), bulk provisioning API spec,
host dashboard requirements, pitch framework, and revenue projections.
Model B — fast to market, hosts control markup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
How It Works, Security, Roadmap, Live Demo, Hosting Providers,
Documentation Hub, Status, Pricing, Changelog, Founder. These
build perceived scale, trust, and conversion infrastructure.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Positioning document — draws the line between babysitting and
orchestration. Ready for marketing page or standalone deployment.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Marketing assets for launch — landing page copy, marketplace description,
FAQ for support load reduction, and competitive comparison table.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Views: Plugins, Wipes, WipeProfiles, WipeCalendar, WipeHistory,
Maps, Analytics, StoreManage, ModuleStore. All 20/20 admin views
now implemented. Updated hero graphic to final version.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Console: Terminal-style RCON interface with timestamped output,
color-coded log types, command input, clear button, and connection
status indicator. Uses server.sendCommand() from the store.
Players: Full management table with search, online/offline/all
filter tabs, Steam ID display, session time, ping, playtime,
admin badges, and kick/ban action buttons. Sorted online-first.
Both views use Oxide Orange brand colors per guidelines.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds baseUrl and @/* path mapping to tsconfig.app.json so vue-tsc can
resolve @/types, @/stores, and @/composables. Prefixes unused stub
parameters with _ to satisfy noUnusedParameters. Full build now passes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replaces the plain trefoil mark with the full product hero —
cracked trefoil, tagline, and feature bullets from the architecture spec.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Proper favicon.ico with 16/32/64px PNG variants for cross-browser
coverage. Apple-touch-icon fallback. Adds CORROSION MANAGEMENT
wordmark PNG for text-based branding contexts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copies brand assets to frontend/public (favicon.png, logo.png, logo-hero.png).
Updates index.html, LoginView, RegisterView, DashboardLayout sidebar, and
PublicLayout footer with proper branding.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
These were installed in the previous session but not saved to package.json.
Production build now succeeds (39KB gzipped).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Backend: Server connection/config/admins DB queries, server API routes
with auth-gated endpoints (overview, config CRUD, admin management).
Frontend: Server store wired to API, dashboard fetches server data on
mount with live status indicators, uptime formatting, and server
config display. Logout now redirects to /login.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Backend auth flow is now functional:
- services/auth.rs: Argon2id password hashing, JWT access/refresh tokens
- services/encryption.rs: AES-256-GCM encrypt/decrypt, hex token generation
- api/auth.rs: Login, register, refresh, logout, /me endpoints
- middleware/auth.rs: JWT Bearer token extractor (FromRequestParts)
- db/users.rs + licenses.rs: Full CRUD with runtime queries (no compile-time DB)
- main.rs: Bootstrap admin user on first run via ADMIN_EMAIL/ADMIN_PASSWORD env vars
- NATS connection now optional for dev (graceful fallback)
- Added hex and http crates to Cargo.toml
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Build complete auth flow with dark-themed CORROSION branding,
loading states, error handling, client-side validation, and
placeholder dashboard with stat cards and quick actions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Complete frontend skeleton: Vite + Vue 3 + TypeScript + Tailwind CSS,
Pinia stores (auth, server, wipe, plugins), authenticated API composable,
full route tree with auth guards, DashboardLayout with sidebar nav,
23 view stubs across auth/admin/public, all TypeScript interfaces.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>