# codixel

Adopt this skill: https://proskills.md/skills/other/mankidev-codixel

Page: https://proskills.md/skills/other/mankidev-codixel
This document is the public skill bundle for that page. It contains SKILL.md and every helper file the catalog carries. No login is required.

## File: SKILL.md
size: 51403
sha: a474ce67de81eace0a833ae971e9e4fa67ddb39f
upstream: https://github.com/mankidev/codixel/blob/HEAD/SKILL.md
truncated: true

````text
---
name: codixel
description: Changes how pixel art is made with AI. Instead of drawing from imagination, ask the user for a reference image, pixelate it, rig it, animate it, and check every step with the user. Use whenever the user asks for pixel art of any kind (sprites, characters, creatures, effects, scenes, props, tiles, gems).
license: MIT
---

# Codixel

You are not a painter. You write code. When you draw something complex from imagination (a dragon, an angel, a character, an animal), the result looks bad. When you start from a real image and turn it into pixels, the result looks good. This skill makes you work the second way and keeps the user in control of every step.

## Showing an image

The terminal cannot show pictures. Every time this skill says "show", do this:

1. Save the result as a PNG with `P.save` (and a GIF with `P.gif` when it moves) in the user's project, or in a folder the user named.
2. Open the PNG yourself with the Read tool and look at it.
3. Give the user the full path of each file.

Read shows only the first frame of a GIF, so check motion on a numbered frame sheet, not on the GIF.

Keep one preview image per piece of work. Put everything you want to show (frames, the last frame next to the first, the reference) on one sheet with `P.sheet`, not in separate files, and save each new version over the same file. The same goes for the GIF.

## Use the core, do not start from scratch

This skill comes with `core/pixel.js`, next to this file. Use it instead of writing image code or effects yourself. In Node: `const P = require("<skill folder>/core/pixel.js")`. In a browser, load it with a script tag and use the global `P`; draw a buffer on a canvas with `P.blit(buf, ctx, x, y)`. Loading and saving files only works in Node; in a browser `P.gif` returns a `Uint8Array`.

**Buffers.** `new P.Buf(w, h)` holds the pixels. `ox`, `oy` set the world offset: every drawing method takes world coordinates, so with `b.ox = -120; b.oy = -120` the point (0, 0) is 120 pixels in from the left and top. Methods: `pset`, `get`, `rect`, `line`, `poly`, `blob` (soft dithered circle), `ring`, `sprite`, `field(fn, palette)` (one value per pixel turned into a palette color with dither), `dither`, `scaled(n)`, `clear`.

**Images.** These work on whole buffers and return a new one:

- `P.load(file)` reads a PNG, `P.save(buf, file)` writes one. Other formats, and interlaced PNGs, must be converted to a plain PNG first with any tool you have (ImageMagick, ffmpeg, Python PIL).
- `P.removeBg(buf, { tol, color, seeds, flood, erode })` removes a plain background. It finds the background color from the image edges and fills inward from them. `tol` (default 48) is how far a color may be from the background and still count as background. `flood: false` also removes background color inside the subject (holes between legs). Soft edges leave a light or dark ring around the subject; `erode: 1` or `2` cuts that many pixels off the outer edge (also `P.erode(buf, n)`).
- `P.trim(buf, pad)`, `P.crop(buf, x, y, w, h)`, `P.bounds(buf)`.
- `P.resize(buf, w, h, { mode })` averages the pixels. Leave out `h` to keep the shape (`P.resize(buf, w, { mode: true })` works too). Pixels end up fully solid or fully clear. Averaging blurs small details like eyes into a gray spot; `mode: true` keeps the most common color in each cell instead, use it on an image you already quantized at full size.
- `P.quantize(buf, n, { palette, dither })` cuts the colors down to `n`, or maps them to a palette you give. Returns `{ buf, palette }`. `dither: true` mixes the two nearest colors in a thin strip where they meet, so soft shading keeps its steps instead of turning into flat bands.
- `P.cleanup(buf, { tol, keepLone })` removes single stray pixels. It keeps a lone pixel when its color is very different from its neighbors (an eye, a highlight). A pixel with no solid neighbor at all is removed unless `keepLone: true` (a spark floating free). After dithering, use `tol: 20` or lower, or the dither pixels count as strays and get removed.
- `P.smoothEdge(buf, { fill })` cleans the silhouette: it removes one pixel bumps, one pixel wide strips and two pixel nubs, and fills one pixel holes and dents. `P.smoothMask(mask, w, h)` does the same on a 0/1 mask. When a subject is made of overlapping parts (leaves, petals, plates), clean each part's mask on its own and put them together after, so the cleanup does not cut gaps where two parts overlap.
- `P.edgeCheck(buf)` returns `{ nubs, strips, holes }`, the positions of pixels that stick out, one pixel wide strips and holes inside the silhouette.
- `P.outline(buf, color, { corners })` adds a one pixel outline. The new buffer is 2 pixels wider and taller and everything moves 1 pixel right and down, so joint positions read before the outline are off by one after it.
- `P.selout(buf, lit, shade, { dir })` adds a one pixel outline in two colors: `lit` on the side the light comes from, `shade` on the other sides. `dir` is where the light comes from, `[-1, -1]` (top left) by default. Take both colors from the sprite's own ramp (a middle color for `lit`, the darkest for `shade`), not black. It grows the buffer like `P.outline`.
- `P.rimLight(buf, ramp, { dir, steps })` makes the edge pixels that face the light one ramp step lighter. Use it with `P.selout` to make the shape crisp, and call it first: `P.selout(P.rimLight(buf, ramp), lit, shade)`. Called after `P.selout`, the edge pixels are the outline, so the rim lands on the outline and the sprite gets none.

