← Browse Hub (tools & browsers)

📖 API Documentation

Canonical API reference for Grudge Studio ObjectStore — game data, map families, home-island foundations, and R2 nature assets. JSON under api/v1/; binaries on assets.grudge-studio.com.

Overview

The ObjectStore API provides read-only access to all static game data for Grudge Warlords. This includes:

💡 Perfect for AI Agents

This API requires no authentication and returns JSON data. Ideal for building game companions, crafting calculators, or AI-powered assistants.

🏝️ Home islands (2026-07)

Player islands use Driftwood Bay / Ironfang Spire foundations. Nature scatter bans Quaternius megakit — see Nature Assets. Live play scale is 1024 m world diameter. SI yardstick: 1.8 m human / ~2.0 m orc — feet from bone box, not a 2 m capsule.

Base URL

https://info.grudge-studio.com/api/v1/

Docs UI: https://info.grudge-studio.com/docs. JSON endpoints are relative to /api/v1/. For example:

GET https://info.grudge-studio.com/api/v1/weapons.json
GET https://info.grudge-studio.com/api/v1/home-island-contract.json
GET https://info.grudge-studio.com/api/v1/map-registry.json

Mirror: https://molochdagod.github.io/ObjectStore/api/v1/ · CDN binaries: https://assets.grudge-studio.com/

Data Architecture — What Controls What

