{
  "id": "phaser-web-game",
  "type": "loadout",
  "title": "Phaser 4 web game",
  "summary": "Phaser 4 rules that send the agent to the skills Phaser ships in node_modules, not v3 tutorials: pooled objects, delta movement, play-tested changes.",
  "description": "Phaser 4 changed the renderer, turned FX and masks into filters and reworked tinting, so agents trained on years of Phaser 3 tutorials write code that no longer works. Phaser's answer is to ship agent skills inside the npm package, one per subsystem plus a v3-to-v4 migration guide. This loadout makes the agent read those version-matched skills before using an API, and adds the game rules that keep a web game smooth: scenes per mode, assets in preload, pooled groups, delta-based movement and a play test after every change.\n",
  "highlights": [
    "Reads Phaser's own skills from node_modules/phaser/skills/ for the installed version",
    "v3-to-v4 migration skill first when porting old code",
    "Pooled Arcade groups; no allocation in update()",
    "Delta-based movement and constants in one tuning module",
    "Example scene type-checked against Phaser 4.2.1 by the verifier"
  ],
  "version": "1.0.0",
  "license": "MIT",
  "author": {
    "name": "Agent Loadout",
    "url": "https://loadout.jnw-it.com"
  },
  "credits": [
    {
      "title": "phaserjs/phaser: agent skills shipped in the repository and npm package",
      "url": "https://github.com/phaserjs/phaser/tree/master/skills"
    },
    {
      "title": "Phaser: migrating from Phaser 3 to Phaser 4",
      "url": "https://phaser.io/news/2026/04/migrating-from-phaser-3-to-phaser-4-what-you-need-to-know"
    },
    {
      "title": "Phaser 4 migration guide",
      "url": "https://github.com/phaserjs/phaser/blob/master/changelog/v4/4.0/MIGRATION-GUIDE.md"
    }
  ],
  "categories": [
    "gamedev"
  ],
  "stacks": [
    "phaser",
    "typescript",
    "vite"
  ],
  "files": [
    {
      "path": "AGENTS.md",
      "role": "instructions",
      "description": "Phaser 4 game rules and where the version-matched docs live.",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": "AGENTS.md",
        "codex": "AGENTS.md",
        "cursor": "AGENTS.md",
        "gemini-cli": "AGENTS.md",
        "antigravity-cli": "AGENTS.md",
        "copilot": "AGENTS.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/AGENTS.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/phaser-web-game/latest/AGENTS.md",
      "bytes": 2091,
      "lang": "markdown",
      "content": "# AGENTS.md: Phaser 4 web game\n\nBrowser game with Phaser 4, TypeScript and Vite. Check the Phaser version in `package.json`; v3 code and tutorials\noften do not work in v4.\n\n## Commands\n- Dev server: `npm run dev`. Production build: `npm run build`. Type-check: `npx tsc --noEmit`.\n- Done means: type-check and build pass, and you ran the game and played the changed part.\n\n## Phaser docs that match the installed version\n- Phaser ships agent skills inside the package: `node_modules/phaser/skills/<topic>/SKILL.md` (scenes, loading-assets,\n  physics-arcade, input-keyboard-mouse-touch, tweens, filters-and-postfx, v3-to-v4-migration and more).\n  Read the relevant one before using an API you have not used in this project. Prefer it over memory and old tutorials.\n- Porting v3 code or a v3 example: read `node_modules/phaser/skills/v3-to-v4-migration/SKILL.md` first. FX and masks\n  are filters in v4, pipelines are render nodes, and the tint API changed.\n\n## Game code rules\n- One scene per screen or mode (Boot, Preload, Menu, Game, GameOver). Scenes talk through events or the registry,\n  not by reaching into each other's fields.\n- Load assets in `preload()` with stable keys; files live in `public/assets/`. Never load in `update()`.\n- Movement and timers use `delta` or Phaser timers, never frame counts, so speed does not depend on frame rate.\n- Reuse objects: physics groups with `maxSize` and `get()` / `disableBody` for bullets, particles and enemies.\n  No `new` or `destroy` per frame.\n- Keep `update()` cheap: no allocations, DOM access or `console.log` in hot paths.\n- Game constants (speeds, sizes, timings) in one config module so tuning does not mean hunting through scenes.\n- Input: support keyboard and pointer or touch for anything the player must do. Guard `this.input.keyboard` (it can be\n  null when disabled).\n- Clean up: remove listeners and timers in the scene's `shutdown` event.\n\n## Scope\n- Protect the core loop first. New features only after it plays well; one feature per change, playable after each.\n- Use the `phaser-feature` skill for every gameplay change.\n"
    },
    {
      "path": "CLAUDE.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Claude Code.",
      "skill": null,
      "agent": "claude-code",
      "install_to": {
        "claude-code": "CLAUDE.md",
        "codex": null,
        "cursor": null,
        "gemini-cli": null,
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/CLAUDE.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/phaser-web-game/latest/CLAUDE.md",
      "bytes": 367,
      "lang": "markdown",
      "content": "# CLAUDE.md\n\n@AGENTS.md\n\n## Claude Code notes\n- Skills from this loadout live in `.claude/skills/`: `phaser-feature`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Phaser 4 web game\" v1.0.0 — https://loadout.jnw-it.com/loadouts/phaser-web-game/ -->\n"
    },
    {
      "path": "GEMINI.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Gemini CLI.",
      "skill": null,
      "agent": "gemini-cli",
      "install_to": {
        "claude-code": null,
        "codex": null,
        "cursor": null,
        "gemini-cli": "GEMINI.md",
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/GEMINI.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/phaser-web-game/latest/GEMINI.md",
      "bytes": 368,
      "lang": "markdown",
      "content": "# GEMINI.md\n\n@./AGENTS.md\n\n## Gemini CLI notes\n- Skills from this loadout live in `.agents/skills/`: `phaser-feature`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Phaser 4 web game\" v1.0.0 — https://loadout.jnw-it.com/loadouts/phaser-web-game/ -->\n"
    },
    {
      "path": "skills/phaser-feature/SKILL.md",
      "role": "skill",
      "description": "Gameplay change with Phaser's skills, checks and a play test.",
      "skill": "phaser-feature",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/phaser-feature/SKILL.md",
        "codex": ".agents/skills/phaser-feature/SKILL.md",
        "cursor": ".agents/skills/phaser-feature/SKILL.md",
        "gemini-cli": ".agents/skills/phaser-feature/SKILL.md",
        "antigravity-cli": ".agents/skills/phaser-feature/SKILL.md",
        "copilot": ".agents/skills/phaser-feature/SKILL.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/SKILL.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/phaser-web-game/latest/skills/phaser-feature/SKILL.md",
      "bytes": 1188,
      "lang": "markdown",
      "content": "---\nname: phaser-feature\ndescription: Add a gameplay feature to a Phaser 4 game using the version-matched Phaser skills in node_modules, pooled objects, delta-based movement, and a type-check, build and play test. Use for any gameplay change.\n---\n\n# Phaser feature\n\n1. Name the feature in one sentence and the scene it lives in. If it needs a new scene, say so.\n2. Read the matching Phaser skill from `node_modules/phaser/skills/` for every subsystem it touches (for example\n   `physics-arcade`, `groups-and-containers`, `tweens`). Use the API as written there for the installed version.\n3. Implement it like `references/GameScene.ts`: assets in `preload()`, pooled groups, delta-based movement, constants in\n   one place, listeners removed on shutdown.\n4. Run `npx tsc --noEmit` and `npm run build`.\n5. Run `npm run dev`, open the game and play the feature. If you can drive a browser (Playwright MCP or similar), take a\n   screenshot of it working; otherwise tell the human exactly what to try.\n6. Check the frame rate did not drop (the Phaser debug or browser performance panel) if you added many objects.\n7. Report: what changed, how you tested it, any tuning values worth adjusting.\n"
    },
    {
      "path": "skills/phaser-feature/references/GameScene.ts",
      "role": "reference",
      "description": "Example v4 scene with pooling and delta movement.",
      "skill": "phaser-feature",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/phaser-feature/references/GameScene.ts",
        "codex": ".agents/skills/phaser-feature/references/GameScene.ts",
        "cursor": ".agents/skills/phaser-feature/references/GameScene.ts",
        "gemini-cli": ".agents/skills/phaser-feature/references/GameScene.ts",
        "antigravity-cli": ".agents/skills/phaser-feature/references/GameScene.ts",
        "copilot": ".agents/skills/phaser-feature/references/GameScene.ts"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/references/GameScene.ts",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/phaser-web-game/latest/skills/phaser-feature/references/GameScene.ts",
      "bytes": 2262,
      "lang": "markdown",
      "content": "// Example Phaser 4 scene: assets in preload, pooled bullets, delta-based movement, keyboard and pointer input,\n// constants in one place and listeners removed on shutdown.\nimport Phaser from \"phaser\";\n\nexport const TUNING = {\n  playerSpeed: 300, // pixels per second\n  bulletSpeed: 600,\n  fireCooldownMs: 200,\n  maxBullets: 30,\n} as const;\n\nexport class GameScene extends Phaser.Scene {\n  private player!: Phaser.Physics.Arcade.Sprite;\n  private bullets!: Phaser.Physics.Arcade.Group;\n  private cursors?: Phaser.Types.Input.Keyboard.CursorKeys;\n  private lastFired = 0;\n\n  constructor() {\n    super(\"Game\");\n  }\n\n  preload(): void {\n    this.load.image(\"player\", \"assets/player.png\");\n    this.load.image(\"bullet\", \"assets/bullet.png\");\n  }\n\n  create(): void {\n    const { width, height } = this.scale;\n    this.player = this.physics.add.sprite(width / 2, height - 60, \"player\");\n    this.player.setCollideWorldBounds(true);\n\n    this.bullets = this.physics.add.group({ defaultKey: \"bullet\", maxSize: TUNING.maxBullets });\n    this.cursors = this.input.keyboard?.createCursorKeys();\n\n    this.input.on(Phaser.Input.Events.POINTER_DOWN, this.fire, this);\n    this.events.once(Phaser.Scenes.Events.SHUTDOWN, () => {\n      this.input.off(Phaser.Input.Events.POINTER_DOWN, this.fire, this);\n    });\n  }\n\n  update(time: number, delta: number): void {\n    const dx = (this.cursors?.left.isDown ? -1 : 0) + (this.cursors?.right.isDown ? 1 : 0);\n    this.player.x += dx * TUNING.playerSpeed * (delta / 1000);\n\n    if (this.cursors?.space.isDown && time > this.lastFired + TUNING.fireCooldownMs) {\n      this.fire();\n      this.lastFired = time;\n    }\n\n    // Return off-screen bullets to the pool instead of destroying them.\n    for (const child of this.bullets.getChildren()) {\n      const b = child as Phaser.Physics.Arcade.Image;\n      if (b.active && b.y < -20) this.bullets.killAndHide(b);\n    }\n  }\n\n  private fire(): void {\n    const b = this.bullets.get(this.player.x, this.player.y - 20) as Phaser.Physics.Arcade.Image | null;\n    if (!b) return; // pool exhausted: skip this shot rather than allocate\n    b.setActive(true).setVisible(true);\n    b.enableBody(true, this.player.x, this.player.y - 20, true, true);\n    b.setVelocityY(-TUNING.bulletSpeed);\n  }\n}\n"
    }
  ],
  "requires": {
    "tools": [
      "node"
    ],
    "env": [],
    "mcp": []
  },
  "tested": {
    "status": "untested",
    "last_run": null,
    "fixture": null,
    "per_agent": {
      "claude-code": "untested",
      "codex": "untested",
      "cursor": "untested",
      "gemini-cli": "untested",
      "antigravity-cli": "untested",
      "copilot": "untested"
    }
  },
  "security": {
    "scanned": true,
    "scanner": "intake-precheck/1",
    "verdict": "clean",
    "network": true,
    "scripts": [],
    "notes": "npm install downloads Phaser and the build tools from npm. The example scene makes no network calls."
  },
  "featured": false,
  "deprecated": false,
  "last_checked": "2026-10-17",
  "published": "2026-10-17",
  "updated": "2026-10-17",
  "compatibility": {
    "claude-code": "native",
    "codex": "native",
    "cursor": "native",
    "gemini-cli": "native",
    "antigravity-cli": "native",
    "copilot": "native"
  },
  "counts": {
    "rules": 1,
    "skills": 1,
    "mcp": 0
  },
  "url": "https://loadout.jnw-it.com/loadouts/phaser-web-game/",
  "api_url": "https://loadout.jnw-it.com/api/loadouts/phaser-web-game.json",
  "verification": {
    "level": "verified-install",
    "status": "verified",
    "label": "Verified install",
    "verified": true,
    "checked_at": "2026-10-17T08:11:22Z",
    "commit": "03c1b9839c40eb1e44c0a2877baaa3978a96895c",
    "content_current": true,
    "agent_tests": "not-run",
    "counts": {
      "pass": 9,
      "fail": 0,
      "skip": 0,
      "not_applicable": 1
    },
    "meaning": "Level 1: automated checks on the files (parse, install paths, MCP config, safety scan, references, size, licence, starter build). No AI agent was run.",
    "checks": [
      {
        "id": "listing",
        "name": "Listing",
        "status": "pass",
        "summary": "Schema valid; 5 files declared, none missing or extra",
        "details": [
          "tested.status: untested (agent tests are separate from Level 1)"
        ]
      },
      {
        "id": "parse",
        "name": "Files parse",
        "status": "pass",
        "summary": "All 5 files parse; front matter valid",
        "details": []
      },
      {
        "id": "adapters",
        "name": "Adapters",
        "status": "pass",
        "summary": "CLAUDE.md and GEMINI.md import AGENTS.md and are up to date",
        "details": [
          "CLAUDE.md: matches the generator",
          "GEMINI.md: matches the generator"
        ]
      },
      {
        "id": "install-paths",
        "name": "Install paths",
        "status": "pass",
        "summary": "Correct paths for all 6 agents; layouts re-discovered",
        "details": [
          "Claude Code: 4 files, 1 skill in .claude/skills/",
          "Codex CLI: 3 files, 1 skill in .agents/skills/",
          "Cursor: 3 files, 1 skill in .agents/skills/",
          "Gemini CLI: 4 files, 1 skill in .agents/skills/",
          "Antigravity CLI: 3 files, 1 skill in .agents/skills/",
          "GitHub Copilot: 3 files, 1 skill in .agents/skills/"
        ]
      },
      {
        "id": "mcp",
        "name": "MCP config",
        "status": "n/a",
        "summary": "No MCP servers in this loadout",
        "details": []
      },
      {
        "id": "safety",
        "name": "Safety scan",
        "status": "pass",
        "summary": "Clean: no credentials, risky shell or hidden text",
        "details": [
          "Scanner intake-precheck/1: verdict clean; network no (listing says yes)"
        ]
      },
      {
        "id": "references",
        "name": "References",
        "status": "pass",
        "summary": "1 reference between files resolves for every agent",
        "details": []
      },
      {
        "id": "size",
        "name": "Size limits",
        "status": "pass",
        "summary": "5 files, 6.1 KB total; largest skills/phaser-feature/references/GameScene.ts 2.2 KB",
        "details": [
          "Limits: 30 files, 32 KB per file, 128 KB total, 500 lines per skill or rule"
        ]
      },
      {
        "id": "licence",
        "name": "Licence",
        "status": "pass",
        "summary": "MIT, by Agent Loadout; text in the repository LICENSE",
        "details": []
      },
      {
        "id": "starter-build",
        "name": "Starter build",
        "status": "pass",
        "summary": "The phaser-feature skill's example scene type-checks under strict TypeScript against Phaser 4.2.1, and the installed Phaser package ships the version-matched skills AGENTS.md points to",
        "details": [
          "Applied 7 loadout files at every agent's paths",
          "✓ place the example scene: cp .agents/skills/phaser-feature/references/GameScene.ts src/GameScene.ts",
          "✓ install: npm ci --no-audit --no-fund",
          "✓ tsc --noEmit (strict): npm run check",
          "✓ Phaser's own skills are where AGENTS.md says: bash -c for s in scenes loading-assets physics-arcade input-keyboard-mouse-touch tweens filters-and-postfx v3-to-v4-migration groups-and-containers; do test -f node_modules/phaser/skills/$s/SKILL.md || { echo \"missing: $s\"; exit 1; }; done; echo skills ok",
          "Covers: Scene with preload, create and delta-based update against Phaser 4 types",
          "Covers: Pooled Arcade physics group with maxSize, get() and killAndHide",
          "Covers: Keyboard guarded for null; pointer listener removed on shutdown",
          "Covers: Every Phaser skill named in AGENTS.md exists in node_modules/phaser/skills/"
        ]
      }
    ]
  },
  "install": {
    "claude-code": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "CLAUDE.md",
          "target": "CLAUDE.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/CLAUDE.md",
          "role": "adapter"
        },
        {
          "path": "skills/phaser-feature/SKILL.md",
          "target": ".claude/skills/phaser-feature/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/phaser-feature/references/GameScene.ts",
          "target": ".claude/skills/phaser-feature/references/GameScene.ts",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/references/GameScene.ts",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/phaser-web-game/claude-code.zip"
    },
    "codex": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/phaser-feature/SKILL.md",
          "target": ".agents/skills/phaser-feature/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/phaser-feature/references/GameScene.ts",
          "target": ".agents/skills/phaser-feature/references/GameScene.ts",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/references/GameScene.ts",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/phaser-web-game/codex.zip"
    },
    "cursor": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/phaser-feature/SKILL.md",
          "target": ".agents/skills/phaser-feature/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/phaser-feature/references/GameScene.ts",
          "target": ".agents/skills/phaser-feature/references/GameScene.ts",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/references/GameScene.ts",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/phaser-web-game/cursor.zip"
    },
    "gemini-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "GEMINI.md",
          "target": "GEMINI.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/GEMINI.md",
          "role": "adapter"
        },
        {
          "path": "skills/phaser-feature/SKILL.md",
          "target": ".agents/skills/phaser-feature/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/phaser-feature/references/GameScene.ts",
          "target": ".agents/skills/phaser-feature/references/GameScene.ts",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/references/GameScene.ts",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/phaser-web-game/gemini-cli.zip"
    },
    "antigravity-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/phaser-feature/SKILL.md",
          "target": ".agents/skills/phaser-feature/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/phaser-feature/references/GameScene.ts",
          "target": ".agents/skills/phaser-feature/references/GameScene.ts",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/references/GameScene.ts",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/phaser-web-game/antigravity-cli.zip"
    },
    "copilot": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/phaser-feature/SKILL.md",
          "target": ".agents/skills/phaser-feature/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/phaser-feature/references/GameScene.ts",
          "target": ".agents/skills/phaser-feature/references/GameScene.ts",
          "raw_url": "https://loadout.jnw-it.com/raw/phaser-web-game/1.0.0/skills/phaser-feature/references/GameScene.ts",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/phaser-web-game/copilot.zip"
    }
  },
  "source_zip_url": "https://loadout.jnw-it.com/download/phaser-web-game/source.zip"
}