**Bones.** For parts that turn at a joint (legs, arms, wings, head):

```js
const rig = new P.Rig(sprite)
  .bone("body", null, 32, 60, 8, 52)
  .bone("head", "body", 34, 22, 32, 4)
  .bind({ joint: 2, paint: { head: [[20, 0], [50, 0], [50, 26], [20, 26]] } });
const pose = { body: { a: 0, dy: -1 }, head: 0.2 };
rig.draw(buf, x, y, pose, { flip: false });
rig.drawBones(big, x * 4, y * 4, pose, { scale: 4 });

const grid = P.ruler(sprite, 6, { step: 8 });
rig.drawBones(grid, 0, 0, pose, { scale: 6 });
```

`bone(name, parent, x, y, endX, endY, z)` takes the joint and the tip in sprite pixels. Parents come before children. `bind` gives every pixel to its nearest bone; `paint` gives the pixels inside a polygon to a bone instead, use it when the nearest bone is wrong. `joint` is how wide the overlap along the seams is, so no gaps open when parts turn. A pose gives each bone an angle in radians, or `{ a, dx, dy }`.

Do not guess where the joints are. `P.ruler(sprite, scale, { step })` scales the sprite up with numbered grid lines every `step` sprite pixels, so you can read the joint and tip coordinates off the image. Its world offset is set so `rig.drawBones(grid, 0, 0, pose, { scale })` lands on the sprite.

Check which pixels belong to which bone before animating. `rig.ownerMap()` returns the sprite tinted with each bone's color (joint overlap is tinted lighter), and `rig.legend()` lists the bone names next to their colors:

```js
const own = P.ruler(rig.ownerMap(), 6, { step: 8 });
rig.drawBones(own, 0, 0, {}, { scale: 6 });
P.save(P.sheet([own, rig.legend()]), "owners.png");
```

A wrong area (a shoulder tinted like the head) shows up here, not after the animation. Fix it with `paint` in `bind` and show it again.

**Long bodies.** For things that curve along a spine (snake, dragon, tail, tentacle): `P.bend(buf, sprite, rest, pose)`. `rest` is the spine as points in sprite pixels, `pose` is the same number of points where the spine should be now. `P.wave(points, t, amp, length, { from })` gives a moving wave along a spine; the wave is still at the start (`from`) and strongest at the end.

**Showing work.**

