Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions .env
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
# VITE_ASSET_PATH=https://M3-org.github.io/loot-assets
# access remote (may have CORS issues) or download from https://github.com/M3-org/loot-assets and load locally
#VITE_ASSET_PATH=./
# Grudge Studio CharacterStudio Configuration
# Asset path — local manifest.json or remote
VITE_ASSET_PATH=./

# Grudge Studio Backend (Railway)
VITE_GRUDGE_API=https://api.grudge-studio.com

# Grudge SSO Gateway
VITE_AUTH_GATEWAY=https://id.grudge-studio.com

# R2 CDN for 3D models, textures, icons
VITE_ASSET_CDN=https://assets.grudge-studio.com
30 changes: 29 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,4 +1,32 @@
# ── GCS — Grudge Character Studio :: Environment Variables ───────────────────
# Copy to .env.local for local development. Never commit .env.local.

# ── Asset path (required) ─────────────────────────────────────────────────────
# Path to the VRM/manifest assets directory.
# Leave empty to use the default public/ bundle, or point at a CDN.
VITE_ASSET_PATH=

# ── Grudge Studio API (The-ENGINE backend) ───────────────────────────────────
# REST API for user accounts, characters, inventory, GBUX balance.
# Production: https://api.grudge-studio.com
# Local dev: http://localhost:5000
VITE_GRUDGE_API=https://api.grudge-studio.com

# ── Auth gateway (Grudge SSO) ─────────────────────────────────────────────────
# SSO login endpoint. Redirects back with ?sso_token=... after login.
# Production: https://id.grudge-studio.com
# Local dev: http://localhost:5000 (The-ENGINE handles /login)
VITE_AUTH_GATEWAY=https://id.grudge-studio.com

# ── Asset CDN ─────────────────────────────────────────────────────────────────
# Optional CDN for 3D assets, textures, and manifests.
VITE_ASSET_CDN=https://assets.grudge-studio.com

# ── OpenSea API key (optional — for NFT trait verification) ───────────────────
VITE_OPENSEA_KEY=

# ── Helius API key (optional — for Solana RPC) ───────────────────────────────
VITE_HELIUS_KEY=
VITE_VALIDATION_SERVER_URL=http://localhost:3000

# ── Validation server (optional — for VRM export validation) ─────────────────
VITE_VALIDATION_SERVER_URL=http://localhost:3000
28 changes: 28 additions & 0 deletions .github/workflows/webpack.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: NodeJS with Webpack
Comment thread
MolochDaGod marked this conversation as resolved.

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]

jobs:
build:
runs-on: ubuntu-latest

strategy:
matrix:
node-version: [18.x, 20.x, 22.x]

steps:
- uses: actions/checkout@v4

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}

- name: Build
run: |
npm install
npx webpack
Comment thread
MolochDaGod marked this conversation as resolved.
28 changes: 24 additions & 4 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,36 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="src/favicon.ico" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="HandheldFriendly" content="true" />
<title>Character Studio</title>
<meta name="theme-color" content="#0d0d0d" />

<title>GCS — Grudge Character Studio · HYDRA</title>
<meta name="description" content="Create, customize, and export 3D VRM characters for Grudge Studio games. HYDRA-powered character creator with full NFT minting and Grudge account integration." />
<meta name="robots" content="index, follow" />

<!-- Open Graph -->
<meta property="og:title" content="GCS — Grudge Character Studio" />
<meta property="og:description" content="Build your character for the Grudge Studio universe. 3D VRM customization, NFT minting, and full Grudge account sync." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://character.grudge-studio.com/" />
<meta property="og:image" content="https://character.grudge-studio.com/assets/og-gcs.jpg" />

<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="GCS — Grudge Character Studio" />
<meta name="twitter:description" content="Build your character for the Grudge Studio universe." />
<meta name="twitter:image" content="https://character.grudge-studio.com/assets/og-gcs.jpg" />

<!-- Fonts: Space Grotesk (Hydra display) + Inter (body) -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@500;600;700;800&display=swap" rel="stylesheet">
</head>
<body>
<canvas id="editor-scene" style="position: fixed; top: 0; left: 0;" width="100%" height="100%"></canvas>
<div id="root" style="overflow: hidden">
</div>
<div id="root" style="overflow: hidden"></div>