ObjectStore (this repo) is the single source of truth for static game definitions (items, skills, maps contracts). Player state is a different SSOT — see Creation of Truth.

  • ObjectStore JSON (api/v1/master-*.json) — canonical item definitions, skills, weapon skills, recipes, materials, tiers. Every entry has a GRUDGE UUID. Served at info.grudge-studio.com/api/v1/ and objectstore.grudge-studio.com/api/v1/.
  • R2 CDN (assets.grudge-studio.com) — binary files only: GLB/GLTF models, PNG icons, textures, audio. Served by the r2-cdn Worker with CORS *. Never commit large GLBs to git — upload to R2.
  • Railway Postgres (grudge-api-production-0d46) — player-state SSOT: characters, account bag, inventory, wallet, professions, home_islands. Not D1, not Supabase, not Puter KV alone.
  • D1 asset_registry (grudge-assets-db) — searchable index for 3D models only (category, R2 key, bones). Prefer assets.grudge-studio.com/{r2_key} for binaries; D1 is an index, not player data.
  • ObjectStore D1 (grudge-objectstore) — icon search index + catalog metadata. API: objectstore.grudge-studio.com/api/v1/icons/*.
  • info.grudge-studio.com — public browsable docs + JSON for all definition data (this site).
  • Game APIhttps://grudge-api-production-0d46.up.railway.app (or same-origin /api/* on client.grudge-studio.com). Island state: GET/PATCH /api/island/*. Do not treat api.grudge-studio.com as auth or character SSOT.

GRUDGE UUID links everything: SKIL-...(skill)prefab.vfxRefR2 path. Game client resolves UUIDs via the ObjectStore API at runtime.

3D GLB binaries are a separate stack from ObjectStore JSON — see 3D Storage & CDN for R2 URLs, D1 asset_registry, and Forge builtin: keys. Do not use /api/v1/asset-registry.json for live GLB lookup.

Icon & Asset Paths

All icon URLs in JSON data use relative paths (e.g. /icons/weapons/Sword_01.png). Each file also has a stable ICON-* UUID in icon-registry.json. Browse visually at Icon Library or resolve at runtime via grudgeSDK.resolveIconUrl().

Prefab Connection Fields

Every weapon skill has a prefab block for game engine wiring. Play clip names are Bip001 pack/role, not Mixamo. Full map: Editors · Prefabs · Stack.

"prefab": {
  "modelRef": "prod/gltf/weapons/sword.glb",
  "vfxRef": null,
  "impactRef": null,
  "animationClip": "sword_shield/attack",
  "soundRef": null,
  "projectileRef": null,
  "cameraShake": null
}

Null refs are skipped. Fill clips with npm run wire:skill-prefab-anims. Play body is still loadRaceKit Toon {race}.glb — not FBX, not Meshy.

Authentication

No Auth Required

The ObjectStore API is completely public. No API keys, tokens, or authentication headers are needed. Simply make HTTP GET requests to any endpoint.

⚠️ Player Data (not this API)

ObjectStore only serves static definitions. Player data (characters, inventory, bag, island seeds, wallet) is Railway Postgres via Grudge ID JWT — never Supabase, never ObjectStore JSON writes. See Creation of Truth, Production Wiring, and Database Schema.

Creation of Truth (SSOT hierarchy)

Agents and apps must create and resolve truth from the owning source — not from previews, Puter caches, or competing hosts.

Truth kindSource of truthHow to create / writeHow to read
Item / skill / recipe definitions ObjectStore api/v1/* PR into ObjectStore → npx vercel --prod (info + objectstore aliases). Binaries stay on R2 — never git-commit GLBs as the catalog. info…/api/v1/ or objectstore…/api/v1/
3D / audio binaries R2 assets.grudge-studio.com Upload + optional D1 asset_registry seed CDN URL (preferred) · D1 index for search only
Account identity id.grudge-studio.com Login / register via Puter, GitHub (Puter), Google → JWT. No product guest accounts or wallets. Bearer JWT · bootstrap grudge-game-bootstrap.js
Characters · bag · wallet · home island Railway Postgres via grudge-api-production-0d46 Authenticated POST/PATCH /api/characters, /api/account/*, /api/island/* Same-origin client…/api/* or Railway absolute URL
New Warlords hero mesh/slots character.grudge-studio.com (Foundry) Create-only funnel → save character on Railway Return to play client with characterId (not stay on Foundry)
Live play UI / open world Vercel grudge-builder Deploy from GrudgeBuilder main Warlords era play: grudgewarlords.com. Same SPA also at client.grudge-studio.com (legacy). Not Open, not GRUDOX, not RTS-Grudge.

Warlords create → play funnel (only this)

id.grudge-studio.com/login?redirect_uri=https://grudgewarlords.com/auth/callback
  → grudgewarlords.com (or client.grudge-studio.com) hub; roster from Railway
  → empty roster: Create hero → character.grudge-studio.com/foundry
  → save → return ?characterId=&era=warlords&from=gcs
  → /airship | /home-island | /play | /tutorial with that UUID
  → definitions: info/objectstore JSON · meshes: assets CDN (Toon RTS GLB via loadRaceKit)
Do not treat as Warlords SSOT
  • water.grudge-studio.com (Tactical Infinity / “Tethical”) — second home-island app; not the client play funnel.
  • warlord-genesis.vercel.app + genesis API — separate MOBA product.
  • open.grudge-studio.com — combat sandbox (Open), not Warlords hub.
  • rts-grudge.vercel.app when aliased to Warlords SPA — RTS must not steal this host from Warlords or vice versa.
  • grudge-builder Vercel aliases on id.grudge-studio.com — auth must stay off the game project.
  • Supabase, Puter KV alone, localStorage — never player bag/XP/roster SSOT.
  • Silent redirect of /play//tutorial//airship to empty /heroes without a create path — funnel failure.
GET /api/v1/warlords-production.json

Machine-readable Warlords production SSOT (fleet hosts, create funnel, cut list). Markdown: WARLORDS-PRODUCTION-SSOT.md.

Weapons Endpoint

GET /api/v1/weapons.json

Returns all weapon definitions organized by category. Each weapon includes stats, abilities, lore, and crafting requirements.

Response Structure

{
  "version": "1.0.0",
  "generated": "2026-02-12T00:00:00Z",
  "categories": {
    "swords": {
      "craftedBy": "Miner",
      "category": "1h",
      "items": [
        {
          "id": "sword-bloodfeud",
          "name": "Bloodfeud Blade",
          "type": "Sword",
          "lore": "Forged in endless clan blood feuds",
          "stats": {
            "damageBase": 50,
            "damagePerTier": 12,
            "speedBase": 100,
            "critBase": 3
          },
          "basicAbility": "Vengeful Slash",
          "abilities": ["Blood Rush", "Iron Grudge", "Clan Charge"],
          "signatureAbility": "Crimson Reprisal",
          "passives": ["Bloodlust", "Swift Vengeance", "Deep Cuts"]
        }
      ]
    },
    "axes": { ... },
    "daggers": { ... },
    "spears": { ... },
    "maces": { ... },
    "hammers1h": { ... },
    "hammers2h": { ... },
    "greatswords": { ... },
    "greataxes": { ... },
    "bows": { ... },
    "crossbows": { ... },
    "guns": { ... },
    "fireStaves": { ... },
    "frostStaves": { ... },
    "holyStaves": { ... },
    "lightningStaves": { ... },
    "arcaneStaves": { ... },
    "tomes": { ... }
  }
}

Weapon Categories

CategoryTypeCrafted ByCount
Swords1-HandMiner6
Axes1-HandMiner6
Daggers1-HandMiner6
Spears2-HandMiner6
Maces1-HandMiner6
Hammers (1H)1-HandMiner6
Hammers (2H)2-HandMiner6
Greatswords2-HandMiner6
Greataxes2-HandMiner6
BowsRanged 2HForester6
CrossbowsRanged 2HEngineer6
GunsRanged 2HEngineer6
Fire StavesRanged 2HMystic6
Frost StavesRanged 2HMystic6
Holy StavesRanged 2HMystic6
Lightning StavesRanged 2HMystic6
Arcane StavesRanged 2HMystic6
TomesOff-handMystic12

Equipment Endpoint

GET /api/v1/armor.json

Returns 150 armor items (6 sets × 8 slots × 3 material types + gems) with stats, procs, and set bonuses.

Materials Endpoint

GET /api/v1/materials.json

Returns all crafting materials including ores, wood, cloth, leather, gems, and magical essences.

Material Categories

CategoryGathered ByTiers
OreMinerT1-T8
IngotsRefinedT1-T8
WoodForesterT1-T8
PlanksRefinedT1-T8
ClothMysticT1-T8
LeatherForesterT1-T8
EssenceMysticT1-T8
GemsMinerT1-T8
InfusionsVariousT1-T5

Armor Endpoint

GET /api/v1/armor.json

Returns armor sets organized by profession and type.

Armor Sets

ProfessionTypeSets
MinerMetal PlateGuardian, Berserker
ForesterLeatherStalker, Brawler
MysticClothScholar, Archmage
EngineerMechMechanist, Inventor

Each set contains 6 pieces: Head, Chest, Legs, Hands, Feet, Shoulders.

Consumables Endpoint

GET /api/v1/consumables.json

Returns all consumable items including foods, potions, and engineer utilities.

Consumable Types

TypeProfessionCountEffect
Red FoodsChef30Attack/Damage buffs
Green FoodsChef30Regen/Healing buffs
Blue FoodsChef30Mana/Magic buffs
PotionsChef/Mystic30Combat effects
Engineer ItemsEngineer12Utility/Explosives

Skills Endpoint

GET /api/v1/skills.json

Returns weapon combat skills with tooltips, cooldowns, and damage formulas.

{
  "skills": [
    {
      "id": "vengeful-slash",
      "name": "Vengeful Slash",
      "weaponType": "Sword",
      "slot": "basic",
      "tooltip": "A fierce slash that builds Grudge Mark stacks...",
      "cooldown": 0,
      "manaCost": 0,
      "damage": "100% weapon damage",
      "effect": "Applies Grudge Mark (5% damage amp, max 3)"
    }
  ]
}

Weapon Skills Endpoint

⚠️ Archived Endpoint

GET /api/v1/weaponSkills.json is ARCHIVED. Canonical weapon skills are now in:

  • GET /api/v1/master-weaponSkills.json — Full skill catalog with SKIL-* UUIDs
  • GET /api/v1/weapon-stat-bridge.json — Stat connections
  • docs/WEAPON-STATS-ATTRIBUTES.md — Attribute scaling docs

Legacy weaponSkills.json remains for backward compatibility but is not updated.

GET /api/v1/master-weaponSkills.json

Canonical weapon skills catalog with 300+ skills across weapon types. Each skill includes GRUDGE UUID (SKIL-*), icon, cooldown, mana cost, damage formulas, and stat connections.

Response Structure

{
  "version": "1.0.0",
  "totalSkills": 473,
  "weaponTypes": [
    {
      "weaponType": "Sword",
      "skillCount": 18,
      "skills": [
        {
          "id": "sword_vengeful_slash",
          "name": "Vengeful Slash",
          "slot": "Attack",
          "cooldown": 0,
          "manaCost": 0,
          "description": "A fierce slash dealing 100% weapon damage...",
          "effect": "Applies Grudge Mark (5% damage amp, max 3)",
          "icon": "/icons/wcs/weapons/Sword_01.png"
        }
      ]
    }
  ]
}

Slot Types

SlotDescriptionColor
AttackPrimary damage abilitiesGreen
CoreCore rotation skillsBlue
DefenseDefensive/utility skillsYellow
SpecialSituational abilitiesPurple
UltimateHigh-impact ultimate abilitiesRed

Play catalog (18 types)

Canonical JSON is master-weaponSkills.json (not the legacy 473-row WCS dump above). Types: Sword, Axe, Hammer, Shield, Greatsword, Greataxe, Claw, Staff, Tome, Mace, Wand, Dagger, Bow, Crossbow, Gun, Spear, Scythe, Tool. Browse: WEAPON_SKILLS.html.

Spell Book

Caster play skills are the STAFF / TOME / WAND rows of master-weaponSkills.json. VFX lab spells are a separate catalog — do not invent a second skill tree.

GET /api/v1/spell-book.json

Derived caster book: Staff, Tome, Wand skills + vfx-spells.json summaries. Browse SPELL_BOOK.html. 3D lab: spell-vfx-library.html.

Weapon Types (24)

Sword, Axe (1H), Greatsword, Greataxe, Bow, Crossbow, Gun, Fire Staff, Frost Staff, Holy Staff, Lightning Staff, Nature Staff, Dagger, Arcane Staff, Spear, Hammer, Scythe, Tool, Fire Tome, Frost Tome, Holy Tome, Shadow Tome, Nature Tome, Arcane Tome

💡 Related

See Weapon Passive Stacks for status effects (bleed, burn, Grudge Mark) and WEAPON-STATS-ATTRIBUTES.md for stat scaling.

Lore

Public copy of the Warlords roster. Names come from GrudgeBuilder lore.ts + heroCodex.ts. Do not invent Sir Aldric / Grommash substitutes.

GET /api/v1/lore.json

World, 3 gods (Odin / Madra / Omni), 3 factions, 24 heroes + pirate legends. Browse LORE.html. Long-form notes: loreHeroes.txt.

Weapon Passive Stacks

GET /api/v1/weapon-passive-stacks.json

Status effects and passive stack catalog for weapon combat — DoT effects (bleed, burn, poison), damage amplifiers (Grudge Mark), and conditional triggers.

⚠️ Design Layer Only

Passive stacks are currently design-layer concepts extracted from weapons.json and studio-manifest.json. The Three.js + Rapier combat runtime (threejs-rapier-react-three-controller) does NOT yet implement DoT or stack systems in CombatController.

See WEAPON-PASSIVE-STACKS.md for full implementation status and runtime requirements.

Status Effect Types

EffectTypeMax StacksDurationWeapon Types
Grudge Mark Damage amp (+5% per stack) 3 Not specified Sword, Axe
Bleed Physical DoT 5 3–8s Dagger, Axe, Sword, Bow
Burn Fire DoT (spreads) 3 3–6s Axe, Fire Staff, Dagger
Poison Nature DoT 3 4–10s Dagger
Chill Slow (15%/stack, max 45%) 3 3s/stack Frost Staff
Shock Lightning DoT 3 2–4s Lightning Staff
Lifesteal On-hit heal Instant Axe, Sword, Hammer
Rune Stack Power-up (+3% dmg, burst) 10 Permanent Greatsword (Runed Great Sword)

Example: Grudge Mark (Sword)

{
  "id": "grudge_mark",
  "name": "Grudge Mark",
  "applyCondition": "on_hit",
  "effect": {
    "amplification": 0.05
  },
  "maxStacks": 3,
  "duration": null,
  "weaponTypes": ["sword", "axe"],
  "sources": {
    "design": "api/v1/weapons.json:34",
    "runtime": "NOT_IMPLEMENTED"
  }
}

Weapon Ability Bindings

WeaponAbilityEffectSource
Bloodfeud BladeVengeful SlashGrudge Markweapons.json:34
Shadow FangCrimson StabBleedweapons.json:550
Venom FangPoison ShivPoisonweapons.json:712
Ember AxeFlame SlashBurnweapons.json:246
Fire StaffFire BoltBurnweapons.json:2234
Fire StaffFlame NovaExplode all burnsweapons.json:2242
Frost StaffFrost BoltChillweapons.json:2367
Lightning StaffThunder BoltShockweapons.json:2633
Runed Great SwordRunic CleaveRune Stackweapons.json:2904
📖 Full Documentation

WEAPON-PASSIVE-STACKS.md — Complete passive stack system documentation including runtime implementation requirements, source file paths, and VFX asset catalog.

Professions Endpoint

GET /api/v1/professions.json

Returns all 5 professions with their skill trees, recipes, and specializations.

Professions

ProfessionRoleSkill NodesCrafts
⛏️ MinerWeaponsmith & Armorsmith42Metal weapons, plate armor
🌲 ForesterBowyer & Leatherworker28Bows, leather armor
🔮 MysticEnchanter & Clothier37Staves, cloth armor, enchants
🍲 ChefCook & Alchemist28Foods, potions
🔧 EngineerMechanist & Siege Master28Guns, crossbows, mech armor

Classes & Races Endpoints

GET /api/v1/classes.json

8 class specs — Warrior, Raider, Mage, Priest, Ranger, Thief, Worge, Verduror — with starting attributes, abilities, and preferred weapons. Soft bonuses, not hard locks. There is no Knight class (30-character plate look maps to Worge).

GET /api/v1/races.json

6 races — Human, Orc, Elf, Undead, Barbarian, Dwarf — with attribute bonuses and faction alignment.

GET /api/v1/attributes.json

8 attributes with stat formulas — STR, INT, VIT, DEX, END, WIS, AGI, TAC.

Enemies & Bosses

GET /api/v1/enemies.json

38 enemies across 8 tiers with abilities, drops, and 3D asset paths.

GET /api/v1/bosses.json

12 bosses with multi-phase mechanics, drops, and Gouldstone chances.

Factions

GET /api/v1/factions.json

3 factions — Crusade, Legion, Fabled — with lore, race mappings, and faction-specific bonuses.

VFX Effect Sprites

GET /api/v1/effectSprites.json

147 VFX sprite sheets sourced from GRUDA-Wars. Includes frame dimensions, frame counts, categories, blend modes, and source image URLs.

Response Structure

{
  "version": "1.0.0",
  "totalEffects": 147,
  "categories": ["fire", "ice", "lightning", "nature", "dark", ...],
  "effects": [
    {
      "key": "fireSpin",
      "name": "Fire Spin",
      "category": "fire",
      "frameWidth": 100,
      "frameHeight": 100,
      "cols": 8,
      "rows": 8,
      "totalFrames": 64,
      "blendMode": "screen",
      "src": "/effects/fire_spin.png"
    }
  ]
}
💡 Live Preview

See all effects animated in real-time at VFX Effects Browser

Battle Ability Effects

GET /api/v1/abilityEffects.json

209 abilities mapping class skills, weapon abilities, and enemy attacks to their VFX effect chains with follow-up effects.

Ability Sources

SourceDescription
Class AbilitiesWarrior, Mage, Ranger, Worge class skills
Weapon AbilitiesSkills tied to specific weapon types
Enemy AbilitiesBoss and mob attack effects

Sprite Database

GET /api/v1/icon-registry.json

Canonical 9,724 ICON-* image catalog — skills, weapons, armor, sigils, UI. Each entry: grudgeUuid, iconPath, cdnUrl, category.

💡 Live Browser

Search and copy UUIDs at Icon Library · lightweight shards: /api/v1/icon-shards/{category}.json

GET /api/v1/icon-category-index.json

Category manifest for browsers — counts, labels, sample thumbnails, shard paths. Pair with icon-search-index.json for client-side search.

GET objectstore…/api/v1/icons/search?q=

Live REST search on ObjectStore worker — paginated results with CDN URLs. Also: /icons/categories, /icons/by-path?path=, /icons/:grudgeUuid.

GET /api/v1/sprites.json

Full sprite database — 500+ icon paths organized by category (weapons, armor, skills, items).

GET /api/v1/spriteMaps.json

246 sprite path mappings for weapons and armor icons — maps item IDs to their sprite sheet locations.

GET /api/v1/sprites2d.json

5,485 2D sprites organized into 13 categories — characters, enemies, bosses, monsters, effects, icons, backgrounds, and more. Sources include RPG-MODULAR, betta-warlords, grudge-angeler, and grudawars.

💡 Live Preview

Browse all sprites visually at 2D Models Browser

Faction Units (RTS)

GET /api/v1/factionUnits.json

19 RTS faction units across 3 factions with stats, animations, and sprite paths.

GET /api/v1/nodeUpgrades.json

Node upgrade system — unit tiers, costs, spawn rates, vision radius.

3D Storage & CDN Access

Grudge uses three layers for 3D content. Use the right tab/API for each — do not mix ObjectStore JSON paths with raw R2 GLB URLs.

LayerBase URLWhat's storedBrowse / access
R2 CDN https://assets.grudge-studio.com/ GLB/GLTF binaries under models/, builtin/, game-assets/icons/ 3D Models Browser · 3DFX Viewer · direct HEAD on CDN URL
D1 asset registry https://objectstore.grudge-studio.com (Worker grudgeassets) Search/upload index. D1 is not the file server. api.grudge-studio.com is dead — do not wire new clients there. JSON catalogs on info.* · binaries on assets.*
ObjectStore JSON https://objectstore.grudge-studio.com/api/v1/ Game design registries (models3d.json, rtsModels.json, prefab wiring) RTS Models · Asset Registries · this docs sidebar
Game Forge builtins builtin:<key> in scene JSON Editor starter maps/characters; large maps on R2 at /builtin/*.glb forge.grudge-studio.com · resolves to CDN at runtime

R2 key layout (3D models)

asset-packs/toon-rts-characters/glb/characters/{race}.glb — play kits (loadRaceKit)
prod/anims/<pack>/                     — Bip001 idle/walk/cast/melee
models/characters/<name>.glb           — other rigged humanoids (not Warlords play default)
models/environment/island_*.glb        — home-island harvest multi-mesh packs
models/nature/organized/trees|rocks/   — extracted per-variant GLBs (no megakit)
models/nature/realistic/trees|rocks/   — catalog layout for scatter (runtime-ready)
models/biomes/review/<biome>.glb       — per-biome scale review scenes
models/evil_rock_mountain_peak_*.glb   — 20 m mountain peaks (home dungeon)
models/weapons/<name>.glb              — attachable weapon meshes
models/animations/<name>.glb           — standalone animation clips
models/buildings/<name>.glb            — structures
models/ships/enemy/{healthy,damaged,sunk}.glb
builtin/<name>.glb                     — Game Forge editor starters
catalogs/home-island/*.json            — CDN copies of island SSOT catalogs
🚫 Low-poly megakit banned on home islands

CommonTree_*, TwistedTree_*, DeadTree_*, Rock_Medium_*, Pine_1..5 megakit paths remain on CDN for legacy but must not be used for home-island scatter/harvest. Use organized/realistic paths — see Nature Assets.

Animation & mesh wiring

Character GLBs in models/characters/ get default animation packs in D1: glocomotion, glocomotion_combat, gestures_basic. Bone map is detected from filename/path (mixamo, bip001 for grudge6, kaykit). Weapons declare attachmentProfile (main_hand, off_hand, ranged_2h) and universal skeleton compatibility.

Play heroes use Toon RTS {race}.glb via ObjectStore js/grudge6-kit.js loadRaceKit only. FBX race kits are the Unity author source — not the play default. RTS-Grudge FactionCharacterRegistry is example-tool code, not the Warlords play loader. ObjectStore prefab.modelRef points at registry UUIDs; games resolve UUID → R2 URL via CDN, not D1 as the file server.

Upload pipeline (local → R2 → D1 index)

Bake with ObjectStore npm run convert, then upload to R2. D1 is the search index only. Prefer GrudgeBuilder scripts/upload-*-to-r2.mjs for new Warlords meshes. Legacy RTS-Grudge seed scripts still exist for the old asset-api Worker:

# Audit + upload + purge local copies (≤50 MB default)
npx tsx scripts/audit-documents-assets.ts --from-json scan.ndjson --upload --purge --priority

# Seed Cloudflare D1 asset_registry
npx tsx scripts/seed-d1.ts

# Bulk upload from client/public/models (fleet repo)
npx tsx scripts/upload-to-r2.ts
npx tsx scripts/seed-d1.ts
June 2026 migration (in progress)

~2,200 local GLB/GLTF files under Documents are deduped by MD5 hash, uploaded to assets.grudge-studio.com, registered in D1 via RTS-Grudge/scripts/seed-d1.ts, and purged from disk after CDN HEAD verification. Pipeline script: audit-documents-assets.ts. Live examples: builtin/map-underground-wars.glb, models/weapons/bow_23.glb.

Maps & Terrain

2D tile maps and biome presets are JSON here. Full 3D arena/map GLBs (e.g. map-underground-wars) are on R2 under builtin/ and referenced in Game Forge as builtin:<key> — see 3D Storage & CDN.

Do not mix map families. Warlords era 9-sector IDs are not the home-block 3×3 IDs — see Map Families.

GET /api/v1/map-registry.json

Canonical map family registry — Warlords era sectors, home-block 3×3, tactical ocean, pirate lobby, home/event islands, arenas, Genesis PvP. Use assertMapIdForFamily on the client before loading a map.

GET /api/v1/warlords-zones.json

Warlords era 9 macro sectors (haven_shore … convergence_nexus) with freeform ARPG notes. Not the player home-block cells.

GET /api/v1/tileMaps.json

2 tile-based RTS maps with nodes, terrain objects, roads, and collision data.

GET /api/v1/terrain.json

Procedural terrain — 5 biome presets (plains, mountains, islands, desert, arena).

GET /api/v1/rendering.json

Materials, 7 skybox presets, 10 particle effects, 5 spell effects.

Map Families

Multiple 9-cell and open-world systems share the fleet. Mixing IDs causes wrong oceans, wrong zones, or broken home islands.

FamilyIDs / scalePlay surface
Warlords era 9 macro sectors (haven_shoreconvergence_nexus) Open-world / zone mode on client.grudge-studio.com
Home-block 3×3 TL…MC_HOME…BR — personal grid around home island Not Warlords sector IDs
Home island 1024 m diameter · foundations Driftwood Bay / Ironfang Spire /home-island · Railway home_islands
Tactical ocean Ship combat map meters (fleet constant) Ocean / sailing play
Pirate lobby Chicken-gun lobby islands Lobby GLB maps
Arenas / Genesis PvP Battle arenas + warlords-genesis Instanced PvP
GET /api/v1/map-registry.json

SSOT for family notes, scale contracts, and which systems own which IDs.

Home Islands

Player-owned procedural islands. Size foundations: Driftwood Bay (coast) and Ironfang Spire (highland). Both use the same physical world diameter.

ContractValue
World diameter1024 m
RTS core200 m (upsampled into 1024 m center)
Character height1.8 m human yardstick · orc ~2.0 m — bone-box feet, not pelvis, not a 2 m capsule
Mountain peak20 m — seed picks one of three evil peaks
Harvest regen4 hours
Seed databaseRailway Postgres home_islandsnot D1
Map / scene editorsforge.grudge-studio.com · threeflow.vercel.app (legacy home-island URL is not Forge)

Size foundations

FoundationRoleElevationBeachPreferred biomes
Driftwood Bay Coastal baseline max 48 m 28 m band beach, tropical, plains, storm
Ironfang Spire Highland / ridge baseline max 80 m 14 m band forest, winter, frozen, volcanic, abyssal, nexus
GET /api/v1/home-island-contract.json

Contract v1.3 — scale, foundations, mountain triad paths, nature policy, Railway authority, studio editor URLs.

GET https://client.grudge-studio.com/api/island/spec

Live home-island spec from GrudgeBuilder (versioned harvest nodes, nature scatter, foundations export). Railway production may proxy the same path.

Pipeline

Forge / ThreeFlow → map to home island state → PATCH /api/island/state (Railway) → Island3DEngine play + mountain portal + CreatureBrain / navmesh AI. Play hero stays loadRaceKit.

Island Build Doctrine

Canonical 1 m occupy grid, faction kits, NPC execution order, HUD, dock crew, and honest asset gaps. Play client executes this contract. Definitions: ObjectStore. Binaries: R2. Island seed: Railway home_islands.

ISLAND-BUILD-DOCTRINE.md · machine JSON below.

ContractValue
Occupy grid1 m × 1 m
Small building / 4×4 RTS4 × 4 m
Medium RTS6 × 4 m (barn, smith, brewery)
Bench0.5 × 1 m · chairs/chests share the leftover 1×1
Wall / fence / gate ribbon2 × 1 m · isolate nodeName
Gate opening1.6 × 3.2 m · 1.8 m kit walks through
Kit plant height1.8 m GOLDEN grudge6 — do not stretch to 2.0
Prop-scale human2.0 m home-island-contract reference
Harvest regen4 hours
Personal homesOutside the fenced yard · attackable

Build phases (NPC order)

Claim flag → harvest → plaza → walls/gates → paths → outposts → lots → profession RTS → defense. One host pack. No mixed-faction mashups. No dummy benches.

Dock crew (hubs only)

Sailor · Weatherman · Gunner — race of the captain, grudge6 kit @ 0.9. Planted on the dock / outpost zone, not inside the curtain.

Nature runtime

Kenney CommonTree / Pine_1 / Rock_Medium / Bush_Common are author-only. Play loads organized stems + R2 island_tree.glb / island_rock.glb / palm isolate M_Palm_P2_*.

GET /api/v1/island-build-doctrine.json

Machine SSOT: size law, occupy layers, phases, stations, HUD, dock crew, ships, nature policy, honest gaps.

GET /api/v1/buildable-prefabs.json

118 playable prefabs with 1 m footprints, roles, occupy layer, size class, attackable flag, wood/stone/iron, build duration.

GET /api/v1/faction-kits.json

Crusade / Fabled / Legion kits — keep, walls, gates, houses, RTS lots. One host pack per settlement.

GET /api/v1/npc-roster.json

Hub / camp / outpost rosters + dock crew. Jobs, professions, zones (plaza · homestead · curtain · outpost).

Nature Assets (Home Island)

Organized nature for home islands. Quaternius / nature-megakit scatter props are banned at runtime. The Warlords play client loads stylized-tree, stone-black, realistic-palms, and R2 harvest packs — never Kenney CommonTree / Pine_1 / Rock_Medium / Bush_Common.

Banned path fragments

CommonTree, TwistedTree, DeadTree, Rock_Medium, Pine_1..5 megakit, Bush_Common, nature-megakit, /models/lowpoly/

CDN layout (runtime-ready)

# Individual variants (preferred for scatter)
https://assets.grudge-studio.com/models/nature/organized/trees/{pine2_14,birch2_4,...}.glb
https://assets.grudge-studio.com/models/nature/organized/rocks/{rock_1..rock_8}.glb

# Catalog layout (same meshes, realistic/* keys)
https://assets.grudge-studio.com/models/nature/realistic/trees/pine/pine_a.glb
https://assets.grudge-studio.com/models/nature/realistic/trees/deciduous/oak_a.glb
https://assets.grudge-studio.com/models/nature/realistic/trees/palm/palm_a.glb
https://assets.grudge-studio.com/models/nature/realistic/rocks/boulder_a.glb

# Multi-mesh harvest packs (variant clone in IslandResourceLoader)
https://assets.grudge-studio.com/models/environment/island_tree.glb
https://assets.grudge-studio.com/models/environment/island_rock.glb
https://assets.grudge-studio.com/models/environment/gem_cluster.glb
GET /api/v1/organized-nature-manifest.json

Manifest of extracted variants, realistic slots, source packs, and ban policy. Also mirrored on CDN: /catalogs/home-island/organized-nature-manifest.json.

GrudgeBuilder scripts
npm run home-island:pipeline          # export → biome reviews → SSOT → R2 upload → CDN probe
npm run home-island:export-nature     # pack → organized + realistic GLBs
npm run home-island:upload            # R2 put (skip if size matches)

Biome Ecosystems

One truth for what each biome offers: 5 land animals, 10 fish species pool, tree class policy, 20 m mountain peak, 4 h harvest regen, character reference 1.8 m human (orc ~2.0 m).

GET /api/v1/biome-ecosystems.json

12 biomes with foundationId (driftwood_bay | ironfang_spire), animals, treePolicy, reviewGlb CDN URLs, bannedNature list.

BiomeFoundationReview GLB
beach, tropical, plains, storm, desertDriftwood Bay/models/biomes/review/{id}.glb
forest, winter, frozen, volcanic, ethereal, abyssal, nexusIronfang Spire/models/biomes/review/{id}.glb

Review scenes include 20 m peak scale markers and a 2 m character capsule for visual QA.

Freeform ARPG (Characters)

Warlords is freeform: race = body mesh, equipment = weapons/armor/anims, class is flavor only (not a hard gear lock).

  • Character mesh pipeline: loadCharacterModel + equipment slots + appearance tint (sRGB multiply from base, no stack).
  • Unlock tables no longer gate weapons by rigid class.
  • See warlords-catalog.json characterTruth and warlords-zones.json freeform notes.
GET /api/v1/warlords-catalog.json

Play matrix, characterTruth, mapFamilies, enemyDamageStates (ship healthy/damaged/sunk), freeform ARPG flags.

Production Wiring (Characters · Accounts · Crafting)

Industry-standard multi-app identity: one Grudge ID account, many character UUIDs, shared account bag, per-character progression. Full agent skill: grudge-production-wiring. Creation hierarchy: Creation of Truth.

LayerProduction URLRole
Identity https://id.grudge-studio.com Login UI, JWT mint, Puter link. Bootstrap: /grudge-game-bootstrap.js (auth host only — not the Warlords SPA)
Game API https://grudge-api-production-0d46.up.railway.app Postgres SSOT — characters, account, inventory, professions, island, wallet. Health: /api/health
Character Studio (Foundry) https://character.grudge-studio.com Create-only heroes (GCS). After save → return to grudgewarlords.com with characterId + era=warlords
Warlords era play https://grudgewarlords.com Apex + SPA. Same-origin /api/* → Railway. Preferred play host.
Same SPA (legacy) https://client.grudge-studio.com Same GrudgeBuilder Vercel project — not a second roster or second game
Wallet / cNFT https://wallet.grudge-studio.com GBUX, custodial wallet, swaps — not id.*
Definitions docs https://info.grudge-studio.com/docs This page — ObjectStore API reference
Crafting https://grudgewarlords.com/craft/ Account bag + per-character XP. Puter craft URL is a legacy redirect.
Fleet JS https://assets.grudge-studio.com/js/grudge-fleet.js ≥2.4 progress helpers + token keys

Scope matrix

ScopeDataAPI
Accountinventory, resources, GBUX, wallet/api/account/*, /api/inventory/*
Character UUIDprofessions, mastery, attributes, equipment/api/characters/:id, …/progress
Islandseed, harvest state/api/island/* (Railway, not D1)
Standards (do not regress)
  • Railway Postgres is player-state SSOT — not D1, not Supabase, not localStorage, not Puter KV alone.
  • Never write account inventory on character PATCH.
  • SSO return allowlist includes *.puter.site and *.grudge-studio.com.
  • Vercel apps: same-origin /api rewrites to Railway. Puter sites: call Railway + ID explicitly with CORS.
  • Do not use api.grudge-studio.com for auth or as character SSOT.
  • Warlords play host is grudgewarlords.com — not water.*, not open.*, not genesis, not RTS-Grudge.
  • Do not alias id.grudge-studio.com or rts-grudge.vercel.app onto the Warlords SPA project. RTS-Grudge is an example tool, not a production game to upgrade.
  • Guest product accounts / auto re-login / free cNFT wallets are not wanted.
GET /api/v1/studio.json → services.gameData.productionWiring

Machine-readable production wiring block (URLs, scope rules, agent skill name).

Crafting site flow

grudge-crafting.puter.site
  → id.grudge-studio.com/login?redirect_uri=…puter.site…
  → Bearer JWT
  → Railway GET /api/characters
  → craft: account bag − materials · character progress + XP (revisioned)
  → ObjectStore master-recipes.json / professions.json for definitions
  → assets.grudge-studio.com icons + grudge-fleet.js

Warlords Catalog & Zones

GET /api/v1/warlords-catalog.json

High-level Warlords truth: freeform character rules, map family pointers, enemy ship damage states, play matrix.

GET /api/v1/warlords-zones.json

Nine era sectors with lore, biome links, and freeform ARPG notes (v1.1+).

GET /api/v1/studio.json

Studio service endpoints including home-island contract, biome catalog URLs, and productionWiring.

Era systems API

Four product eras. One Grudge ID. Roster is GET /api/characters?era=. Machine: /api/v1/era-systems.json. Human: ERA_SYSTEMS_API.md. UI slots: ui.grudge-studio.com/api/eras.

EraPlayStats / bodyMain panelCodex JSON
warlords client.* / grudgewarlords.com STR…TAC · Toon loadRaceKit ?era=warlords play-contract · master-items
nexus grudges play · grudox BIO…GRA · /api/stats ?era=nexus weapons.json · armor.json · era-characters#nexus
voxel Grudges + Mine-Loader + GRUDOX BIO…GRA in Grudges · TVS / explorer ?era=voxel voxelAssets.json
armada gated naval / mech hardpoints cockpit/chassis/HPL/HPR/core ?era=armada grudge-armada.json
Handoff + product lock

Play URL is always ?characterId=<RFC-UUID>&era=<era>. Grudges play roster is era=voxel. Nexus is the stat/API name and the Grudges main-panel sheet — do not default Grudges heroes to era=nexus.

GET /api/v1/era-systems.json

Per-era play hosts, catalogs, CDN roots, Foundry create URLs, UI contracts, account wiring.

Open launcher (library + account into games)

open.grudge-studio.com is the Steam-like library and Grudge ID hub — not Warlords play, not GRUDOX cabinets, not Foundry. Machine: /api/v1/open-launcher.json. Human: OPEN_LAUNCHER_API.md.

IntentURL
Libraryopen.grudge-studio.com
Danger lab/danger?era=voxel|warlords|nexus|armada
Account / roster/account
Create herocharacter.*/foundry

