{
 "meta": {
  "name": "LOADOUT",
  "about": "A free, hand-checked guide to making games with AI coding agents.",
  "checked": "2026-11-05",
  "modes": {
   "fun": "Free hobby games shared with family and friends",
   "sell": "Anything sold, ad-supported or on a store"
  },
  "counts": {
   "tools": 656,
   "worth_knowing": 356,
   "kits": 12,
   "wants": 72
  }
 },
 "every": {
  "id": "every",
  "title": "Every game",
  "example": "",
  "blurb": "The small kit that comes along on every game, whatever the type. The engine and everything else come from the game's own kit.",
  "lanes": [
   {
    "job": "Rules",
    "items": [
     {
      "rule": "Human design pass: one art direction sheet (hero, ordinary enemy, a boss that feels dangerous, an environment corner, a menu) and a feel spec per action, judged in motion on the real screen.",
      "label": "use"
     },
     {
      "rule": "Runtime feedback: the agent can run the game, read its state and see the screen. Godot: a normal rendering run with --write-movie or a screenshot hook (headless runs show nothing). Web: the develop-web-game loop below.",
      "label": "use"
     },
     {
      "rule": "Versioned save fixtures: keep one save file from every version, and every build must load them all.",
      "label": "use"
     },
     {
      "rule": "A test only counts after it fails on a build we broke on purpose.",
      "label": "use"
     },
     {
      "rule": "One GPU trial at a time, on a real asset (for example a concept paintover for a boss), compared with the current way on result, cleanup time and editability.",
      "label": "try"
     }
    ]
   },
   {
    "job": "Art",
    "items": [
     {
      "tool": "Krita",
      "id": "kde/krita",
      "label": "use",
      "why": "Painting, paintovers, key art.",
      "fun": "yes",
      "sell": "yes"
     },
     {
      "tool": "Inkscape",
      "id": "inkscape/inkscape",
      "label": "use",
      "why": "Icons, logos, UI frames.",
      "fun": "yes",
      "sell": "yes"
     },
     {
      "tool": "Google Fonts",
      "id": "google/fonts",
      "label": "use",
      "why": "Three type roles: display, body, numbers.",
      "fun": "yes",
      "sell": "yes"
     },
     {
      "tool": "Lospec palettes (list and API)",
      "id": "name:lospec-palettes-list-and-api",
      "label": "use",
      "why": "Pick a palette, then assign shadow, mid and light per material by hand.",
      "fun": "yes",
      "sell": "catch",
      "sell_note": "Free to use in practice; the palette page states no usage terms (verified listing shows 4,542 results). Credit the palette author in credits as good practice."
     },
     {
      "tool": "Kenney (all CC0 packs)",
      "id": "name:kenney-all-cc0-packs",
      "label": "use",
      "why": "Free placeholders. Swap or repaint before anyone judges the look.",
      "fun": "yes",
      "sell": "yes"
     }
    ]
   },
   {
    "job": "Sound",
    "items": [
     {
      "tool": "Audacity",
      "id": "audacity/audacity",
      "label": "use",
      "why": "Trim, loop and clean up sounds. Pin version 3.7.",
      "fun": "yes",
      "sell": "yes"
     },
     {
      "tool": "FFmpeg",
      "id": "ffmpeg/ffmpeg",
      "label": "use",
      "why": "Convert audio, cut gameplay clips.",
      "fun": "yes",
      "sell": "catch",
      "sell_note": "License depends on the build and codecs; the installed build is GPL. Fine as a tool, not something we ship inside a game."
     },
     {
      "tool": "jsfxr",
      "id": "chr15m/jsfxr",
      "label": "try",
      "why": "Retro sound effects an agent writes as text. A person listens to each one in the game mix.",
      "fun": "yes",
      "sell": "yes"
     }
    ]
   },
   {
    "job": "Agent help",
    "items": [
     {
      "tool": "Engine llms.txt files",
      "id": "name:engine-llms-txt-files",
      "label": "use",
      "why": "Current engine docs so agents stop writing old-version code.",
      "fun": "yes",
      "sell": "yes"
     },
     {
      "tool": "develop-web-game test loop (openai/skills, removed 2026-04-23)",
      "id": "openai/skills",
      "label": "use",
      "why": "Web games: run, screenshot, read state. It runs on Playwright.",
      "fun": "yes",
      "sell": "yes"
     },
     {
      "tool": "Godot AI (hi-godot)",
      "id": "hi-godot/godot-ai",
      "label": "try",
      "why": "Godot games: a helper on top of file edits, telemetry off.",
      "fun": "catch",
      "sell": "catch",
      "fun_note": "Telemetry is on by default; turn it off.",
      "sell_note": "MIT, no paid tier found. Needs uv (free). Anonymous telemetry is ON by default (install UUID, event, outcome, duration); opt out with GODOT_AI_DISABLE_TELEMETRY=true. Its own README says Godot 4.7+."
     },
     {
      "tool": "Limbo Console",
      "id": "limbonaut/limbo_console",
      "label": "need",
      "why": "Godot dev builds: inspect and drive game state. Strip it from release builds.",
      "fun": "yes",
      "sell": "yes"
     }
    ]
   },
   {
    "job": "Checks",
    "items": [
     {
      "tool": "Ajv",
      "id": "ajv-validator/ajv",
      "label": "use",
      "why": "Validates save files against a schema in JS games, as part of the save fixture check.",
      "fun": "yes",
      "sell": "yes"
     },
     {
      "tool": "Colour Contrast Analyser",
      "id": "thepaciellogroup/ccae",
      "label": "use",
      "why": "HUD and menu text has enough contrast. Also look at it on the real screen.",
      "fun": "yes",
      "sell": "yes"
     },
     {
      "tool": "NVDA",
      "id": "nvaccess/nvda",
      "label": "need",
      "why": "Menus work with a screen reader, once per release.",
      "fun": "yes",
      "sell": "yes"
     }
    ]
   },
   {
    "job": "Share",
    "items": [
     {
      "tool": "butler",
      "id": "itchio/butler",
      "label": "use",
      "why": "itch.io by default: public or hidden pages for friends.",
      "fun": "yes",
      "sell": "yes"
     },
     {
      "tool": "GitHub Pages",
      "id": "name:github-pages",
      "label": "need",
      "why": "A plain link instead of itch.io. One host per project.",
      "fun": "yes",
      "sell": "catch",
      "sell_note": "Free. 1 GB site, 100 GB/month soft bandwidth, 10 builds/hour soft (Actions deploys exempt). Not for running an online business or commercial transactions (verified). Fine for free games and demos."
     }
    ]
   }
  ]
 },
 "kits": [
  {
   "id": "adventure",
   "title": "Adventure or RPG",
   "example": "Like Wispvale",
   "blurb": "Top-down exploring, talking, collecting and fighting. Godot is home base.",
   "lanes": [
    {
     "job": "Engine",
     "items": [
      {
       "tool": "Godot Engine",
       "id": "godotengine/godot",
       "label": "use",
       "why": "GDScript, so a web build stays possible.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Maps",
     "items": [
      {
       "tool": "Better Terrain",
       "id": "portponky/better-terrain",
       "label": "try",
       "why": "Auto-tiling inside Godot's own tile editor.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "LDtk",
       "id": "deepnight/ldtk",
       "label": "need",
       "why": "When levels have lots of typed objects.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Characters",
     "items": [
      {
       "tool": "Pixelorama",
       "id": "orama-interactive/pixelorama",
       "label": "use",
       "why": "Pixel sprites and animation.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "game-asset-pipeline (Blender to sprites)",
       "id": "barissabuncular/game-asset-pipeline",
       "label": "try",
       "why": "Model once in Blender, render every angle as sprites. Keeps creatures on-model.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Story and dialogue",
     "items": [
      {
       "tool": "Dialogue Manager",
       "id": "nathanhoad/godot_dialogue_manager",
       "label": "use",
       "why": "Branching conversations in plain text files.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Rhubarb Lip Sync",
       "id": "danielswolf/rhubarb-lip-sync",
       "label": "need",
       "why": "Portraits that talk.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Enemies and states",
     "items": [
      {
       "tool": "LimboAI",
       "id": "limbonaut/limboai",
       "label": "try",
       "why": "Enemy and boss decisions.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Godot State Charts",
       "id": "derkork/godot-statecharts",
       "label": "need",
       "why": "Only if player or boss states get tangled.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "GLoot",
       "id": "peter-kish/gloot",
       "label": "need",
       "why": "An inventory.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Feel and effects",
     "items": [
      {
       "tool": "Phantom Camera",
       "id": "ramokz/phantom-camera",
       "label": "try",
       "why": "Camera framing and boss shots.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Juicee",
       "id": "kelpekk/juicee",
       "label": "try",
       "why": "Hit-stop, shake and flashes, tuned per action.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Effekseer",
       "id": "effekseer/effekseer",
       "label": "try",
       "why": "Spells and heavy hits.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Input",
     "items": [
      {
       "tool": "Controller Icons",
       "id": "rsubtil/controller_icons",
       "label": "use",
       "why": "The right button prompts for any pad.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Sound",
     "items": [
      {
       "tool": "BeepBox",
       "id": "johnnesky/beepbox",
       "label": "use",
       "why": "Music an agent can write and edit.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Furnace",
       "id": "tildearrow/furnace",
       "label": "need",
       "why": "Real chip sound.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Kokoro-82M",
       "id": "hexgrad/kokoro",
       "label": "need",
       "why": "A temporary voice for lines.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Testing",
     "items": [
      {
       "tool": "GUT (Godot Unit Test)",
       "id": "bitwes/gut",
       "label": "use",
       "why": "Tests that run without the editor in one command. Won both bake-offs.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "gdUnit4",
       "id": "godot-gdunit-labs/gdunit4",
       "label": "need",
       "why": "Only when a test must fake input or step frames.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Handhelds",
     "items": [
      {
       "tool": "Android SDK command-line tools",
       "id": "name:android-sdk-command-line-tools",
       "label": "need",
       "why": "APKs for Android handhelds.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "scrcpy",
       "id": "genymobile/scrcpy",
       "label": "need",
       "why": "Record and drive an Android handheld from the PC.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    }
   ]
  },
  {
   "id": "browser",
   "title": "Quick browser game",
   "example": "Arcade, puzzle, daily game",
   "blurb": "The game is a link friends tap. Phaser is home base.",
   "lanes": [
    {
     "job": "Engine",
     "items": [
      {
       "tool": "Phaser 4",
       "id": "phaserjs/phaser",
       "label": "use",
       "why": "Pin one version per project. It has sound built in.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Vite",
       "id": "vitejs/vite",
       "label": "use",
       "why": "Dev server and build.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "LittleJS",
       "id": "killedbyapixel/littlejs",
       "label": "need",
       "why": "Instead of Phaser, for a tiny jam-size game.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Art",
     "items": [
      {
       "tool": "Pixelorama",
       "id": "orama-interactive/pixelorama",
       "label": "use",
       "why": "Sprites.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Free Texture Packer (app, CLI, core)",
       "id": "odrick/free-tex-packer",
       "label": "use",
       "why": "Packs sprites into atlases.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Levels",
     "items": [
      {
       "tool": "Tiled",
       "id": "mapeditor/tiled",
       "label": "use",
       "why": "Plain-text maps an agent can edit.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Sound",
     "items": [
      {
       "tool": "ZzFX",
       "id": "killedbyapixel/zzfx",
       "label": "try",
       "why": "Tiny sound effects as number arrays.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "BeepBox",
       "id": "johnnesky/beepbox",
       "label": "use",
       "why": "Music.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Helpers",
     "items": [
      {
       "tool": "seedrandom",
       "id": "davidbau/seedrandom",
       "label": "need",
       "why": "Runs that repeat for tests.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "idb-keyval",
       "id": "jakearchibald/idb-keyval",
       "label": "need",
       "why": "Saves that survive a reload.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "lil-gui",
       "id": "georgealways/lil-gui",
       "label": "need",
       "why": "Tuning sliders for game feel.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Testing",
     "items": [
      {
       "tool": "Vitest",
       "id": "vitest-dev/vitest",
       "label": "use",
       "why": "Logic tests. The every-game kit covers screenshots.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Phones",
     "items": [
      {
       "tool": "Vite PWA plugin",
       "id": "vite-pwa/vite-plugin-pwa",
       "label": "try",
       "why": "Installs like an app on phones.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    }
   ]
  },
  {
   "id": "platformer",
   "title": "Platformer or action",
   "example": "2D jumping, running, fighting",
   "blurb": "Feel is everything. This kit is the Godot route; for a link, use the Quick browser game kit.",
   "lanes": [
    {
     "job": "Engine",
     "items": [
      {
       "tool": "Godot Engine",
       "id": "godotengine/godot",
       "label": "use",
       "why": "Downloads and handhelds.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Art",
     "items": [
      {
       "tool": "Pixelorama",
       "id": "orama-interactive/pixelorama",
       "label": "use",
       "why": "Sprites.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Pixel Art Lighter",
       "id": "name:pixel-art-lighter",
       "label": "try",
       "why": "Hand-tuned normal maps for prominent pixel sprites.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Laigter",
       "id": "azagaya/laigter",
       "label": "need",
       "why": "Batch normal maps from the command line.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Levels",
     "items": [
      {
       "tool": "LDtk",
       "id": "deepnight/ldtk",
       "label": "try",
       "why": "Fast level layout with auto-tiles.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "SmartShape2D",
       "id": "sirramesq/smartshape2d",
       "label": "need",
       "why": "Smooth hand-drawn terrain shapes.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Feel and effects",
     "items": [
      {
       "tool": "Phantom Camera",
       "id": "ramokz/phantom-camera",
       "label": "use",
       "why": "Smooth follow and look-ahead.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Juicee",
       "id": "kelpekk/juicee",
       "label": "try",
       "why": "Hit-stop and shake, per action.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Effekseer",
       "id": "effekseer/effekseer",
       "label": "try",
       "why": "Big hits.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Enemies",
     "items": [
      {
       "tool": "LimboAI",
       "id": "limbonaut/limboai",
       "label": "try",
       "why": "Behavior trees.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "BulletUpHell",
       "id": "dark-peace/bulletuphell",
       "label": "need",
       "why": "Bullet patterns for a shooter.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Input",
     "items": [
      {
       "tool": "Controller Icons",
       "id": "rsubtil/controller_icons",
       "label": "use",
       "why": "Pad prompts.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Sound",
     "items": [
      {
       "tool": "Furnace",
       "id": "tildearrow/furnace",
       "label": "try",
       "why": "Chip music.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Testing",
     "items": [
      {
       "tool": "GUT (Godot Unit Test)",
       "id": "bitwes/gut",
       "label": "use",
       "why": "Tests that run without the editor in one command. Won both bake-offs.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "gdUnit4",
       "id": "godot-gdunit-labs/gdunit4",
       "label": "need",
       "why": "Only when a test must fake input or step frames.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Godot Stagehand",
       "id": "mrf/godot-stagehand",
       "label": "need",
       "why": "Replay a tricky bug exactly. Very young.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    }
   ]
  },
  {
   "id": "3d",
   "title": "3D world or showpiece",
   "example": "Explore, drive, fly",
   "blurb": "Godot is the default for a 3D game. Three.js only when the point is a showpiece link.",
   "lanes": [
    {
     "job": "Engine",
     "items": [
      {
       "tool": "Godot Engine",
       "id": "godotengine/godot",
       "label": "use",
       "why": "The default for 3D games, downloads and Android.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Three.js",
       "id": "mrdoob/three.js",
       "label": "need",
       "why": "A custom 3D showpiece that lives at a link.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Models",
     "items": [
      {
       "tool": "Blender",
       "id": "blender/blender",
       "label": "use",
       "why": "Masters, exported as glTF.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Blockbench",
       "id": "jannisx11/blockbench",
       "label": "need",
       "why": "Chunky low-poly models.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "glTF-Transform and gltfpack",
       "id": "donmccurdy/gltf-transform",
       "label": "use",
       "why": "Shrink files for phones.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "glTF-Validator",
       "id": "khronosgroup/gltf-validator",
       "label": "use",
       "why": "Catch broken .gltf and .glb files before the engine does.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Materials and light",
     "items": [
      {
       "tool": "Poly Haven",
       "id": "poly-haven/public-api",
       "label": "use",
       "why": "Free HDRI lighting, textures and models.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Material Maker",
       "id": "rodzill4/material-maker",
       "label": "need",
       "why": "Your own materials from a node graph.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "World",
     "items": [
      {
       "tool": "Terrain3D",
       "id": "tokisangames/terrain3d",
       "label": "try",
       "why": "Godot terrain.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "ProtonScatter",
       "id": "hungryproton/scatter",
       "label": "try",
       "why": "Scatter trees and rocks.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Characters",
     "items": [
      {
       "tool": "Quaternius (packs and Universal Animation Library)",
       "id": "name:quaternius-packs-and-universal-animation-library",
       "label": "need",
       "why": "Placeholder characters and animations.",
       "fun": "yes",
       "sell": "catch",
       "sell_note": "Conflict found 2026-11-05: quaternius.com/license.html now shows a custom Quaternius Asset License v1.0 (commercial use OK, no attribution, but no reselling or redistributing the assets as packs), while pack pages such as Universal Animation Library still say CC0 (both verified). Standard and Pro tiers free; Source tier (.blend, engine-ready) paid or Patreon. Record the license text at download time."
      },
      {
       "tool": "UniRig",
       "id": "vast-ai-research/unirig",
       "label": "need",
       "why": "Auto-rig a model.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Three.js extras",
     "items": [
      {
       "tool": "three-mesh-bvh",
       "id": "gkjohnson/three-mesh-bvh",
       "label": "need",
       "why": "Fast picking and collision for Three.js.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "postprocessing (pmndrs)",
       "id": "pmndrs/postprocessing",
       "label": "need",
       "why": "Bloom and color grading, with restraint.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Debug",
     "items": [
      {
       "tool": "RenderDoc",
       "id": "baldurk/renderdoc",
       "label": "need",
       "why": "Look inside a slow frame.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    }
   ]
  },
  {
   "id": "story",
   "title": "Story game or visual novel",
   "example": "Choices, characters, reading",
   "blurb": "Words first. Decide how the story is told, then pick the one engine for it.",
   "lanes": [
    {
     "job": "Engine (pick one by format)",
     "items": [
      {
       "tool": "Ink",
       "id": "inkle/ink",
       "label": "use",
       "why": "A branching story, played on the web with inkjs.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Ren'Py",
       "id": "renpy/renpy",
       "label": "need",
       "why": "If it is a classic visual novel.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Dialogue Manager",
       "id": "nathanhoad/godot_dialogue_manager",
       "label": "need",
       "why": "If the story lives inside a Godot game.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Voices",
     "items": [
      {
       "tool": "Kokoro-82M",
       "id": "hexgrad/kokoro",
       "label": "try",
       "why": "Read lines aloud.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Rhubarb Lip Sync",
       "id": "danielswolf/rhubarb-lip-sync",
       "label": "need",
       "why": "Mouths that move with the voice.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Subtitle Edit",
       "id": "subtitleedit/subtitleedit",
       "label": "need",
       "why": "Timed captions.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Music",
     "items": [
      {
       "tool": "BeepBox",
       "id": "johnnesky/beepbox",
       "label": "use",
       "why": "Themes an agent can write.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Other languages",
     "items": [
      {
       "tool": "i18next",
       "id": "i18next/i18next",
       "label": "need",
       "why": "Translations for an Ink web story.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Poedit",
       "id": "vslavik/poedit",
       "label": "need",
       "why": "Translation files for Godot or Ren'Py.",
       "fun": "yes",
       "sell": "catch",
       "sell_note": "Free OSS edition; Pro features cost money and are optional."
      }
     ]
    }
   ]
  },
  {
   "id": "party",
   "title": "Party game",
   "example": "Couch play, a home arcade cabinet",
   "blurb": "Several people, one screen. Godot handles many gamepads.",
   "lanes": [
    {
     "job": "Engine",
     "items": [
      {
       "tool": "Godot Engine",
       "id": "godotengine/godot",
       "label": "use",
       "why": "Several gamepads at once.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Input",
     "items": [
      {
       "tool": "Controller Icons",
       "id": "rsubtil/controller_icons",
       "label": "use",
       "why": "Pad prompts for every player.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "SDL GameControllerDB",
       "id": "mdqinc/sdl_gamecontrollerdb",
       "label": "need",
       "why": "Odd or arcade pads that Godot does not know.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Xelu's free controller and key prompts",
       "id": "name:xelu-s-free-controller-and-key-prompts",
       "label": "need",
       "why": "Different button art, used through Controller Icons.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Feel",
     "items": [
      {
       "tool": "Juicee",
       "id": "kelpekk/juicee",
       "label": "try",
       "why": "Big readable feedback.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Phantom Camera",
       "id": "ramokz/phantom-camera",
       "label": "try",
       "why": "A shared camera that fits everyone.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Sound",
     "items": [
      {
       "tool": "BeepBox",
       "id": "johnnesky/beepbox",
       "label": "use",
       "why": "Upbeat loops.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "TV box",
     "items": [
      {
       "tool": "Android SDK command-line tools",
       "id": "name:android-sdk-command-line-tools",
       "label": "need",
       "why": "Run it on an Android TV box.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "scrcpy",
       "id": "genymobile/scrcpy",
       "label": "need",
       "why": "Watch and record an Android TV box screen on the PC.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    }
   ]
  },
  {
   "id": "fighting",
   "title": "Fighting game",
   "example": "A home arcade cabinet",
   "blurb": "Ikemen GO for a cabinet fighter. Godot only for a web or phone fighter.",
   "lanes": [
    {
     "job": "Engine",
     "items": [
      {
       "tool": "Ikemen GO",
       "id": "ikemen-engine/ikemen-go",
       "label": "use",
       "why": "A free fighting game engine for a cabinet, with its own effect system.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Godot Engine",
       "id": "godotengine/godot",
       "label": "need",
       "why": "A fighter for web or phones.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Art",
     "items": [
      {
       "tool": "Pixelorama",
       "id": "orama-interactive/pixelorama",
       "label": "use",
       "why": "Sprites and frames.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "game-asset-pipeline (Blender to sprites)",
       "id": "barissabuncular/game-asset-pipeline",
       "label": "try",
       "why": "Pre-rendered 3D fighters, the classic look.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "For a Godot fighter only",
     "items": [
      {
       "tool": "netfox",
       "id": "foxssake/netfox",
       "label": "need",
       "why": "Rollback for online fights.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Effekseer",
       "id": "effekseer/effekseer",
       "label": "need",
       "why": "Hit sparks and supers.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Juicee",
       "id": "kelpekk/juicee",
       "label": "need",
       "why": "Hit-stop by attack weight.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Sound",
     "items": [
      {
       "tool": "Furnace",
       "id": "tildearrow/furnace",
       "label": "try",
       "why": "Arcade-style music.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    }
   ]
  },
  {
   "id": "gameboy",
   "title": "Real retro hardware",
   "example": "Game Boy first",
   "blurb": "A real ROM that runs on Android handhelds. Game Boy has a tested route; the other consoles are optional.",
   "lanes": [
    {
     "job": "Game Boy (tested)",
     "items": [
      {
       "tool": "GBDK-2020",
       "id": "gbdk-2020/gbdk-2020",
       "label": "use",
       "why": "Build the ROM in C. Codex proved it.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "PyBoy",
       "id": "baekalfen/pyboy",
       "label": "use",
       "why": "An agent presses buttons and checks the screen.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "GB Studio",
       "id": "chrismaltby/gb-studio",
       "label": "need",
       "why": "The visual route, no code.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "hUGETracker and hUGEDriver",
       "id": "superdisk/hugetracker",
       "label": "use",
       "why": "Game Boy music.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Art",
     "items": [
      {
       "tool": "Pixelorama",
       "id": "orama-interactive/pixelorama",
       "label": "use",
       "why": "Tiles and sprites.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Lospec palettes (list and API)",
       "id": "name:lospec-palettes-list-and-api",
       "label": "use",
       "why": "Real hardware palettes, which the console enforces.",
       "fun": "yes",
       "sell": "catch",
       "sell_note": "Free to use in practice; the palette page states no usage terms (verified listing shows 4,542 results). Credit the palette author in credits as good practice."
      }
     ]
    },
    {
     "job": "Other consoles (optional)",
     "items": [
      {
       "tool": "Butano",
       "id": "gvaliente/butano",
       "label": "need",
       "why": "Game Boy Advance, tested in mGBA.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "NESFab",
       "id": "pubby/nesfab",
       "label": "need",
       "why": "NES, tested in Mesen 2.",
       "fun": "yes",
       "sell": "catch",
       "sell_note": "Free. The GPL covers the compiler; check the library terms before selling a ROM."
      },
      {
       "tool": "SGDK",
       "id": "stephane-d/sgdk",
       "label": "need",
       "why": "Genesis, tested in ares.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Play it",
     "items": [
      {
       "tool": "RetroArch",
       "id": "libretro/retroarch",
       "label": "use",
       "why": "What Android handhelds run.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    }
   ]
  },
  {
   "id": "retro",
   "title": "Retro-style modern game",
   "example": "Pixel art, CRT glow, chiptune",
   "blurb": "A new game with an old soul. Godot or Phaser underneath, from their own kits.",
   "lanes": [
    {
     "job": "Art",
     "items": [
      {
       "tool": "Pixelorama",
       "id": "orama-interactive/pixelorama",
       "label": "use",
       "why": "Sprites.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Open pixel fonts (Monogram, Departure Mono, Ark Pixel)",
       "id": "name:open-pixel-fonts-monogram-departure-mono-ark-pixel",
       "label": "use",
       "why": "Departure Mono, Monogram, Ark Pixel at whole sizes.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Screen",
     "items": [
      {
       "tool": "Flowerwall CRT shader for Godot",
       "id": "art-oria/flowerwall-crt-shader-for-godot",
       "label": "try",
       "why": "A careful CRT, not cheap scanlines.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "webgl-crt-shader",
       "id": "gingerbeardman/webgl-crt-shader",
       "label": "need",
       "why": "The web version.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "didder",
       "id": "makew0rld/didder",
       "label": "need",
       "why": "Dithered art like old hardware.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Sound",
     "items": [
      {
       "tool": "Furnace",
       "id": "tildearrow/furnace",
       "label": "use",
       "why": "Chip music for real.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "FamiStudio",
       "id": "bleubleu/famistudio",
       "label": "need",
       "why": "NES-style music, easier to learn.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    }
   ]
  },
  {
   "id": "fantasy",
   "title": "Fantasy console jam",
   "example": "A weekend game",
   "blurb": "Tiny on purpose. Everything lives in one small cart.",
   "lanes": [
    {
     "job": "Engine",
     "items": [
      {
       "tool": "TIC-80",
       "id": "nesbox/tic-80",
       "label": "use",
       "why": "Code, art, map and sound in one app.",
       "fun": "yes",
       "sell": "catch",
       "sell_note": "MIT source. The paid PRO binary on itch.io adds text-format carts, 8 memory banks, and export without editors, but the README says anyone can build PRO free with cmake -DBUILD_PRO=On. Exports HTML and native builds; also runs on handhelds (Android app and ports)."
      },
      {
       "tool": "Pyxel",
       "id": "kitao/pyxel",
       "label": "need",
       "why": "If you would rather write Python. Version 3 just shipped.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "PuzzleScript",
       "id": "increpare/puzzlescript",
       "label": "need",
       "why": "A pure puzzle game.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    }
   ]
  },
  {
   "id": "kids",
   "title": "Something for the kids",
   "example": "Learning, family, kids making their own",
   "blurb": "Big readable UI, voices, and tools kids can use themselves.",
   "lanes": [
    {
     "job": "Kids make their own",
     "items": [
      {
       "tool": "Microsoft MakeCode Arcade",
       "id": "microsoft/pxt-arcade",
       "label": "try",
       "why": "Retro games built with blocks.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Bitsy",
       "id": "name:bitsy",
       "label": "try",
       "why": "Tiny story worlds.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Pencil2D",
       "id": "pencil2d/pencil",
       "label": "need",
       "why": "Drawing their own flipbook animations.",
       "fun": "yes",
       "sell": "no",
       "sell_note": "Non-commercial: GPL-2.0 desktop app; the drawings you make are yours. GPL was never a real barrier here; it was skipped as redundant."
      }
     ]
    },
    {
     "job": "We make one for them",
     "items": [
      {
       "tool": "Godot Engine",
       "id": "godotengine/godot",
       "label": "use",
       "why": "Or Phaser from the browser kit.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Kokoro-82M",
       "id": "hexgrad/kokoro",
       "label": "try",
       "why": "Reads text aloud.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Checks",
     "items": [
      {
       "rule": "Read every screen on the real device at arm's length: big text, big buttons, nothing that needs reading fast.",
       "label": "use"
      }
     ]
    }
   ]
  },
  {
   "id": "online",
   "title": "Online with friends",
   "example": "Only when the game truly needs it",
   "blurb": "Most games don't. When one does, start with one route.",
   "lanes": [
    {
     "job": "Browser games",
     "items": [
      {
       "tool": "Colyseus",
       "id": "colyseus/colyseus",
       "label": "use",
       "why": "Rooms and shared state. Hosting is extra.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "boardgame.io",
       "id": "boardgameio/boardgame.io",
       "label": "need",
       "why": "Turn-based and board games instead.",
       "fun": "yes",
       "sell": "yes"
      },
      {
       "tool": "Trystero",
       "id": "dmotz/trystero",
       "label": "need",
       "why": "Peer to peer; check what it still needs for signaling before relying on it.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Godot games",
     "items": [
      {
       "tool": "netfox",
       "id": "foxssake/netfox",
       "label": "use",
       "why": "Rollback and state sync.",
       "fun": "yes",
       "sell": "yes"
      }
     ]
    },
    {
     "job": "Before friends play",
     "items": [
      {
       "rule": "Two clients, then lag, disconnect and rejoin.",
       "label": "use"
      }
     ]
    }
   ]
  }
 ],
 "wants": [
  {
   "need": "make portraits talk",
   "main": "Rhubarb Lip Sync",
   "main_id": "danielswolf/rhubarb-lip-sync",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Uses your own mouth sprites."
  },
  {
   "need": "give a game a CRT TV look",
   "main": "Flowerwall CRT shader for Godot",
   "main_id": "art-oria/flowerwall-crt-shader-for-godot",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "webgl-crt-shader",
   "backup_id": "gingerbeardman/webgl-crt-shader",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Godot first, web second. Avoid cheap dark scanlines."
  },
  {
   "need": "dither art like old hardware",
   "main": "didder",
   "main_id": "makew0rld/didder",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Dither shaders (Godot and three.js)",
   "backup_id": "donitzo/godot-color-dither",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": ""
  },
  {
   "need": "add a VHS or composite video look",
   "main": "ntsc-rs",
   "main_id": "ntsc-rs/ntsc-rs",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": ""
  },
  {
   "need": "scan a real object into a 3D model",
   "main": "COLMAP",
   "main_id": "colmap/colmap",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Meshroom",
   "backup_id": "alicevision/meshroom",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Plan a cleanup pass."
  },
  {
   "need": "turn 3D models into pixel sprites",
   "main": "game-asset-pipeline (Blender to sprites)",
   "main_id": "barissabuncular/game-asset-pipeline",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Blender spritesheet renderer (bgivenb)",
   "backup_id": "bgivenb/blender-spritesheet",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "The pre-rendered look; keeps characters on-model."
  },
  {
   "need": "make spells and hit effects",
   "main": "Effekseer",
   "main_id": "effekseer/effekseer",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "GODOT-VFX-LIBRARY",
   "backup_id": "haowg/godot-vfx-library",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Godot."
  },
  {
   "need": "make hits feel heavy",
   "main": "Juicee",
   "main_id": "kelpekk/juicee",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Godot. Write a feel spec per attack first."
  },
  {
   "need": "shatter meshes on big 3D hits",
   "main": "Smash The Mesh",
   "main_id": "cloudofoz/godot-smashthemesh",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Godot 3D."
  },
  {
   "need": "make objects jiggle and sway",
   "main": "Wigglebone",
   "main_id": "detomon/wigglebone",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Ears, tails, antennas on Godot creatures."
  },
  {
   "need": "add a temporary voice to lines",
   "main": "Kokoro-82M",
   "main_id": "hexgrad/kokoro",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Piper (piper1-gpl)",
   "backup_id": "ohf-voice/piper1-gpl",
   "backup_modes": {
    "fun": "yes",
    "sell": "catch",
    "sell_note": "GPL runtime, and some voices come from datasets with non-commercial terms; check the specific voice."
   },
   "note": "Pick voices whose data allows it."
  },
  {
   "need": "make background music fast",
   "main": "BeepBox",
   "main_id": "johnnesky/beepbox",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "ACE-Step 1.5",
   "backup_id": "ace-step/ace-step-1.5",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "ACE-Step counts as the GPU trial."
  },
  {
   "need": "make chiptune music",
   "main": "Furnace",
   "main_id": "tildearrow/furnace",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "FamiStudio",
   "backup_id": "bleubleu/famistudio",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": ""
  },
  {
   "need": "make Game Boy music",
   "main": "hUGETracker and hUGEDriver",
   "main_id": "superdisk/hugetracker",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": ""
  },
  {
   "need": "make retro sound effects",
   "main": "jsfxr",
   "main_id": "chr15m/jsfxr",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Bfxr2",
   "backup_id": "increpare/bfxr2",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Bfxr2 has footsteps on five surfaces."
  },
  {
   "need": "check what a sound effect sounds like",
   "main": "earshot",
   "main_id": "leonxlnx/earshot",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "A helper. A person still listens."
  },
  {
   "need": "loop a music track with no gap",
   "main": "PyMusicLooper",
   "main_id": "arkrow/pymusiclooper",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": ""
  },
  {
   "need": "build 3D rooms like Quake",
   "main": "TrenchBroom + func_godot",
   "main_id": "trenchbroom/trenchbroom",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Godot."
  },
  {
   "need": "draw tile maps",
   "main": "Tiled",
   "main_id": "mapeditor/tiled",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "LDtk",
   "backup_id": "deepnight/ldtk",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Godot games can also use Godot's own tile editor."
  },
  {
   "need": "generate dungeons",
   "main": "rot.js",
   "main_id": "ondras/rot.js",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "WFC (krychu)",
   "backup_id": "krychu/wfc",
   "backup_modes": {
    "fun": "yes",
    "sell": "catch",
    "sell_note": "License stated in README, no LICENSE file. Fine for build-time use; confirm before vendoring code."
   },
   "note": "rot.js for web games."
  },
  {
   "need": "generate terrain",
   "main": "FastNoiseLite",
   "main_id": "auburn/fastnoiselite",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Terrain3D",
   "backup_id": "tokisangames/terrain3d",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Both Godot. FastNoiseLite is built in."
  },
  {
   "need": "write branching dialogue",
   "main": "Dialogue Manager",
   "main_id": "nathanhoad/godot_dialogue_manager",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Ink",
   "backup_id": "inkle/ink",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Dialogue Manager in Godot, Ink on the web."
  },
  {
   "need": "give enemies a brain",
   "main": "LimboAI",
   "main_id": "limbonaut/limboai",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Beehave",
   "backup_id": "bitbrain/beehave",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Godot."
  },
  {
   "need": "add an inventory",
   "main": "GLoot",
   "main_id": "peter-kish/gloot",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Godot."
  },
  {
   "need": "show the right controller buttons",
   "main": "Controller Icons",
   "main_id": "rsubtil/controller_icons",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Godot. Xelu's prompts give it different button art."
  },
  {
   "need": "play couch multiplayer with several pads",
   "main": "Godot Engine",
   "main_id": "godotengine/godot",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Plus Controller Icons for every player's prompts."
  },
  {
   "need": "add touch controls on phones",
   "main": "Virtual Joystick (Godot)",
   "main_id": "marcofaziorandom/virtual-joystick-godot",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "nipplejs",
   "backup_id": "yoannmoinet/nipplejs",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Virtual Joystick in Godot, nipplejs on the web."
  },
  {
   "need": "turn an image into a 3D model",
   "main": "TripoSG",
   "main_id": "vast-ai-research/triposg",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Hunyuan3D 2.x (2.0, 2mini, 2mv, 2.1)",
   "backup_id": "tencent-hunyuan/hunyuan3d-2",
   "backup_modes": {
    "fun": "yes",
    "sell": "catch",
    "sell_note": "Fine to use in the US; whether a game made with it can be sold in the EU or UK is a gray area. Newer Hunyuan 3D 3.x is reported to be hosted-only."
   },
   "note": "Distant props only, after cleanup. Counts as the GPU trial."
  },
  {
   "need": "remove an image background",
   "main": "rembg",
   "main_id": "danielgatis/rembg",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "BiRefNet",
   "backup_id": "zhengpeng7/birefnet",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": ""
  },
  {
   "need": "fix messy AI pixel art",
   "main": "spritefusion-pixel-snapper",
   "main_id": "hugo-dz/spritefusion-pixel-snapper",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "proper-pixel-art",
   "backup_id": "kennethjallen/proper-pixel-art",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": ""
  },
  {
   "need": "make concept art or paintovers with AI",
   "main": "Z-Image (Turbo and Base)",
   "main_id": "tongyi-mai/z-image",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "FLUX.2 [klein] 4B",
   "backup_id": "black-forest-labs/flux2",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Through ComfyUI. Never for hero characters. Counts as the GPU trial."
  },
  {
   "need": "upscale old or small images",
   "main": "Real-ESRGAN (with ncnn Vulkan CLI)",
   "main_id": "xinntao/real-esrgan",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": ""
  },
  {
   "need": "make 2D sprites catch light",
   "main": "Pixel Art Lighter",
   "main_id": "name:pixel-art-lighter",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Laigter",
   "backup_id": "azagaya/laigter",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Won on one painted prop in a 13-position Godot lantern sweep. Use Laigter when batch export matters."
  },
  {
   "need": "make chunky low-poly or voxel models",
   "main": "Blockbench",
   "main_id": "jannisx11/blockbench",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "vengi (voxedit, voxconvert)",
   "backup_id": "vengi-voxel/vengi",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": ""
  },
  {
   "need": "make materials and textures",
   "main": "Material Maker",
   "main_id": "rodzill4/material-maker",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "ambientCG",
   "backup_id": "name:ambientcg",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": ""
  },
  {
   "need": "rig a 3D character automatically",
   "main": "UniRig",
   "main_id": "vast-ai-research/unirig",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": ""
  },
  {
   "need": "make animation from text",
   "main": "Kimodo",
   "main_id": "nv-tlabs/kimodo",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Uses licensed motion data."
  },
  {
   "need": "use real motion capture",
   "main": "CMU Motion Capture Database",
   "main_id": "name:cmu-motion-capture-database",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "FreeMoCap",
   "backup_id": "freemocap/freemocap",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": ""
  },
  {
   "need": "generate planets and space art",
   "main": "Pixel Planets",
   "main_id": "deep-fold/pixelplanets",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": ""
  },
  {
   "need": "generate trees",
   "main": "EZ-Tree",
   "main_id": "dgreenheck/ez-tree",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "gdTree3D",
   "backup_id": "jeksun97/gdtree3d",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "EZ-Tree on the web, gdTree3D in Godot."
  },
  {
   "need": "put a game on Android handhelds",
   "main": "Android SDK command-line tools",
   "main_id": "name:android-sdk-command-line-tools",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Godot exports the APK; scrcpy records it on the PC."
  },
  {
   "need": "check the game on an Android TV box with a controller",
   "main": "scrcpy",
   "main_id": "genymobile/scrcpy",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Mirror an Android TV box over adb and play it with a real pad."
  },
  {
   "need": "keep old saves working",
   "main": "Ajv",
   "main_id": "ajv-validator/ajv",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Keep one save from every version; every build must load them. Ajv checks JSON saves."
  },
  {
   "need": "share a game with friends by link",
   "main": "butler",
   "main_id": "itchio/butler",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "GitHub Pages",
   "backup_id": "name:github-pages",
   "backup_modes": {
    "fun": "yes",
    "sell": "catch",
    "sell_note": "Free. 1 GB site, 100 GB/month soft bandwidth, 10 builds/hour soft (Actions deploys exempt). Not for running an online business or commercial transactions (verified). Fine for free games and demos."
   },
   "note": "itch.io allows hidden pages."
  },
  {
   "need": "make a phone-installable web game",
   "main": "Vite PWA plugin",
   "main_id": "vite-pwa/vite-plugin-pwa",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Capacitor",
   "backup_id": "ionic-team/capacitor",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": ""
  },
  {
   "need": "make a Windows download",
   "main": "Godot Engine",
   "main_id": "godotengine/godot",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "A zip of the Godot export works for friends. Inno Setup if you want an installer."
  },
  {
   "need": "play together online",
   "main": "Colyseus",
   "main_id": "colyseus/colyseus",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "boardgame.io",
   "backup_id": "boardgameio/boardgame.io",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Web. Godot games use netfox."
  },
  {
   "need": "add rollback for a fighter",
   "main": "netfox",
   "main_id": "foxssake/netfox",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Godot. Ikemen GO has its own netplay."
  },
  {
   "need": "replay a bug exactly",
   "main": "Godot Stagehand",
   "main_id": "mrf/godot-stagehand",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "godot-e2e",
   "backup_id": "randallliuxin/godot-e2e",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Both very young; trial first."
  },
  {
   "need": "test a browser game automatically",
   "main": "develop-web-game test loop (openai/skills, removed 2026-04-23)",
   "main_id": "openai/skills",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "It runs on Playwright."
  },
  {
   "need": "test a Godot game automatically",
   "main": "GUT (Godot Unit Test)",
   "main_id": "bitwes/gut",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "gdUnit4",
   "backup_id": "godot-gdunit-labs/gdunit4",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "GUT won both bake-offs; gdUnit4 when a test must fake input."
  },
  {
   "need": "tune game feel with sliders",
   "main": "lil-gui",
   "main_id": "georgealways/lil-gui",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Limbo Console",
   "backup_id": "limbonaut/limbo_console",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "lil-gui on the web, Limbo Console in Godot."
  },
  {
   "need": "find why a game stutters",
   "main": "PresentMon",
   "main_id": "gametechdev/presentmon",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "RenderDoc",
   "backup_id": "baldurk/renderdoc",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": ""
  },
  {
   "need": "translate a game",
   "main": "i18next",
   "main_id": "i18next/i18next",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Poedit",
   "backup_id": "vslavik/poedit",
   "backup_modes": {
    "fun": "yes",
    "sell": "catch",
    "sell_note": "Free OSS edition; Pro features cost money and are optional."
   },
   "note": "i18next on the web, Poedit for Godot."
  },
  {
   "need": "make NPCs that talk back with AI",
   "main": "NobodyWho",
   "main_id": "nobodywho-ooo/nobodywho",
   "main_modes": {
    "fun": "yes",
    "sell": "catch",
    "sell_note": "README: proprietary and commercial games may use it; only changes to NobodyWho itself must be shared. Prebuilt packages include espeak-ng (GPL-3.0) through the Kokoro feature; build without that feature to avoid it. No web export; Godot has no iOS export."
   },
   "backup": "Ollama",
   "backup_id": "ollama/ollama",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Runs locally, no cloud bill."
  },
  {
   "need": "let players talk to the game by voice",
   "main": "whisper.cpp",
   "main_id": "ggml-org/whisper.cpp",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": ""
  },
  {
   "need": "make a map or road-trip game",
   "main": "MapLibre GL JS",
   "main_id": "maplibre/maplibre-gl-js",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Pixel Path",
   "backup_id": "jonwheatley/pixel-path",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": ""
  },
  {
   "need": "make a VR game",
   "main": "Godot XR Tools",
   "main_id": "godotvr/godot-xr-tools",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": ""
  },
  {
   "need": "make a game friends can mod",
   "main": "Luanti (formerly Minetest)",
   "main_id": "luanti-org/luanti",
   "main_modes": {
    "fun": "yes",
    "sell": "catch",
    "sell_note": "Free. Engine is LGPL and some bundled media is CC BY-SA, so ship your own media. Games publish on ContentDB for free and run on Windows, Linux, macOS and Android."
   },
   "backup": "OpenRA",
   "backup_id": "openra/openra",
   "backup_modes": {
    "fun": "yes",
    "sell": "catch",
    "sell_note": "Use original or cleared assets; the classic upstream media is proprietary."
   },
   "note": ""
  },
  {
   "need": "make a real Game Boy ROM",
   "main": "GBDK-2020",
   "main_id": "gbdk-2020/gbdk-2020",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "GB Studio",
   "backup_id": "chrismaltby/gb-studio",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Test with PyBoy."
  },
  {
   "need": "make a game for a home arcade cabinet",
   "main": "Godot Engine",
   "main_id": "godotengine/godot",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Ikemen GO",
   "backup_id": "ikemen-engine/ikemen-go",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Ikemen GO when it is a fighter."
  },
  {
   "need": "let a kid make their own game",
   "main": "Microsoft MakeCode Arcade",
   "main_id": "microsoft/pxt-arcade",
   "main_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "backup": "Bitsy",
   "backup_id": "name:bitsy",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": ""
  },
  {
   "need": "keep a character on-model across AI images",
   "main": "FLUX.1 [dev] and FLUX.1 Kontext [dev]",
   "main_id": "name:flux-1-dev-and-flux-1-kontext-dev",
   "main_modes": {
    "fun": "yes",
    "sell": "no",
    "sell_note": "Non-commercial: the FLUX.1 [dev] Non-Commercial License lists 'personal study, private entertainment, hobby projects' as allowed use (license text read 2026-11-05). LoRAs trained on dev inherit it. Official HF download is a click-through gate; city96 GGUF re-uploads are ungated and carry the same license."
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Kontext edits from one reference image. Back in for hobby use. Counts as the GPU trial."
  },
  {
   "need": "make AI sprites with see-through backgrounds",
   "main": "Qwen-Image 2.1 and 2.1-Turbo",
   "main_id": "qwenlm/qwen-image-2.1",
   "main_modes": {
    "fun": "catch",
    "sell": "catch",
    "fun_note": "Research-or-evaluation license: fine for trying ideas, unclear for art in a game you share.",
    "sell_note": "Hobby gray: free to download, but the license covers research or evaluation only, and a shared hobby game is not clearly either. Fine for prototypes and placeholder art; redo final art with the Apache Qwen-Image family or Z-Image if in doubt. Redistributing the weights needs the license's Notice text."
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Research-only license: check it first."
  },
  {
   "need": "make a song with singing",
   "main": "YuE2 (3B)",
   "main_id": "multimodal-art-projection/yue",
   "main_modes": {
    "fun": "yes",
    "sell": "no",
    "sell_note": "Non-commercial: CC BY-NC 4.0 plus a creator permission that explicitly covers personal users. The official HF path wants a 24 GB BF16 GPU with FlashAttention, so use the GGUF route here. YuE v1 from the same skipped entry stays out (superseded)."
   },
   "backup": "ACE-Step 1.5",
   "backup_id": "ace-step/ace-step-1.5",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Back in for hobby use."
  },
  {
   "need": "make sound effects that match a clip",
   "main": "MMAudio",
   "main_id": "hkchengrex/mmaudio",
   "main_modes": {
    "fun": "yes",
    "sell": "no",
    "sell_note": "Non-commercial: CC BY-NC 4.0 allows non-commercial use with credit."
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": "Back in for hobby use."
  },
  {
   "need": "give characters voices that laugh, whisper or shout",
   "main": "Fish Audio S2 Pro (Fish Speech)",
   "main_id": "fishaudio/fish-speech",
   "main_modes": {
    "fun": "yes",
    "sell": "no",
    "sell_note": "Non-commercial: the Fish Audio Research License names hobbyist personal use as allowed, and you own the outputs. If you ship the model itself, include the license, a Notice file and 'Built with Fish Audio'. Fish Audio Drama 3 from the same skipped entry stays out (35B MoE, 48 GB FP8 minimum)."
   },
   "backup": "Kokoro-82M",
   "backup_id": "hexgrad/kokoro",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "Made-up voices or your own, never a real person without permission."
  },
  {
   "need": "let a kid draw their own animations",
   "main": "Pencil2D",
   "main_id": "pencil2d/pencil",
   "main_modes": {
    "fun": "yes",
    "sell": "no",
    "sell_note": "Non-commercial: GPL-2.0 desktop app; the drawings you make are yours. GPL was never a real barrier here; it was skipped as redundant."
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": ""
  },
  {
   "need": "make an RPG without code",
   "main": "RPG Paper Maker",
   "main_id": "rpg-paper-maker/rpg-paper-maker",
   "main_modes": {
    "fun": "yes",
    "sell": "no",
    "sell_note": "Non-commercial: free games made with the free version, default assets included, may be published (EULA sections 1.2 and 1.3). Only selling needs the commercial edition."
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": ""
  },
  {
   "need": "find real recorded sound effects",
   "main": "BBC Sound Effects archive",
   "main_id": "name:bbc-sound-effects-archive",
   "main_modes": {
    "fun": "catch",
    "sell": "catch",
    "fun_note": "Personal-use licence: fine for family copies, unclear for public uploads.",
    "sell_note": "Hobby gray: a game kept among family and friends fits 'personal project'; posting it publicly (for example on itch.io) is not clearly personal. Credit the BBC."
   },
   "backup": "Kenney audio packs",
   "backup_id": "name:kenney-audio-packs",
   "backup_modes": {
    "fun": "yes",
    "sell": "yes"
   },
   "note": "BBC is for personal projects only."
  },
  {
   "need": "borrow ready-made shader effects",
   "main": "LYGIA shader library",
   "main_id": "patriciogonzalezvivo/lygia",
   "main_modes": {
    "fun": "yes",
    "sell": "no",
    "sell_note": "Non-commercial: Prosperity allows noncommercial use and lists 'private entertainment, hobby projects, amateur pursuits' as personal uses (verified). Keep the license text and contributor line with any copy. Selling a game would need a paid license after a 30-day trial."
   },
   "backup": "Shadertoy code",
   "backup_id": "name:shadertoy-code",
   "backup_modes": {
    "fun": "yes",
    "sell": "no",
    "sell_note": "Non-commercial: CC BY-NC-SA allows non-commercial reuse with credit, and your changed shader stays CC BY-NC-SA. Read each shader's header first: some authors choose MIT or CC0, a few reserve all rights."
   },
   "note": "Back in for hobby use."
  },
  {
   "need": "shrink images so a web game loads faster",
   "main": "pngquant",
   "main_id": "kornelski/pngquant",
   "main_modes": {
    "fun": "yes",
    "sell": "no",
    "sell_note": "Non-commercial: running the GPL command-line tool on your images puts no license on the images; only linking libimagequant into your own program brings GPL terms."
   },
   "backup": null,
   "backup_id": null,
   "backup_modes": null,
   "note": ""
  }
 ]
}