- `P.sheet(items, { cols, scale, fit, gap })` puts several buffers in one image with labels above them. An item is a buffer or `{ buf, label, scale }`. `fit: 192` scales each one to about 192 pixels high. Clear pixels show as a checker.
- `P.text(buf, x, y, "A", color, scale)` writes letters, numbers and `- 
````

## File: README.md
size: 4980
sha: 23673c4a0343ae7280aa35cc7e5548bcb8c09454
upstream: https://github.com/mankidev/codixel/blob/HEAD/README.md

````text
<p align="center"><img src="images/logo.png" width="128" alt="Codixel logo"></p>

# Codixel

Codixel is a Claude Code skill for making pixel art with AI: game sprites, characters, animations and effects like fire, smoke and beams. It covers how to describe what you want, the steps from a reference image to a finished animated sprite, and why you have to check every step.

![Fire without and with Codixel](images/fire_compare.gif)

Left: without Codixel. Right: with Codixel.

## Steps

![God, step by step](images/god_steps.png)

1. Find real images of what you want. Use your own, or ones whose license allows it.
2. Have the AI put it together in code from those images.
3. Ask for bones so the parts can move.
4. Ask for pixel art and say how it should look, for example "realistic".
5. Look at the animation frames one by one.
6. Put it in the scene and check it next to everything else.

Here the bones come before the pixels, because the god is put together from several images. With a single image, like Kinryu, turn it into pixels first and add the bones after.

![God animation](images/god.gif)

![God battle](images/god_battle.gif)

## What to do

- [Remember Claude Code is not a painter, it only writes code](#claude-code-is-not-a-painter)
- [Start from a real reference image](#example-kinryu)
- [Give a reference to compare with](#examples)
- [Go step by step](#steps)
- [Ask for how it should look, like "realistic"](#examples)
- [Build characters from only a few pixels](#examples)
- [Use dither only where two colors meet](#dither)
- [Find sounds on the internet, don't let the AI make them](#sound)
- [Never say "do this" or "copy this" and walk away, check every step](#never-do-this-or-copy-this-and-walk-away)

## Claude Code is not a painter

**Claude Code cannot draw pixel art from scratch like a painter. It only writes code.**

![Kinryu, drawn from scratch vs from a reference](images/kinryu_old_new.png)

Left: Claude Code drew the dragon from scratch. Right: Claude Code turned a reference image into pixels and moved it.

## Example: Kinryu

![Kinryu, step by step](images/kinryu_steps.png)

1. Start from one picture of a gold dragon.
2. Take off the background and make it pixels.
3. Find the line from head to tail and move the body along it.
4. Put it in the scene.

![Kinryu animation](images/kinryu.gif)

## Spines

![Black leopard walking, with its spine and leg bones](images/leopard_spine.gif)

Codixel is good at understanding animal spines. It builds the body, legs and tail on the spine and moves them the way the real animal walks.

## Dither

![The same scene drawn four ways](images/dither.png)

Pixel art has only a few colors, so a sky or a ball needs a trick to change softly from one color to the next:

- Smooth: hundreds of colors. It looks like a blurry photo.
- Bands: flat stripes. You see hard lines between them.
- Dither everywhere: soft, but grainy.
- Bands and a dither strip: flat colors, mixed only where two bands meet. Codixel uses this one.

## Hue shifting

![Five greens without and with hue shifting](images/hue_shift.png)

Hue shifting changes the hue of each color in a palette along with its lightness.

## Outline

![The same clover with no outline, an outline, and an outline with rim light](images/outline.png)

The outline takes its colors from the sprite. Rim light makes the edges that face the light one step lighter.

## Sound

Don't let the AI make the sounds for your game. AI-made sounds are easy to spot. Have it find sounds on the internet instead.

## Never "do this" or "copy this" and walk away

**Never tell the AI "do this" or "copy this" and leave it. Check it the whole time it works and make sure what you get is what you wanted.**

While this README was being written, the AI added a lot of things I didn't ask for. That is why you should check every step.

![Heirs of the Valley, first version vs now](images/hotv_before_after.png)

After every step, look at the result. Does it look the way you described it?

If something is wrong, say exactly what is wrong and run the step again. Move on only when the step is right.

## Install

```
git clone https://github.com/mankidev/codixel ~/.claude/skills/codixel
```

Claude Code loads it on the next start. It runs when you ask for pixel art.

## Examples

![Astral Prison, reference vs result](images/astral_prison.png)

![Astral Prison animation](images/astral_prison.gif)

![Beams, smoke explosion, fire breath and hell fire](images/core_effects.gif)

![Mini characters](images/minis.gif)

![Hollowchain](images/hollowchain.gif)

![Ocean animation](images/ocean.gif)

![Waterfall animation](images/waterfall.gif)

![River animation](images/river.gif)

![Beach wave animation](images/beach_wave.gif)

![Ruby gem animation](images/gem.gif)

![Blue, violet, crimson and emerald space backgrounds](images/space_backgrounds.png)

![Crimson background with moving layers](images/space_parallax.gif)

## License

MIT. See [LICENSE](LICENSE).
````

## File: .github/ISSUE_TEMPLATE/bug_report.md
size: 243
sha: 3b35153387f5230e1bb0b854d8cef6818ab9ffb4
upstream: https://github.com/mankidev/codixel/blob/HEAD/.github/ISSUE_TEMPLATE/bug_report.md

```text
---
name: Bug report
about: Something in the skill or the core does not work as described
labels: bug
---