Same-origin open…/api/* → Railway. JWT keys: grudge.open.token, sso_token. Engine keeps Controller / weapon / camera on map change; rebind terrain only. Handoff: ?characterId=&era=.

Do not

Open racer/cabinets on Open Danger. Warlords /home-island on the Open SPA. Login returnTo at character.* or id.*. Second bag DB per satellite.

GET /api/v1/open-launcher.json

Library filters, SSO, player API routes, per-era play URLs, entry-catch bans.

Prefab · asset update scheme

One pattern for agents. Machine: /api/v1/prefab-scheme.json. Human: PREFAB_ASSET_SCHEME.md.

StoreOwnsHow to update
ObjectStore JSONITEM / SKIL / PFAB / ICON definitionsEdit api/v1npm run sync:docsnpx vercel --prod
R2 CDNGLB / PNG / audiogrudge-convert → r2 put → HEAD 200 not HTML
D1 asset_registrySearch index onlySeed batches ≤100
RailwayHeroes, bag, ledger instancesAuth /api/characters · /api/account · /api/uuid

Skill/item prefab block: modelRef · vfxRef · animationClip = {pack}/{role} on Bip001. Null refs are valid. Play Warlords body = Toon {race}.glb via loadRaceKit.

GET /api/v1/prefab-scheme.json

Definition vs instance vs binary vs player; add/update steps; Warlords play gate.

UUID law

Wiki: wiki.html. Machine: /api/v1/uuid-law.json. Account contract: account-game-uuid-contract.json.

FamilyFormatSSOT
AccountGRUDGE_…Railway JWT / bag
CharacterRFC UUIDhandoff ?characterId=
Skill definitionSKIL-*master-weaponSkills.json
Icon assetICON-*icon-path-index.json
Item instanceserver grudge_uuidledger — not this JSON

Editors · Prefabs · Stack · Scripts

Correct wiring for agents. Machine JSON: /api/v1/fleet-wiring.json. Do not invent a second editor, loader, bag DB, or npm stack.

Editors (do not collapse brands)

HostBrand / owns
forge.grudge-studio.comGrudge Forge — R3F + Rapier + .gfscene deploy
threeflow.vercel.appThreeFlow — Warlords scene editor (Vue + three r185). Elite handoff ?asset=
character.grudge-studio.com/foundryCharacter Foundry — create-only, 4-slot → play handoff
casting.grudge-studio.comWarlords UX / weapon-effects lab — loadRaceKit
grudge-combat.vercel.app/adminGladiators kit bake / weapon skill studio
info…/grudge6-editorPrefab ↔ anim worker (this repo)
info…/editors/Material / ObjectStore local editors
http://127.0.0.1:3847/GRUDA Studio — local project window, not a public Vercel app
Not the map editor

grudge-studio-editor.vercel.app is a legacy home-island URL. Do not treat it as Forge or ThreeFlow. Open / GRUDOX / Warlords stay separate hosts.

Prefabs

LayerSSOT
Play heroToon RTS {race}.glb via js/grudge6-kit.js loadRaceKit only. Contract: grudge6-warlords-play-contract.json
Weapon itemsmaster-weapon-prefabs.json
Weapon skillsmaster-weaponSkills.jsonprefab.animationClip = {pack}/{role} on Bip001
Equipmesh_ids + SLOT_DEFS after prefix strip · one mixer · bone-box feet (not pelvis)
Fill clipsnpm run wire:skill-prefab-anims · editor grudge6-editor

Play CDN: https://assets.grudge-studio.com/asset-packs/toon-rts-characters/glb/characters/{race}.glb

Stack dependencies (do not add a second)

UsePackage
Scene / mixerthree ^0.185 — one AnimationMixer
Physics@dimforge/rapier3d-compat + in-repo physics world
Mesh groundthree-mesh-bvh
Nav / AIthree-pathfinding, yuka

Ban: second mixer, second physics engine, Meshy/capsule as play hero, OrbitControls writing combat TPS camera. Full matrix: skill grudge-3d-game-packages · Open docs/OPEN_PACKAGE_SSOT.md.

ObjectStore scripts

cd F:\GitHub\ObjectStore
npm run sync:docs                 # this /docs page + canonical-manifest
npm run convert                   # production GLB bake → then R2
npm run wire:skill-prefab-anims   # prefab.animationClip pack/role
npx vercel --prod                 # info.grudge-studio.com + objectstore.grudge-studio.com
GET /api/v1/fleet-wiring.json

Editors, prefabs, deploy bans, scripts, stack pins — same table as this section.

API · D1 · Deploy (do not mix stores)

ObjectStore is definitions. D1 is an index. Railway is player state. R2 is binaries. Mixing those is how catalogs and heroes go stale.

StoreOwnsDoes not ownHow to ship
ObjectStore / info JSON catalogs (api/v1/*.json), lore, spell book, docs Player bag, roster, island seeds, GLB files cd ObjectStore; npx vercel --prod — aliases info.grudge-studio.com + objectstore.grudge-studio.com. .vercelignore already drops icons/models/sprites.
R2 grudge-assets GLB / audio / icons / anim JSON Search metadata, player rows wrangler r2 object put from ObjectStore CDN worker cwd. Verify HEAD assets.grudge-studio.com/<key> is 200 and not HTML (CDN serves the info hub as application/json on missing keys).
D1 grudge-assets-db asset_registry search index (purpose=play|isolate|author) Characters, bag, island, wallet, skill definitions Seed from a manifest in batches of ≤100. Stamp body_status from magic bytes, not HEAD 200.
Railway Postgres Accounts (GRUDGE_…), character UUIDs, bag, wallet, home island Recipe JSON, race GLBs GrudgeBuilder API deploy. Backup: grudge-dev-tool npm run backup:postgres.
Deploy hygiene
  • Intentional deploys — do not mix unrelated WIP into “update info”.
  • Play kit fail-closed: Toon {race}.glb HEAD 200, one mixer, Bip001 clips, bone-box feet. Red: races bake / FBX / Meshy / capsule as play body.
  • api.grudge-studio.com is a dead public host — do not wire new clients to it.
  • Live CDN Worker is ObjectStore/workers/cdn/. Do not deploy GrudgeBuilder/workers/cdn (same Worker name overwrites the route).
  • Do not wrangler deploy ObjectStore workers/ai onto ai.grudge-studio.com (stale fork). Legion is F:\GitHub\grudge-ai-hub.
  • After catalog JSON changes: npm run sync:docs (Vercel buildCommand already runs it).

Animations

animations.json defines clip names, blend rules, and state-machine wiring. Actual Mixamo / combat GLB clips live on R2 at models/animations/*.glb and are indexed in D1 — see 3D Storage & CDN.

GET /api/v1/animations.json

Animation system v2.0 — 18 common anims, transition rules, blend config. Resolve binary clips via D1 /assets/category/animation.

GET /api/v1/controllers.json

5 RTS camera presets, 4 chase camera presets, FPS, mouse controller config.

AI Systems

GET /api/v1/ai.json

AI behavior trees — 7 node types, entity states, blackboard, scoring.

GET /api/v1/ecs.json

ECS components — 8 component types, 2 systems, spatial hash config.

Tier System

All equipment in Grudge Warlords uses an 8-tier system:

TierNameLevel ReqMaterial Example
T1Common1Copper, Pine
T2Uncommon10Iron, Oak
T3Rare20Steel, Maple
T4Epic30Mithril, Ash
T5Legendary40Adamantine, Ironwood
T6Mythic50Orichalcum, Ebony
T7Ancient60Starmetal, Wyrmwood
T8Divine70Divine Ore, Worldtree

Stats scale with tier using base + (perTier × (tier - 1))

Items Database

GET /api/v1/items-database.json

Unified item database with 3,425 items across 8 categories: weapons, armor, consumables, materials, accessories, relics, capes, and shields. Each item includes an icon URL, stats, tier, tooltip, and category metadata.

Response Structure

{
  "version": "1.0.0",
  "totalItems": 3425,
  "categories": ["weapons", "armor", "consumables", "materials", "accessories", "relics", "capes", "shields"],
  "items": [
    {
      "id": "sword-bloodfeud-t5",
      "name": "Bloodfeud Blade",
      "category": "weapons",
      "type": "Sword",
      "tier": 5,
      "icon": "/icons/weapons/Sword_01.png",
      "tooltip": "Forged in endless clan blood feuds",
      "stats": { "damage": 98, "speed": 100 }
    }
  ]
}
💡 Live Browser

Browse all items, foods, potions, recipes, buildings, and mounts at GRUDGE Item Database (canonical; ItemBrowser.html redirects). Validate with npm run validate:catalog.

Sprite Characters

GET /api/v1/sprite-characters.json

275 animated 2D characters with full animation manifests. Supports grid-based sprite sheets and frame-sequence formats. Sources include RPG-MODULAR, betta-warlords, grudge-angeler, and grudawars.

Response Structure

{
  "version": "2.0.0",
  "totalCharacters": 275,
  "characters": [
    {
      "id": "warrior_male",
      "name": "Warrior Male",
      "source": "RPG-MODULAR",
      "animations": {
        "idle":   { "src": "/sprites/Warrior/Idle.png",   "cols": 8, "rows": 1 },
        "walk":   { "src": "/sprites/Warrior/Walk.png",   "cols": 8, "rows": 1 },
        "attack": { "src": "/sprites/Warrior/Attack.png", "cols": 6, "rows": 1 }
      }
    }
  ]
}
💡 Live Preview

Browse all sprites at 2D Models Browser

grudgeDot Assets

GET /api/v1/grudgedot-assets.json

grudgeDot game asset manifest — sprite objects, animations, and resource paths for use in grudgeDot events and scenes.

GET /api/v1/grudgedot-hero-aliases.json

25 hero class → sprite mappings for grudgeDot Assistant. Maps class/race combinations to their corresponding sprite character IDs.

{
  "version": "1.0.0",
  "totalAliases": 25,
  "aliases": [
    { "heroClass": "warrior", "race": "human", "spriteId": "warrior_male", "src": "/sprites/Warrior/Idle.png" }
  ]
}

Voxel Assets

GET /api/v1/voxelAssets.json

Voxel model asset registry — .vox and converted GLB/GLTF models for characters, props, and terrain elements.

Asset Registries

JSON catalogs for 2D icons, sprites, VFX, and UI. For live 3D GLB binaries use 3D Storage & CDN (assets.grudge-studio.com + api.grudge-studio.com/assets) — not this section.

GET /api/v1/asset-registry.json

ObjectStore master index (sprites, icons, paths) — not the Cloudflare D1 asset_registry table. For 3D model UUID → CDN URL, query GET https://api.grudge-studio.com/assets/uuid/:uuid.

GET /api/v1/backgrounds-registry.json

167 battle and scene background image paths organized by zone/theme.

GET /api/v1/effects-registry.json

VFX effects registry — indexed list of all particle and spell effects across the codebase.

GET /api/v1/3dfx-registry.json

3D shader and FX registry — GLSL shaders (fire, lightning, magic, shockwave) with metadata for the 3DFX viewer.

3DFX Viewer · Live VFX Sandbox

GET /api/v1/spell-arsenal.json

Spell-type arsenal — 10 families (projectile, slash, aura, hand, aoe, wall, cloud, summon, portal, impact) with 50+ visual variants. Each variant has skillSlot and skillUses for wiring SKIL-* abilities and status effects.

Sandbox: grudge-vfx.puter.site

GET /api/v1/vfx-spells.json

26 game-ready spell VFX definitions — shaders, particles, splines, geometry, and timing. Pairs with spell-arsenal.json variant ids.

Spell VFX Library

GET /api/v1/ui-packs.json

UI asset packs — buttons, frames, icons, and HUD elements for use in game interfaces.

RTS Models

Two registries serve RTS 3D content — use both, for different purposes:

  • ObjectStore /api/v1/rtsModels.json — design-time paths and prefab wiring for the RTS game mode.
  • Live D1 + R2 api.grudge-studio.com/assets — production GLB binaries on CDN with searchable metadata (category, bone map, animation packs).
GET /api/v1/rtsModels.json

RTS-specific 3D model registry — buildings, units, and terrain objects for the real-time strategy game mode. JSON only; resolve GLB URLs via 3D Storage.

GET https://api.grudge-studio.com/assets/category/environment

Live D1 index of environment GLBs (maps, arenas). Each row includes r2_keyhttps://assets.grudge-studio.com/{r2_key}.

Worlds

GET /api/v1/worlds.json

World definitions for multi-world game modes — island maps, spawn configurations, and biome data.

GET /api/v1/studio.json

Grudge Studio configuration — service registry, feature flags, and app metadata used by the grudgeDot assistant and launcher.

AI Sprite Editor

The 2D Models Browser includes a built-in AI sprite editing assistant powered by Puter.js.

Features

  • Chat Interface — Slide-out panel with streaming AI responses. Supports GPT-4o (vision), GPT-5.4 Nano, Gemini 2.5 Flash, Claude Sonnet 4.
  • Vision Analysis — When a sprite is open in the modal, the AI sees the current canvas frame and can describe it, identify issues, and suggest fixes.
  • Auto-Apply Commands — AI returns JSON commands ({"action":"hue","value":45}) that instantly apply to the editor controls.
  • Sprite Generation — Generate new sprites via GPT Image 1.5 directly in the chat.
  • Quick Actions — One-click buttons for Analyze, Find Issues, Color Suggest, Generate Idle.
  • Persistent Chat — History saved to Puter KV storage across sessions.

Available AI Commands

CommandParametersDescription
huevalue: -180 to 180Shift hue of sprite
saturationvalue: 0 to 200Adjust saturation %
brightnessvalue: 50 to 200Adjust brightness %
flipFlip horizontally
trimAuto-trim transparency
exportExport current frame
exportAllExport all frames
generateprompt: stringGenerate new sprite

Sprite Uploader & Parser

Upload and parse sprite sheets, GIFs, individual PNGs, and Aseprite atlas exports. Available via the 📤 Upload Sprites button in the 2D Models Browser toolbar.

Supported Formats

FormatDetectionNotes
PNG/WEBP Sprite SheetAuto-detect frame grid via transparent column/row analysisOverride cols, rows, frameW, frameH manually
Animated GIFWebCodecs ImageDecoder API (with fallback)Extracts all frames as individual canvases
Multiple PNGsSorted by filename, treated as frame sequenceBatch drag-and-drop supported
Aseprite JSON + PNGParses .json atlas for frame rects (array or object format)Drop both files together

AI-Assisted Detection

Click 🤖 AI Detect Layout to send a thumbnail to GPT-4o vision. The AI identifies the frame grid, character type, and animation type, then pre-fills all parse settings automatically.

Save Options

  • Save to Browser — Stores in localStorage with sprite-characters.json compatible format. Shows in gallery after refresh.
  • Save to Puter Cloud — Uploads PNG + metadata JSON to Puter cloud storage (grudge-sprites/{category}/).

Puter.js Integration

The ObjectStore uses Puter.js v2 for free, serverless AI and cloud storage — no API keys or backend needed.

APIs Used

APIPurpose
POST /api/ai/chat (Railway gruda-ai-router)Vision analysis, sprite editing chat — Legion first, Puter backup server-side
puter.ai.txt2img()Sprite generation with GPT Image 1.5
puter.fs.write()Save sprites to Puter cloud storage
puter.kv.set()/get()Persist chat history and user preferences
💡 Free for Users

Puter.js uses a user-pays model — each user's Puter account covers their own AI usage. Developers pay nothing regardless of scale.

JavaScript SDK v5.0

Single import for all backend services + static game data:

// CDN
import { GrudgeSDK } from 'https://objectstore.grudge-studio.com/sdk/grudge-sdk.js';

// or NPM
// npm install @grudgstudio/core
import { GrudgeSDK } from '@grudgstudio/core';

const sdk = new GrudgeSDK({ token: '<JWT>' });

// Static game data
const weapons = await sdk.getWeapons();
const swords  = await sdk.getWeaponsByCategory('swords');
const items   = await sdk.getItemsDatabase();   // 3,425 items
const chars   = await sdk.getSpriteCharacters(); // 275 animated chars
const results = await sdk.search('iron');

// Tier colors
const t5 = GrudgeSDK.getTierColor(5); // { name: 'Red', hex: '#ff4d4d', label: 'Legendary' }

Backend Service Clients (SDK v5.0)

Authenticated clients for live fleet services. Prefer Railway + ID + CDN over legacy hostnames.

ClientURL (production)Description
sdk.authid.grudge-studio.comLogin / register via Puter (username, Grudge ID, Puter ID). Wallet/cNFT stay on wallet.grudge-studio.com. No product guest.
sdk.gamegrudge-api-production-0d46.up.railway.app (or same-origin /api on client)Characters, account bag, island, wallet, lobbies
sdk.accountsame Railway game API /api/account/*Profile / bag — do not invent a second account DB
sdk.definitionsobjectstore.grudge-studio.com/api/v1 or info…/api/v1Static ObjectStore JSON (this catalog)
sdk.assetsassets.grudge-studio.comR2 binaries; optional D1 index for search
sdk.wsRailway Colyseus / world endpoints on game APIIslands, PvP, lobbies — not a separate “ws.” product host

Legacy names api.grudge-studio.com, assets-api.grudge-studio.com, ws.grudge-studio.com are not player-state SSOT. Use Railway + CDN paths above.

const sdk = new GrudgeSDK({ token: '<JWT>' });

// Auth
const res  = await sdk.auth.login('username', 'password');
const me   = await sdk.auth.getMe();

// Game API
const chars   = await sdk.game.listCharacters();
const balance = await sdk.game.getBalance(charId);
await sdk.game.startCraft({ char_id: 1, recipe_key: 'iron-sword' });

// Account
const profile = await sdk.account.getProfile(grudgeId);
const friends = await sdk.account.listFriends();

// Asset Service (R2)
const assets = await sdk.assets.listAssets({ prefix: 'models/' });

// WebSocket
const socket = sdk.ws.game();
socket.emit('join-island', { island_key: 'island_1' });

Python Examples

import requests

BASE_URL = "https://objectstore.grudge-studio.com/api/v1"

# Get all weapons
weapons = requests.get(f"{BASE_URL}/weapons.json").json()

# Find all swords
swords = weapons["categories"]["swords"]["items"]
print(f"Found {len(swords)} swords")

# Get materials
materials = requests.get(f"{BASE_URL}/materials.json").json()

# Find T5+ ores
high_tier_ores = [m for m in materials["materials"] 
                  if m["category"] == "ore" and m["tier"] >= 5]

Search API (Serverless)

GET /api/search?q={query}&type={type}&limit={limit}

Serverless search across all ObjectStore data. Searches weapons, armor, materials, consumables, enemies, bosses, skills, and sprites.

Parameters

ParamRequiredDefaultDescription
qYesSearch query string
typeNoallFilter by type: weapons, armor, materials, consumables, enemies, bosses, skills, sprites
limitNo50Max results (1-200)

Example

GET /api/search?q=iron&type=materials&limit=10

{
  "query": "iron",
  "type": "materials",
  "totalResults": 3,
  "results": [
    { "type": "material", "id": "iron-ore", "name": "Iron Ore", "category": "ore", "tier": 2 },
    { "type": "material", "id": "iron-ingot", "name": "Iron Ingot", "category": "ingot", "tier": 2 }
  ]
}
💡 Vercel Only

The /api/search and /api/stats endpoints are serverless functions available only when deployed on Vercel. The static JSON files work on both GitHub Pages and Vercel.

Stats API (Serverless)

GET /api/stats

Returns aggregate statistics for all ObjectStore data — total counts by category, available endpoints, and browser pages.

AI Integration

The ObjectStore API is designed for AI agent consumption:

  • No Authentication - Direct HTTP access
  • JSON Format - Easy to parse
  • Stable Schema - Rarely changes
  • Complete Data - All game definitions in one place
💡 Recommended: Cache Responses

Game data updates infrequently. Cache API responses for 24 hours to reduce requests and improve performance.

Example: AI Crafting Assistant

// Fetch required data
const [weapons, materials] = await Promise.all([
  fetch(BASE_URL + '/weapons.json').then(r => r.json()),
  fetch(BASE_URL + '/materials.json').then(r => r.json())
]);

// Helper: Get materials needed for a weapon
function getCraftingRequirements(weaponId, tier) {
  const weapon = findWeapon(weapons, weaponId);
  const tierMaterials = materials.materials.filter(m => m.tier === tier);
  
  return {
    weapon: weapon.name,
    tier: tier,
    profession: weapon.craftedBy,
    primaryMaterial: tierMaterials.find(m => 
      m.gatheredBy === weapon.craftedBy
    )
  };
}