Skip to main content

Deployment Overview

Hyperscape uses a split deployment model:
  • Server: Railway, Fly.io, or Docker host
  • Client: Vercel, Netlify, or static hosting
  • Database: PostgreSQL (Neon recommended)
  • Assets: CDN or object storage

Environment Variables

Server Production

Client Production

Production Domains

Hyperscape supports multiple production domains with CORS configuration (added in commits bb292c1, 7ff88d1): Game Domains:
  • hyperscape.gg - Primary game domain (added Feb 2026)
  • play.hyperscape.club - Alternative game domain
Betting Domains:
  • hyperscape.bet - Betting platform (added Feb 2026)
  • hyperbet.win - Additional betting domain (added Feb 2026)
CORS Configuration: The server and betting keeper automatically allow these domains:
Subdomain Pattern Support: The betting keeper supports subdomain patterns for flexible deployment:
Tauri Mobile Deep Links: Mobile apps support deep linking from production domains:
Website Game Link: The marketing website now links to the primary game domain:
PUBLIC_PRIVY_APP_ID must match between client and server.

Railway Deployment

1

Create Railway project

Connect your GitHub repository to Railway.
2

Configure build

Set build command: bun run build Set start command: bun start
3

Add PostgreSQL

Add PostgreSQL service from Railway marketplace.
4

Set environment variables

Add all required server environment variables.

Cloudflare Pages Deployment

The client automatically deploys to Cloudflare Pages on push to main via GitHub Actions (added commit 37c3629, Feb 26 2026).

Automated Deployment

