Makes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote.
Icon Composer plugin for Claude Code, Codex, and gh skill
This repo packages one skill, `compose-app-icon`, for creating, validating, and rendering Apple Icon Composer `.icon` packages. The skill uses bundled Python CLIs in `scripts/` to generate icons, validate them against schema, and optionally render them with `ictool` on macOS.
Builders who use Claude Code, Codex, or `gh skill` and want a reusable way to work with Apple app icon packages.
You can create, validate, and render `.icon` packages from the same installed skill instead of checking them by hand.
What it does
Create icon packages
Runs `create_icon.py` to make a fresh `.icon` package or edit an existing `icon.json` in place.
Validate icon packages
Runs `validate_icon.py` with `jsonschema` and asset checks against `Assets/` on disk.
Render ground-truth previews
Uses `ictool` from Xcode on macOS to render platform and appearance variants to PNG.
Install across hosts
Ships manifests for Claude Code, Codex, and `gh skill` so the same skill can be installed in different hosts.
Bundle the schema and tests
Includes `icon-schema.json`, `pyproject.toml`, `uv.lock`, and pytest coverage for the bundled CLIs.
How to get it
- 1Run
/plugin marketplace add giginet/apple-icon-composer-skill /plugin install icon-composer@icon-composer
- 2Run
codex plugin marketplace add giginet/apple-icon-composer-skill # then open the plugin directory in Codex, pick the "Icon Composer" marketplace, and install
- 3Requires GitHub CLI v2.90.0+.
# Browse and pick interactively gh skill install giginet/apple-icon-composer-skill # Or install it directly for a given host gh skill install giginet/apple-icon-composer-skill compose-app-icon --agent claude-code
README
Icon Composer Skill
The icon-composer plugin — tools to create, validate, and render Apple Icon Composer .icon packages. The same package installs three ways: as a Claude Code plugin, a Codex plugin, or a standalone skill via gh skill.
Install
Published at https://github.com/giginet/apple-icon-composer-skill. Pick the host you use — each path installs the same compose-app-icon skill.
Prerequisite: uv on your PATH (the skill runs its bundled Python CLIs through it) — brew install uv.
Claude Code
/plugin marketplace add giginet/apple-icon-composer-skill
/plugin install icon-composer@icon-composer
Then run /reload-plugins once and confirm with / — you should see /icon-composer:compose-app-icon. The @icon-composer suffix names the marketplace declared in .claude-plugin/marketplace.json, disambiguating it from any other marketplaces you have installed.
Codex
codex plugin marketplace add giginet/apple-icon-composer-skill
# then open the plugin directory in Codex, pick the "Icon Composer" marketplace, and install
Backed by the repo marketplace at .agents/plugins/marketplace.json with the manifest at plugins/icon-composer/.codex-plugin/plugin.json. Codex sets CLAUDE_PLUGIN_ROOT for compatibility, so the skill's ${CLAUDE_PLUGIN_ROOT}/skills/compose-app-icon/scripts/... references work unchanged.
GitHub CLI (gh skill)
Requires GitHub CLI v2.90.0+.
# Browse and pick interactively
gh skill install giginet/apple-icon-composer-skill
# Or install it directly for a given host
gh skill install giginet/apple-icon-composer-skill compose-app-icon --agent claude-code
The skill is self-contained: its scripts/ directory is a uv project bundling create_icon.py, validate_icon.py, icon-schema.json, and uv.lock, so gh skill copies the whole working toolset — not just the instructions. Outside a plugin host, ${CLAUDE_PLUGIN_ROOT} is unset, so run the CLIs from the installed skill's scripts/ directory (the SKILL.md explains this); uv is still required.
Skill
One skill, compose-app-icon, covers authoring, validation, and rendering:
| Triggers on | What it does |
|---|---|
"make an icon", "change the icon's dark-mode color", authoring or editing any icon.json property | Creates a fresh .icon via the bundled create_icon.py CLI, or edits an existing icon.json in place and re-validates. Covers all schema categories — fills, blend modes, shadows, translucency, Liquid Glass (Mode/Specular/Blur Material/Refractivity), RTL asset mirroring, layouts, specializations. |
| "check this icon", "why won't Icon Composer open this" | Runs jsonschema against icon.json via validate_icon.py, cross-checks referenced assets against Assets/ on disk, and explains failures in terms of the schema. |
| "render this icon", "show me the dark/tinted variant", "does Icon Composer actually open this" | On macOS with Xcode, renders any platform/appearance to a PNG with ictool (bundled in Icon Composer.app, located via xcode-select -p). A failed render is the ground-truth signal that Icon Composer can't open the package — catching engine-level issues the schema can't, like the scale-only position bug. |
The skill shells out to two small Python CLIs bundled in its scripts/ directory (a uv project); its preflight stops with an error if uv is not on PATH. The optional ictool rendering/ground-truth step needs macOS with Xcode (Icon Composer 1.5+; 2.0 for the Icon Composer 2 keys) and is skipped elsewhere — validate_icon.py is the portable check.
Repo layout
.
├── .claude-plugin/
│ └── marketplace.json Claude Code marketplace index (points at plugins/)
├── .agents/plugins/
│ └── marketplace.json Codex repo marketplace (points at plugins/)
├── skills -> plugins/icon-composer/skills symlink for top-level `gh skill --from-local`
├── plugins/
│ └── icon-composer/
│ ├── .claude-plugin/plugin.json Claude Code manifest
│ ├── .codex-plugin/plugin.json Codex manifest (skills: "./skills/")
│ └── skills/
│ └── compose-app-icon/
│ ├── SKILL.md authoring + validation instructions
│ └── scripts/ self-contained uv project
│ ├── create_icon.py
│ ├── validate_icon.py
│ ├── icon-schema.json source of truth for icon.json
│ ├── pyproject.toml uv-managed deps: jsonschema, pillow, pytest (dev)
│ ├── uv.lock
│ └── tests/ pytest suite for both CLIs
├── fixtures/ example .icon packages — simple-image, variables-changed, complex-icon, test-generated, plugin-test
└── README.md
The skill is self-contained: the CLIs, schema, and their uv project all live in plugins/icon-composer/skills/compose-app-icon/scripts/, so every host — Claude Code, Codex, or gh skill — gets the full toolset when it copies the skill directory, with no shared files outside it. The top-level skills symlink points back into the plugin for local gh skill --from-local runs; remote gh skill discovers the skill via the nested plugins/icon-composer/skills/*/SKILL.md path.
Hacking on the skill locally
cd plugins/icon-composer/skills/compose-app-icon/scripts
uv sync # installs runtime + dev (pytest) dependencies
# Run the unit tests
uv run pytest
# Validate every example fixture by hand
for f in ../../../../../fixtures/*.icon; do
uv run python validate_icon.py "$f"
done
# Round-trip: copy a fixture through the create CLI and re-validate
FIX=../../../../../fixtures/simple-image.icon
uv run python create_icon.py \
--output /tmp/smoke.icon \
--icon "$FIX/icon.json" \
--asset video.fill.png="$FIX/Assets/video.fill.png" \
--force
uv run python validate_icon.py /tmp/smoke.icon
icon-schema.json is the authoritative definition of the icon.json format for both Icon Composer 1.x and 2.x — including per-slot -specializations overrides (appearance, idiom, localization), the Liquid Glass property set on groups (lighting, specular, blur-material, refractivity, translucency, shadow), the document features gate Icon Composer 2 writes, and the enum values Icon Composer's UI labels quietly map to (for example, Shadow "Natural" → "neutral", "Chromatic" → "layer-color").
Files in the repo
- .agents
- .claude
- .claude-plugin
- .github
- fixtures
- plugins
- .gitignore
- LICENSE
- README.md
- skills
Discussion (0)
Ask about usage, or say what you built with itSign in to join the discussion.
No comments yet. Be the first to say what this is good for.
More plugins

Graphs that teach > graphs that impress. Turn any code into an interactive knowledge graph you can explore, search, and ask questions about. Works with Claude Code, Codex, Cursor, Copilot, Gemini CLI, and more.
OmO: Just type "mass ulw" keyword with your prompt. Now you are the master of graph engineering.
Persistent Context Across Sessions for Every Agent – Captures everything your agent does during sessions, compresses it with AI, and injects relevant context back into future sessions. Works with Claude Code, OpenClaw, Codex, Gemini, Hermes, Copilot, OpenCode + More
Opinionated Oxlint rules for rejecting low-evidence TypeScript and JavaScript patterns
Teams-first Multi-agent orchestration for Claude Code