61
PUTER APPS
120+
DEPLOYMENTS
7
LIVE GAMES
—
USERS
◎
SOLANA ACTIVE
✓
MySQL 8 LIVE
SERVICES
SIGN IN TO UNLOCK
QUICK ACCESS
MY GRUDGE ID
IDENTITY HUB
?
CHANGE
—
—
GRUDGE ID
—
PUTER ID
—
SOLANA WALLET
CONNECTED ACCOUNTS
ACCOUNT SETTINGS
PUTER APPS
61 APPS
LIVE DEPLOYMENTS
PUTER.SITE
DNS & SERVER SETUP
GRUDGEWARLORDS.COM
⚙ api.grudge-studio.com — Backend + AI Workers
Add these records in your DNS provider (Cloudflare / Namecheap / etc)
| TYPE | NAME | VALUE | TTL | NOTE |
|---|---|---|---|---|
| CNAME | server | cname.vercel-dns.com | Auto | Then add api.grudge-studio.com as custom domain in Vercel dashboard |
| — OR — | server | 74.208.155.229 | 300 | A record pointing directly to your GrudgeNetwork/Radmin IP |
🏰 gruda.grudgewarlords.com — Studio Deployment Hub
| TYPE | NAME | VALUE | TTL | NOTE |
|---|---|---|---|---|
| CNAME | gruda | grudgestudio.puter.site | Auto | Points to your Puter deployment — upload this hub file there |
📡 Radmin VPN Local Server Config
Run this on your GrudgeNetwork machine (WSL/Linux) to expose the Node backend:
# WSL / Linux terminal on GrudgeNetwork (74.208.155.229)
# Install Node + PM2 if not already done
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install -g pm2
# Clone or create your server project
mkdir -p ~/grudge-server && cd ~/grudge-server
npm init -y
npm install express cors dotenv mysql2/promise
# Create .env
DATABASE_URL="your-neon-pooler-connection-string"
GEMINI_API_KEY="PROXIED_VIA_BACKEND"
PORT=9666
CORS_ORIGIN="https://grudgewarlords.com,https://gruda.grudgewarlords.com"
# Start with PM2 (persists across reboots)
pm2 start server.js --name grudge-server
pm2 startup && pm2 save
# Your server is now at:
# http://74.208.155.229:9666 (local VPN)
# https://api.grudge-studio.com (after DNS propagates)
🗄️ MySQL 8 — Single Source of Truth Schema
-- Run in MySQL CLI
CREATE TABLE IF NOT EXISTS users (
id CHAR(36) PRIMARY KEY DEFAULT (UUID()),
grudge_id VARCHAR(255) UNIQUE NOT NULL,
puter_id VARCHAR(255) UNIQUE,
username VARCHAR(255) UNIQUE NOT NULL,
display_name TEXT,
email VARCHAR(255) UNIQUE,
phone TEXT,
password_hash TEXT,
-- OAuth providers
discord_id VARCHAR(255) UNIQUE,
google_id VARCHAR(255) UNIQUE,
github_id VARCHAR(255) UNIQUE,
-- Web3
solana_wallet VARCHAR(255) UNIQUE,
crossmint_wallet TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
last_login DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS characters (
id CHAR(36) PRIMARY KEY DEFAULT (UUID()),
user_id CHAR(36) REFERENCES users(id),
name TEXT, race TEXT, class TEXT,
level INT DEFAULT 1,
stats JSON DEFAULT (JSON_OBJECT()),
gear JSON DEFAULT (JSON_OBJECT()),
faction TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS game_sessions (
id CHAR(36) PRIMARY KEY DEFAULT (UUID()),
user_id CHAR(36) REFERENCES users(id),
game TEXT, data JSON DEFAULT (JSON_OBJECT()),
started_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS assets (
id CHAR(36) PRIMARY KEY DEFAULT (UUID()),
owner_id CHAR(36) REFERENCES users(id),
type TEXT, name TEXT, url TEXT,
metadata JSON DEFAULT (JSON_OBJECT()),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
🚀 Deploy This Hub to gruda.grudgewarlords.com
# 1. Upload grudge-hub-v2.html to Puter as index.html
# in the folder mapped to grudgestudio.puter.site
# (or any puter.site you add the CNAME for)
# 2. In Puter File Manager:
# → Navigate to your site folder
# → Upload this file as index.html
# → Done — changes are instant
# 3. DNS CNAME added? Wait 5-30 min for propagation
# then visit: https://gruda.grudgewarlords.com
TECH STACK & DEPENDENCIES
VPS 74.208.155.229
🏗️ Backend Services (Docker Compose)
| SERVICE | CONTAINER | PORT | URL |
|---|---|---|---|
| Grudge Identity | grudge-id | 3001 | id.grudge-studio.com |
| Wallet Service | wallet-service | 3002 | (internal only) |
| Game API | game-api | 3003 | api.grudge-studio.com |
| AI Agent | ai-agent | 3004 | (internal only) |
| Account API | account-api | 3005 | account.grudge-studio.com |
| Launcher API | launcher-api | 3006 | launcher.grudge-studio.com |
| WebSocket | ws-service | 3007 | ws.grudge-studio.com |
| MySQL 8 | grudge-mysql | 3306 | (internal only) |
| Redis 7 | grudge-redis | 6379 | (internal only) |
📦 Core Dependencies
| PACKAGE | PURPOSE | LAYER |
|---|---|---|
| Node.js 20 | Runtime for all backend services | Backend |
| Express.js 4 | REST API framework for all services | Backend |
| Socket.IO 4.7 | WebSocket — /game, /crew, /global, /pvp namespaces | Backend |
| mysql2 | MySQL 8 driver with connection pooling | Backend |
| ioredis | Redis 7 client — rate limiting, pub/sub, caching | Backend |
| jsonwebtoken | JWT auth (issued by grudge-id, verified everywhere) | Backend |
| bcryptjs | Password hashing for local auth | Backend |
| Colyseus | Multiplayer game server framework (headless-server) | Game Server |
| BabylonJS | 3D engine for game clients | Frontend |
| React 19 | UI framework for Vercel-deployed frontends | Frontend |
| Three.js | 3D rendering for web game clients | Frontend |
| Web3Auth | Solana wallet authentication (JWKS-verified) | Auth |
| @solana/web3.js | Solana blockchain interaction | Web3 |
| Crossmint SDK | Server-side custodial wallets + cNFT minting | Web3 |
☁️ Infrastructure & DevOps
| TOOL | PURPOSE | STATUS |
|---|---|---|
| Docker Compose | Container orchestration for all services | ACTIVE |
| Coolify | Self-hosted PaaS on VPS (deploy management) | ACTIVE |
| Traefik | Reverse proxy — TLS termination, routing | ACTIVE |
| Cloudflare Workers | Edge compute — site, dashboard, R2 CDN, auth-gateway | ACTIVE |
| Cloudflare R2 | S3-compatible object storage for game assets | ACTIVE |
| Cloudflare KV | Edge key-value — status caching, rate limiting | ACTIVE |
| Vercel | Frontend deployments (all game clients + apps) | ACTIVE |
| GitHub Actions | CI/CD — lint, test, deploy on push | ACTIVE |
| PM2 | Process manager for non-Docker Node services | AVAILABLE |
| Wrangler CLI | Cloudflare Worker deploy tool | ACTIVE |
🧠 AI & Tooling
| SERVICE | USE CASE | INTEGRATION |
|---|---|---|
| Claude (Anthropic) | Character generation, story AI, code assist | Server-side API |
| Gemini (Google) | AI console, NPC dialogue, fast inference | Server-side API |
| OpenAI / DALL-E | Image generation for characters, islands | Server-side API |
| Puter AI | Client-side AI (user-pays model, $0 cost) | Client SDK |
| Meshy / Tripo | Text-to-3D voxel model generation | Server-side API |
| Twilio Verify | SMS OTP for phone authentication | Server-side API |
🎮 Game Server Stack
| COMPONENT | PURPOSE | PORT / URL |
|---|---|---|
| Colyseus Server | Authoritative multiplayer rooms (combat, islands) | 7777 (internal) |
| Socket.IO /game | Island rooms — real-time player movement, events | ws.grudge-studio.com |
| Socket.IO /crew | Crew chat + coordination | ws.grudge-studio.com |
| Socket.IO /global | Server-wide broadcasts (kills, claims, events) | ws.grudge-studio.com |
| Socket.IO /pvp | PvP matchmaking + arena state | ws.grudge-studio.com |
| Redis Pub/Sub | Cross-process event bridge for WS namespaces | 6379 (internal) |
| ObjectStore API | Static game data (weapons, armor, recipes, races) | GitHub Pages |
🔐 Auth Providers
| PROVIDER | ENDPOINT | STATUS |
|---|---|---|
| Email / Password | POST /auth/login + /auth/register | LIVE |
| Discord OAuth | GET /auth/discord → callback | LIVE |
| Google OAuth | GET /auth/google → callback | LIVE |
| GitHub OAuth | GET /auth/github → callback | LIVE |
| Web3Auth (Phantom) | POST /auth/wallet | LIVE |
| Puter Cloud | POST /auth/puter | LIVE |
| Phone SMS (Twilio) | POST /auth/phone-send + /phone-verify | LIVE |
| Guest (Device ID) | POST /auth/guest | LIVE |
| SSO Cookie | GET /auth/sso-check | LIVE |
AI COMMAND CONSOLE
GRUDGE AI
GRUDGE AI // Grudge AI Backend
✓ GRUDGE AI CONSOLE INITIALIZED
→ GRUDGE AI API connected
→ Context: Grudge Studio | Owner: Racalvin The Pirate King
→ Stack: Node/TS, Solana, MySQL 8, Puter, Vercel, Radmin VPN
✓ Ready — type a command or use shortcuts above
GRUDGE ❯