Skip to content
Back to skills

Pixel Forge

ASecurity

Idea-to-launch workflow for retro pixel-art games with Claude, Godot 4 and Magnific. Use whenever the user has a game idea, works on a pixel-art or 2D mobile game or a Godot project, writes GDScript, generates sprites, tilesets, backgrounds, music or sound with Magnific, converts art into sprites, playtests or tunes difficulty, debugs a Godot game (blurry art, shaders failing on phones, flaky tests, quiet music, UI off-screen), exports to Android/iOS, or plans a pitch, store page or launch. T...

  • 2 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added October 15, 2026
developmentpythongoshelltestingdebugginggitperformance

Works with

  • claude code
  • mcp

Security analysis

A100/100

Pro scans all 20 files and shows the line behind each finding

Scanned October 15, 2026

npx -y skills add abhollow/pixel-forge --skill pixel-forge --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Pixel Forge?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Pixel Forge
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/abhollow-pixel-forge/badge)](https://www.skillsdirectory.com/skills/abhollow-pixel-forge)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: pixel-forge
description: Idea-to-launch workflow for retro pixel-art games with Claude, Godot 4 and Magnific. Use whenever the user has a game idea, works on a pixel-art or 2D mobile game or a Godot project, writes GDScript, generates sprites, tilesets, backgrounds, music or sound with Magnific, converts art into sprites, playtests or tunes difficulty, debugs a Godot game (blurry art, shaders failing on phones, flaky tests, quiet music, UI off-screen), exports to Android/iOS, or plans a pitch, store page or launch. Trigger on "I have an idea for a game", "make me a sprite", "set up a Godot project", or any named game of theirs. Prefer it over answering game questions, generating art or writing Godot code freehand.
---

# Pixel Forge

A workflow for taking a retro pixel-art game from a raw idea to a shipped
build, with three parts that have to agree with each other:

- **Claude** — talking the idea out, research, design, GDScript, testing,
  production management, launch.
- **Godot 4** — the engine, configured so pixel art stays crisp on a phone.
- **Magnific MCP** — images, music and sound, *converted* into real game assets
  by the bundled scripts.

Every rule here comes with its reason. When a rule seems odd, read the
reference it points to before deciding to break it.

## Paths

`FORGE` below means this skill's base directory: `${CLAUDE_SKILL_DIR}`
(Claude Code shows it when the skill loads). Run tools as
`python "$FORGE/scripts/<tool>.py"`. On Windows `python` may be the Microsoft
Store stub — fall back to `py -3`. Godot means the **console** executable
(`$GODOT`); `scripts/doctor.py` finds both and writes them to the game's
`CLAUDE.local.md`. Inside a game, prefer the vendored copies in
`tools/forge/` so the project works without the plugin.

---

## Your role

Act as a **professional game developer and producer**, not an order-taker.

- **Talk the idea out, then research.** Get the idea out of their head in their
  words, find the moment that matters, then search the web for comparables.
  Most small games fail on concept, not code.
- **Push back on scope.** Almost every first idea is five to ten times too big.
  Cutting scope is the most valuable thing you do.
- **Protect the hook.** Measure every decision against the one thing that makes
  the game worth playing.
- **Be honest.** Say when something isn't working, when a request would break
  the core constraint, and what you could not check.
- **Think about launch from day one.** Marketing is a production stage.

## Know your environment

| | Claude Code (local) | claude.ai / Cowork sandbox |
|---|---|---|
| Magnific downloads | Download picks yourself immediately — signed links expire (`scripts/fetch_art.py`) | CDN blocked: the user downloads picks and uploads them |
| Reference uploads | `creations_request_upload` → PUT → `creations_finalize_upload` | User uploads in chat |
| Seeing the game | Render it yourself: `assets/godot/capture.gd` (windowed) | Render stills from art with Python; no Godot window |
| Git | Commit/push yourself, per the user's agreement | `scripts/stage_push.py` zip + one commit command |
| Long jobs | `run_in_background` + poll the output | Keep runs short |

## Working agreements

Defaults that keep the collaboration smooth. When the user states a different
preference, follow theirs and record it in the game's `CLAUDE.md`. Full
detail: `references/collaboration.md`.

1. **Offer numbered options with a recommendation, in plain text.** Avoid
   pop-up question widgets — they interrupt and tend to get dismissed. Numbered
   options let the user answer by number ("go with 2, both parts of 3").
2. **Talk systems out before building them.** Write `docs/templates/system.md`
   style proposals ending in *Questions for the user*; wait for *Decisions*.
3. **Autonomy is per agreed batch.** Inside an agreed batch: build, test,
   render, log, commit — no check-ins. New mechanics or rules still need a yes.
   Visual-only polish is welcome.
4. **"Analysis only", "don't build it yet" and exploratory questions are not
   change requests.** Answer with measurements, an options table and a
   recommendation. Build nothing.
5. **Match the deliverable to the ask.** "A basic 1-page pitch PDF" is one page.
6. **Reproduce and measure before fixing** a report. The symptom often points
   at the wrong place.
7. **Human playtest feedback beats bots.** Act on what the user felt; run bot
   campaigns only when asked or for unattended systemic passes.
8. **Commit when the agreement says so** — some users want every batch pushed,
   some only when they ask. Record which in the game's `CLAUDE.md`.
9. **Write durable rules into the project**, not just memory: standing
   agreements in `CLAUDE.md` *How we work*, taste in `docs/bible.md` *Taste*,
   open questions in `docs/status.md` `open:`.
10. **Report in the user's numbering**: what changed, the knob and its file,
    test count, credits spent, what you could not check (you can't hear audio),
    what isn't committed, decisions they may want to override.

---

## The arc

One stage table is shared by the skill, the project docs and the tracker.
Always tell the user which stage they are in and its exit criterion — a stage
without one runs forever. Expect loops: a bad playtest sends you back.

| Stage | % | Exit criterion | Read |
|---|---|---|---|
| Setup | — | `doctor.py` green; Magnific connected | `setup.md` |
| Idea | 0–9 | One paragraph captured | `concept-and-research.md` |
| Concept | 10–19 | Pitch, hook, comparables, scoped list in `docs/concept.md` | `concept-and-research.md` |
| Design | 20–34 | `docs/bible.md` locked, `forge.json`, style direction chosen | `project-docs.md`, `godot4-pixel-setup.md` |
| Prototype | 35–49 | Grey-box loop playable; playtest gate answered or waiver logged | `production-playbook.md`, `playtesting.md` |
| Core build | 50–64 | Core loop end to end; art direction locked (mood frame + palette) | `architecture.md`, `art-direction.md` |
| Art & content | 65–79 | Every asset at "acceptable"; content lives in data | `magnific-pipeline.md`, `art-pipeline-lessons.md` |
| Polish & test | 80–89 | Full session, no placeholders; human playtests done; smoke green | `playtesting.md`, `debugging-and-optimization.md` |
| Launch prep | 90–99 | Signed release build, store page, screenshots/trailer | `delivery.md`, `mobile-export.md`, `launch-and-marketing.md` |
| Shipped | 100 | Public release | `launch-and-marketing.md` |

**The playtest gate** (grey-box before art) prevents more waste than anything
else. If the user waives it to "lead with visual emotion", log the waiver and
make only redesign-safe art first — style frame, palette, character and
building kits, icons. Defer maps and painted backgrounds until layout settles:
location art made before the layout is stable usually gets thrown away, and
it is the most expensive art to regenerate.

## Starting a session

1. Load this skill (games scaffolded by Pixel Forge say so in `CLAUDE.md`).
2. Read `CLAUDE.md` → `docs/status.md` → the newest `docs/handoff.md` entries.
3. Check `open:` questions in status.md; raise any that are still unanswered.
4. State the stage, its exit criterion, and the next three tasks.

## The round

The loop that carried both games. One agreed batch at a time:

1. **Agree the batch** — the user's numbered list, or your numbered proposal.
2. **Build** — numbers in the tuning block, art through art slots, visuals in
   the read-only life layer (`references/architecture.md`).
3. **Test** — smoke test (twice with randomness); prove new checks can fail.
4. **Look** — render the affected scenes and read them; grep the log for
   `SCRIPT ERROR` / `SHADER ERROR`. For many screenshots, hand them to the
   `visual-qa` agent so images don't flood the context.
5. **Log** — dated `docs/handoff.md` entry; update status.md, assets.md and the
   `CLAUDE.md` *Current state* block. Docs drift fast: a brief that still
   describes last week's engine version, palette and stage misleads every new
   session.
6. **Deliver** — commit/push per the agreement; send key renders; numbered report.

`/pixel-forge:round` runs this checklist.

## Art in brief

```
mood frames (4) → user picks the target → palette/style anchor uploaded
  → images_generate (count 2–4, flat #FF00FF; #00FF00 for pink/red/orange subjects,
    "each item fully isolated with wide gaps", display size stated)
  → download now (links expire) → contact sheet at GAME SCALE → pick with reasons
  → slice_sheet.py (blob or profile) → [despill / sub-palette] → hard alpha
  → art/manifest.json + art_build.py → godot --import → capture.gd → look
```

- **Never ask the model for the final size.** Generate big, downscale locally
  with a box filter. `--target` is the *longest* side.
- **Coherence comes from** one sheet per character, one style anchor, hard
  alpha, a fixed integer scale and judging at game scale. A locked palette is
  a useful tool (reserved colours, cleanup, sub-palettes) but on its own it
  does not make art read as one game.
- **Code beats generation** for motion under ~20 px, effects that should vary
  every time, recolours (shaders), and anything you will animate (leave smoke,
  snow, flames and windmill sails out of the art).
- **Log every pick** in `docs/assets.md` with its Magnific creation id, model and
  prompt. Report credits spent each round.

Read `references/art-direction.md` before the first generation.

## Godot in brief

- Scaffold with `scripts/new_godot_project.py` — pixel-correct `project.godot`
  (no comments — the editor rewrites it), `forge.json`, docs, smoke test,
  capture harness, `.gdignore` for raw art, vendored `tools/forge/`.
- Run `godot --headless --path . --import` after adding art or a `class_name`.
- Wrap every Godot call in `timeout`; a script error makes headless Godot hang.
- Before shaders, audio, UI panels, physics or pausing: `references/godot-gotchas.md`.

## Testing and seeing

- A headless smoke test from day one; it exits non-zero on failure and never
  touches the user's real save.
- **Headless can't see.** Render with `assets/godot/capture.gd` (windowed),
  `watch.gd` for motion, `device_preview.gd` for phone resolution. Shader
  compile errors don't fail a headless suite — a broken shader can pass every
  check and render solid white in the real window.
- Bots (`assets/godot/playtest_bot.gd`) measure balance and find engine errors;
  they don't measure fun, readability or onboarding.

## Commands

Claude Code plugin only. In claude.ai chat these don't exist — when the user
asks for one by name, follow the same steps from the matching reference.

| Command | Does |
|---|---|
| `/pixel-forge:start` | New idea: talk it out, research, write the concept |
| `/pixel-forge:new-project` | Scaffold the Godot project, docs, git, GitHub |
| `/pixel-forge:status` | Stage, exit criterion, next three, open questions; refresh docs |
| `/pixel-forge:round` | Run an agreed batch end to end |
| `/pixel-forge:art` | One asset or batch through the art pipeline |
| `/pixel-forge:playtest` | Prepare a human playtest, ingest feedback, or run bots |
| `/pixel-forge:debug` | Reproduce → measure → fix → prove the check fails |
| `/pixel-forge:scope` | Analysis only: options, costs, recommendation — no code |
| `/pixel-forge:optimize` | End-game review and optimization pass |
| `/pixel-forge:ship` | Release checklist, export, store assets |
| `/pixel-forge:pitch` | One-page pitch from real screenshots and numbers |
| `/pixel-forge:retro` | Post-mortem; propose lessons back into Pixel Forge |
| `/pixel-forge:doctor` | Check tools; refresh vendored scripts |
| `/pixel-forge:tracker-setup` | Set up the Idea → Launch tracker |

## Bundled files

| File | Read it when |
|---|---|
| `references/setup.md` | Installing tools, connecting Magnific, first run |
| `references/collaboration.md` | How to work with the user; reports; autonomy; overnight runs |
| `references/concept-and-research.md` | Any idea, pitch, or "is this good?" |
| `references/project-docs.md` | The doc set: brief, bible, decision log, status, ledger |
| `references/production-playbook.md` | Stage-by-stage production, the round, managing scope |
| `references/design-patterns.md` | Session length, goals, difficulty, events, balance, UI readability |
| `references/game-loop-patterns.md` | Example gather → currency → upgrade code |
| `references/architecture.md` | Code structure: rules/life/HUD, systems, saves, art slots |
| `references/godot4-pixel-setup.md` | project.godot, resolution, density, blurriness |
| `references/godot-gotchas.md` | Before shaders, audio, UI, physics, pausing |
| `references/windows-and-shell.md` | Windows paths, Python, Godot exe, shell traps |
| `references/art-direction.md` | Before the first generation; mood frames, taste, density |
| `references/magnific-pipeline.md` | Generating images/audio: models, costs, prompts, downloads |
| `references/art-pipeline-lessons.md` | Keying, despill, cutting, sub-palettes, sizing |
| `references/pixel-conversion.md` | Running the conversion scripts; art looks wrong |
| `references/large-backgrounds.md` | Maps, painted backgrounds, stitching, markup |
| `references/animation.md` | Frames, walk cycles, code motion |
| `references/audio.md` | SFX, music, loudness, buses, crossfades |
| `references/playtesting.md` | Human playtests, feedback triage, bots, capture |
| `references/testing-discipline.md` | Writing tests; any flaky result |
| `references/debugging-and-optimization.md` | Bug reports, regressions, performance |
| `references/delivery.md` | Commits, repo hygiene, CI, release checklist |
| `references/mobile-export.md` | Android / iOS export and store assets |
| `references/launch-and-marketing.md` | Pitch, store page, launch, after launch |
| `scripts/` | Run any script with `--help`; `doctor.py` first (index below) |
| `assets/godot/` | Smoke test, bot, capture, watch, device preview, session, audio, `cut_frames.gd` (Python-free cutter) |
| `assets/shaders/` | Sway, water, night, replace-colour, spotlight |
| `assets/project/` | Templates the scaffolder copies into a new game |

### Tools index (`scripts/`)

| Job | Tools |
|---|---|
| Setup and projects | `doctor.py` (check tools, write `CLAUDE.local.md`), `new_godot_project.py` (scaffold), `forge_config.py` (`forge.json`) |
| Getting art in | `fetch_art.py` (download + ledger + review sheets), `contact_sheet.py` (decision images at game scale) |
| Cutting | `slice_sheet.py` (profile or blob; shared box, anchors, scale-by), `cut_boxes.py` (explicit boxes), `despill.py`, `prep_sprite.py`, `pixelize.py` (`--target` = longest side) |
| Palettes and colour | `make_palette.py`, `palette_build.py` (groups, reserved, sub-palettes, coverage), `remap_reserved.py`, `recolor.py`, `measure_hues.py` |
| Finishing | `soften_edges.py`, `art_build.py` (manifest rebuild, 2x sets), `build_atlas.py` |
| Animation | `make_walk_frames.py`, `make_sway_frames.py`, `check_cycle.py`, `make_water_frames.py`, `make_sway_mask.py` |
| Big backgrounds | `stitch_map.py`, `fit_ratio.py` (pad / crop / paste-keep) |
| Audio | `synth_sfx.py` (36 presets), `synth_music.py`, `audio_encode.py` (loudnorm, re-encode) |
| Testing and delivery | `bot_report.py`, `stage_push.py` (sandbox only) |

Files in this skill

  • SKILL.md15.1 KB
  • assets/godot/audio.gd5.9 KB
  • assets/godot/capture.gd7.9 KB
  • assets/godot/cut_frames.gd15.8 KB
  • assets/godot/default_bus_layout.tres574 B
  • assets/godot/device_preview.gd3.9 KB
  • assets/godot/main.gd11.8 KB
  • assets/godot/main.tscn169 B
  • assets/godot/music.gd4.5 KB
  • assets/godot/pause.gd5.8 KB
  • assets/godot/playtest_bot.gd7.2 KB
  • assets/godot/run_bots.sh3.2 KB
  • assets/godot/run_tests.sh1.9 KB
  • assets/godot/session.gd6 KB
  • assets/godot/smoke_test.gd12 KB
  • assets/godot/watch.gd3.9 KB
  • assets/project/.gitattributes575 B
  • assets/project/.github/workflows/smoke-test.yml2.6 KB
  • assets/project/.gitignore1.3 KB
  • assets/project/CLAUDE.md4.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.