## What happened

## What you expected

## Steps to reproduce

1.
2.

## Images or frames

## Environment

- Claude Code version:
- OS:
```

## File: .github/ISSUE_TEMPLATE/config.yml
size: 27
sha: 0086358db1eb971c0cfa8739c27518bbc18a5ff4
upstream: https://github.com/mankidev/codixel/blob/HEAD/.github/ISSUE_TEMPLATE/config.yml

```text
blank_issues_enabled: true
```

## File: .github/ISSUE_TEMPLATE/feature_request.md
size: 167
sha: 6dcf376325267debc8a2b2565c727e0d5cb296d1
upstream: https://github.com/mankidev/codixel/blob/HEAD/.github/ISSUE_TEMPLATE/feature_request.md

```text
---
name: Feature request
about: Suggest a new effect, step or improvement
labels: enhancement
---

## What you want

## Why it helps

## Reference images or examples
```

## File: .github/pull_request_template.md
size: 183
sha: b9fa30f71e8c61689ddc1db2bab881aa4ed54e13
upstream: https://github.com/mankidev/codixel/blob/HEAD/.github/pull_request_template.md

```text
## What this changes

## How it looks

## Checklist

- [ ] One change per pull request
- [ ] Frames or a GIF are attached for changes to `core/pixel.js`
- [ ] No comments in the code
```

## File: CODE_OF_CONDUCT.md
size: 5378
sha: 037d72bcfad61e7a2a413b9740757f6162341934
upstream: https://github.com/mankidev/codixel/blob/HEAD/CODE_OF_CONDUCT.md

```text
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
  overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement by
