pixel-art
Convert images into retro pixel art with hardware-accurate palettes (NES, Game Boy, PICO-8, C64, etc.), and animate them into short videos. Presets cover arcade, SNES, and 10+ era-correct looks. Use `
Convert images into retro pixel art with hardware-accurate palettes (NES, Game Boy, PICO-8, C64, etc.), and animate them into short videos. Presets cover arcade, SNES, and 10+ era-correct looks. Use `
Real data. Real impact.
Emerging
Developers
Per week
Excellent
Skills give you superpowers. Install in 30 seconds.
Convert any image into retro pixel art, then optionally animate it into a short MP4 or GIF with era-appropriate effects (rain, fireflies, snow, embers).
Two scripts ship with this skill:
scripts/pixel_art.py — photo → pixel-art PNG (Floyd-Steinberg dithering)scripts/pixel_art_video.py — pixel-art PNG → animated MP4 (+ optional GIF)Each is importable or runnable directly. Presets snap to hardware palettes when you want era-accurate colors (NES, Game Boy, PICO-8, etc.), or use adaptive N-color quantization for arcade/SNES-style looks.
Before generating, confirm the style with the user. Different presets produce very different outputs and regenerating is costly.
Call
clarify with 4 representative presets. Pick the set based on what the
user asked for — don't just dump all 14.
Default menu when the user's intent is unclear:
clarify( question="Which pixel-art style do you want?", choices=[ "arcade — bold, chunky 80s cabinet feel (16 colors, 8px)", "nes — Nintendo 8-bit hardware palette (54 colors, 8px)", "gameboy — 4-shade green Game Boy DMG", "snes — cleaner 16-bit look (32 colors, 4px)", ], )
When the user already named an era (e.g. "80s arcade", "Gameboy"), skip
clarify and use the matching preset directly.
If the user asked for a video/GIF, or the output might benefit from motion, ask which scene:
clarify( question="Want to animate it? Pick a scene or skip.", choices=[ "night — stars + fireflies + leaves", "urban — rain + neon pulse", "snow — falling snowflakes", "skip — just the image", ], )
Do NOT call
clarify more than twice in a row. One for style, one for scene if
animation is on the table. If the user explicitly asked for a specific style
and scene in their message, skip clarify entirely.
Run
pixel_art() first; if animation was requested, chain into
pixel_art_video() on the result.
| Preset | Era | Palette | Block | Best for |
|---|---|---|---|---|
| 80s arcade | adaptive 16 | 8px | Bold posters, hero art |
| 16-bit | adaptive 32 | 4px | Characters, detailed scenes |
| 8-bit | NES (54) | 8px | True NES look |
| DMG handheld | 4 green shades | 8px | Monochrome Game Boy |
| Pocket handheld | 4 grey shades | 8px | Mono GB Pocket |
| PICO-8 | 16 fixed | 6px | Fantasy-console look |
| Commodore 64 | 16 fixed | 8px | 8-bit home computer |
| Apple II hi-res | 6 fixed | 10px | Extreme retro, 6 colors |
| BBC Teletext | 8 pure | 10px | Chunky primary colors |
| Windows MS Paint | 24 fixed | 8px | Nostalgic desktop |
| CRT phosphor | 2 green | 6px | Terminal/CRT aesthetic |
| CRT amber | 2 amber | 6px | Amber monitor look |
| Cyberpunk | 10 neons | 6px | Vaporwave/cyber |
| Soft pastel | 10 pastels | 6px | Kawaii / gentle |
Named palettes live in
scripts/palettes.py (see references/palettes.md for
the complete list — 28 named palettes total). Any preset can be overridden:
pixel_art("in.png", "out.png", preset="snes", palette="PICO_8", block=6)
| Scene | Effects |
|---|---|
| Twinkling stars + fireflies + drifting leaves |
| Fireflies + sparkles |
| Dust motes + warm sparkles |
| Dust motes |
| Rain + neon pulse |
| Leaves + fireflies |
| Sparkles + fireflies |
| Rain + lightning |
| Bubbles + light sparkles |
| Embers + sparkles |
| Snowflakes + sparkles |
| Heat shimmer + dust |
import sys sys.path.insert(0, "/home/teknium/.hermes/skills/creative/pixel-art/scripts") from pixel_art import pixel_art from pixel_art_video import pixel_art_video # 1. Convert to pixel art pixel_art("/path/to/photo.jpg", "/tmp/pixel.png", preset="nes") # 2. Animate (optional) pixel_art_video( "/tmp/pixel.png", "/tmp/pixel.mp4", scene="night", duration=6, fps=15, seed=42, export_gif=True, )
cd /home/teknium/.hermes/skills/creative/pixel-art/scripts python pixel_art.py in.jpg out.png --preset gameboy python pixel_art.py in.jpg out.png --preset snes --palette PICO_8 --block 6 python pixel_art_video.py out.png out.mp4 --scene night --duration 6 --gif
Pixel conversion:
block with Image.NEAREST (hard pixels, no interpolation)Image.NEARESTQuantizing AFTER downscale keeps dithering aligned with the final pixel grid. Quantizing before would waste error-diffusion on detail that disappears.
Video overlay:
libx264 -pix_fmt yuv420p -crf 18palettegen + paletteusepip install Pillow)"NES", "PICO_8", "GAMEBOY_ORIGINAL").block or palette will break quantization — keep them positive ints.mono_green / mono_amber force color=0.0 (desaturate). If you override
and keep chroma, the 2-color palette can produce stripes on smooth regions.clarify loop: call it at most twice per turn (style, then scene). Don't
pepper the user with more picks.Image.open(p).getcolors())ffprobe can open it) with non-zero sizeNamed hardware palettes and the procedural animation loops in
pixel_art_video.py
are ported from pixel-art-studio
(MIT). See ATTRIBUTION.md in this skill directory for details.MIT
mkdir -p ~/.hermes/skills/creative/pixel-art && curl -o ~/.hermes/skills/creative/pixel-art/SKILL.md https://raw.githubusercontent.com/NousResearch/hermes-agent/main/skills/creative/pixel-art/SKILL.md1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.