<link rel="stylesheet" href="public/style.css" />
<script src="ktx2/libktx.js"></script>
Expand Down
9 changes: 4 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
{
"name": "@m3-org/characterstudio",
"version": "0.5.0",
"homepage": "https://m3-org.github.io/CharacterStudio",
"name": "@grudge-studio/gcs",
"version": "1.0.0",
"description": "GCS — Grudge Character Studio. HYDRA-powered 3D VRM character creator for the Grudge Studio ecosystem.",
"homepage": "https://character.grudge-studio.com",
"scripts": {
"predeploy": "npm run build",
"deploy": "gh-pages -d build",
"dev": "vite --host",
"build": "vite build",
"serve": "vite preview",
Expand Down
128 changes: 54 additions & 74 deletions public/manifest.json
Original file line number Diff line number Diff line change
@@ -1,89 +1,69 @@
{
"characters":[
"characters": [
{
"name": "Anata",
"description": "Female",
"portrait": "./assets/portraitImages/female.jpg",
"manifest":"https://m3-org.github.io/loot-assets/anata/female/manifest.json",
"format": "vrm"
"name": "Human",
"description": "Balanced fighter, versatile in all roles.",
"portrait": "https://assets.grudge-studio.com/portraits/human.jpg",
"manifest": "https://assets.grudge-studio.com/manifests/human.json",
"format": "glb",
"raceId": "human",
"faction": "crusade"
},
{
"name": "Anata",
"description": "Male",
"portrait": "./assets/portraitImages/male.jpg",
"manifest":"./loot-assets/anata/male/manifest.json",
"format": "vrm"
"name": "Barbarian",
"description": "Brutal berserker, raw power and fury.",
"portrait": "https://assets.grudge-studio.com/portraits/barbarian.jpg",
"manifest": "https://assets.grudge-studio.com/manifests/barbarian.json",
"format": "glb",
"raceId": "barbarian",
"faction": "crusade"
},
{
"name": "ON1FORCE",
"description": "Demon",
"portrait": "./assets/portraitImages/0n1.jpg",
"manifest":"https://m3-org.github.io/loot-assets/0N1/manifest.json",
"format": "vrm"
"name": "Elf",
"description": "Agile marksman, master of precision.",
"portrait": "https://assets.grudge-studio.com/portraits/elf.jpg",
"manifest": "https://assets.grudge-studio.com/manifests/elf.json",
"format": "glb",
"raceId": "elf",
"faction": "fabled"
},
{
"name": "TUBBY CAT",
"description": "Cute",
"portrait": "./assets/portraitImages/tubby.jpg",
"manifest":"https://m3-org.github.io/loot-assets/tubbycats/manifest.json",
"format": "vrm"
}
],
"loras":[
{
"name": "SDXL Lora 728",
"description": "Poses and camera positions to create Lora for SDXL 726 x 726",
"manifest":"./lora-assets/manifest.json",
"icon": "|"
}
],
"sprites":[
{
"name": "Multiple Animations",
"description": "Multiple definitions for different animations converted to sprites.",
"manifest":"./sprite-atlas-assets/manifest.json",
"icon": "|"
}

],
"thumbnails":[
{
"name": "Clothing Thumbnail",
"description": "Create thumbnails for Clothing",
"manifest":"./thumbnail-assets/manifest.json",
"icon": "|"
"name": "Dwarf",
"description": "Stout defender, unbreakable resolve.",
"portrait": "https://assets.grudge-studio.com/portraits/dwarf.jpg",
"manifest": "https://assets.grudge-studio.com/manifests/dwarf.json",
"format": "glb",
"raceId": "dwarf",
"faction": "crusade"
},
{
"name": "Clothing Thumbnail2",
"description": "Create thumbnails for Clothing",
"manifest":"./thumbnail-assets/manifest.json",
"icon": "|"
}
],
"defaultAnimations":[
{
"name": "T-Pose",
"description": "T-Pose",
"location":"./animations/T-Pose.fbx",
"icon": "|"
},
{
"name": "Dancing",
"description": "Basic Dance Animation",
"location":"./animations/Dancing.fbx",
"icon": "|"
"name": "Orc",
"description": "Savage warrior, strength through rage.",
"portrait": "https://assets.grudge-studio.com/portraits/orc.jpg",
"manifest": "https://assets.grudge-studio.com/manifests/orc.json",
"format": "glb",
"raceId": "orc",
"faction": "legion"
},
{
"name": "Walking",
"description": "Basic Walk Animation",
"location":"./animations/Walking.fbx",
"icon": "|"
},
{
"name": "Waving",
"description": "Basic Waving Animation",
"location":"./animations/Waving.fbx",
"icon": "|"
"name": "Undead",
"description": "Risen skeleton, relentless and fearless.",
"portrait": "https://assets.grudge-studio.com/portraits/undead.jpg",
"manifest": "https://assets.grudge-studio.com/manifests/undead.json",
"format": "glb",
"raceId": "undead",
"faction": "legion"
}
],
"classes": [
{ "id": "warrior", "name": "Warrior", "icon": "⚔️", "defaultWeapon": "unarmed" },
{ "id": "mage", "name": "Mage", "icon": "🔮", "defaultWeapon": "unarmed" },
{ "id": "ranger", "name": "Ranger", "icon": "🏹", "defaultWeapon": "unarmed" },
{ "id": "worg", "name": "Worge", "icon": "🐺", "defaultWeapon": "unarmed" }
Comment thread
MolochDaGod marked this conversation as resolved.
],
"defaultAnimations": [
{ "name": "Idle", "description": "Standing idle", "location": "https://assets.grudge-studio.com/models/animations/sword-shield/sword and shield idle.glb" },
{ "name": "Walk", "description": "Walking forward", "location": "https://assets.grudge-studio.com/models/animations/sword-shield/sword and shield run.glb" },
{ "name": "Attack", "description": "Basic attack", "location": "https://assets.grudge-studio.com/models/animations/sword-shield/sword and shield attack.glb" }
Comment on lines +65 to +67
]
}
Loading