opening a private report through [GitHub security advisories](https://github.com/mankidev/codixel/security/advisories/new) or by contacting the maintainer on GitHub (@mankidev).
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series
of actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior,  harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within
the community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
```

## File: CONTRIBUTING.md
size: 800
sha: 5ae84bf2af3378093d7f78d9cece1701d3e39ec7
upstream: https://github.com/mankidev/codixel/blob/HEAD/CONTRIBUTING.md

```text
# Contributing

Thanks for helping with Codixel.

## Ways to help

- Report a bug or a wrong instruction in `SKILL.md` with an issue.
- Suggest a new effect or a better step with an issue first, so it can be talked through before any work.
- Send a pull request for fixes to `SKILL.md`, `README.md` or `core/pixel.js`.

## Pull requests

- Keep each pull request to one change.
- For `core/pixel.js`, include a GIF or a few frames that show the result.
- New effects should come from a real, finished use (a game, a scene), not from a quick test.
- Code has no comments; explain the change in the pull request instead.
- By sending a pull request you agree that your work is released under the MIT License.

## Code of conduct

Everyone taking part follows the [Code of Conduct](CODE_OF_CONDUCT.md).
```

## File: core/pixel.js
size: 92274
sha: c5892305306710952a32d8b3094e8405078094b4
upstream: https://github.com/mankidev/codixel/blob/HEAD/core/pixel.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/core/pixel.js

## File: images/astral_prison.gif
size: 687129
sha: 1e0e71549a81a3bdf2a6daffeede153cb82f20ed
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/astral_prison.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/astral_prison.gif

## File: images/astral_prison.png
size: 328894
sha: b2fbc492768eb0cd72277e47a24df957da25d47b
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/astral_prison.png

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/astral_prison.png

## File: images/beach_wave.gif
size: 444245
sha: db0ba65038b2cefcf8e463926e118bf4b5642302
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/beach_wave.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/beach_wave.gif

## File: images/core_effects.gif
size: 3097724
sha: 74fe4fa3fbb39cf27f2646269e324807f302b253
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/core_effects.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/core_effects.gif

## File: images/dither.png
size: 8675
sha: 927c85a4cce778ab01867fd338f58a702f457907
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/dither.png

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/dither.png

## File: images/fire_compare.gif
size: 152076
sha: 9e6afa61f211484658f2d3c3a0e1d02b7571af63
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/fire_compare.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/fire_compare.gif

## File: images/gem.gif
size: 707345
sha: ff4fb33d55073a6c975fd45f19b4ed21a66eb5b1
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/gem.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/gem.gif

## File: images/god.gif
size: 757295
sha: 60340e12b94b609cdbdcfb53f480de9adf31b9e8
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/god.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/god.gif

## File: images/god_battle.gif
size: 2499625
sha: 1ac3dda8a378a763ea98c3422082eaa656fc0c4a
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/god_battle.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/god_battle.gif

## File: images/god_steps.png
size: 169569
sha: 6cbe72fdcd1eb448070bed5ae791f1bfb09d5966
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/god_steps.png

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/god_steps.png

## File: images/hollowchain.gif
size: 2175986
sha: 211d8f72c65c8c7bce955eb7c5e02eb63604e07a
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/hollowchain.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/hollowchain.gif

## File: images/hotv_before_after.png
size: 560009
sha: ab2b030556e3a2af3d3813f39aeaab37d37ee78f
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/hotv_before_after.png

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/hotv_before_after.png

## File: images/hue_shift.png
size: 1638
sha: 35cf919304f47e9fef0ba8e2840cb0114b784398
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/hue_shift.png

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/hue_shift.png

## File: images/kinryu.gif
size: 1231422
sha: f6d8b44831c21c0baadd9166ed517609a9ccb5c4
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/kinryu.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/kinryu.gif

## File: images/kinryu_old_new.png
size: 114224
sha: bb86a7fccb25ec501a4af0eed96445455c187c96
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/kinryu_old_new.png

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/kinryu_old_new.png

## File: images/kinryu_steps.png
size: 119496
sha: 95fd83684af81dd1ecaeee9145cd42a19f6e2ce3
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/kinryu_steps.png

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/kinryu_steps.png

## File: images/leopard_spine.gif
size: 4058497
sha: 043c1a60262abd0ed362435458fccdc948c3783c
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/leopard_spine.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/leopard_spine.gif

## File: images/logo.png
size: 2512
sha: ba326b9ada38df774c4f0f305891f98a0c8bb217
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/logo.png

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/logo.png

## File: images/minis.gif
size: 26282
sha: eb9cb6204ae9dfd609e4bb89cbe988bf0488037e
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/minis.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/minis.gif

## File: images/ocean.gif
size: 146585
sha: 69a2215b83633eb8dcb80bb8063d1003aebd7380
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/ocean.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/ocean.gif

## File: images/ocean_before_after.png
size: 10327
sha: 245a30a92306d4fa0d67a118ddba2aa47753f81f
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/ocean_before_after.png

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/ocean_before_after.png

## File: images/outline.png
size: 7893
sha: 214cc4ae1d88e0337e72d5bf2a7bd261c12afbc6
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/outline.png

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/outline.png

## File: images/river.gif
size: 3386532
sha: fadbf33f1678bd746718e730a746fed89a611253
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/river.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/river.gif

## File: images/space_backgrounds.png
size: 221946
sha: a74820b09cdce4c39affd65c660df2a1f523c3d3
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/space_backgrounds.png

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/space_backgrounds.png

## File: images/space_parallax.gif
size: 1636455
sha: 7dde0cd3d1c675bbaed1b8e58b2dcc0cb5c0d635
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/space_parallax.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/space_parallax.gif

## File: images/waterfall.gif
size: 684019
sha: fdd1ce39e8a9a5840409cdf506df5a2a57d4e810
upstream: https://github.com/mankidev/codixel/blob/HEAD/images/waterfall.gif

Content is not inlined in the catalog. Read the upstream file: https://github.com/mankidev/codixel/blob/HEAD/images/waterfall.gif

## File: LICENSE
size: 1065
sha: c733b8b841f262ede8f722a082b304146098062c
upstream: https://github.com/mankidev/codixel/blob/HEAD/LICENSE

```text
MIT License

Copyright (c) 2026 mankidev

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```

## File: SECURITY.md
size: 493
sha: ec01def5c56a51b51acf6b6bdf5f89d8b12e57fd
upstream: https://github.com/mankidev/codixel/blob/HEAD/SECURITY.md

```text
# Security policy

Codixel is a set of instructions and a small JavaScript file that runs locally. It has no server and stores no data.

## Reporting a problem

If you find something unsafe, for example an instruction in `SKILL.md` that makes the AI run harmful commands, report it privately through [GitHub security advisories](https://github.com/mankidev/codixel/security/advisories/new). Please do not open a public issue for it.

Only the latest version on the `main` branch is supported.
```
