{
  "name": "Grudge Studio ObjectStore",
  "version": "4.0.0",
  "description": "Public game data API, sprite browser, asset management, and storage for Grudge Warlords",
  "homepage": "https://molochdagod.github.io/ObjectStore",
  "repository": "https://github.com/MolochDaGod/ObjectStore",
  "organization": "Grudge Studio",
  "services": {
    "spriteRegistry": {
      "description": "2D sprite pipeline with UUIDs, frame detection, and character grouping",
      "endpoints": {
        "sprites": "/api/v1/sprites2d.json",
        "characters": "/api/v1/sprite-characters.json"
      },
      "api": {
        "listSprites": "GET /api/v1/sprites?category={cat}&page={n}&limit={n}",
        "searchSprites": "GET /api/v1/sprites/search?q={query}&category={cat}",
        "getSprite": "GET /api/v1/sprites/{uuid}",
        "listCharacters": "GET /api/v1/characters?category={cat}",
        "getCharacter": "GET /api/v1/characters/{uuid}",
        "stats": "GET /api/v1/stats"
      },
      "stats": {
        "totalSprites": 1449,
        "totalCharacters": 103,
        "uuidFormat": "SPRT-{8hex}-{6hex}"
      }
    },
    "gameData": {
      "description": "Static JSON game data for Grudge Warlords",
      "endpoints": {
        "weapons": "/api/v1/weapons.json",
        "armor": "/api/v1/armor.json",
        "materials": "/api/v1/materials.json",
        "consumables": "/api/v1/consumables.json",
        "skills": "/api/v1/skills.json",
        "weaponSkills": "/api/v1/weaponSkills.json",
        "professions": "/api/v1/professions.json",
        "races": "/api/v1/races.json",
        "classes": "/api/v1/classes.json",
        "factions": "/api/v1/factions.json",
        "attributes": "/api/v1/attributes.json",
        "enemies": "/api/v1/enemies.json",
        "bosses": "/api/v1/bosses.json",
        "quests": "/api/v1/quests.json",
        "dialogue": "/api/v1/dialogue.json",
        "missions": "/api/v1/missions.json",
        "skillTrees": "/api/v1/skillTrees.json",
        "equipment": "/api/v1/equipment.json",
        "worldMap": "/api/v1/worldMap.json",
        "regions": "/api/v1/regions.json",
        "lore": "/api/v1/lore.json",
        "audio": "/api/v1/audio.json",
        "video": "/api/v1/video.json",
        "heroes": "/api/v1/heroes.json",
        "models3d": "/api/v1/models3d.json",
        "warlordsZones": "/api/v1/warlords-zones.json",
        "warlordsCatalog": "/api/v1/warlords-catalog.json",
        "mapRegistry": "/api/v1/map-registry.json",
        "homeIslandContract": "/api/v1/home-island-contract.json",
        "biomeEcosystems": "/api/v1/biome-ecosystems.json",
        "organizedNature": "/api/v1/organized-nature-manifest.json"
      },
      "warlordsCanonical": {
        "description": "Warlords ERA open-world only (9 macro sectors). Class flavor-only freeform ARPG. NOT player home-block 3x3.",
        "zones": "/api/v1/warlords-zones.json",
        "catalog": "/api/v1/warlords-catalog.json",
        "mapRegistry": "/api/v1/map-registry.json",
        "clientPlay": "https://client.grudge-studio.com/play?sector=haven_shore&mode=zone&worldSeed=grudge-world-1",
        "worldSeed": "grudge-world-1",
        "sourceRepo": "GrudgeBuilder/shared/definitions/worldMapSectors.ts",
        "characterRule": "race=body mesh; equipment=weapons/armor/anims; class=flavor",
        "mapFamily": "warlords_era_open_world",
        "version": "1.1.0"
      },
      "mapFamiliesCanonical": {
        "description": "All playable map spaces — two different 9-cell systems + lobby/home/arena/genesis",
        "registry": "/api/v1/map-registry.json",
        "sourceRepo": "GrudgeBuilder/shared/definitions/mapRegistry.ts"
      },
      "homeIslandCanonical": {
        "description": "Player home islands — Driftwood Bay + Ironfang Spire size foundations, 1024m, 2m character, organized nature (no megakit)",
        "contract": "/api/v1/home-island-contract.json",
        "biomes": "/api/v1/biome-ecosystems.json",
        "natureManifest": "/api/v1/organized-nature-manifest.json",
        "cdnCatalogs": "https://assets.grudge-studio.com/catalogs/home-island/",
        "cdnNature": "https://assets.grudge-studio.com/models/nature/realistic/",
        "studioEditor": "https://grudge-studio-editor.vercel.app/editor?mode=home-island",
        "database": "Railway Postgres home_islands (NOT D1)",
        "worldSizeM": 1024,
        "characterHeightM": 2,
        "mountainPeakHeightM": 20,
        "foundations": [
          "driftwood_bay",
          "ironfang_spire"
        ],
        "version": "1.3.0"
      },
      "productionWiring": {
        "description": "Live identity + character + account + crafting wiring (industry-standard multi-app pattern)",
        "agentSkill": "grudge-production-wiring",
        "auth": "https://id.grudge-studio.com",
        "authBootstrap": "https://id.grudge-studio.com/grudge-game-bootstrap.js",
        "gameApi": "https://grudge-api-production-0d46.up.railway.app",
        "gameApiHealth": "https://grudge-api-production-0d46.up.railway.app/api/health",
        "characters": "GET/POST /api/characters · POST /api/characters/:id/progress",
        "account": "/api/account/* · /api/inventory/*",
        "characterStudio": "https://character.grudge-studio.com",
        "warlords": "https://grudgewarlords.com",
        "client": "https://client.grudge-studio.com",
        "craftingPuter": "https://grudge-crafting.puter.site",
        "fleetJs": "https://assets.grudge-studio.com/js/grudge-fleet.js",
        "definitions": "https://objectstore.grudge-studio.com/api/v1",
        "cdn": "https://assets.grudge-studio.com",
        "scope": {
          "account": [
            "inventory",
            "resources",
            "GBUX",
            "wallet"
          ],
          "character": [
            "professions",
            "mastery",
            "attributes",
            "equipment",
            "skillTrees"
          ]
        },
        "rules": [
          "Railway Postgres is player-state SSOT — not D1, not Supabase, not localStorage, not Puter KV alone",
          "Never put account inventory on character PATCH",
          "SSO return allowlist includes *.puter.site and *.grudge-studio.com",
          "Vercel apps use same-origin /api rewrites; Puter sites call Railway+ID explicitly",
          "Primary play host is client.grudge-studio.com — not water.*, open.*, or genesis",
          "Do not alias id.grudge-studio.com or rts-grudge.vercel.app onto the Warlords SPA",
          "Create heroes only via character.grudge-studio.com Foundry; return with characterId"
        ],
        "version": "1.1.0",
        "updated": "2026-07-29",
        "warlordsPrimary": "https://client.grudge-studio.com",
        "createFunnel": [
          "id login",
          "client /home",
          "Foundry create on character.grudge-studio.com",
          "return /airship?characterId=&from=gcs",
          "home-island | play | tutorial | lobby"
        ],
        "notSsot": [
          "water.grudge-studio.com",
          "warlord-genesis",
          "Supabase",
          "api.grudge-studio.com for auth/characters"
        ]
      }
    },
    "storage": {
      "description": "File upload/download with S3 bridge and local fallback",
      "api": {
        "upload": "POST /api/storage/upload",
        "uploadMulti": "POST /api/storage/upload-multi",
        "uploadZip": "POST /api/storage/upload-zip",
        "delete": "DELETE /api/storage/{key}",
        "list": "GET /api/storage/list?prefix={prefix}"
      },
      "adapters": [
        "local",
        "s3"
      ],
      "s3Config": {
        "envVars": [
          "S3_ENDPOINT",
          "S3_BUCKET",
          "S3_ACCESS_KEY_ID",
          "S3_SECRET_ACCESS_KEY",
          "S3_REGION",
          "S3_PUBLIC_URL"
        ]
      }
    },
    "assetRegistry": {
      "description": "Legacy asset registry with UUID lookup",
      "endpoints": {
        "categories": "/api/assets/categories",
        "search": "/api/assets/search?q={query}",
        "getByUuid": "/api/assets/{uuid}"
      }
    }
  },
  "pages": {
    "home": "/index.html",
    "spriteBrowser": "/2D_MODELS.html",
    "itemDatabase": "/GRUDGE_Item_Database.html",
    "spriteDatabase": "/SPRITE_DATABASE.html",
    "vfxBrowser": "/VFX_BROWSER.html",
    "itemBrowser": "/GRUDGE_Item_Database.html",
    "admin": "/admin.html"
  },
  "sdk": {
    "path": "/sdk/grudge-sdk.js",
    "npm": "@grudge-studio/objectstore",
    "methods": [
      "getSprites()",
      "getSprite(uuid)",
      "searchSprites(query, opts)",
      "getCharacters(opts)",
      "getCharacter(uuid)",
      "getAnimationUrl(charUuid, animName)",
      "getWeapons()",
      "getArmor()",
      "getMaterials()",
      "getConsumables()",
      "getSkills()",
      "getProfessions()",
      "getRaces()",
      "getClasses()",
      "getFactions()",
      "getEnemies()",
      "getBosses()"
    ]
  },
  "scripts": {
    "start": "node server.js",
    "rebuild:sprites2d": "node scripts/rebuild-sprites2d.mjs",
    "dedup:sprites": "node scripts/dedup-sprites.mjs",
    "generate:registry": "node scripts/generate-asset-registry.mjs"
  },
  "updated": "2026-03-12"
}