The .github/workflows/deploy-pages.yml workflow triggers on:
  • Pushes to main branch
  • Changes to packages/client/** or packages/shared/** (shared contains packet definitions)
  • Changes to package.json or bun.lockb
  • Manual workflow dispatch
The client depends on packages/shared for packet definitions. When packets change on the server, the client must rebuild to stay in sync.
Deployment Process:
Multi-Line Commit Message Fix (commit 3e4bb48): Wrangler fails on multi-line commit messages. The workflow now extracts only the first line:
Production URLs:
  • Primary: https://hyperscape.gg
  • Alternative: https://hyperscape.club
  • Preview: https://<commit-sha>.hyperscape.pages.dev

Required GitHub Secrets

Cloudflare R2 CORS Configuration

Assets are served from Cloudflare R2 with CORS enabled for cross-origin loading:
CORS Configuration:
Why This Format: The wrangler API requires nested allowed.origins/methods/headers structure (not flat allowedOrigins). The old format caused wrangler r2 bucket cors set to fail (commit 055779a). Benefits:
  • Allows assets.hyperscape.club to serve to all domains
  • Supports hyperscape.gg, hyperscape.club, and preview URLs
  • Enables cross-origin asset loading for Cloudflare Pages → R2

Manual Deployment

Deploy manually using wrangler:

Vercel Client Deployment

1

Import project

Import packages/client directory to Vercel.
2

Configure build

Root directory: packages/client Build command: bun run build Output directory: dist
3

Set environment variables

Add PUBLIC_* environment variables.

Database Setup

Neon PostgreSQL

  1. Create database at neon.tech
  2. Copy connection string
  3. Set as DATABASE_URL in server environment

Migrations

CDN Setup

Option 1: Self-Hosted

Use the included Docker CDN:
Configure PUBLIC_CDN_URL to point to your CDN host.

Option 2: Cloud Storage

Upload assets to S3, R2, or similar:
  1. Build assets: bun run assets:optimize
  2. Upload packages/server/world/assets/
  3. Set PUBLIC_CDN_URL to bucket URL

Vast.ai GPU Deployment

Hyperscape deploys to Vast.ai for GPU-accelerated streaming with automated CI/CD via GitHub Actions.

Automated Instance Provisioning (NEW)

The scripts/vast-provision.sh script automatically finds and rents GPU instances with display driver support:
1

Install Vast.ai CLI

2

Run Provisioner

The script will:
  • Search for instances with gpu_display_active=true (REQUIRED for WebGPU)
  • Filter by reliability (≥95%), GPU RAM (≥20GB), price (≤$2/hr)
  • Show top 5 available instances
  • Automatically rent the best instance
  • Wait for instance to be ready
  • Output SSH connection details
3

Update GitHub Secrets

4

Trigger Deployment

CRITICAL: Only rent instances with gpu_display_active=true. Compute-only GPUs cannot run WebGPU streaming.
Configuration Options: Edit scripts/vast-provision.sh to customize search criteria:
Output:

Automated Deployment

Automated Deployment

The .github/workflows/deploy-vast.yml workflow automatically deploys to Vast.ai on push to main:
Manual Deployment (commit b1f41d5): You can now trigger Vast.ai deployments manually from GitHub Actions UI:
  1. Go to Actions tab in GitHub
  2. Select “Deploy to Vast.ai” workflow
  3. Click “Run workflow”
  4. Select branch (usually main)
  5. Click “Run workflow”
This is useful for:
  • Deploying hotfixes without waiting for CI
  • Re-deploying after Vast.ai instance restart
  • Testing deployment process
Deployment Process:
  1. Write Secrets to /tmp - Saves secrets to /tmp/hyperscape-secrets.env before git operations (commit 684b203)
  2. Enter Maintenance Mode - Pauses new duel cycles, waits for active markets to resolve
  3. SSH Deploy - Connects to Vast.ai instance, pulls latest code, builds, and restarts
  4. Auto-Detect Configuration - Database mode, stream destinations, GPU rendering mode
  5. Start Xvfb - Virtual display started before PM2 (commit 294a36c)
  6. PM2 Restart - Reads secrets from /tmp, auto-detects database mode (commits 684b203, 3df4370)
  7. Exit Maintenance Mode - Resumes duel cycles after health check passes

Graceful Restart API (Zero-Downtime Deployments)

The server provides a graceful restart API for zero-downtime deployments during active duels: Request Graceful Restart:
Check Restart Status:
Behavior:
  • If no duel active: restarts immediately via SIGTERM
  • If duel in progress: waits until RESOLUTION phase completes
  • PM2 automatically restarts the server with new code
  • No interruption to active duels or streams
Use Cases:
  • Deploy hotfixes during active streaming
  • Update server code without stopping duels
  • Restart after configuration changes

Maintenance Mode API (March 2026)

The server provides a comprehensive maintenance mode system for zero-downtime deployments: Enter Maintenance Mode:
Exit Maintenance Mode:
Check Status:
Get Live Logs:
Restart Server:
The restart endpoint calls process.exit(0) after a 2-second delay. Ensure you have a process manager (PM2) configured to automatically restart the server.
Manual Maintenance Mode: Helper scripts are available for manual control:
Client-Side Maintenance Banner: The client automatically displays a maintenance banner when the server enters maintenance mode:
  • Polls /health endpoint every 5 seconds
  • Displays red warning banner when maintenanceMode: true
  • Banner appears across all screens (game, admin, leaderboard, streaming)
  • Message: “SERVER MAINTENANCE IMMINENT - GAME WILL PAUSE AFTER CURRENT DUEL”
Maintenance Mode Behavior:
  • Prevents new duel cycles from starting
  • Waits for active duels to complete
  • Pauses betting markets
  • Sets safeToDeploy: true when safe to restart
  • Resumes automatically on exit or timeout

Required GitHub Secrets

Configure these in repository settings → Secrets → Actions:

Deployment Script Improvements (March 2026)

The scripts/deploy-vast.sh script has been significantly enhanced with recent improvements: MediaRecorder Streaming Mode (Commits 72c667a, 7284882):
  • Switched from CDP screencast to MediaRecorder mode for streaming capture
  • Uses canvas.captureStream() → WebSocket → FFmpeg pipeline
  • More reliable under Xvfb + WebGPU on Vast instances
  • Requires internalCapture=1 URL parameter for canvas capture bridge
  • Eliminates stream freezing and stalling issues
PM2 Secrets Loading (Commits 684b203, 3df4370):
  • Writes secrets to /tmp/hyperscape-secrets.env before git operations
  • ecosystem.config.cjs reads secrets file directly at config load time
  • Auto-detects DUEL_DATABASE_MODE from DATABASE_URL hostname
  • Prevents sanitizeRuntimeEnv() from stripping DATABASE_URL in remote mode
  • Ensures secrets persist through git reset operations
Chrome Beta for Linux WebGPU Support (Commit 154f0b6, March 13, 2026):
  • Reverted from Chrome Canary back to Chrome Beta (google-chrome-beta) for Linux NVIDIA
  • Chrome Canary was experiencing instability issues on Linux NVIDIA GPUs
  • Chrome Beta provides better stability for production streaming
  • Uses Vulkan ANGLE backend (--use-angle=vulkan) for optimal performance
Xvfb Display Setup (Commits 704b955, 294a36c):
  • Starts Xvfb before PM2 to ensure virtual display is available
  • Exports DISPLAY=:99 to environment
  • ecosystem.config.cjs explicitly sets DISPLAY=:99 in PM2 environment
  • Prevents “cannot open display” errors during RTMP streaming
Remote Database Auto-Detection (Commit dd51c7f):
  • Auto-detects remote database mode from DATABASE_URL environment variable
  • Sets USE_LOCAL_POSTGRES=false when remote database detected
  • Prevents Docker PostgreSQL conflicts on Vast.ai instances
APT Fix-Broken (Commit dd51c7f):
  • Added apt --fix-broken install -y before package installation
  • Resolves dependency conflicts on fresh Vast.ai instances
  • Prevents deployment failures from broken package states
Streaming Destination Auto-Detection (Commit 41dc606):
  • STREAM_ENABLED_DESTINATIONS now uses || logic for fallback
  • Auto-detects enabled destinations from configured stream keys
  • Explicitly forwards stream keys through PM2 environment
  • Added TWITCH_RTMP_STREAM_KEY alias to secrets file
First-Time Setup Support (Commit 6302fa4):
  • Auto-clones repository if it doesn’t exist on fresh Vast.ai instances
  • Eliminates manual repository setup step
Bun Installation Check (Commit abfe0ce):
  • Always checks and installs bun if missing
  • Ensures bun is available before running build commands
The scripts/deploy-vast.sh script handles the full deployment with these improvements: Key Steps:
  1. Load secrets from /tmp/hyperscape-secrets.env (commit 684b203)
  2. Auto-detect database mode from DATABASE_URL (commit 3df4370)
  3. Auto-detect stream destinations from available keys (commit 41dc606)
  4. Configure DNS resolution (some Vast containers use internal-only DNS)
  5. Pull latest code from main branch
  6. Restore environment variables after git reset (commits eec04b0, dda4396, 4a6aaaf)
  7. Install system dependencies (build-essential, ffmpeg, Vulkan drivers, Chrome Beta, PulseAudio)
  8. GPU rendering detection and configuration (commits dd649da, e51a332, 30bdaf0, 725e934, 012450c):
    • Check for NVIDIA GPU and DRI devices
    • Try Xorg mode first (if DRI available)
    • Detect Xorg swrast fallback and switch to headless EGL if needed
    • Fall back to Xvfb mode if Xorg fails
    • Fall back to headless EGL mode if X11 not available
    • Install NVIDIA Xorg drivers and configure headless X server
    • Force NVIDIA-only Vulkan ICD to avoid Mesa conflicts
  9. Install Chrome Beta channel for WebGPU support (commit 547714e)
  10. Setup PulseAudio for audio capture (commits 3b6f1ee, aab66b0, b9d2e41):
  • Create virtual sink (chrome_audio) for Chrome audio output
  • Configure user-mode PulseAudio with proper permissions
  • Export PULSE_SERVER environment variable
  1. Install Playwright and dependencies
  2. Build core packages (physx, decimation, impostors, procgen, asset-forge, shared)
  3. Setup Solana keypair from SOLANA_DEPLOYER_PRIVATE_KEY (commit 8a677dc)
  4. Push database schema with drizzle-kit and warmup connection pool
  5. Tear down existing processes (commit b466233):
    • Use pm2 kill instead of pm2 delete to restart daemon with fresh env
    • Clean up legacy watchdog processes
  6. Start port proxies (socat) for external access
  7. Start Xvfb virtual display (commits 704b955, 294a36c):
    • Start Xvfb before PM2 to ensure DISPLAY is available
    • Export DISPLAY=:99 to environment
  8. Export GPU environment variables for PM2
  9. Start duel stack via PM2 (commits 684b203, 3df4370):
    • PM2 reads secrets from /tmp/hyperscape-secrets.env
    • Auto-detects database mode from DATABASE_URL
    • Explicitly forwards DISPLAY, DATABASE_URL, and stream keys
  10. Wait for health check to pass (up to 120 seconds)
  11. Run streaming diagnostics (commit cf53ad4)
Environment Variable Persistence (commits eec04b0, dda4396, 4a6aaaf): Problem: git reset operations in deploy script would overwrite the .env file, losing DATABASE_URL and stream keys. Solution: Write secrets to /tmp before git reset, then restore after:
Why This Matters:
  • Prevents database connection loss during deployment
  • Ensures stream keys persist across deployments
  • Required for zero-downtime deployments
Stream Key Export (commits 7ee730d, a71d4ba, 50f8bec): Stream keys must be explicitly unset and re-exported before PM2 start:
Why This Matters:
  • Vast.ai servers can have stale stream keys from previous deployments
  • Stale values override .env file values
  • Explicitly unsetting ensures PM2 picks up correct keys
  • Prevents streams from going to wrong Twitch/X/Kick accounts
Port Mappings:

Solana Keypair Setup

The deployment automatically configures Solana keypairs from environment variables:
Environment Variable Fallbacks:
All three roles (authority, reporter, keeper) default to the same deployer keypair for simplified configuration.

System Requirements

Vast.ai Instance Specs:
  • GPU: NVIDIA with Vulkan support (RTX 3060 Ti or better)
  • RAM: 16GB minimum
  • Storage: 50GB minimum
  • OS: Ubuntu 22.04 or Debian 12
Installed Dependencies:
  • Bun (latest)
  • FFmpeg (system package, not static build)
  • Chrome Beta channel (google-chrome-beta) - Updated March 13, 2026 for better production stability
  • Playwright Chromium
  • Vulkan drivers (mesa-vulkan-drivers, vulkan-tools)
  • Xorg or EGL support (for GPU rendering)
  • PulseAudio (for audio capture)
  • socat (for port proxying)
GPU Rendering Requirements (commits e51a332, 30bdaf0, 012450c, Feb 27-28 2026): The system requires hardware GPU rendering for WebGPU. Three modes are supported (tried in order):
  1. Xorg Mode (preferred if DRI/DRM available):
    • Requires /dev/dri/card0 or similar DRM device
    • Full hardware GPU acceleration
    • Best performance
  2. Xvfb Mode (fallback when Xorg fails):
    • Virtual framebuffer + GPU rendering via ANGLE/Vulkan
    • Works when DRI/DRM not available
    • Requires X11 protocol support
  3. Headless EGL Mode (fallback for containers without X11):
    • Works without X server or DRM/DRI access
    • Uses Chrome’s --headless=new with direct EGL rendering
    • Hardware GPU acceleration via NVIDIA EGL
    • Ideal for Vast.ai containers where NVIDIA kernel module fails to initialize for Xorg
    • Uses --use-gl=egl --ozone-platform=headless flags
Swrast Detection (commit 725e934):
  • Deployment script detects when Xorg falls back to swrast (software rendering)
  • Automatically switches to headless EGL mode when swrast detected
  • Prevents unusable software rendering for WebGPU streaming
Software rendering (SwiftShader, Lavapipe) is NOT supported - too slow for streaming. See Also: GPU Rendering Guide for complete GPU configuration

Streaming Configuration

The deployment uses these streaming settings (updated March 2026):
Frame Pacing (Commits 522fe37, e2c9fbf): The streaming pipeline enforces 30fps frame pacing to eliminate buffering:
  • Frame Pacing Guard: Skips frames arriving faster than 85% of 33.3ms target interval
  • Xvfb Compositor: Runs at 30fps without vsync (game is capped at 30fps)
  • everyNthFrame: Set to 1 (Xvfb delivers at 30fps, no frame skipping needed)
  • Resolution: 1280x720 matches capture viewport, eliminates upscaling overhead
Impact: Eliminates stream buffering, smoother playback for viewers, reduced bandwidth usage. Multi-Platform Streaming: Streams simultaneously to:
  • Twitch (rtmp://live.twitch.tv/app)
  • Kick (rtmps://fa723fc1b171.global-contribute.live-video.net/app) - Fixed in commit 5dbd239
  • X/Twitter (rtmp://sg.pscp.tv:80/x)
  • YouTube explicitly disabled (commit b466233)
BREAKING CHANGE - WebGPU Required (commit 47782ed, Feb 27 2026):
  • All WebGL fallback code removed
  • STREAM_CAPTURE_DISABLE_WEBGPU and DUEL_FORCE_WEBGL_FALLBACK flags ignored
  • Deployment FAILS if WebGPU cannot initialize (no soft fallbacks)
  • Headless mode NOT supported (WebGPU requires display server: Xorg or Xvfb)
  • DUEL_USE_PRODUCTION_CLIENT=true recommended for faster page loads (180s timeout fix)
  • STREAM_GOP_SIZE now configurable via environment variable (default: 60 frames)
Audio Streaming (commits 3b6f1ee, aab66b0, b9d2e41):
  • Game music and sound effects captured via PulseAudio
  • Virtual sink (chrome_audio) routes Chrome audio to FFmpeg
  • Graceful fallback to silent audio if PulseAudio unavailable
See Also:

Health Monitoring

The deployment includes comprehensive health checks:
Post-Deploy Diagnostics: The deploy script automatically runs streaming diagnostics:
  • Checks streaming API state
  • Verifies game client is running
  • Checks RTMP status file
  • Lists FFmpeg processes
  • Shows recent PM2 logs filtered for streaming keywords

Troubleshooting

Stream not appearing on platforms:
  1. Check stream keys are configured:
  1. Check FFmpeg processes:
  1. Check RTMP status:
  1. Check PM2 logs:
Database connection issues: The deployment writes DATABASE_URL to packages/server/.env after git reset to prevent it from being overwritten. GPU rendering issues: Check Vulkan support:
If Vulkan fails, the system falls back to GL ANGLE backend. WebGPU diagnostics (NEW - commit d5c6884): Check WebGPU initialization logs:
Browser timeout issues (NEW - commit 4be263a): If page load times out (180s limit), enable production client build:
This serves pre-built client via vite preview instead of dev server, eliminating JIT compilation delays.

CI/CD Configuration

GitHub Actions

The repository includes several CI/CD workflows with recent reliability improvements (Feb 2026):

Build and Test (.github/workflows/ci.yml)

Runs on every push to main:
  • Installs Foundry for MUD contracts tests
  • Runs all package tests with increased timeouts for CI
  • Validates manifest JSON files
  • Checks TypeScript compilation
Key Features:
  • Caches dependencies for faster builds
  • Runs tests in parallel across packages
  • Fails fast on first error
  • Uses --frozen-lockfile to prevent npm rate-limiting (commit 08aa151, Feb 25, 2026)
Frozen Lockfile Fix (commit 08aa151): All CI workflows now use bun install --frozen-lockfile to prevent npm 403 rate-limiting errors:
Why This Matters:
  • bun install without --frozen-lockfile tries to resolve packages fresh from npm even when lockfile exists
  • Under CI load this triggers npm rate-limiting (403 Forbidden)
  • --frozen-lockfile ensures bun uses only the committed lockfile for resolution
  • Eliminates npm registry calls entirely in CI
  • Applied to all workflows: ci.yml, integration.yml, typecheck.yml, deploy-*.yml
Impact:
  • CI workflows now run reliably without npm rate-limiting failures
  • Faster builds (no network calls to npm registry)
  • Deterministic builds (exact versions from lockfile)

Integration Tests (.github/workflows/integration.yml)

Runs integration tests with database setup: Database Schema Creation (commit eb8652a): The integration workflow uses drizzle-kit push for declarative schema creation instead of server migrations:
Why This Approach:
  • Server’s built-in migrations have FK ordering issues (migration 0050 references arena_rounds from older migrations)
  • drizzle-kit push creates schema declaratively without these problems
  • Prevents “relation already exists” errors on fresh test databases
  • SKIP_MIGRATIONS=true tells server to skip migration system (schema already created)
  • Fixed in commits: eb8652a (CI integration), 6a5f4ee (table validation skip)
Migration 0050 Fix (commit e4b6489): Migration 0050 was also fixed to add IF NOT EXISTS guards for idempotency:
This allows the server’s migration system to work correctly on fresh databases when SKIP_MIGRATIONS is not set.

Deployment Workflows

  • Railway: .github/workflows/deploy-railway.yml
  • Cloudflare: .github/workflows/deploy-cloudflare.yml
  • Vast.ai: .github/workflows/deploy-vast.yml
Environment Variables Required:
  • RAILWAY_TOKEN - Railway API token
  • CLOUDFLARE_API_TOKEN - Cloudflare API token
  • VAST_API_KEY - Vast.ai API key

Docker Build Configuration

Server Dockerfile:
Key Points:
  • Uses bookworm-slim for Python 3.11+ support
  • Includes build-essential for native module compilation
  • Sets CI=true to skip asset download (assets served from CDN)
  • Installs git-lfs for asset checks

Streaming Infrastructure

Browser Capture Configuration

The streaming system uses Playwright with Chrome for game capture: Chrome Flags for WebGPU:
FFmpeg Configuration:
Playwright Dependencies:

GPU Compatibility

Tested Configurations:
  • ✅ RTX 3060 Ti (Vulkan)
  • ✅ RTX 4090 (Vulkan)
  • ⚠️ RTX 5060 Ti (GL ANGLE only, Vulkan ICD broken)
Fallback Modes:
  1. WebGPU + Vulkan (preferred, best performance)
  2. WebGPU + GL ANGLE (RTX 5060 Ti, stable)
  3. WebGL + Swiftshader (CPU fallback, lowest performance)
Environment Variables:

Xvfb Configuration

For headful mode with GPU compositing:
Docker Configuration:

Chrome Dev Channel

For latest WebGPU features on Vast.ai:

Solana Betting Infrastructure

CLOB Market Mainnet Migration

The betting system migrated to CLOB (Central Limit Order Book) market program on Solana mainnet in February 2026 (commits dba3e03, 35c14f9): Program Address Updates:
IDL Updates: All IDL files updated with mainnet program addresses:
Bot Rewrite for CLOB Instructions: The betting bot was rewritten to use CLOB market instructions instead of binary market:
Server Configuration: Arena config fallback updated to mainnet fight oracle:
Frontend Configuration: Updated .env.mainnet with all VITE_ environment variables:
Migration Checklist:
  • Update program addresses in Rust code
  • Regenerate IDL files with anchor build
  • Update keeper bot logic for CLOB instructions
  • Update server arena config with mainnet program IDs
  • Update frontend .env.mainnet with all VITE_ vars
  • Test on devnet before mainnet deployment
  • Verify program deployment on Solana Explorer

Native App Releases

Hyperscape automatically builds native desktop and mobile apps for tagged releases.

Creating a Release

This triggers .github/workflows/build-app.yml which builds:
  • Windows: .msi installer (x64)
  • macOS: .dmg installer (universal binary: Intel + Apple Silicon)
  • Linux: .AppImage (portable) and .deb (Debian/Ubuntu)
  • iOS: .ipa bundle
  • Android: .apk bundle

Download Portal

Built apps are published to:

Required GitHub Secrets

Configure these in repository settings for automated builds:
The build workflow is enabled as of commit cb57325 (Feb 25, 2026). See docs/native-release.md in the repository for complete setup instructions.

Security & Browser Requirements

WebGPU Requirement

As of February 2026, Hyperscape requires WebGPU for rendering. All shaders use Three.js Shading Language (TSL) which only works with WebGPU. Browser Support:
  • Chrome 113+ (WebGPU enabled by default)
  • Edge 113+
  • Safari 18+ (macOS Sonoma+)
  • Firefox Nightly (experimental)
Unsupported Browsers: Users on browsers without WebGPU support see a user-friendly error screen:
Why WebGPU Only:
  • All procedural shaders (grass, terrain, particles) use TSL
  • TSL compiles to WGSL (WebGPU Shading Language)
  • No WebGL fallback possible without rewriting all shaders
  • Commit: 3bc59db (February 26, 2026)

CSRF Protection Updates

The CSRF middleware was updated to support cross-origin clients (commit cd29a76): Problem:
  • CSRF uses SameSite=Strict cookies which cannot be sent in cross-origin requests
  • Cloudflare Pages (hyperscape.gg) → Railway backend caused “Missing CSRF token” errors
  • Cross-origin requests already protected by Origin validation + JWT auth
Solution:
Security Layers:
  1. Origin header validation (http-server.ts preHandler hook)
  2. JWT bearer token authentication (Authorization header)
  3. CSRF cookie validation (same-origin requests only)

JWT Secret Enforcement

JWT secret is now required in production and staging environments (commit 3bc59db):
Generate Secure Secret:

Production Checklist

  • PostgreSQL database provisioned
  • Environment variables configured
  • JWT_SECRET generated and set (REQUIRED in production)
  • ADMIN_CODE set (REQUIRED for production security)
  • Privy credentials set (both client and server)
  • CDN serving assets with CORS configured
  • WebSocket URL configured
  • SSL/TLS enabled
  • Vast.ai API key configured (if using GPU deployment)
  • CI/CD workflows configured with required secrets
  • DNS configured (Google DNS for Vast.ai instances)
  • Solana program addresses updated for mainnet (if using betting)
  • CORS domains configured for production domains
  • GitHub secrets configured for native app builds (if releasing)
  • WebGPU-compatible browsers verified for users
  • Maintenance mode API tested with ADMIN_CODE